// Main package file for your library code.
// Put public APIs and shared helpers here.
// Keep blocks small and focused for easy refactors.

// ---------------------------------------------------------------------------
// P1 路由层契约 —— 单一来源(routes / cmd/service 都参考此清单)
// ---------------------------------------------------------------------------
//
// routes_meta 形式 (path, handler_name):
//   - path: HTTP 路径(已剥离 query string)
//   - handler_name: 路由表中的简短名,cmd/service 内部 `match` 后派发到对应 handle_xxx
// 契约不变:每个 path 的入参 / 出参 / 错误码与 24 端点初版一致;新增 metrics / health /
// mqm_re_annotate 走同一清单路径。
//
// cmd/service/moon.pkg 是 native-only,wasm-gc 测试只能验证「meta 结构」而非 handler 实际行为。
// 因此 routes_meta 与 error_codes 抽到根包,测试通过同一包内可见性验证。
//
// 同步点:改 routes 时,cmd/service/routes.mbt 的 `let routes` 需同步(两者都为 27 项)。
//        L19 测试断言 24 端点 + 3 新增 全部在表内。
// ---------------------------------------------------------------------------

// 路由表:27 项(24 既有 + metrics + health + mqm_re_annotate)。handler_name 为 handler 内部短名。
//   P5 增量:mqm_re_annotate 加入(Google 2025-10-28 re-annotation 论文对齐)
pub let routes_meta : Array[(String, String)] = [
  ("/api/ping", "ping"),
  ("/api/tm_count", "tm_count"),
  ("/api/fuzzy_match", "fuzzy_match"),
  ("/api/add_tm", "add_tm"),
  ("/api/check_terms", "check_terms"),
  ("/api/concordance", "concordance"),
  ("/api/qe_auto", "qe_auto"),
  ("/api/predict", "predict"),
  ("/api/observe", "observe"),
  ("/api/recall", "recall"),
  ("/api/explain", "explain"),
  ("/api/reward", "reward"),
  ("/api/consolidate", "consolidate"),
  ("/api/retrieve_prompt", "retrieve_prompt"),
  ("/api/bleu", "bleu"),
  ("/api/chrf", "chrf"),
  ("/api/style_check", "style_check"),
  ("/api/style_report", "style_report"),
  ("/api/back_align", "back_align"),
  ("/api/term_conflicts", "term_conflicts"),
  ("/api/fed_export", "fed_export"),
  ("/api/fed_import", "fed_import"),
  ("/api/distill_inject", "distill_inject"),
  ("/api/active_learning", "active_learning"),
  ("/api/metrics", "metrics"),
  ("/api/health", "health"),
  ("/api/mqm_re_annotate", "mqm_re_annotate"),
]

// 错误码稳定表:send_error 全部用此六码(机器可读);L22 测试断言覆盖。
//   400 invalid_json     JSON 解析失败(read_json_or_400 走 400 分支)
//   413 body_too_large   request body 超过 MAX_BODY_CHARS
//   400 missing_field    必填字段缺失(add_tm.src / observe.text)
//   404 unknown_mid      reward 收到不存在的 mid
//   500 internal_error   handler 顶层 panic 兜底
//   500 align_failed     back_align 引擎返回非 Object(异常路径)
//   P3 增量:原表只列 3 码,实际 7 个 send_error 调用点用到 6 码(routes.mbt L85/87/153/293/389/452/590)。
//   补全后与 send_error 实际出口严格一一对应;新增 send_error 调用点必须同步此表 + L22 测试。
pub let error_codes : Array[String] = [
  "invalid_json",
  "body_too_large",
  "missing_field",
  "unknown_mid",
  "internal_error",
  "align_failed",
]

// API 版本(moon.mod 同步):/api/health 透出
pub let api_version : String = "0.1.0"

// 24 既有端点的路径集合(L19 用:断言 routes_meta 至少覆盖这些 baseline)
pub let baseline_paths : Array[String] = [
  "/api/ping", "/api/tm_count", "/api/fuzzy_match", "/api/add_tm",
  "/api/check_terms", "/api/concordance", "/api/qe_auto", "/api/predict",
  "/api/observe", "/api/recall", "/api/explain", "/api/reward",
  "/api/consolidate", "/api/retrieve_prompt", "/api/bleu", "/api/chrf",
  "/api/style_check", "/api/style_report", "/api/back_align",
  "/api/term_conflicts", "/api/fed_export", "/api/fed_import",
  "/api/distill_inject", "/api/active_learning",
]