@co-engram/core 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap/classify.d.ts +73 -0
- package/dist/bootstrap/classify.d.ts.map +1 -0
- package/dist/bootstrap/classify.js +134 -0
- package/dist/bootstrap/classify.js.map +1 -0
- package/dist/bootstrap/index.d.ts +89 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +158 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/concepts/dictionary.d.ts +260 -0
- package/dist/concepts/dictionary.d.ts.map +1 -0
- package/dist/concepts/dictionary.js +253 -0
- package/dist/concepts/dictionary.js.map +1 -0
- package/dist/concepts/index.d.ts +11 -0
- package/dist/concepts/index.d.ts.map +1 -0
- package/dist/concepts/index.js +10 -0
- package/dist/concepts/index.js.map +1 -0
- package/dist/concepts/types.d.ts +65 -0
- package/dist/concepts/types.d.ts.map +1 -0
- package/dist/concepts/types.js +15 -0
- package/dist/concepts/types.js.map +1 -0
- package/dist/config/defaults.d.ts +32 -3
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +53 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +18 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +75 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/loader.d.ts +10 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +10 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +97 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/contradiction/auto-degrade.d.ts +11 -2
- package/dist/contradiction/auto-degrade.d.ts.map +1 -1
- package/dist/contradiction/auto-degrade.js +22 -0
- package/dist/contradiction/auto-degrade.js.map +1 -1
- package/dist/contradiction/resolver.d.ts.map +1 -1
- package/dist/contradiction/resolver.js +7 -1
- package/dist/contradiction/resolver.js.map +1 -1
- package/dist/dreaming/index.d.ts +1 -0
- package/dist/dreaming/index.d.ts.map +1 -1
- package/dist/dreaming/index.js +1 -0
- package/dist/dreaming/index.js.map +1 -1
- package/dist/dreaming/llm-pattern-abstraction.d.ts +31 -0
- package/dist/dreaming/llm-pattern-abstraction.d.ts.map +1 -0
- package/dist/dreaming/llm-pattern-abstraction.js +70 -0
- package/dist/dreaming/llm-pattern-abstraction.js.map +1 -0
- package/dist/dreaming/rem.d.ts.map +1 -1
- package/dist/dreaming/rem.js +1 -0
- package/dist/dreaming/rem.js.map +1 -1
- package/dist/dreaming/scheduler.d.ts +13 -0
- package/dist/dreaming/scheduler.d.ts.map +1 -1
- package/dist/dreaming/scheduler.js +14 -2
- package/dist/dreaming/scheduler.js.map +1 -1
- package/dist/evolution/triggered.d.ts.map +1 -1
- package/dist/evolution/triggered.js +1 -0
- package/dist/evolution/triggered.js.map +1 -1
- package/dist/generative/hypothesis.d.ts.map +1 -1
- package/dist/generative/hypothesis.js +1 -0
- package/dist/generative/hypothesis.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1278 -33
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/index.d.ts +34 -1
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +36 -7
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/zh.d.ts +709 -32
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1282 -33
- package/dist/i18n/zh.js.map +1 -1
- package/dist/index/graph-builder.js +3 -3
- package/dist/index/graph-builder.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/learning/loop.d.ts +9 -0
- package/dist/learning/loop.d.ts.map +1 -1
- package/dist/learning/loop.js +42 -1
- package/dist/learning/loop.js.map +1 -1
- package/dist/maintenance/types.d.ts +11 -0
- package/dist/maintenance/types.d.ts.map +1 -1
- package/dist/maintenance/types.js.map +1 -1
- package/dist/merge/auto-onboard.d.ts +7 -1
- package/dist/merge/auto-onboard.d.ts.map +1 -1
- package/dist/merge/auto-onboard.js +35 -13
- package/dist/merge/auto-onboard.js.map +1 -1
- package/dist/merge/post-merge-hook.d.ts.map +1 -1
- package/dist/merge/post-merge-hook.js +16 -2
- package/dist/merge/post-merge-hook.js.map +1 -1
- package/dist/merge/synapse-merger.js +6 -0
- package/dist/merge/synapse-merger.js.map +1 -1
- package/dist/merge-driver.cjs +64 -5
- package/dist/observability/audit-log.d.ts +7 -1
- package/dist/observability/audit-log.d.ts.map +1 -1
- package/dist/observability/audit-log.js.map +1 -1
- package/dist/observability/necessity-evaluator.d.ts +29 -0
- package/dist/observability/necessity-evaluator.d.ts.map +1 -1
- package/dist/observability/necessity-evaluator.js +240 -13
- package/dist/observability/necessity-evaluator.js.map +1 -1
- package/dist/observability/proposal-engine.d.ts +81 -4
- package/dist/observability/proposal-engine.d.ts.map +1 -1
- package/dist/observability/proposal-engine.js +207 -13
- package/dist/observability/proposal-engine.js.map +1 -1
- package/dist/observability/runtime-description-check.d.ts +55 -0
- package/dist/observability/runtime-description-check.d.ts.map +1 -0
- package/dist/observability/runtime-description-check.js +63 -0
- package/dist/observability/runtime-description-check.js.map +1 -0
- package/dist/prompt-signals/cache.d.ts +73 -0
- package/dist/prompt-signals/cache.d.ts.map +1 -1
- package/dist/prompt-signals/cache.js +102 -0
- package/dist/prompt-signals/cache.js.map +1 -1
- package/dist/prompt-signals/event-bus.d.ts +82 -0
- package/dist/prompt-signals/event-bus.d.ts.map +1 -0
- package/dist/prompt-signals/event-bus.js +105 -0
- package/dist/prompt-signals/event-bus.js.map +1 -0
- package/dist/prompt-signals/index.d.ts +2 -1
- package/dist/prompt-signals/index.d.ts.map +1 -1
- package/dist/prompt-signals/index.js +2 -1
- package/dist/prompt-signals/index.js.map +1 -1
- package/dist/reinforcement/ltp.d.ts +15 -1
- package/dist/reinforcement/ltp.d.ts.map +1 -1
- package/dist/reinforcement/ltp.js +24 -5
- package/dist/reinforcement/ltp.js.map +1 -1
- package/dist/reinforcement/related.d.ts +31 -2
- package/dist/reinforcement/related.d.ts.map +1 -1
- package/dist/reinforcement/related.js +39 -3
- package/dist/reinforcement/related.js.map +1 -1
- package/dist/retrieval/filter.d.ts.map +1 -1
- package/dist/retrieval/filter.js +7 -0
- package/dist/retrieval/filter.js.map +1 -1
- package/dist/retrieval/fts.d.ts +6 -5
- package/dist/retrieval/fts.d.ts.map +1 -1
- package/dist/retrieval/fts.js +74 -22
- package/dist/retrieval/fts.js.map +1 -1
- package/dist/status/index.d.ts +7 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +7 -0
- package/dist/status/index.js.map +1 -0
- package/dist/status/status.d.ts +132 -0
- package/dist/status/status.d.ts.map +1 -0
- package/dist/status/status.js +437 -0
- package/dist/status/status.js.map +1 -0
- package/dist/storage/engram-store.d.ts.map +1 -1
- package/dist/storage/engram-store.js +17 -2
- package/dist/storage/engram-store.js.map +1 -1
- package/dist/storage/git.d.ts +168 -0
- package/dist/storage/git.d.ts.map +1 -1
- package/dist/storage/git.js +616 -33
- package/dist/storage/git.js.map +1 -1
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/infra-doctor.d.ts +42 -0
- package/dist/storage/infra-doctor.d.ts.map +1 -0
- package/dist/storage/infra-doctor.js +92 -0
- package/dist/storage/infra-doctor.js.map +1 -0
- package/dist/storage/obsidian-links.d.ts +73 -0
- package/dist/storage/obsidian-links.d.ts.map +1 -0
- package/dist/storage/obsidian-links.js +177 -0
- package/dist/storage/obsidian-links.js.map +1 -0
- package/dist/storage/path.d.ts +24 -0
- package/dist/storage/path.d.ts.map +1 -1
- package/dist/storage/path.js +53 -0
- package/dist/storage/path.js.map +1 -1
- package/dist/storage/repository.d.ts +74 -5
- package/dist/storage/repository.d.ts.map +1 -1
- package/dist/storage/repository.js +337 -21
- package/dist/storage/repository.js.map +1 -1
- package/dist/storage/synapse-store.d.ts +7 -1
- package/dist/storage/synapse-store.d.ts.map +1 -1
- package/dist/storage/synapse-store.js +8 -0
- package/dist/storage/synapse-store.js.map +1 -1
- package/dist/tools/audit-query-tool.d.ts +53 -0
- package/dist/tools/audit-query-tool.d.ts.map +1 -0
- package/dist/tools/audit-query-tool.js +123 -0
- package/dist/tools/audit-query-tool.js.map +1 -0
- package/dist/tools/doctor-tools.d.ts +5 -0
- package/dist/tools/doctor-tools.d.ts.map +1 -1
- package/dist/tools/doctor-tools.js +11 -3
- package/dist/tools/doctor-tools.js.map +1 -1
- package/dist/tools/engram-tools.d.ts +13 -0
- package/dist/tools/engram-tools.d.ts.map +1 -1
- package/dist/tools/engram-tools.js +72 -8
- package/dist/tools/engram-tools.js.map +1 -1
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/llm-descriptions.d.ts +28 -28
- package/dist/tools/llm-descriptions.d.ts.map +1 -1
- package/dist/tools/llm-descriptions.js +56 -489
- package/dist/tools/llm-descriptions.js.map +1 -1
- package/dist/tools/normalization.d.ts +43 -0
- package/dist/tools/normalization.d.ts.map +1 -0
- package/dist/tools/normalization.js +68 -0
- package/dist/tools/normalization.js.map +1 -0
- package/dist/tools/proposal-tools.d.ts +23 -1
- package/dist/tools/proposal-tools.d.ts.map +1 -1
- package/dist/tools/proposal-tools.js +58 -17
- package/dist/tools/proposal-tools.js.map +1 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +6 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/schemas.d.ts +96 -22
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +84 -11
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/skill-tools.js +1 -1
- package/dist/tools/skill-tools.js.map +1 -1
- package/dist/tools/synapse-tools.d.ts.map +1 -1
- package/dist/tools/synapse-tools.js +1 -0
- package/dist/tools/synapse-tools.js.map +1 -1
- package/dist/tools/sync-tools.d.ts +102 -0
- package/dist/tools/sync-tools.d.ts.map +1 -0
- package/dist/tools/sync-tools.js +309 -0
- package/dist/tools/sync-tools.js.map +1 -0
- package/dist/tools/synthesize-tools.d.ts +79 -0
- package/dist/tools/synthesize-tools.d.ts.map +1 -0
- package/dist/tools/synthesize-tools.js +297 -0
- package/dist/tools/synthesize-tools.js.map +1 -0
- package/dist/tools/tool-profile.d.ts +68 -0
- package/dist/tools/tool-profile.d.ts.map +1 -0
- package/dist/tools/tool-profile.js +174 -0
- package/dist/tools/tool-profile.js.map +1 -0
- package/dist/tools/tool.d.ts +17 -0
- package/dist/tools/tool.d.ts.map +1 -1
- package/dist/tools/tool.js.map +1 -1
- package/dist/types/disclosure.d.ts +7 -0
- package/dist/types/disclosure.d.ts.map +1 -1
- package/dist/types/repository-types.d.ts +17 -1
- package/dist/types/repository-types.d.ts.map +1 -1
- package/dist/types/synapse.d.ts +19 -1
- package/dist/types/synapse.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -1,511 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* LLM-facing tool description
|
|
2
|
+
* LLM-facing tool description resolution (host-agnostic)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* 1. 一句话总结(plain language)
|
|
9
|
-
* 2. WHEN TO CALL:3-5 个触发模式,带用户原话示例
|
|
10
|
-
* 3. WHEN NOT TO CALL:2-3 个反模式,避免过度调用
|
|
11
|
-
* 4. RETURNS:结果形状 + 下一步动作
|
|
12
|
-
*
|
|
13
|
-
* 设计目标:让 LLM 看到 description 后能立即判断"现在该不该调",
|
|
14
|
-
* 不需要看 instructions 或 CLAUDE.md。
|
|
15
|
-
*
|
|
16
|
-
* 本模块对所有 host 共享:MCP / OpenClaw / 未来 host 都走这里。
|
|
4
|
+
* 历史上这里维护一个独立的 `LLM_TOOL_DESCRIPTIONS` 常量,与 i18n 字典并行,
|
|
5
|
+
* 容易漂移。三层拆分重构把 agent 层描述统一迁入 i18n 字典
|
|
6
|
+
* (`tool.<name>.agent`),实现单一真相源。本模块仅保留薄薄的解析/审计/override 函数,
|
|
7
|
+
* 全部委托到 `localizeToolDescription(..., layer='agent')`。
|
|
17
8
|
*
|
|
18
9
|
* @module @co-engram/core/tools
|
|
19
10
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
* key 是工具名,value 是 { en, zh } 双语描述。
|
|
24
|
-
* 覆盖 standard profile 暴露的全部 16 个工具(含自愈 engram_doctor + 路径树 engram_list_paths)。
|
|
25
|
-
*/
|
|
26
|
-
export const LLM_TOOL_DESCRIPTIONS = {
|
|
27
|
-
engram_search: {
|
|
28
|
-
en: `Search team memory for past decisions, preferences, project context.
|
|
29
|
-
|
|
30
|
-
WHEN TO CALL:
|
|
31
|
-
- User references past work ("we decided", "previously", "last time we")
|
|
32
|
-
- User mentions preferences ("I prefer", "I always use", "I hate when")
|
|
33
|
-
- User asks about project history ("why does X exist", "who decided", "did we discuss")
|
|
34
|
-
- Encountering a bug that may have been seen before
|
|
35
|
-
- User explicitly says "remember" or "did we discuss"
|
|
36
|
-
|
|
37
|
-
WHEN NOT TO CALL:
|
|
38
|
-
- Pure code questions unrelated to team history
|
|
39
|
-
- General programming knowledge (use web search)
|
|
40
|
-
- Simple greetings or acknowledgments
|
|
41
|
-
|
|
42
|
-
RETURNS: Top N engrams (title + summary + score + tags). Use engram_get for full content.`,
|
|
43
|
-
zh: `搜索团队记忆(过去的设计决策、偏好、项目上下文)。
|
|
44
|
-
|
|
45
|
-
何时调用:
|
|
46
|
-
- 用户引用过去的工作("我们之前决定"、"上次"、"以前我们")
|
|
47
|
-
- 用户提到偏好("我喜欢"、"我一直用"、"我讨厌")
|
|
48
|
-
- 用户问项目历史("X 为什么存在"、"谁决定的"、"我们讨论过...吗")
|
|
49
|
-
- 遇到可能之前见过的 bug
|
|
50
|
-
- 用户明确说"记住"或"我们讨论过"
|
|
51
|
-
|
|
52
|
-
何时不调用:
|
|
53
|
-
- 与团队历史无关的纯代码问题
|
|
54
|
-
- 通用编程知识(用 web search)
|
|
55
|
-
- 简单问候
|
|
56
|
-
|
|
57
|
-
返回:Top N 条 engram(标题 + 摘要 + 分数 + tags)。需要全文用 engram_get。`,
|
|
58
|
-
},
|
|
59
|
-
engram_get: {
|
|
60
|
-
en: `Read full content of a single memory (engram) by ID.
|
|
61
|
-
|
|
62
|
-
WHEN TO CALL:
|
|
63
|
-
- After engram_search returned a hit you want to read in full
|
|
64
|
-
- User explicitly asks for details on a specific engram ID
|
|
65
|
-
- You need metadata (importance, tags, verification status) not shown in search summary
|
|
66
|
-
|
|
67
|
-
WHEN NOT TO CALL:
|
|
68
|
-
- You haven't called engram_search yet (search first)
|
|
69
|
-
- The engram ID is from an outdated conversation (re-search to verify)
|
|
70
|
-
|
|
71
|
-
RETURNS: Full content + metadata (createdAt, importance, truthScore, reinforcementCount) + related engram IDs (synapses).`,
|
|
72
|
-
zh: `按 ID 读取单条记忆(engram)的完整内容。
|
|
73
|
-
|
|
74
|
-
何时调用:
|
|
75
|
-
- engram_search 返回的命中需要读全文
|
|
76
|
-
- 用户明确询问某个 engram ID 的详情
|
|
77
|
-
- 需要搜索摘要里没显示的元数据(重要性、tags、验证状态)
|
|
78
|
-
|
|
79
|
-
何时不调用:
|
|
80
|
-
- 还没调过 engram_search(先搜索)
|
|
81
|
-
- engram ID 来自过时的对话(重新搜索验证)
|
|
82
|
-
|
|
83
|
-
返回:完整内容 + 元数据(创建时间、重要性、truthScore、强化次数)+ 相关 engram ID 列表。`,
|
|
84
|
-
},
|
|
85
|
-
engram_create: {
|
|
86
|
-
en: `Create a new memory (engram) for important team knowledge.
|
|
87
|
-
|
|
88
|
-
WHEN TO CALL:
|
|
89
|
-
- User explicitly states a preference ("from now on, use arrow functions")
|
|
90
|
-
- User makes a design decision with rationale ("we'll use PostgreSQL because X")
|
|
91
|
-
- User shares a bug lesson ("this failed because Y, remember to check Z")
|
|
92
|
-
- User corrects an outdated memory ("actually, we switched to X")
|
|
93
|
-
|
|
94
|
-
WHEN NOT TO CALL:
|
|
95
|
-
- For trivial / throwaway information ("the weather is nice")
|
|
96
|
-
- For information already in CLAUDE.md or project README
|
|
97
|
-
- For information the user is just asking about (use engram_search instead)
|
|
98
|
-
|
|
99
|
-
RETURNS: Created engram ID + version. Existing duplicates auto-detected.`,
|
|
100
|
-
zh: `为重要的团队知识创建新记忆(engram)。
|
|
101
|
-
|
|
102
|
-
何时调用:
|
|
103
|
-
- 用户明确表达偏好("以后用 arrow function")
|
|
104
|
-
- 用户做出带理由的设计决策("我们用 PostgreSQL,因为 X")
|
|
105
|
-
- 用户分享 bug 教训("这个失败因为 Y,以后记得检查 Z")
|
|
106
|
-
- 用户纠正过时记忆("其实我们已经改用 X 了")
|
|
107
|
-
|
|
108
|
-
何时不调用:
|
|
109
|
-
- 琐碎/一次性信息("天气不错")
|
|
110
|
-
- CLAUDE.md 或项目 README 已有的信息
|
|
111
|
-
- 用户只是在询问的信息(用 engram_search)
|
|
112
|
-
|
|
113
|
-
返回:创建的 engram ID + 版本号。自动检测重复。`,
|
|
114
|
-
},
|
|
115
|
-
engram_update: {
|
|
116
|
-
en: `Update an existing memory when its content needs refinement (not contradiction).
|
|
117
|
-
|
|
118
|
-
WHEN TO CALL:
|
|
119
|
-
- Adding details to an existing engram ("the migration also needs to handle X")
|
|
120
|
-
- Correcting a typo / imprecise wording in memory
|
|
121
|
-
- The user clarifies a previous memory ("what I meant was...")
|
|
122
|
-
|
|
123
|
-
WHEN NOT TO CALL:
|
|
124
|
-
- The new info contradicts the old (use engram_create + contradiction_resolve instead)
|
|
125
|
-
- The memory is fine as-is (don't update just to refresh timestamp)
|
|
126
|
-
|
|
127
|
-
RETURNS: Updated engram + new version number.`,
|
|
128
|
-
zh: `当已有记忆的内容需要细化(不是矛盾)时更新。
|
|
129
|
-
|
|
130
|
-
何时调用:
|
|
131
|
-
- 给已有 engram 补充细节("迁移还要处理 X")
|
|
132
|
-
- 修正记忆里的笔误/不精确表述
|
|
133
|
-
- 用户澄清之前的记忆("我的意思是...")
|
|
134
|
-
|
|
135
|
-
何时不调用:
|
|
136
|
-
- 新信息和旧的矛盾(用 engram_create + contradiction_resolve)
|
|
137
|
-
- 记忆没问题(不要为了刷新时间戳而更新)
|
|
138
|
-
|
|
139
|
-
返回:更新后的 engram + 新版本号。`,
|
|
140
|
-
},
|
|
141
|
-
engram_list: {
|
|
142
|
-
en: `Browse all memories (paginated), newest first.
|
|
143
|
-
|
|
144
|
-
WHEN TO CALL:
|
|
145
|
-
- User wants an overview of stored memories ("what do you know about me")
|
|
146
|
-
- You need to find a memory but don't have a precise search query
|
|
147
|
-
- Reviewing what's been captured recently
|
|
148
|
-
|
|
149
|
-
WHEN NOT TO CALL:
|
|
150
|
-
- You have a specific query (use engram_search instead — faster and more relevant)
|
|
151
|
-
- Just to check if a memory exists (search by content)
|
|
152
|
-
|
|
153
|
-
RETURNS: List of engram summaries (title, tags, updatedAt) + total count. Use cursor/limit for pagination.`,
|
|
154
|
-
zh: `浏览所有记忆(分页),最新优先。
|
|
155
|
-
|
|
156
|
-
何时调用:
|
|
157
|
-
- 用户想看存储的记忆概览("你知道我什么")
|
|
158
|
-
- 需要找记忆但没精确查询词
|
|
159
|
-
- 回顾最近捕获的内容
|
|
160
|
-
|
|
161
|
-
何时不调用:
|
|
162
|
-
- 有明确查询(用 engram_search 更快更准)
|
|
163
|
-
- 只为检查记忆是否存在(按内容搜)
|
|
164
|
-
|
|
165
|
-
返回:engram 摘要列表(标题、tags、更新时间)+ 总数。支持分页。`,
|
|
166
|
-
},
|
|
167
|
-
synapse_create: {
|
|
168
|
-
en: `Create a typed connection between two memories (synapse).
|
|
169
|
-
|
|
170
|
-
WHEN TO CALL:
|
|
171
|
-
- A new memory extends / contradicts / relates to an existing one
|
|
172
|
-
- User mentions causal or dependency relationship ("X happened because of Y")
|
|
173
|
-
- Connecting a decision to its rationale, or a bug to its fix
|
|
174
|
-
|
|
175
|
-
WHEN NOT TO CALL:
|
|
176
|
-
- The two memories are unrelated
|
|
177
|
-
- You're unsure of the relationship kind (use 'related_to' as default)
|
|
178
|
-
|
|
179
|
-
RETURNS: Synapse ID + from/to engram IDs. Common kinds: extends, contradicts, related_to, caused_by.`,
|
|
180
|
-
zh: `在两条记忆之间创建有类型的连接(synapse)。
|
|
181
|
-
|
|
182
|
-
何时调用:
|
|
183
|
-
- 新记忆扩展/矛盾/关联已有记忆
|
|
184
|
-
- 用户提到因果或依赖关系("X 因为 Y 发生")
|
|
185
|
-
- 把决策链接到理由,或 bug 链接到修复
|
|
186
|
-
|
|
187
|
-
何时不调用:
|
|
188
|
-
- 两条记忆无关
|
|
189
|
-
- 不确定关系类型(默认用 'related_to')
|
|
190
|
-
|
|
191
|
-
返回:synapse ID + from/to engram ID。常见类型:extends、contradicts、related_to、caused_by。`,
|
|
192
|
-
},
|
|
193
|
-
engram_reinforce: {
|
|
194
|
-
en: `Mark a memory as effectively used (positive reinforcement).
|
|
195
|
-
|
|
196
|
-
WHEN TO CALL:
|
|
197
|
-
- You cited an engram ID in your answer and the user accepted the result
|
|
198
|
-
- A retrieved memory directly contributed to solving the task
|
|
199
|
-
- After successfully completing a task that depended on a memory
|
|
200
|
-
|
|
201
|
-
WHEN NOT TO CALL:
|
|
202
|
-
- You didn't actually use the memory (just skimmed it)
|
|
203
|
-
- The task failed or the memory was wrong (use engram_report_failure instead)
|
|
204
|
-
|
|
205
|
-
RETURNS: Memory's strength score increased + effective-use count incremented.`,
|
|
206
|
-
zh: `标记某条记忆被有效使用(正向强化)。
|
|
207
|
-
|
|
208
|
-
何时调用:
|
|
209
|
-
- 你在回答里引用了 engram ID 且用户接受了结果
|
|
210
|
-
- 取回的记忆直接帮助解决了任务
|
|
211
|
-
- 成功完成依赖某条记忆的任务后
|
|
212
|
-
|
|
213
|
-
何时不调用:
|
|
214
|
-
- 实际没用那条记忆(只是扫了一眼)
|
|
215
|
-
- 任务失败或记忆错了(用 engram_report_failure)
|
|
216
|
-
|
|
217
|
-
返回:记忆的强度分数增加 + 有效使用计数 +1。`,
|
|
218
|
-
},
|
|
219
|
-
engram_report_failure: {
|
|
220
|
-
en: `Report a memory as wrong or outdated (negative reinforcement).
|
|
221
|
-
|
|
222
|
-
WHEN TO CALL:
|
|
223
|
-
- User says "that's not right" / "we changed that" / "outdated"
|
|
224
|
-
- A retrieved memory led to a wrong answer
|
|
225
|
-
- Code or reality contradicts the memory
|
|
226
|
-
|
|
227
|
-
WHEN NOT TO CALL:
|
|
228
|
-
- The memory is just incomplete (use engram_update)
|
|
229
|
-
- You're not sure (ask the user first)
|
|
230
|
-
|
|
231
|
-
RETURNS: Memory's failure count increased + strength score decreased. May trigger automatic refutation in a later maintenance cycle.`,
|
|
232
|
-
zh: `报告某条记忆错误或过时(负向强化)。
|
|
233
|
-
|
|
234
|
-
何时调用:
|
|
235
|
-
- 用户说"不对"、"我们改了"、"过时了"
|
|
236
|
-
- 取回的记忆导致了错误答案
|
|
237
|
-
- 代码或现实和记忆矛盾
|
|
238
|
-
|
|
239
|
-
何时不调用:
|
|
240
|
-
- 记忆只是不完整(用 engram_update)
|
|
241
|
-
- 不确定(先问用户)
|
|
242
|
-
|
|
243
|
-
返回:记忆的失败次数增加 + 强度分数下降。可能在后续维护周期自动驳回。`,
|
|
244
|
-
},
|
|
245
|
-
engram_delete: {
|
|
246
|
-
en: `Permanently delete a memory (use with caution).
|
|
247
|
-
|
|
248
|
-
WHEN TO CALL:
|
|
249
|
-
- User explicitly asks to delete ("remove that memory about X")
|
|
250
|
-
- Memory is duplicated and you're keeping only one
|
|
251
|
-
- Memory contains sensitive info that should not persist
|
|
252
|
-
|
|
253
|
-
WHEN NOT TO CALL:
|
|
254
|
-
- Memory is just outdated (use engram_report_failure, let maintenance refute it)
|
|
255
|
-
- User is ambiguous ("forget that" — confirm what they mean)
|
|
256
|
-
- For bulk cleanup (use CLI instead)
|
|
257
|
-
|
|
258
|
-
RETURNS: { deleted: true } or error if not found.`,
|
|
259
|
-
zh: `永久删除一条记忆(谨慎使用)。
|
|
260
|
-
|
|
261
|
-
何时调用:
|
|
262
|
-
- 用户明确要删除("删掉关于 X 的那条记忆")
|
|
263
|
-
- 记忆重复了,只保留一条
|
|
264
|
-
- 记忆含敏感信息不应保留
|
|
265
|
-
|
|
266
|
-
何时不调用:
|
|
267
|
-
- 记忆只是过时(用 engram_report_failure,让维护 refute)
|
|
268
|
-
- 用户表述模糊("忘掉那个"— 确认含义)
|
|
269
|
-
- 批量清理(用 CLI)
|
|
270
|
-
|
|
271
|
-
返回:{ deleted: true } 或未找到错误。`,
|
|
272
|
-
},
|
|
273
|
-
close_learning_loop: {
|
|
274
|
-
en: `Close the verification loop on a memory after confirming its correctness.
|
|
275
|
-
|
|
276
|
-
WHEN TO CALL:
|
|
277
|
-
- You used a memory, verified it works, and want to mark it as confirmed
|
|
278
|
-
- After positive feedback + user confirmation that the memory is accurate
|
|
279
|
-
- Completing the "retrieve → use → verify → confirm" cycle
|
|
280
|
-
|
|
281
|
-
WHEN NOT TO CALL:
|
|
282
|
-
- You haven't actually verified yet (wait until confirmation is solid)
|
|
283
|
-
- The memory turned out wrong (use engram_report_failure)
|
|
284
|
-
|
|
285
|
-
RETURNS: Updated verification status + closed loop metadata.`,
|
|
286
|
-
zh: `确认记忆正确后,关闭验证回路。
|
|
287
|
-
|
|
288
|
-
何时调用:
|
|
289
|
-
- 使用了记忆,验证有效,想标记为已确认
|
|
290
|
-
- 正向反馈 + 用户确认记忆准确后
|
|
291
|
-
- 完成"取回 → 使用 → 验证 → 确认"循环
|
|
292
|
-
|
|
293
|
-
何时不调用:
|
|
294
|
-
- 还没实际验证(等确认扎实后再调)
|
|
295
|
-
- 记忆最终错了(用 engram_report_failure)
|
|
296
|
-
|
|
297
|
-
返回:更新后的验证状态 + 闭环元数据。`,
|
|
298
|
-
},
|
|
299
|
-
contradiction_resolve: {
|
|
300
|
-
en: `Resolve a contradiction between two memories (old vs new).
|
|
301
|
-
|
|
302
|
-
WHEN TO CALL:
|
|
303
|
-
- A new memory explicitly contradicts an older one
|
|
304
|
-
- User confirms the old memory is wrong and should be refuted
|
|
305
|
-
- You need to mark which side wins in a contradiction synapse
|
|
306
|
-
|
|
307
|
-
WHEN NOT TO CALL:
|
|
308
|
-
- The two memories are just different perspectives (use synapse kind 'related_to')
|
|
309
|
-
- You're not sure which is right (ask the user)
|
|
310
|
-
|
|
311
|
-
RETURNS: Resolution record + updated verification status on both engrams.`,
|
|
312
|
-
zh: `解决两条记忆之间的矛盾(旧 vs 新)。
|
|
313
|
-
|
|
314
|
-
何时调用:
|
|
315
|
-
- 新记忆明确矛盾旧记忆
|
|
316
|
-
- 用户确认旧记忆错了应该 refute
|
|
317
|
-
- 需要标记 contradiction synapse 里哪一方胜出
|
|
318
|
-
|
|
319
|
-
何时不调用:
|
|
320
|
-
- 两条记忆只是不同视角(用 synapse kind 'related_to')
|
|
321
|
-
- 不确定哪个对(问用户)
|
|
322
|
-
|
|
323
|
-
返回:resolution 记录 + 两条 engram 的验证状态更新。`,
|
|
324
|
-
},
|
|
325
|
-
engram_list_proposals: {
|
|
326
|
-
en: `List pending memory proposals (implicit capture candidates awaiting review).
|
|
327
|
-
|
|
328
|
-
WHEN TO CALL:
|
|
329
|
-
- System prompt shows "N memory candidates pending"
|
|
330
|
-
- User asks "what proposals do you have" or "review pending memories"
|
|
331
|
-
- Periodically to triage captured but unconfirmed memories
|
|
332
|
-
|
|
333
|
-
WHEN NOT TO CALL:
|
|
334
|
-
- No pending proposals (system prompt will show 0)
|
|
335
|
-
- You just searched explicitly (use engram_search)
|
|
336
|
-
|
|
337
|
-
RETURNS: List of proposals (title, similarity, sample message, proposal ID).`,
|
|
338
|
-
zh: `列出待处理的记忆候选(隐式捕获但待审批的)。
|
|
339
|
-
|
|
340
|
-
何时调用:
|
|
341
|
-
- 系统提示显示"N 个候选记忆待处理"
|
|
342
|
-
- 用户问"有什么候选"或"查看待处理记忆"
|
|
343
|
-
- 定期清理已捕获但未确认的记忆
|
|
344
|
-
|
|
345
|
-
何时不调用:
|
|
346
|
-
- 没有待处理候选(系统提示会显示 0)
|
|
347
|
-
- 刚刚显式搜索过(用 engram_search)
|
|
348
|
-
|
|
349
|
-
返回:候选列表(标题、相似度、样本消息、proposal ID)。`,
|
|
350
|
-
},
|
|
351
|
-
engram_accept_proposal: {
|
|
352
|
-
en: `Accept a pending memory proposal (convert it to a real engram).
|
|
353
|
-
|
|
354
|
-
WHEN TO CALL:
|
|
355
|
-
- User confirms a proposal is valid ("yes, save that")
|
|
356
|
-
- You reviewed a proposal and it captures a real preference/decision
|
|
357
|
-
|
|
358
|
-
WHEN NOT TO CALL:
|
|
359
|
-
- The proposal is wrong or low quality (use engram_dismiss_proposal)
|
|
360
|
-
- You haven't reviewed it yet
|
|
361
|
-
|
|
362
|
-
RETURNS: Created engram ID + proposal marked as accepted.`,
|
|
363
|
-
zh: `接受待处理的候选(转成真正的 engram)。
|
|
364
|
-
|
|
365
|
-
何时调用:
|
|
366
|
-
- 用户确认候选有效("对,保存那个")
|
|
367
|
-
- 你审核后认为候选捕获了真实偏好/决策
|
|
368
|
-
|
|
369
|
-
何时不调用:
|
|
370
|
-
- 候选错误或质量低(用 engram_dismiss_proposal)
|
|
371
|
-
- 还没审核
|
|
372
|
-
|
|
373
|
-
返回:创建的 engram ID + 候选标记为已接受。`,
|
|
374
|
-
},
|
|
375
|
-
engram_dismiss_proposal: {
|
|
376
|
-
en: `Dismiss a pending memory proposal (reject the capture).
|
|
377
|
-
|
|
378
|
-
WHEN TO CALL:
|
|
379
|
-
- User says "no, that's not worth saving"
|
|
380
|
-
- Proposal is noisy / low quality / already covered
|
|
381
|
-
- After review, you decide it shouldn't become a memory
|
|
382
|
-
|
|
383
|
-
WHEN NOT TO CALL:
|
|
384
|
-
- You haven't reviewed the proposal content
|
|
385
|
-
- The proposal is borderline (accept + refine instead)
|
|
386
|
-
|
|
387
|
-
RETURNS: Proposal marked as dismissed + removed from pending list.`,
|
|
388
|
-
zh: `驳回待处理的候选(拒绝捕获)。
|
|
389
|
-
|
|
390
|
-
何时调用:
|
|
391
|
-
- 用户说"不,不值得保存"
|
|
392
|
-
- 候选是噪声/低质量/已被覆盖
|
|
393
|
-
- 审核后决定不应成为记忆
|
|
394
|
-
|
|
395
|
-
何时不调用:
|
|
396
|
-
- 还没审核候选内容
|
|
397
|
-
- 候选处于边缘(改为接受 + 细化)
|
|
398
|
-
|
|
399
|
-
返回:候选标记为已驳回 + 从待处理列表移除。`,
|
|
400
|
-
},
|
|
401
|
-
engram_doctor: {
|
|
402
|
-
en: `Run a self-healing scan over the memory repo and report findings.
|
|
403
|
-
|
|
404
|
-
Auto-fixes: moved files (index re-points), renamed titles (re-slug + rename), stale index entries (cleared). Reports for manual review: dangling synapse references and orphan markdown.
|
|
405
|
-
|
|
406
|
-
WHEN TO CALL:
|
|
407
|
-
- User says "my memory looks wrong" or "search misses entries I expected"
|
|
408
|
-
- User manually edited/renamed files under the data root
|
|
409
|
-
- After a Git merge that touched the data repo
|
|
410
|
-
- Periodic health check (once per session)
|
|
411
|
-
|
|
412
|
-
WHEN NOT TO CALL:
|
|
413
|
-
- No observed inconsistency
|
|
414
|
-
- User wants a specific engram (use engram_get)
|
|
415
|
-
|
|
416
|
-
RETURNS: started/finished timestamps, total counts, autoFixesApplied, pendingManualReview, and the full issues array (kind + path + message + autoFixed).`,
|
|
417
|
-
zh: `对记忆仓库做一次自愈扫描。
|
|
418
|
-
|
|
419
|
-
自动修复:文件移动(索引重新指向)、标题重命名(重新生成 slug + 重命名)、过期索引项(清除)。仅报告:dangling synapse 引用、孤儿 markdown。
|
|
420
|
-
|
|
421
|
-
何时调用:
|
|
422
|
-
- 用户说"记忆看起来不对"或"搜索找不到该有的条目"
|
|
423
|
-
- 用户手动编辑/重命名了数据目录下的文件
|
|
424
|
-
- 触及数据仓库的 Git 合并之后
|
|
425
|
-
- 定期健康检查(每次会话一次)
|
|
426
|
-
|
|
427
|
-
何时不调用:
|
|
428
|
-
- 没观察到不一致
|
|
429
|
-
- 用户想看具体某条 engram(用 engram_get)
|
|
430
|
-
|
|
431
|
-
返回:开始/结束时间戳、总计数、自动修复数、待审核数,以及完整 issues 列表。`,
|
|
432
|
-
},
|
|
433
|
-
engram_list_paths: {
|
|
434
|
-
en: `Show the physical directory tree of the memory repo so you can orient before searching.
|
|
435
|
-
|
|
436
|
-
Each node carries engramCount (cumulative for that subtree). Use it to see where memory is concentrated (which domains, which projects) before deciding what to search for.
|
|
437
|
-
|
|
438
|
-
WHEN TO CALL:
|
|
439
|
-
- Start of a session, before any engram_search, to map the landscape
|
|
440
|
-
- User asks "what do we have memories about" or "what areas does the team work on"
|
|
441
|
-
- You want to pick a more specific domain tag before searching
|
|
442
|
-
|
|
443
|
-
WHEN NOT TO CALL:
|
|
444
|
-
- You already know the query — go straight to engram_search
|
|
445
|
-
- User wants a specific engram (use engram_get)
|
|
446
|
-
|
|
447
|
-
RETURNS: Nested { path, engramCount, children } tree rooted at '/'. Optional maxDepth (1-10, default 5).`,
|
|
448
|
-
zh: `展示记忆仓库的物理目录树,让你在搜索前先建立全局认知。
|
|
449
|
-
|
|
450
|
-
每节点带 engramCount(子树累计)。用它了解记忆集中在哪些领域、项目,再决定搜什么。
|
|
451
|
-
|
|
452
|
-
何时调用:
|
|
453
|
-
- 会话开始时,在 engram_search 之前建立全局观感
|
|
454
|
-
- 用户问"我们有哪些方面的记忆"或"团队做什么领域"
|
|
455
|
-
- 准备搜索但想先选更具体的 domain tag
|
|
456
|
-
|
|
457
|
-
何时不调用:
|
|
458
|
-
- 已知道具体查询——直接 engram_search
|
|
459
|
-
- 用户想要某条 engram(用 engram_get)
|
|
460
|
-
|
|
461
|
-
返回:嵌套 { path, engramCount, children } 树,根为 '/'。可选 maxDepth(1-10,默认 5)。`,
|
|
462
|
-
},
|
|
463
|
-
};
|
|
464
|
-
/**
|
|
465
|
-
* 被禁止的实现术语(出现则视为描述不 LLM-friendly)
|
|
466
|
-
*
|
|
467
|
-
* 这些是开发者视角的术语,LLM 看到反而困惑。
|
|
468
|
-
*/
|
|
469
|
-
const FORBIDDEN_TERMS = [
|
|
470
|
-
"FTS",
|
|
471
|
-
"LTP",
|
|
472
|
-
"Hebbian",
|
|
473
|
-
"RPE",
|
|
474
|
-
"reinforcementScore",
|
|
475
|
-
"effectiveRetrievals",
|
|
476
|
-
"failedUses",
|
|
477
|
-
"engram_reinforce", // 不应在描述里引用其他工具的内部字段
|
|
478
|
-
"truthScore", // 例外:engram_get 描述里可以保留作为字段名
|
|
479
|
-
];
|
|
11
|
+
import { localizeToolDescription, en, zh } from "../i18n/index.js";
|
|
12
|
+
import { applyRuntimeCheck, } from "../observability/runtime-description-check.js";
|
|
480
13
|
/**
|
|
481
14
|
* Resolve a tool's LLM-facing description.
|
|
482
15
|
*
|
|
483
16
|
* Resolution order:
|
|
484
|
-
* 1.
|
|
17
|
+
* 1. i18n 字典 `tool.<name>.agent`(单一真相源,迁移自原 LLM_TOOL_DESCRIPTIONS)
|
|
485
18
|
* 2. fallback (caller-provided default, usually the core `tool.*` i18n string)
|
|
486
19
|
*
|
|
487
|
-
*
|
|
20
|
+
* 返回字符串,不修改入参。
|
|
21
|
+
*
|
|
22
|
+
* Task 3.1 后:解析结果会被运行时校验(FORBIDDEN_TERMS)。默认 `warn` 模式
|
|
23
|
+
* (含禁词时返回带 [⚠ description violates] 前缀的标记文本)。生产 host 启动时
|
|
24
|
+
* 应传 `options.failMode = 'strict'`,让违规描述立刻 throw。
|
|
488
25
|
*/
|
|
489
|
-
export function resolveLlmDescription(tool, language, fallback) {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
return
|
|
26
|
+
export function resolveLlmDescription(tool, language, fallback, options) {
|
|
27
|
+
// localizeToolDescription 的最终 fallback 是 toolName;此处把 tool.description
|
|
28
|
+
// 作为中间 fallback,保持与原 LLM_TOOL_DESCRIPTIONS 时代一致的语义:
|
|
29
|
+
// agent 字典 → fallback (caller 提供) → tool.description → toolName
|
|
30
|
+
const resolved = localizeToolDescription(tool.name, language, fallback ?? tool.description, "agent");
|
|
31
|
+
return applyRuntimeCheck(resolved, tool.name, options);
|
|
495
32
|
}
|
|
496
33
|
/**
|
|
497
34
|
* Override 工具的 description
|
|
498
35
|
*
|
|
499
|
-
* 如果 tool
|
|
36
|
+
* 如果 `tool.<name>.agent` 在 i18n 字典中存在,返回新的 tool(描述被替换);
|
|
500
37
|
* 否则返回原 tool(保持 caller 注入的 description / core i18n 描述)。
|
|
501
38
|
*
|
|
502
39
|
* 不修改输入 tool(返回新对象)。
|
|
503
40
|
*/
|
|
504
41
|
export function overrideDescription(tool, language) {
|
|
505
|
-
const
|
|
506
|
-
|
|
42
|
+
const dict = (language === "zh" ? zh : en);
|
|
43
|
+
const key = `tool.${tool.name}.agent`;
|
|
44
|
+
const newDescription = dict[key];
|
|
45
|
+
if (!newDescription)
|
|
507
46
|
return tool;
|
|
508
|
-
const newDescription = language === "zh" ? entry.zh : entry.en;
|
|
509
47
|
return { ...tool, description: newDescription };
|
|
510
48
|
}
|
|
511
49
|
/**
|
|
@@ -514,6 +52,35 @@ export function overrideDescription(tool, language) {
|
|
|
514
52
|
export function overrideDescriptions(tools, language) {
|
|
515
53
|
return tools.map((t) => overrideDescription(t, language));
|
|
516
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* 被禁止的实现术语(出现则视为描述不 LLM-friendly)
|
|
57
|
+
*
|
|
58
|
+
* 这些是开发者视角的术语,LLM 看到反而困惑。
|
|
59
|
+
* technical 层允许;agent 层禁止。
|
|
60
|
+
*/
|
|
61
|
+
const FORBIDDEN_TERMS = [
|
|
62
|
+
"FTS",
|
|
63
|
+
"LTP",
|
|
64
|
+
"Hebbian",
|
|
65
|
+
"RPE",
|
|
66
|
+
"reinforcementScore",
|
|
67
|
+
"effectiveRetrievals",
|
|
68
|
+
"failedUses",
|
|
69
|
+
"engram_reinforce", // 不应在描述里引用其他工具的内部字段
|
|
70
|
+
"truthScore", // 例外:engram_get 描述里可以保留作为字段名
|
|
71
|
+
];
|
|
72
|
+
export { FORBIDDEN_TERMS };
|
|
73
|
+
/**
|
|
74
|
+
* 列出 i18n 字典中所有 agent 层 key 对应的工具名
|
|
75
|
+
*
|
|
76
|
+
* 用于测试枚举覆盖度。返回工具名(去掉 `tool.` 前缀和 `.agent` 后缀)。
|
|
77
|
+
*/
|
|
78
|
+
export function listAgentDescribedTools() {
|
|
79
|
+
const dict = en;
|
|
80
|
+
return Object.keys(dict)
|
|
81
|
+
.filter((k) => k.startsWith("tool.") && k.endsWith(".agent"))
|
|
82
|
+
.map((k) => k.slice("tool.".length, -".agent".length));
|
|
83
|
+
}
|
|
517
84
|
/**
|
|
518
85
|
* 检查描述质量(用于测试 / CI gate)
|
|
519
86
|
*
|
|
@@ -521,10 +88,10 @@ export function overrideDescriptions(tools, language) {
|
|
|
521
88
|
* 'truthScore' 在 engram_get 的 RETURNS 段是允许的(作为字段名引用)。
|
|
522
89
|
*/
|
|
523
90
|
export function auditDescriptionQuality(name, language) {
|
|
524
|
-
const
|
|
525
|
-
|
|
91
|
+
const dict = (language === "zh" ? zh : en);
|
|
92
|
+
const text = dict[`tool.${name}.agent`];
|
|
93
|
+
if (!text)
|
|
526
94
|
return [`tool "${name}" has no LLM-facing description`];
|
|
527
|
-
const text = language === "zh" ? entry.zh : entry.en;
|
|
528
95
|
const violations = [];
|
|
529
96
|
// 结构检查
|
|
530
97
|
if (!text.includes("WHEN TO CALL") && !text.includes("何时调用")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-descriptions.js","sourceRoot":"","sources":["../../src/tools/llm-descriptions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"llm-descriptions.js","sourceRoot":"","sources":["../../src/tools/llm-descriptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,uBAAuB,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,iBAAiB,GAElB,MAAM,+CAA+C,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAO,EACP,QAAkB,EAClB,QAAiB,EACjB,OAA6B;IAE7B,uEAAuE;IACvE,oDAAoD;IACpD,gEAAgE;IAChE,MAAM,QAAQ,GAAG,uBAAuB,CACtC,IAAI,CAAC,IAAI,EACT,QAAQ,EACR,QAAQ,IAAI,IAAI,CAAC,WAAW,EAC5B,OAAO,CACR,CAAC;IACF,OAAO,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAO,EACP,QAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAqC,CAAC;IAC/E,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,IAAI,QAAQ,CAAC;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAmB,EACnB,QAAkB;IAElB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,eAAe,GAAsB;IACzC,KAAK;IACL,KAAK;IACL,SAAS;IACT,KAAK;IACL,oBAAoB;IACpB,qBAAqB;IACrB,YAAY;IACZ,kBAAkB,EAAE,oBAAoB;IACxC,YAAY,EAAE,6BAA6B;CAC5C,CAAC;AACF,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,EAAsC,CAAC;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,QAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAqC,CAAC;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,SAAS,IAAI,iCAAiC,CAAC,CAAC;IACnE,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,OAAO;IACP,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,UAAU,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,UAAU,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC5B,UAAU,CAAC,IAAI,CACb,0BAA0B,IAAI,CAAC,MAAM,MAAM,SAAS,SAAS,CAC9D,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC5B,UAAU,CAAC,IAAI,CACb,yBAAyB,IAAI,CAAC,MAAM,MAAM,SAAS,SAAS,CAC7D,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,WAAW,GAAG,IAAI,KAAK,YAAY,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,IAAI,KAAK,YAAY,IAAI,WAAW;YAAE,SAAS;QACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 输入规范化与校验管道(P0-3 / P1-72 / P1-78 修复)
|
|
3
|
+
*
|
|
4
|
+
* 单一抽象层,提供 validateInput 的强化版 parseAndNormalize:
|
|
5
|
+
* - `.strict()` 拒绝 unknown keys(P0-3 修复:Zod 默认 strip 让 filter 字段
|
|
6
|
+
* 错写都被静默吞,导致调试困难)
|
|
7
|
+
* - ULID 字段 `.toUpperCase()` 规范化(P1-78 修复:ULID 规范本身大小写不
|
|
8
|
+
* 敏感,但工具层未做规范化,小写输入会返回 INVALID_ID)
|
|
9
|
+
*
|
|
10
|
+
* 向后兼容:既有工具继续用 validateInput(schema, raw);新工具或修复后的
|
|
11
|
+
* 工具改用 parseAndNormalize(schema, raw, { ulidFields: [...] })。
|
|
12
|
+
*
|
|
13
|
+
* @module @co-engram/core/tools
|
|
14
|
+
*/
|
|
15
|
+
import type { ZodTypeAny } from "zod";
|
|
16
|
+
/** ULID canonical 字符集(Crockford base32,大小写不敏感) */
|
|
17
|
+
export declare const ULID_PATTERN: RegExp;
|
|
18
|
+
/**
|
|
19
|
+
* 把任何 ULID-like 字符串规范化为 canonical 大写形式。
|
|
20
|
+
*
|
|
21
|
+
* 用于工具入口的 id / synapseId / fromId / toId 字段。
|
|
22
|
+
* 输入不匹配 ULID 格式时返回原值(让下游 lookup 抛 INVALID_ID,不在此处校验)。
|
|
23
|
+
*/
|
|
24
|
+
export declare function normalizeUlid(input: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* 强化版输入校验。
|
|
27
|
+
*
|
|
28
|
+
* 行为:
|
|
29
|
+
* 1. 用 `schema.strict().safeParse(raw)`(拒绝 unknown keys)
|
|
30
|
+
* 2. 对 `opts.ulidFields` 列出的字段做 `.toUpperCase()` 规范化
|
|
31
|
+
* 3. 失败时抛与 validateInput 同样格式的错误(便于调用方统一捕获)
|
|
32
|
+
*
|
|
33
|
+
* 与 validateInput 的差异:
|
|
34
|
+
* - validateInput 默认 strip unknown keys(向后兼容,但隐藏 typo)
|
|
35
|
+
* - parseAndNormalize 强制 strict + 可选 ULID 规范化(显式安全)
|
|
36
|
+
*
|
|
37
|
+
* 建议新工具或修复后的工具用 parseAndNormalize;既有工具保持 validateInput。
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseAndNormalize<T>(schema: ZodTypeAny, raw: unknown, options?: {
|
|
40
|
+
/** 需要做 ULID `.toUpperCase()` 规范化的字段名列表 */
|
|
41
|
+
readonly ulidFields?: readonly string[];
|
|
42
|
+
}): T;
|
|
43
|
+
//# sourceMappingURL=normalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalization.d.ts","sourceRoot":"","sources":["../../src/tools/normalization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEtC,kDAAkD;AAClD,eAAO,MAAM,YAAY,QAA6B,CAAC;AAEvD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE;IACP,0CAA0C;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,GACL,CAAC,CA8BH"}
|