recallnest 1.4.1

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.
Files changed (261) hide show
  1. package/.claude-plugin/CLAUDE.md +29 -0
  2. package/.claude-plugin/marketplace.json +18 -0
  3. package/.env.example +3 -0
  4. package/.github/workflows/ci.yml +28 -0
  5. package/.mcp.json +9 -0
  6. package/CHANGELOG.md +51 -0
  7. package/CLAUDE.md +42 -0
  8. package/DEMO.md +94 -0
  9. package/EVAL.md +89 -0
  10. package/FAILURES.md +75 -0
  11. package/LICENSE +21 -0
  12. package/OPERATIONS.md +59 -0
  13. package/README.md +427 -0
  14. package/README_CN.md +425 -0
  15. package/ROADMAP.md +198 -0
  16. package/assets/recallnest-workbench.png +0 -0
  17. package/assets/ui/app.js +807 -0
  18. package/assets/ui/index.html +154 -0
  19. package/assets/ui/styles.css +605 -0
  20. package/assets/wechat-qr.jpg +0 -0
  21. package/config.json.example +38 -0
  22. package/daily-recall.sh +87 -0
  23. package/daily-reflections/2026-03-05.md +15 -0
  24. package/daily-reflections/2026-03-06.md +15 -0
  25. package/daily-reflections/2026-03-07.md +7 -0
  26. package/daily-reflections/2026-03-08.md +34 -0
  27. package/daily-reflections/2026-03-09.md +35 -0
  28. package/daily-reflections/2026-03-10.md +36 -0
  29. package/daily-reflections/2026-03-11.md +35 -0
  30. package/daily-reflections/2026-03-12.md +36 -0
  31. package/daily-reflections/2026-03-13.md +35 -0
  32. package/daily-reflections/2026-03-14.md +35 -0
  33. package/daily-reflections/2026-03-15.md +35 -0
  34. package/daily-reflections/2026-03-16.md +41 -0
  35. package/daily-reflections/2026-03-17.md +10 -0
  36. package/daily-reflections/2026-03-18.md +10 -0
  37. package/daily-reflections/2026-03-19.md +10 -0
  38. package/daily-reflections/2026-03-20.md +10 -0
  39. package/daily-reflections/2026-03-21.md +10 -0
  40. package/daily-reflections/2026-03-22.md +10 -0
  41. package/daily-reflections/2026-03-23.md +10 -0
  42. package/daily-reflections/2026-03-24.md +10 -0
  43. package/daily-reflections/2026-03-25.md +32 -0
  44. package/daily-reflections/2026-03-26.md +37 -0
  45. package/daily-reflections/2026-03-27.md +35 -0
  46. package/daily-reflections/2026-03-28.md +35 -0
  47. package/daily-reflections/2026-03-29.md +35 -0
  48. package/daily-reflections/2026-03-30.md +36 -0
  49. package/daily-reflections/2026-03-31.md +35 -0
  50. package/daily-reflections/2026-04-01.md +35 -0
  51. package/docs/api-reference.md +1291 -0
  52. package/docs/architecture.md +168 -0
  53. package/docs/memory-boundary-contract.md +226 -0
  54. package/docs/memory-categories.md +119 -0
  55. package/docs/pipeline-audit-ultramemory.md +177 -0
  56. package/docs/plans/2026-03-08-query-expansion.md +270 -0
  57. package/docs/plans/2026-03-16-continuity-layer.md +196 -0
  58. package/docs/plans/mcp-tiering-plan.md +126 -0
  59. package/docs/research/recall-quality-audit-2026-03-22.md +153 -0
  60. package/docs/self-evolution.md +198 -0
  61. package/docs/superpowers/plans/2026-03-19-ingest-pipeline-upgrade.md +782 -0
  62. package/docs/superpowers/specs/2026-03-19-ingest-pipeline-upgrade-design.md +77 -0
  63. package/docs/superpowers/specs/2026-03-23-pull-claude-desktop-design.md +95 -0
  64. package/eval/cases.json +85 -0
  65. package/eval/continuity/case-seeds.json +90 -0
  66. package/eval/continuity/cases.json +302 -0
  67. package/eval/continuity/memory-seeds.json +26 -0
  68. package/eval/continuity/pattern-seeds.json +100 -0
  69. package/eval/continuity/results-2026-03-16.md +117 -0
  70. package/eval/continuity/results-2026-03-19.md +453 -0
  71. package/eval/continuity/runbook.md +110 -0
  72. package/eval/continuity/seed-cases.md +54 -0
  73. package/eval/reports/2026-03-06-abstract-query-baseline.md +96 -0
  74. package/eval/reports/2026-03-06-aws-ssh-baseline.md +82 -0
  75. package/eval/reports/2026-03-06-baseline.md +82 -0
  76. package/eval/reports/query-expansion.md +138 -0
  77. package/integrations/README.md +57 -0
  78. package/integrations/claude-code/README.md +133 -0
  79. package/integrations/claude-code/claude-md-snippet.md +31 -0
  80. package/integrations/claude-code/setup.sh +66 -0
  81. package/integrations/claude-code/smoke-continuity.sh +452 -0
  82. package/integrations/codex/README.md +49 -0
  83. package/integrations/codex/agents-md-snippet.md +31 -0
  84. package/integrations/codex/setup.sh +58 -0
  85. package/integrations/examples/claude-agent-sdk/memory-agent.ts +182 -0
  86. package/integrations/examples/langchain/memory-chain.py +111 -0
  87. package/integrations/examples/openai-agents-sdk/memory-agent.py +109 -0
  88. package/integrations/gemini-cli/README.md +57 -0
  89. package/integrations/gemini-cli/gemini-md-snippet.md +31 -0
  90. package/integrations/gemini-cli/setup.sh +64 -0
  91. package/integrations/shared/install-managed-block.sh +51 -0
  92. package/lm +19 -0
  93. package/package.json +50 -0
  94. package/plan-v1.2-distributable.md +105 -0
  95. package/scripts/archive-distilled-junk.ts +116 -0
  96. package/scripts/backfill-l0l1l2.ts +98 -0
  97. package/scripts/blind-scan.ts +588 -0
  98. package/scripts/cleanup-step1-exact-dups.ts +117 -0
  99. package/scripts/cleanup-step2-template-dups.ts +113 -0
  100. package/scripts/cleanup-step3-stale-content.ts +149 -0
  101. package/scripts/cleanup-step4-orphan-scopes.ts +131 -0
  102. package/scripts/delete-distilled-junk.ts +88 -0
  103. package/scripts/distill-facts.ts +305 -0
  104. package/scripts/health-check.ts +343 -0
  105. package/scripts/incremental-ingest.sh +71 -0
  106. package/scripts/mlp-health-check.ts +382 -0
  107. package/scripts/pull-claude-desktop.ts +515 -0
  108. package/scripts/re-ingest-cc.sh +66 -0
  109. package/scripts/rebalance-memory-health.ts +181 -0
  110. package/scripts/run-desktop-ingest.sh +11 -0
  111. package/scripts/start-server.sh +12 -0
  112. package/scripts/viz-dashboard.html +423 -0
  113. package/scripts/viz-export.ts +703 -0
  114. package/src/__tests__/access-tracker-novelty.test.ts +228 -0
  115. package/src/__tests__/auto-consolidation.test.ts +168 -0
  116. package/src/__tests__/auto-recall.test.ts +131 -0
  117. package/src/__tests__/batch-dedup.test.ts +65 -0
  118. package/src/__tests__/capture-engine.test.ts +1142 -0
  119. package/src/__tests__/capture-heuristic.test.ts +171 -0
  120. package/src/__tests__/cascade-forget.test.ts +210 -0
  121. package/src/__tests__/category-min-scores.test.ts +33 -0
  122. package/src/__tests__/confidence-tracker.test.ts +196 -0
  123. package/src/__tests__/conflict-advisor.test.ts +206 -0
  124. package/src/__tests__/conflict-escalation.test.ts +149 -0
  125. package/src/__tests__/conflict-lifecycle.test.ts +83 -0
  126. package/src/__tests__/conflict-output.test.ts +85 -0
  127. package/src/__tests__/conflict-store.test.ts +374 -0
  128. package/src/__tests__/consolidation-engine.test.ts +181 -0
  129. package/src/__tests__/context-composer-pins.test.ts +64 -0
  130. package/src/__tests__/context-composer-task-selection.test.ts +24 -0
  131. package/src/__tests__/context-renderer.test.ts +91 -0
  132. package/src/__tests__/continuity-eval.test.ts +275 -0
  133. package/src/__tests__/continuity-schema.test.ts +97 -0
  134. package/src/__tests__/core-recall-eval.test.ts +235 -0
  135. package/src/__tests__/core-summary.test.ts +109 -0
  136. package/src/__tests__/dedup-actions.test.ts +58 -0
  137. package/src/__tests__/deterministic-id.test.ts +39 -0
  138. package/src/__tests__/doctor.test.ts +303 -0
  139. package/src/__tests__/drill-down.test.ts +108 -0
  140. package/src/__tests__/embedder.test.ts +122 -0
  141. package/src/__tests__/entity-resolver.test.ts +58 -0
  142. package/src/__tests__/event-segmenter.test.ts +153 -0
  143. package/src/__tests__/hotness-blend.test.ts +76 -0
  144. package/src/__tests__/ingest.test.ts +360 -0
  145. package/src/__tests__/kg-extractor.test.ts +184 -0
  146. package/src/__tests__/kg-store.test.ts +198 -0
  147. package/src/__tests__/llm-consolidation.test.ts +226 -0
  148. package/src/__tests__/memory-boundaries.test.ts +237 -0
  149. package/src/__tests__/memory-health-rebalance.test.ts +144 -0
  150. package/src/__tests__/memory-output.test.ts +215 -0
  151. package/src/__tests__/multi-vector.test.ts +242 -0
  152. package/src/__tests__/ppr-traversal.test.ts +256 -0
  153. package/src/__tests__/preference-guard-smoke.test.ts +211 -0
  154. package/src/__tests__/preference-matcher.test.ts +230 -0
  155. package/src/__tests__/preference-slots.test.ts +106 -0
  156. package/src/__tests__/prospective-memory.test.ts +283 -0
  157. package/src/__tests__/query-entity-detector.test.ts +171 -0
  158. package/src/__tests__/query-expander.test.ts +34 -0
  159. package/src/__tests__/recall-mode.test.ts +64 -0
  160. package/src/__tests__/result-synthesizer.test.ts +198 -0
  161. package/src/__tests__/resume-context.test.ts +4743 -0
  162. package/src/__tests__/retrieval-trace.test.ts +213 -0
  163. package/src/__tests__/retriever-boundary-weight.test.ts +136 -0
  164. package/src/__tests__/retroactive-boost.test.ts +223 -0
  165. package/src/__tests__/scope-inventory.test.ts +200 -0
  166. package/src/__tests__/scope-policy.test.ts +69 -0
  167. package/src/__tests__/session-checkpoint.test.ts +259 -0
  168. package/src/__tests__/session-gc.test.ts +215 -0
  169. package/src/__tests__/store-scope-audit.test.ts +81 -0
  170. package/src/__tests__/temporal-parser.test.ts +241 -0
  171. package/src/__tests__/term-registry.test.ts +121 -0
  172. package/src/__tests__/tool-output-compressor.test.ts +133 -0
  173. package/src/__tests__/version-manager.test.ts +213 -0
  174. package/src/__tests__/workflow-observation.test.ts +400 -0
  175. package/src/access-tracker.ts +316 -0
  176. package/src/adaptive-retrieval.ts +64 -0
  177. package/src/api-server.ts +667 -0
  178. package/src/asset-sync.ts +79 -0
  179. package/src/auto-consolidation.ts +133 -0
  180. package/src/auto-gc.ts +124 -0
  181. package/src/auto-recall.ts +95 -0
  182. package/src/capture-engine.ts +931 -0
  183. package/src/capture-heuristic.ts +177 -0
  184. package/src/cascade-forget.ts +135 -0
  185. package/src/chunker.ts +253 -0
  186. package/src/cli.ts +1917 -0
  187. package/src/confidence-tracker.ts +166 -0
  188. package/src/conflict-advisor.ts +433 -0
  189. package/src/conflict-engine.ts +181 -0
  190. package/src/conflict-escalation.ts +138 -0
  191. package/src/conflict-lifecycle.ts +67 -0
  192. package/src/conflict-output.ts +218 -0
  193. package/src/conflict-schema.ts +130 -0
  194. package/src/conflict-store.ts +127 -0
  195. package/src/consolidation-engine.ts +256 -0
  196. package/src/context-composer-pins.ts +183 -0
  197. package/src/context-composer-queries.ts +121 -0
  198. package/src/context-composer-scope.ts +56 -0
  199. package/src/context-composer-stable-selection.ts +200 -0
  200. package/src/context-composer-stable.ts +217 -0
  201. package/src/context-composer-task-fallbacks.ts +36 -0
  202. package/src/context-composer-task-ranking.ts +197 -0
  203. package/src/context-composer-task-results.ts +137 -0
  204. package/src/context-composer-task-selection.ts +342 -0
  205. package/src/context-composer-text.ts +57 -0
  206. package/src/context-composer.ts +300 -0
  207. package/src/context-renderer.ts +179 -0
  208. package/src/decay-engine.ts +189 -0
  209. package/src/doctor.ts +543 -0
  210. package/src/embedder.ts +557 -0
  211. package/src/entity-resolver.ts +131 -0
  212. package/src/eval.ts +632 -0
  213. package/src/event-segmenter.ts +216 -0
  214. package/src/ingest.ts +1822 -0
  215. package/src/kg-extractor.ts +217 -0
  216. package/src/kg-store.ts +353 -0
  217. package/src/legacy-scope-review.ts +53 -0
  218. package/src/llm-client.ts +629 -0
  219. package/src/llm-consolidation.ts +168 -0
  220. package/src/mcp-server.ts +1337 -0
  221. package/src/memory-assets.ts +475 -0
  222. package/src/memory-boundaries.ts +354 -0
  223. package/src/memory-health-rebalance.ts +220 -0
  224. package/src/memory-output.ts +474 -0
  225. package/src/memory-schema.ts +184 -0
  226. package/src/multi-vector.ts +234 -0
  227. package/src/noise-filter.ts +155 -0
  228. package/src/ppr-traversal.ts +279 -0
  229. package/src/preference-matcher.ts +174 -0
  230. package/src/preference-slots.ts +259 -0
  231. package/src/prospective-memory.ts +198 -0
  232. package/src/query-entity-detector.ts +207 -0
  233. package/src/query-expander.ts +98 -0
  234. package/src/result-synthesizer.ts +114 -0
  235. package/src/retrieval-profiles.ts +101 -0
  236. package/src/retrieval-trace.ts +94 -0
  237. package/src/retriever.ts +1338 -0
  238. package/src/retroactive-boost.ts +154 -0
  239. package/src/rif.ts +73 -0
  240. package/src/runtime-config.ts +172 -0
  241. package/src/schema-utils.ts +56 -0
  242. package/src/scope-inventory.ts +310 -0
  243. package/src/scope-policy.ts +142 -0
  244. package/src/session-engine.ts +168 -0
  245. package/src/session-output.ts +96 -0
  246. package/src/session-schema.ts +60 -0
  247. package/src/session-store.ts +293 -0
  248. package/src/stderr-log.ts +16 -0
  249. package/src/store.ts +903 -0
  250. package/src/temporal-parser.ts +318 -0
  251. package/src/term-registry.ts +791 -0
  252. package/src/tool-output-compressor.ts +115 -0
  253. package/src/tracker.ts +57 -0
  254. package/src/ui-server.ts +430 -0
  255. package/src/version-manager.ts +172 -0
  256. package/src/workflow-observation-engine.ts +316 -0
  257. package/src/workflow-observation-managed.ts +83 -0
  258. package/src/workflow-observation-output.ts +86 -0
  259. package/src/workflow-observation-schema.ts +87 -0
  260. package/src/workflow-observation-scope-review.ts +409 -0
  261. package/src/workflow-observation-store.ts +69 -0
@@ -0,0 +1,791 @@
1
+ export const CONTINUITY_TASK_TERMS = [
2
+ "新窗口",
3
+ "fresh window",
4
+ "new window",
5
+ "cross window",
6
+ "跨窗口",
7
+ "上个窗口",
8
+ "之前讨论过",
9
+ "刚才",
10
+ "不要让我重复前情",
11
+ "重复前情",
12
+ "接力",
13
+ "handoff",
14
+ "resume",
15
+ "session",
16
+ "checkpoint",
17
+ "continuity",
18
+ "terminal",
19
+ ];
20
+
21
+ const CONTINUATION_VERB_TERMS = [
22
+ "continue",
23
+ "pick up",
24
+ "left off",
25
+ "继续",
26
+ "接着",
27
+ "接上",
28
+ "续上",
29
+ "回到",
30
+ "捡起来",
31
+ "做到哪",
32
+ "之前",
33
+ "上次",
34
+ ];
35
+
36
+ const CONTINUATION_CONTEXT_TERMS = [
37
+ "recallnest",
38
+ "project",
39
+ "项目",
40
+ "window",
41
+ "窗口",
42
+ "terminal",
43
+ "终端",
44
+ "前情",
45
+ "session",
46
+ "checkpoint",
47
+ "handoff",
48
+ "接力",
49
+ "同一个",
50
+ "memory layer",
51
+ "shared memory layer",
52
+ "shared memory",
53
+ "memory system",
54
+ "cross-window memory",
55
+ "multi-window memory",
56
+ "记忆层",
57
+ "记忆系统",
58
+ "跨窗口记忆",
59
+ "多窗口记忆",
60
+ "recall pipeline",
61
+ "recall 管线",
62
+ "same project",
63
+ "记忆项目",
64
+ "记忆功能",
65
+ "记忆服务",
66
+ "跨终端记忆",
67
+ "cross-terminal memory",
68
+ "memory service",
69
+ ];
70
+
71
+ export const WORKFLOW_CUE_TERMS = [
72
+ "search_memory",
73
+ "resume_context",
74
+ "checkpoint_session",
75
+ "checkpoint",
76
+ "autorecall",
77
+ "sessionstrategy",
78
+ "workflow",
79
+ "pattern",
80
+ "流程",
81
+ "步骤",
82
+ "模板",
83
+ ];
84
+
85
+ export const STRONG_WORKFLOW_CUE_TERMS = [
86
+ "search_memory",
87
+ "resume_context",
88
+ "checkpoint_session",
89
+ "checkpoint",
90
+ "autorecall",
91
+ "sessionstrategy",
92
+ ];
93
+
94
+ export const CONTINUITY_WORKFLOW_CUE_GROUPS = [
95
+ { key: "search_memory", terms: ["search_memory"] },
96
+ { key: "resume_context", terms: ["resume_context"] },
97
+ { key: "checkpoint", terms: ["checkpoint_session", "latest_checkpoint", "checkpoint"] },
98
+ ];
99
+
100
+ export const STABLE_INSTRUCTION_PREFIXES = [
101
+ "再看看",
102
+ "看看",
103
+ "查看",
104
+ "让我",
105
+ "帮我",
106
+ "继续",
107
+ "接着",
108
+ "排查",
109
+ "处理",
110
+ "同步",
111
+ "确认",
112
+ "检查",
113
+ "测试",
114
+ "review",
115
+ "inspect",
116
+ "check",
117
+ "look at",
118
+ "continue",
119
+ "help me",
120
+ "let me",
121
+ ];
122
+
123
+ export const STABLE_LOW_SIGNAL_TERMS = [
124
+ "本地没 clone",
125
+ "远程最新状态",
126
+ "setup 脚本和项目结构",
127
+ "setup script and project structure",
128
+ "继续讨论",
129
+ "读完了",
130
+ "整理一下关键发现",
131
+ "github.com/",
132
+ "https://",
133
+ "http://",
134
+ ];
135
+
136
+ export const TASK_RESULT_LOW_SIGNAL_TERMS = [
137
+ "https://",
138
+ "http://",
139
+ "github.com/",
140
+ "笑不活了",
141
+ "open issues",
142
+ "issue 还在",
143
+ "issue still",
144
+ "关闭啊",
145
+ "让我看看",
146
+ "看一下",
147
+ "没问题?",
148
+ ];
149
+
150
+ export const TASK_RESULT_PLANISH_TERMS = [
151
+ "我先",
152
+ "先看",
153
+ "先查",
154
+ "先补",
155
+ "先改",
156
+ "先确认",
157
+ "我要",
158
+ "准备",
159
+ "接下来",
160
+ "会先",
161
+ "i'll",
162
+ "i will",
163
+ "let me",
164
+ "going to",
165
+ "next i",
166
+ ];
167
+
168
+ export const TASK_RESULT_SPECIFICITY_GROUPS = [
169
+ {
170
+ resultTerms: ["mcp transport", "transport rollout", "transport regression"],
171
+ taskTerms: ["mcp transport", "transport", "mcp", "rollout", "relay", "adapter", "传输"],
172
+ },
173
+ {
174
+ resultTerms: ["smoke:claude-continuity", "headless claude code continuity smoke", "continuity smoke"],
175
+ taskTerms: ["smoke", "claude-continuity", "acceptance", "验收", "headless"],
176
+ },
177
+ {
178
+ resultTerms: ["doctor baseline", "doctor --ci", "baseline check", "baseline hardening"],
179
+ taskTerms: ["doctor", "baseline", "基线", "coverage", "ci", "doctor --ci", "验证"],
180
+ },
181
+ {
182
+ resultTerms: ["seed:continuity", "seed continuity", "seed refresh", "reseed continuity"],
183
+ taskTerms: ["seed", "seed:continuity", "种子", "reseed", "refresh", "回填", "补种"],
184
+ },
185
+ {
186
+ resultTerms: [
187
+ "continuity eval checkpoint isolation",
188
+ "continuity eval regression",
189
+ "continuity eval fixture",
190
+ "checkpoint fixture",
191
+ ],
192
+ taskTerms: ["eval", "evaluation", "regression", "fixture", "评估", "回归", "用例", "case"],
193
+ },
194
+ {
195
+ resultTerms: [
196
+ "continuity eval profile forwarding gap",
197
+ "profile forwarding gap",
198
+ "profile: writing",
199
+ "sparse writing prompts",
200
+ "sparse-style fallback",
201
+ ],
202
+ taskTerms: [
203
+ "eval profile",
204
+ "profile regression",
205
+ "profile forwarding",
206
+ "profile forwarding gap",
207
+ "profile: writing",
208
+ "writing prompt",
209
+ "writing prompts",
210
+ "sparse writing prompt",
211
+ "sparse writing prompts",
212
+ "sparse-style fallback",
213
+ "style fallback",
214
+ "写作提示",
215
+ "写作评估",
216
+ "写作回归",
217
+ "写作 prompt",
218
+ "profile 转发",
219
+ "profile 转发缺口",
220
+ ],
221
+ },
222
+ {
223
+ resultTerms: [
224
+ "eval runner shared components skewed later continuity previews",
225
+ "shared components skewed later continuity previews",
226
+ "single-case replay",
227
+ "per-case fresh components",
228
+ "fresh-window replay",
229
+ "eval runner isolation",
230
+ ],
231
+ taskTerms: [
232
+ "eval runner",
233
+ "eval runner isolation",
234
+ "runner isolation",
235
+ "single-case replay",
236
+ "fresh-window replay",
237
+ "per-case fresh components",
238
+ "shared eval components",
239
+ "shared component state",
240
+ "runner replay",
241
+ "runner 隔离",
242
+ "单 case 回放",
243
+ "单用例回放",
244
+ "共享组件状态",
245
+ "fresh-window 回放",
246
+ ],
247
+ },
248
+ {
249
+ resultTerms: [
250
+ "workflow_observe",
251
+ "workflow_health",
252
+ "workflow_evidence",
253
+ "workflow observation",
254
+ ],
255
+ taskTerms: [
256
+ "workflow_observe",
257
+ "workflow_health",
258
+ "workflow_evidence",
259
+ "workflow observation",
260
+ "observation",
261
+ "governance",
262
+ "health",
263
+ "evidence",
264
+ "自进化",
265
+ "观测",
266
+ ],
267
+ },
268
+ {
269
+ resultTerms: [
270
+ "three-terminal continuity trigger validation",
271
+ "continue-style prompts triggered recall reliably",
272
+ "managed continuity rules",
273
+ "global instruction file",
274
+ ],
275
+ taskTerms: [
276
+ "claude code",
277
+ "codex",
278
+ "gemini cli",
279
+ "three-terminal",
280
+ "三终端",
281
+ "trigger",
282
+ "触发",
283
+ "setup",
284
+ "install",
285
+ "安装",
286
+ "接入",
287
+ "instruction",
288
+ "规则",
289
+ "managed continuity",
290
+ ],
291
+ },
292
+ {
293
+ resultTerms: [
294
+ "missed continuity guidance",
295
+ "cue coverage",
296
+ "conversational named recallnest continue prompts",
297
+ "named recallnest continue without project nouns",
298
+ "without project nouns",
299
+ ],
300
+ taskTerms: [
301
+ "guidance",
302
+ "cue",
303
+ "coverage",
304
+ "prompt",
305
+ "prompts",
306
+ "phrasing",
307
+ "wording",
308
+ "trigger",
309
+ "话术",
310
+ "提示词",
311
+ ],
312
+ },
313
+ {
314
+ resultTerms: [
315
+ "broad case fallback query",
316
+ "query-analysis assistant notes",
317
+ "fallback query",
318
+ "fallback-query",
319
+ "fallback-query meta case",
320
+ "structured case detection",
321
+ ],
322
+ taskTerms: [
323
+ "fallback query",
324
+ "fallback-query",
325
+ "query-analysis",
326
+ "ranking",
327
+ "task-ranking",
328
+ "排序",
329
+ "structured case",
330
+ "assistant note",
331
+ "noise filter",
332
+ "recentcases",
333
+ ],
334
+ },
335
+ {
336
+ resultTerms: [
337
+ "transcript-style pattern fragment",
338
+ "generic continuity preview",
339
+ "relevantpatterns",
340
+ "non-durable transcript fragments",
341
+ ],
342
+ taskTerms: [
343
+ "pattern",
344
+ "patterns",
345
+ "transcript",
346
+ "fragment",
347
+ "preview",
348
+ "previews",
349
+ "relevantpatterns",
350
+ "workflow cue",
351
+ "task result",
352
+ "task-result",
353
+ "selection",
354
+ ],
355
+ },
356
+ {
357
+ resultTerms: [
358
+ "bulk fact distillation",
359
+ "distill-facts.ts",
360
+ "smartextractbatch",
361
+ "health-check.ts",
362
+ "qwen-turbo",
363
+ "distillation authority",
364
+ "archived metadata",
365
+ ],
366
+ taskTerms: [
367
+ "distill",
368
+ "distillation",
369
+ "fact distillation",
370
+ "distill-facts",
371
+ "smartextract",
372
+ "smartextractbatch",
373
+ "health-check",
374
+ "qwen",
375
+ "archived",
376
+ "archive",
377
+ "worker pool",
378
+ "duplicate rate",
379
+ "dedupcheck",
380
+ ],
381
+ },
382
+ {
383
+ resultTerms: [
384
+ "promote recurring continuity workflow",
385
+ "store_workflow_pattern",
386
+ "/v1/pattern",
387
+ ],
388
+ taskTerms: [
389
+ "pattern",
390
+ "patterns",
391
+ "workflow",
392
+ "workflow pattern",
393
+ "store_workflow_pattern",
394
+ "/v1/pattern",
395
+ "promote",
396
+ "沉淀",
397
+ "复用模式",
398
+ "pattern seed",
399
+ ],
400
+ },
401
+ {
402
+ resultTerms: [
403
+ "scoped recall leaked conversational durable pins",
404
+ "conversational durable pins",
405
+ "scoped mixed-project pin collision leaked foreign project summaries",
406
+ "foreign project summaries",
407
+ "telegram-cli-bridge",
408
+ ],
409
+ taskTerms: [
410
+ "pin",
411
+ "pins",
412
+ "pinned",
413
+ "bridge",
414
+ "telegram",
415
+ "telegram-cli-bridge",
416
+ "transcript",
417
+ "readme",
418
+ "mixed-project",
419
+ "collision",
420
+ "durable pin",
421
+ ],
422
+ },
423
+ {
424
+ resultTerms: [
425
+ "scoped entity recall leaked foreign project entities via shared tool nouns",
426
+ "scoped task results leaked foreign project patterns and cases",
427
+ "shared tool nouns",
428
+ ],
429
+ taskTerms: [
430
+ "scope",
431
+ "scoped",
432
+ "mixed-project",
433
+ "foreign project",
434
+ "collision",
435
+ "entity collision",
436
+ "task result collision",
437
+ "shared tool nouns",
438
+ ],
439
+ },
440
+ {
441
+ resultTerms: [
442
+ "borderline transcript dedup swallowed incremental a2a details",
443
+ "incremental a2a details",
444
+ "same-topic a2a upgrade",
445
+ "transcript dedup",
446
+ ],
447
+ taskTerms: [
448
+ "a2a",
449
+ "claude sdk",
450
+ "agent sdk",
451
+ "gateway",
452
+ "dedup",
453
+ "ingest",
454
+ "transcript",
455
+ "permissionmode",
456
+ "allowedtools",
457
+ "launchagent",
458
+ "debugging",
459
+ "调试",
460
+ "去重",
461
+ ],
462
+ },
463
+ ];
464
+
465
+ export const PREFERENCE_SPECIFICITY_GROUPS = [
466
+ {
467
+ resultTerms: [
468
+ "claude code",
469
+ "codex",
470
+ "gemini cli",
471
+ "smoke",
472
+ "integration",
473
+ "验收",
474
+ "验证视角",
475
+ "独立验证",
476
+ "sidecar",
477
+ "cc 介入",
478
+ ],
479
+ taskTerms: [
480
+ "claude code",
481
+ "codex",
482
+ "gemini cli",
483
+ "smoke",
484
+ "integration",
485
+ "验收",
486
+ "验证",
487
+ "独立验证",
488
+ "sidecar",
489
+ "cc",
490
+ ],
491
+ },
492
+ ];
493
+
494
+ export const GENERIC_SCOPE_TERMS = new Set([
495
+ "project",
496
+ "session",
497
+ "memory",
498
+ "asset",
499
+ "scope",
500
+ "项目",
501
+ "会话",
502
+ "记忆",
503
+ ]);
504
+
505
+ export const CASE_CUE_TERMS = [
506
+ "问题",
507
+ "解决",
508
+ "修复",
509
+ "排查",
510
+ "原因",
511
+ "导致",
512
+ "改成",
513
+ "改为",
514
+ "回退",
515
+ "恢复",
516
+ "workaround",
517
+ "root cause",
518
+ "resolved",
519
+ "solution",
520
+ "fixed",
521
+ "debug",
522
+ "error",
523
+ "failure",
524
+ ];
525
+
526
+ export const CASE_FALLBACK_TASK_TERMS = [
527
+ "recallnest",
528
+ "continuity",
529
+ "checkpoint",
530
+ "resume_context",
531
+ "排查",
532
+ "调试",
533
+ "debug",
534
+ "fix",
535
+ "root cause",
536
+ "workaround",
537
+ "issue",
538
+ "项目",
539
+ "terminal",
540
+ "window",
541
+ "跨窗口",
542
+ "新窗口",
543
+ ];
544
+
545
+ export const ASSOCIATIVE_RECALL_CUE_TERMS = [
546
+ "memory layer",
547
+ "shared memory layer",
548
+ "shared memory",
549
+ "memory system",
550
+ "memory service",
551
+ "cross-window memory",
552
+ "cross-terminal memory",
553
+ "multi-window memory",
554
+ "memory project",
555
+ "记忆层",
556
+ "记忆系统",
557
+ "记忆服务",
558
+ "记忆功能",
559
+ "跨窗口记忆系统",
560
+ "跨窗口记忆",
561
+ "跨终端记忆",
562
+ "多窗口记忆",
563
+ "记忆项目",
564
+ "recall pipeline",
565
+ "recall 管线",
566
+ ];
567
+
568
+ export const TASK_HINT_GROUPS = [
569
+ {
570
+ cues: ["写文章", "文章", "写作", "公众号", "draft", "article", "post", "writing"],
571
+ hints: ["写作", "文章", "语气", "风格", "口语化", "不端着", "AI", "公众号"],
572
+ },
573
+ {
574
+ cues: ["配图", "封面", "图片", "插图", "视觉", "image", "cover", "illustration"],
575
+ hints: ["配图", "封面", "视觉", "图片", "插图", "审美", "手绘", "撞色"],
576
+ },
577
+ {
578
+ cues: ASSOCIATIVE_RECALL_CUE_TERMS,
579
+ hints: ["recallnest", "记忆层", "memory layer", "continuity", "checkpoint_session", "resume_context", "store_memory"],
580
+ },
581
+ ];
582
+
583
+ export const STYLE_TASK_TERMS = [
584
+ "语气",
585
+ "风格",
586
+ "偏好",
587
+ "写作风格",
588
+ "回复风格",
589
+ "tone",
590
+ "voice",
591
+ "style",
592
+ "preference",
593
+ ];
594
+
595
+ export const RECALL_ONLY_TERMS = [
596
+ "回忆",
597
+ "记得",
598
+ "想起",
599
+ "remember",
600
+ "recall",
601
+ "what do you remember",
602
+ "不要让我重复",
603
+ ];
604
+
605
+ export const WRITING_ACTION_TERMS = [
606
+ "写一篇",
607
+ "起草",
608
+ "草稿",
609
+ "改稿",
610
+ "润色",
611
+ "research",
612
+ "调研",
613
+ "选题",
614
+ "继续写",
615
+ "写公众号",
616
+ "draft",
617
+ "revise",
618
+ "edit",
619
+ "article",
620
+ ];
621
+
622
+ export const CHINESE_TERM_EDGE_STOP_CHARS = new Set([
623
+ "的",
624
+ "了",
625
+ "和",
626
+ "是",
627
+ "在",
628
+ "给",
629
+ "让",
630
+ "再",
631
+ "先",
632
+ "就",
633
+ "都",
634
+ "很",
635
+ "去",
636
+ "做",
637
+ "写",
638
+ "看",
639
+ "用",
640
+ "要",
641
+ "我",
642
+ "你",
643
+ "他",
644
+ "她",
645
+ "它",
646
+ "们",
647
+ "这",
648
+ "那",
649
+ "请",
650
+ ]);
651
+
652
+ export const DEFAULT_EXTRACT_TERM_LIMIT = 12;
653
+ export const TASK_CUE_EXTRACTION_LIMIT = 32;
654
+
655
+ export function normalizeText(text: string): string {
656
+ return text.replace(/\s+/g, " ").trim().toLowerCase();
657
+ }
658
+
659
+ function dedupeTerms(items: string[], limit: number): string[] {
660
+ return Array.from(new Set(items)).slice(0, limit);
661
+ }
662
+
663
+ export function extractTerms(text?: string, limit = DEFAULT_EXTRACT_TERM_LIMIT): string[] {
664
+ if (!text) return [];
665
+ const matches = text.match(/[\p{Script=Han}]{2,}|[a-z0-9._/-]{3,}/giu) || [];
666
+ const expanded: string[] = [];
667
+
668
+ for (const match of matches) {
669
+ const lower = match.toLowerCase();
670
+ expanded.push(lower);
671
+
672
+ if (!/[\p{Script=Han}]/u.test(match) || match.length <= 4) continue;
673
+
674
+ const chars = Array.from(lower);
675
+ for (let size = 2; size <= 3; size += 1) {
676
+ for (let index = 0; index <= chars.length - size; index += 1) {
677
+ const chunk = chars.slice(index, index + size).join("");
678
+ if (
679
+ chunk.length < 2 ||
680
+ CHINESE_TERM_EDGE_STOP_CHARS.has(chunk[0] || "") ||
681
+ CHINESE_TERM_EDGE_STOP_CHARS.has(chunk[chunk.length - 1] || "")
682
+ ) {
683
+ continue;
684
+ }
685
+ expanded.push(chunk);
686
+ }
687
+ }
688
+ }
689
+
690
+ return dedupeTerms(expanded, limit);
691
+ }
692
+
693
+ export function buildTaskHintTerms(text?: string): string[] {
694
+ if (!text) return [];
695
+ const normalized = normalizeText(text);
696
+ const hints = TASK_HINT_GROUPS.flatMap((group) =>
697
+ group.cues.some((cue) => normalized.includes(cue.toLowerCase())) ? group.hints : [],
698
+ );
699
+ return dedupeTerms(hints.map((term) => term.toLowerCase()), 32);
700
+ }
701
+
702
+ export function containsAnyTerm(text: string, terms: string[]): boolean {
703
+ const normalized = normalizeText(text);
704
+ return terms.some((term) => normalized.includes(term));
705
+ }
706
+
707
+ export function looksLikeContinuityTask(taskSeed?: string): boolean {
708
+ if (!taskSeed) return false;
709
+ const normalized = normalizeText(taskSeed);
710
+ return (
711
+ containsAnyTerm(taskSeed, CONTINUITY_TASK_TERMS) ||
712
+ (
713
+ CONTINUATION_VERB_TERMS.some((term) => normalized.includes(term)) &&
714
+ CONTINUATION_CONTEXT_TERMS.some((term) => normalized.includes(term))
715
+ )
716
+ );
717
+ }
718
+
719
+ export function looksLikeStyleTask(taskSeed?: string): boolean {
720
+ if (!taskSeed) return false;
721
+ return containsAnyTerm(taskSeed, STYLE_TASK_TERMS);
722
+ }
723
+
724
+ export function looksLikeRecallOnlyTask(taskSeed?: string): boolean {
725
+ if (!taskSeed) return false;
726
+ const normalized = normalizeText(taskSeed);
727
+ return (
728
+ RECALL_ONLY_TERMS.some((term) => normalized.includes(term)) &&
729
+ !WRITING_ACTION_TERMS.some((term) => normalized.includes(term))
730
+ );
731
+ }
732
+
733
+ export function looksLikeCaseFallbackTask(taskSeed?: string): boolean {
734
+ if (!taskSeed) return false;
735
+ return containsAnyTerm(taskSeed, CASE_FALLBACK_TASK_TERMS);
736
+ }
737
+
738
+ export function looksLikeStableInstruction(text: string): boolean {
739
+ const normalized = normalizeText(text);
740
+ return STABLE_INSTRUCTION_PREFIXES.some((prefix) => normalized.startsWith(prefix));
741
+ }
742
+
743
+ export function containsLowSignalStableTerm(text: string): boolean {
744
+ return containsAnyTerm(text, STABLE_LOW_SIGNAL_TERMS);
745
+ }
746
+
747
+ export function looksLikeLowSignalTaskResult(text: string): boolean {
748
+ return containsAnyTerm(text, TASK_RESULT_LOW_SIGNAL_TERMS);
749
+ }
750
+
751
+ export function countTermHits(text: string, terms: string[]): number {
752
+ const normalized = normalizeText(text);
753
+ return terms.reduce((count, term) => count + (normalized.includes(term) ? 1 : 0), 0);
754
+ }
755
+
756
+ export function looksLikePlanishTaskResult(text: string): boolean {
757
+ return containsAnyTerm(text, TASK_RESULT_PLANISH_TERMS);
758
+ }
759
+
760
+ export const GENERIC_ENTITY_TASK_TERMS = new Set([
761
+ ...Array.from(GENERIC_SCOPE_TERMS),
762
+ ...CONTINUITY_TASK_TERMS.map((term) => normalizeText(term)),
763
+ ...WORKFLOW_CUE_TERMS.map((term) => normalizeText(term)),
764
+ ...CASE_FALLBACK_TASK_TERMS.map((term) => normalizeText(term)),
765
+ "continue",
766
+ "继续",
767
+ "接着",
768
+ "项目",
769
+ "问题",
770
+ "error",
771
+ "errors",
772
+ "issue",
773
+ "issues",
774
+ "fix",
775
+ "debug",
776
+ "排查",
777
+ "处理",
778
+ "calling",
779
+ "code",
780
+ "之前",
781
+ "那个",
782
+ "什么",
783
+ ]);
784
+
785
+ export function taskCueCoverage(category: "patterns" | "cases", text: string): string[] {
786
+ if (category !== "patterns") return [];
787
+ const normalized = normalizeText(text);
788
+ return CONTINUITY_WORKFLOW_CUE_GROUPS
789
+ .filter((group) => group.terms.some((term) => normalized.includes(term)))
790
+ .map((group) => group.key);
791
+ }