feat(agent): 集数待确认的智能体兜底——查看上下文 / 模拟 / 写规则三个能力,写入前强制模拟,接后台调查与授权内恢复

能力 ID 的域名允许单个下划线分词(episode_mapping)。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-03 20:08:20 +08:00
1 parent 45a114263b
commit 7793c7b3bc
27 files changed
+1747 -48

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@ import { CapabilityId } from "@umt/contracts";
* 能力 ID ↔ 模型工具名 的唯一映射。
* 上游(Anthropic/OpenAI)工具名只允许 ^[a-zA-Z0-9_-]{1,64}$,不能带点,
* 所以 `download.submit` 对 Pi 暴露为 `download__submit`。
* 域名部分不含下划线,反向映射按第一个 `__` 切分即可无歧义。
* 域名部分最多含单个下划线分词(episode_mapping),不含连续下划线,反向映射按第一个 `__` 切分即可无歧义。
*/
const TOOL_NAME_SEPARATOR = "__";
const TOOL_NAME_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/;
@@ -67,6 +67,17 @@ export const INTENT_ROUTES: readonly IntentRoute[] = [
{ cap: "organize.execute", note: "执行整理" },
],
},
{
intent: "集数对不上、集数待确认(绝对集号、连续编号、特别篇)",
steps: [
{ cap: "episode_mapping.inspect", note: "事项内资源、同组相邻资源、季表、现有规则与确定性建议" },
{ cap: "episode_mapping.simulate", note: "试草稿规则,看样本是否全部解决、有没有误伤已对上的资源" },
{ cap: "episode_mapping.apply_rule", note: "模拟通过才写规则,写入后同类资源自动处理" },
],
tips: [
"优先 expression(偏移表达式),其次 table(对照表),特别篇 / 花絮用 special;拿不准就不写,只把模拟通过的规则留作建议。",
],
},
{
intent: "问订阅、追更、缺集",
steps: [
@@ -171,7 +182,7 @@ export function renderRoutes(available: ReadonlySet<string>): string[] {
const chain = steps.map((s) => `${s.cap}(${s.note}${needsApproval(s.cap) ? ",需要批准" : ""})`).join(" → ");
out.push(`- ${r.intent}:${chain}`);
for (const t of r.tips ?? []) {
const caps = t.match(/\b[a-z]+\.[a-z_]+\b/g) ?? [];
const caps = t.match(/\b[a-z][a-z_]*\.[a-z_]+\b/g) ?? [];
if (caps.every((c) => !(c in CAPABILITY_CATALOG) || available.has(c))) out.push(` - ${t}`);
}
}