@chendpoc/pi-memory 0.1.0

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 (177) hide show
  1. package/README.md +180 -0
  2. package/dist/adapters/piComplete.d.ts +17 -0
  3. package/dist/adapters/piComplete.d.ts.map +1 -0
  4. package/dist/adapters/piComplete.js +169 -0
  5. package/dist/adapters/piComplete.js.map +1 -0
  6. package/dist/bundle/install.d.ts +34 -0
  7. package/dist/bundle/install.d.ts.map +1 -0
  8. package/dist/bundle/install.js +183 -0
  9. package/dist/bundle/install.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +245 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/config.d.ts +27 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +49 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/errclass.d.ts +7 -0
  19. package/dist/errclass.d.ts.map +1 -0
  20. package/dist/errclass.js +32 -0
  21. package/dist/errclass.js.map +1 -0
  22. package/dist/extension.d.ts +24 -0
  23. package/dist/extension.d.ts.map +1 -0
  24. package/dist/extension.js +7 -0
  25. package/dist/extension.js.map +1 -0
  26. package/dist/fallback/index.d.ts +11 -0
  27. package/dist/fallback/index.d.ts.map +1 -0
  28. package/dist/fallback/index.js +16 -0
  29. package/dist/fallback/index.js.map +1 -0
  30. package/dist/fallback/llmRerank.d.ts +19 -0
  31. package/dist/fallback/llmRerank.d.ts.map +1 -0
  32. package/dist/fallback/llmRerank.js +60 -0
  33. package/dist/fallback/llmRerank.js.map +1 -0
  34. package/dist/fallback/memoryMd.d.ts +6 -0
  35. package/dist/fallback/memoryMd.d.ts.map +1 -0
  36. package/dist/fallback/memoryMd.js +35 -0
  37. package/dist/fallback/memoryMd.js.map +1 -0
  38. package/dist/fallback/sessionIndex.d.ts +35 -0
  39. package/dist/fallback/sessionIndex.d.ts.map +1 -0
  40. package/dist/fallback/sessionIndex.js +222 -0
  41. package/dist/fallback/sessionIndex.js.map +1 -0
  42. package/dist/fallback/sessionSearch.d.ts +18 -0
  43. package/dist/fallback/sessionSearch.d.ts.map +1 -0
  44. package/dist/fallback/sessionSearch.js +161 -0
  45. package/dist/fallback/sessionSearch.js.map +1 -0
  46. package/dist/index.d.ts +25 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +24 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/paths.d.ts +7 -0
  51. package/dist/paths.d.ts.map +1 -0
  52. package/dist/paths.js +26 -0
  53. package/dist/paths.js.map +1 -0
  54. package/dist/pi-extension.d.ts +6 -0
  55. package/dist/pi-extension.d.ts.map +1 -0
  56. package/dist/pi-extension.js +224 -0
  57. package/dist/pi-extension.js.map +1 -0
  58. package/dist/preflight/detectIntents.d.ts +102 -0
  59. package/dist/preflight/detectIntents.d.ts.map +1 -0
  60. package/dist/preflight/detectIntents.js +624 -0
  61. package/dist/preflight/detectIntents.js.map +1 -0
  62. package/dist/preflight/hook.d.ts +58 -0
  63. package/dist/preflight/hook.d.ts.map +1 -0
  64. package/dist/preflight/hook.js +77 -0
  65. package/dist/preflight/hook.js.map +1 -0
  66. package/dist/preflight/render.d.ts +21 -0
  67. package/dist/preflight/render.d.ts.map +1 -0
  68. package/dist/preflight/render.js +132 -0
  69. package/dist/preflight/render.js.map +1 -0
  70. package/dist/preflight/strip.d.ts +11 -0
  71. package/dist/preflight/strip.d.ts.map +1 -0
  72. package/dist/preflight/strip.js +46 -0
  73. package/dist/preflight/strip.js.map +1 -0
  74. package/dist/service.d.ts +56 -0
  75. package/dist/service.d.ts.map +1 -0
  76. package/dist/service.js +158 -0
  77. package/dist/service.js.map +1 -0
  78. package/dist/sidecar/bundle.d.ts +19 -0
  79. package/dist/sidecar/bundle.d.ts.map +1 -0
  80. package/dist/sidecar/bundle.js +39 -0
  81. package/dist/sidecar/bundle.js.map +1 -0
  82. package/dist/sidecar/client.d.ts +17 -0
  83. package/dist/sidecar/client.d.ts.map +1 -0
  84. package/dist/sidecar/client.js +107 -0
  85. package/dist/sidecar/client.js.map +1 -0
  86. package/dist/sidecar/process.d.ts +14 -0
  87. package/dist/sidecar/process.d.ts.map +1 -0
  88. package/dist/sidecar/process.js +126 -0
  89. package/dist/sidecar/process.js.map +1 -0
  90. package/dist/tools/memoryAppend.d.ts +37 -0
  91. package/dist/tools/memoryAppend.d.ts.map +1 -0
  92. package/dist/tools/memoryAppend.js +99 -0
  93. package/dist/tools/memoryAppend.js.map +1 -0
  94. package/dist/tools/memoryRecall.d.ts +113 -0
  95. package/dist/tools/memoryRecall.d.ts.map +1 -0
  96. package/dist/tools/memoryRecall.js +325 -0
  97. package/dist/tools/memoryRecall.js.map +1 -0
  98. package/dist/trainer/bundleBuilder.d.ts +30 -0
  99. package/dist/trainer/bundleBuilder.d.ts.map +1 -0
  100. package/dist/trainer/bundleBuilder.js +106 -0
  101. package/dist/trainer/bundleBuilder.js.map +1 -0
  102. package/dist/trainer/bundleLoader.d.ts +12 -0
  103. package/dist/trainer/bundleLoader.d.ts.map +1 -0
  104. package/dist/trainer/bundleLoader.js +59 -0
  105. package/dist/trainer/bundleLoader.js.map +1 -0
  106. package/dist/trainer/deltaMerge.d.ts +38 -0
  107. package/dist/trainer/deltaMerge.d.ts.map +1 -0
  108. package/dist/trainer/deltaMerge.js +183 -0
  109. package/dist/trainer/deltaMerge.js.map +1 -0
  110. package/dist/trainer/entityResolver.d.ts +27 -0
  111. package/dist/trainer/entityResolver.d.ts.map +1 -0
  112. package/dist/trainer/entityResolver.js +92 -0
  113. package/dist/trainer/entityResolver.js.map +1 -0
  114. package/dist/trainer/extractFacts.d.ts +67 -0
  115. package/dist/trainer/extractFacts.d.ts.map +1 -0
  116. package/dist/trainer/extractFacts.js +213 -0
  117. package/dist/trainer/extractFacts.js.map +1 -0
  118. package/dist/trainer/index.d.ts +54 -0
  119. package/dist/trainer/index.d.ts.map +1 -0
  120. package/dist/trainer/index.js +82 -0
  121. package/dist/trainer/index.js.map +1 -0
  122. package/dist/trainer/llmExtractor.d.ts +16 -0
  123. package/dist/trainer/llmExtractor.d.ts.map +1 -0
  124. package/dist/trainer/llmExtractor.js +146 -0
  125. package/dist/trainer/llmExtractor.js.map +1 -0
  126. package/dist/trainer/marker.d.ts +10 -0
  127. package/dist/trainer/marker.d.ts.map +1 -0
  128. package/dist/trainer/marker.js +28 -0
  129. package/dist/trainer/marker.js.map +1 -0
  130. package/dist/trainer/scheduler.d.ts +31 -0
  131. package/dist/trainer/scheduler.d.ts.map +1 -0
  132. package/dist/trainer/scheduler.js +72 -0
  133. package/dist/trainer/scheduler.js.map +1 -0
  134. package/dist/trainer/sessionLoader.d.ts +23 -0
  135. package/dist/trainer/sessionLoader.d.ts.map +1 -0
  136. package/dist/trainer/sessionLoader.js +106 -0
  137. package/dist/trainer/sessionLoader.js.map +1 -0
  138. package/dist/types.d.ts +135 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +8 -0
  141. package/dist/types.js.map +1 -0
  142. package/package.json +78 -0
  143. package/src/adapters/piComplete.ts +233 -0
  144. package/src/bundle/install.ts +206 -0
  145. package/src/cli.ts +254 -0
  146. package/src/config.ts +92 -0
  147. package/src/errclass.ts +37 -0
  148. package/src/extension.ts +23 -0
  149. package/src/fallback/index.ts +24 -0
  150. package/src/fallback/llmRerank.ts +90 -0
  151. package/src/fallback/memoryMd.ts +36 -0
  152. package/src/fallback/sessionIndex.ts +289 -0
  153. package/src/fallback/sessionSearch.ts +181 -0
  154. package/src/index.ts +213 -0
  155. package/src/paths.ts +28 -0
  156. package/src/pi-extension.ts +276 -0
  157. package/src/preflight/detectIntents.ts +654 -0
  158. package/src/preflight/hook.ts +136 -0
  159. package/src/preflight/render.ts +185 -0
  160. package/src/preflight/strip.ts +50 -0
  161. package/src/service.ts +202 -0
  162. package/src/sidecar/bundle.ts +52 -0
  163. package/src/sidecar/client.ts +166 -0
  164. package/src/sidecar/process.ts +145 -0
  165. package/src/tools/memoryAppend.ts +113 -0
  166. package/src/tools/memoryRecall.ts +364 -0
  167. package/src/trainer/bundleBuilder.ts +192 -0
  168. package/src/trainer/bundleLoader.ts +105 -0
  169. package/src/trainer/deltaMerge.ts +221 -0
  170. package/src/trainer/entityResolver.ts +140 -0
  171. package/src/trainer/extractFacts.ts +312 -0
  172. package/src/trainer/index.ts +147 -0
  173. package/src/trainer/llmExtractor.ts +206 -0
  174. package/src/trainer/marker.ts +30 -0
  175. package/src/trainer/scheduler.ts +104 -0
  176. package/src/trainer/sessionLoader.ts +139 -0
  177. package/src/types.ts +168 -0
@@ -0,0 +1,624 @@
1
+ export const MEMORY_HELPER_TOOL_NAME = "compile_memory_intents";
2
+ export const MEMORY_HELPER_MAX_INPUT_RUNES = 500;
3
+ const exactRelationshipPatterns = [
4
+ {
5
+ re: /^\s*(.+?)\s*(?:与|和|跟)\s*我\s*(?:的)?\s*关系\s*[??。.!!]*\s*$/,
6
+ anchorGroup: 1,
7
+ },
8
+ {
9
+ re: /^\s*我\s*(?:与|和|跟)\s*(.+?)\s*(?:是\s*)?(?:什么|什麼|啥|怎样|怎樣)?\s*关系\s*[??。.!!]*\s*$/,
10
+ anchorGroup: 1,
11
+ },
12
+ {
13
+ re: /^\s*我\s*(?:认识|認識|见过|見過)\s*(.+?)\s*(?:吗|嗎)?\s*[??。.!!]*\s*$/,
14
+ anchorGroup: 1,
15
+ },
16
+ {
17
+ re: /^\s*who\s+is\s+(.+?)\s+to\s+me\s*[?.!]*\s*$/i,
18
+ anchorGroup: 1,
19
+ },
20
+ {
21
+ re: /^\s*my\s+relationship\s+with\s+(.+?)\s*[?.!]*\s*$/i,
22
+ anchorGroup: 1,
23
+ },
24
+ {
25
+ re: /^\s*how\s+do\s+i\s+know\s+(.+?)\s*[?.!]*\s*$/i,
26
+ anchorGroup: 1,
27
+ },
28
+ {
29
+ re: /^\s*what\s+is\s+my\s+(?:connection|relationship)\s+(?:to|with)\s+(.+?)\s*[?.!]*\s*$/i,
30
+ anchorGroup: 1,
31
+ },
32
+ {
33
+ re: /^\s*(?:do|did)\s+i\s+(?:know|meet)\s+(.+?)\s*[?.!]*\s*$/i,
34
+ anchorGroup: 1,
35
+ },
36
+ {
37
+ re: /^\s*where\s+do\s+i\s+know\s+(.+?)\s+from\s*[?.!]*\s*$/i,
38
+ anchorGroup: 1,
39
+ },
40
+ {
41
+ re: /^\s*(.+?)\s*と\s*(?:私|わたし|僕|俺|自分)\s*(?:の)?\s*関係\s*[??。.!!]*\s*$/,
42
+ anchorGroup: 1,
43
+ },
44
+ {
45
+ re: /^\s*(?:私|わたし|僕|俺|自分)\s*と\s*(.+?)\s*(?:は|って)?\s*(?:どんな|どういう)?\s*関係\s*[??。.!!]*\s*$/,
46
+ anchorGroup: 1,
47
+ },
48
+ {
49
+ re: /^\s*(.+?)\s*は\s*(?:私|わたし|僕|俺|自分)\s*にとって\s*(?:誰|何)\s*[??。.!!]*\s*$/,
50
+ anchorGroup: 1,
51
+ },
52
+ {
53
+ re: /^\s*(.+?)\s*を\s*(?:どう|どこで)?\s*知って(?:いる|る)?\s*(?:の|か)?\s*[??。.!!]*\s*$/,
54
+ anchorGroup: 1,
55
+ },
56
+ {
57
+ re: /^\s*(.+?)\s*に\s*会ったこと(?:が)?ある\s*(?:の|か)?\s*[??。.!!]*\s*$/,
58
+ anchorGroup: 1,
59
+ },
60
+ ];
61
+ const latinEntityPattern = /(?:^|[\s"'((【])([A-Z][\p{L}\p{N}_&.+-]*(?:\s+[A-Z0-9][\p{L}\p{N}_&.+-]*){0,4})/u;
62
+ const privateMemoryCues = [
63
+ "remember",
64
+ "recall",
65
+ "last time",
66
+ "previously",
67
+ "before",
68
+ "we discussed",
69
+ "we decided",
70
+ "did we",
71
+ "have we",
72
+ "my ",
73
+ " me ",
74
+ " i ",
75
+ "记得",
76
+ "記得",
77
+ "回忆",
78
+ "回憶",
79
+ "上次",
80
+ "之前",
81
+ "以前",
82
+ "我们聊",
83
+ "我們聊",
84
+ "我们说",
85
+ "我們說",
86
+ "我",
87
+ "我的",
88
+ "覚えて",
89
+ "思い出",
90
+ "前回",
91
+ "以前",
92
+ "前に",
93
+ "話した",
94
+ "決めた",
95
+ "私",
96
+ "わたし",
97
+ "僕",
98
+ "俺",
99
+ "自分",
100
+ ];
101
+ const relationQuestionCues = [
102
+ "relationship",
103
+ "connection",
104
+ "know",
105
+ "met",
106
+ "meet",
107
+ "worked",
108
+ "work with",
109
+ "colleague",
110
+ "coworker",
111
+ "classmate",
112
+ "advisor",
113
+ "mentor",
114
+ "friend",
115
+ "created",
116
+ "built",
117
+ "authored",
118
+ "founded",
119
+ "owns",
120
+ "owned",
121
+ "depends",
122
+ "requires",
123
+ "uses",
124
+ "implemented",
125
+ "runs on",
126
+ "integrates",
127
+ "supports",
128
+ "released",
129
+ "published",
130
+ "forked",
131
+ "inspired",
132
+ "customer",
133
+ "competitor",
134
+ "email",
135
+ "handle",
136
+ "url",
137
+ "path",
138
+ "scheduled",
139
+ "monitors",
140
+ "what does",
141
+ "who created",
142
+ "who owns",
143
+ "who built",
144
+ "关系",
145
+ "關係",
146
+ "认识",
147
+ "認識",
148
+ "见过",
149
+ "見過",
150
+ "合作",
151
+ "同事",
152
+ "同学",
153
+ "同學",
154
+ "导师",
155
+ "導師",
156
+ "朋友",
157
+ "是谁",
158
+ "是誰",
159
+ "工作",
160
+ "任职",
161
+ "任職",
162
+ "创建",
163
+ "創建",
164
+ "作者",
165
+ "拥有",
166
+ "擁有",
167
+ "依赖",
168
+ "依賴",
169
+ "使用",
170
+ "实现",
171
+ "實現",
172
+ "运行",
173
+ "運行",
174
+ "集成",
175
+ "支持",
176
+ "发布",
177
+ "發布",
178
+ "项目",
179
+ "項目",
180
+ "関係",
181
+ "知",
182
+ "会った",
183
+ "仕事",
184
+ "同僚",
185
+ "友達",
186
+ "先生",
187
+ "メンター",
188
+ "作った",
189
+ "作者",
190
+ "所有",
191
+ "依存",
192
+ "使",
193
+ "実装",
194
+ "動",
195
+ "統合",
196
+ "対応",
197
+ "発表",
198
+ "公開",
199
+ "プロジェクト",
200
+ ];
201
+ const typedTargetCues = [
202
+ "which people",
203
+ "which person",
204
+ "which company",
205
+ "which companies",
206
+ "which project",
207
+ "which projects",
208
+ "which tool",
209
+ "which tools",
210
+ "which language",
211
+ "which languages",
212
+ "what projects",
213
+ "what tools",
214
+ "who are",
215
+ "哪些人",
216
+ "哪个公司",
217
+ "哪些公司",
218
+ "哪些项目",
219
+ "哪些項目",
220
+ "哪些工具",
221
+ "什么项目",
222
+ "什麼項目",
223
+ "どの人",
224
+ "どの会社",
225
+ "どのプロジェクト",
226
+ "どのツール",
227
+ "どの言語",
228
+ "誰が",
229
+ ];
230
+ const publicCurrentFactCues = [
231
+ "latest",
232
+ "current",
233
+ "today's",
234
+ "news",
235
+ "stock price",
236
+ "weather",
237
+ "president",
238
+ "ceo of",
239
+ "exchange rate",
240
+ "schedule for",
241
+ "最新",
242
+ "新闻",
243
+ "新聞",
244
+ "股价",
245
+ "股價",
246
+ "天气",
247
+ "天氣",
248
+ "总统",
249
+ "總統",
250
+ "汇率",
251
+ "匯率",
252
+ "ニュース",
253
+ "株価",
254
+ "天気",
255
+ "大統領",
256
+ "為替",
257
+ ];
258
+ const knownMemoryRelations = new Set([
259
+ "employed_at",
260
+ "previously_employed_at",
261
+ "works_on",
262
+ "affiliated_with",
263
+ "studied_under",
264
+ "studied_at",
265
+ "collaborates_with",
266
+ "follows_person",
267
+ "followed_by_person",
268
+ "commented_on",
269
+ "knows_about",
270
+ "has_handle_on",
271
+ "has_email",
272
+ "created",
273
+ "created_by",
274
+ "maintained_by",
275
+ "develops",
276
+ "developed_by_org",
277
+ "owns",
278
+ "owned_by",
279
+ "acquired",
280
+ "acquired_by",
281
+ "subsidiary_of",
282
+ "parent_of",
283
+ "founded",
284
+ "founded_by",
285
+ "invested_in",
286
+ "received_investment_from",
287
+ "customer_of",
288
+ "has_customer",
289
+ "competes_with",
290
+ "banking_relationship",
291
+ "uses",
292
+ "used_by",
293
+ "depends_on",
294
+ "implemented_in",
295
+ "runs_on",
296
+ "integrates_with",
297
+ "supports",
298
+ "powered_by",
299
+ "loaded_via",
300
+ "has_component",
301
+ "part_of",
302
+ "has_property",
303
+ "has_path",
304
+ "stored_at",
305
+ "monitors",
306
+ "targets",
307
+ "enables",
308
+ "enabled_by",
309
+ "generates",
310
+ "generated_from",
311
+ "implements",
312
+ "implemented_by",
313
+ "excludes",
314
+ "deleted_from",
315
+ "published_on",
316
+ "released",
317
+ "latest_release_tag",
318
+ "forked_from",
319
+ "inspired_by",
320
+ "succeeds",
321
+ "preceded_by",
322
+ "describes",
323
+ "described_in",
324
+ "category",
325
+ "has_alias",
326
+ "has_url",
327
+ "located_in",
328
+ "scheduled_for",
329
+ "ranked_on",
330
+ "listed_on",
331
+ "features_project",
332
+ "related_to",
333
+ "other",
334
+ ]);
335
+ /** JSON schema for forced tool_use compile_memory_intents (helper providers). */
336
+ export const COMPILE_MEMORY_INTENTS_PARAMETERS = {
337
+ type: "object",
338
+ additionalProperties: false,
339
+ properties: {
340
+ should_recall: {
341
+ type: "boolean",
342
+ description: "True only when the user is asking about their own private episodic memory.",
343
+ },
344
+ gate_reason: {
345
+ type: "string",
346
+ description: "One short phrase (under 40 chars) describing the gate decision.",
347
+ },
348
+ intents: {
349
+ type: "array",
350
+ maxItems: 3,
351
+ items: {
352
+ type: "object",
353
+ additionalProperties: false,
354
+ properties: {
355
+ mode: {
356
+ type: "string",
357
+ enum: ["direct_relation", "path_query", "typed_neighborhood"],
358
+ },
359
+ anchor_mentions: {
360
+ type: "array",
361
+ items: { type: "string" },
362
+ minItems: 1,
363
+ maxItems: 4,
364
+ },
365
+ relation_constraints: {
366
+ type: "array",
367
+ items: { type: "string" },
368
+ maxItems: 4,
369
+ },
370
+ candidate_type: { type: "string" },
371
+ scope_filter: {
372
+ type: "array",
373
+ items: { type: "string" },
374
+ maxItems: 4,
375
+ },
376
+ target_slot: { type: "string", enum: ["head", "tail"] },
377
+ time_window: { type: "string" },
378
+ evidence_budget: { type: "integer", minimum: 1, maximum: 50 },
379
+ result_limit: { type: "integer", minimum: 1, maximum: 100 },
380
+ },
381
+ required: ["mode", "anchor_mentions"],
382
+ },
383
+ },
384
+ },
385
+ required: ["should_recall", "intents"],
386
+ };
387
+ export function detectExactMemoryIntents(query) {
388
+ const q = query.trim();
389
+ if (!q)
390
+ return [];
391
+ for (const p of exactRelationshipPatterns) {
392
+ const m = q.match(p.re);
393
+ if (m && m[p.anchorGroup]) {
394
+ const anchor = cleanMemoryAnchor(m[p.anchorGroup]);
395
+ if (anchor)
396
+ return [defaultDirectMemoryIntent(anchor)];
397
+ }
398
+ }
399
+ return [];
400
+ }
401
+ export function defaultDirectMemoryIntent(anchor) {
402
+ return {
403
+ mode: "direct_relation",
404
+ anchor_mentions: [anchor],
405
+ evidence_budget: 5,
406
+ result_limit: 10,
407
+ };
408
+ }
409
+ export function cleanMemoryAnchor(s) {
410
+ let t = s.trim();
411
+ t = t.replace(/^[\s"'""''`.,,。??!!::;;()[\]【】]+|[\s"'""''`.,,。??!!::;;()[\]【】]+$/g, "");
412
+ if (t.startsWith("the "))
413
+ t = t.slice(4);
414
+ if (t.startsWith("The "))
415
+ t = t.slice(4);
416
+ for (const prefix of ["关于", "和", "与", "跟", "to ", "with "]) {
417
+ if (t.startsWith(prefix))
418
+ t = t.slice(prefix.length).trim();
419
+ }
420
+ if (!t || isPronounAnchor(t) || looksLikeTaskText(t))
421
+ return "";
422
+ return t;
423
+ }
424
+ export function isPronounAnchor(s) {
425
+ switch (s.trim().toLowerCase()) {
426
+ case "i":
427
+ case "me":
428
+ case "my":
429
+ case "mine":
430
+ case "myself":
431
+ case "user":
432
+ case "the user":
433
+ case "我":
434
+ case "我的":
435
+ case "自己":
436
+ case "本人":
437
+ case "私":
438
+ case "わたし":
439
+ case "僕":
440
+ case "俺":
441
+ return true;
442
+ default:
443
+ return false;
444
+ }
445
+ }
446
+ export function looksLikeTaskText(s) {
447
+ const lower = s.toLowerCase();
448
+ if (lower.includes("http://") ||
449
+ lower.includes("https://") ||
450
+ lower.includes("\n") ||
451
+ lower.includes("```")) {
452
+ return true;
453
+ }
454
+ for (const marker of [
455
+ " fix ",
456
+ " implement ",
457
+ " debug ",
458
+ " code ",
459
+ " file ",
460
+ " error ",
461
+ " stack trace ",
462
+ "修复",
463
+ "修改",
464
+ "实现",
465
+ "代码",
466
+ "文件",
467
+ "錯誤",
468
+ "错误",
469
+ "测试",
470
+ "構建",
471
+ "构建",
472
+ ]) {
473
+ if (lower.includes(marker))
474
+ return true;
475
+ }
476
+ return false;
477
+ }
478
+ function truncateRunes(s, max) {
479
+ const runes = [...s];
480
+ if (runes.length <= max)
481
+ return s;
482
+ return runes.slice(0, max).join("");
483
+ }
484
+ function containsAny(s, markers) {
485
+ return markers.some((m) => s.includes(m));
486
+ }
487
+ function hasEntityishSurface(s) {
488
+ if (latinEntityPattern.test(s))
489
+ return true;
490
+ if (/["'""''`「」『』]/.test(s))
491
+ return true;
492
+ const hasCJKOrKana = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(s);
493
+ return hasCJKOrKana && [...s].length <= 80;
494
+ }
495
+ export function looksMemoryRelevant(query) {
496
+ const lower = query.toLowerCase();
497
+ const hasMemoryCue = containsAny(lower, privateMemoryCues);
498
+ const hasRelationCue = containsAny(lower, relationQuestionCues);
499
+ const hasTypedTarget = containsAny(lower, typedTargetCues);
500
+ const hasEntity = hasEntityishSurface(query);
501
+ if (!(hasMemoryCue || hasRelationCue || hasTypedTarget || hasEntity))
502
+ return false;
503
+ if (containsAny(lower, publicCurrentFactCues) && !hasMemoryCue)
504
+ return false;
505
+ return true;
506
+ }
507
+ function isBroadMemoryRelation(rel) {
508
+ return rel === "related_to" || rel === "other";
509
+ }
510
+ function isSnakeRelation(rel) {
511
+ let base = rel.replace(/^\^/, "").replace(/\^-1$/, "");
512
+ if (!base)
513
+ return false;
514
+ return /^[a-z0-9_]+$/.test(base);
515
+ }
516
+ function isKnownMemoryRelation(rel) {
517
+ const base = rel.replace(/^\^/, "").replace(/\^-1$/, "");
518
+ return knownMemoryRelations.has(base);
519
+ }
520
+ function cleanAnchorList(inAnchors) {
521
+ const out = [];
522
+ const seen = new Set();
523
+ for (const raw of inAnchors) {
524
+ const anchor = cleanMemoryAnchor(raw);
525
+ if (!anchor)
526
+ continue;
527
+ const key = anchor.toLowerCase();
528
+ if (seen.has(key))
529
+ continue;
530
+ seen.add(key);
531
+ out.push(anchor);
532
+ }
533
+ return out;
534
+ }
535
+ function cleanRelationConstraints(inRels) {
536
+ const out = [];
537
+ for (const raw of inRels) {
538
+ const rel = raw.trim();
539
+ if (!rel || isBroadMemoryRelation(rel) || !isSnakeRelation(rel) || !isKnownMemoryRelation(rel)) {
540
+ continue;
541
+ }
542
+ out.push(rel);
543
+ }
544
+ return out;
545
+ }
546
+ export function sanitizeMemoryIntents(intents) {
547
+ const out = [];
548
+ const seen = new Set();
549
+ for (const raw of intents) {
550
+ const intent = { ...raw };
551
+ intent.anchor_mentions = cleanAnchorList(intent.anchor_mentions ?? []);
552
+ if (intent.anchor_mentions.length === 0)
553
+ continue;
554
+ if (!intent.mode)
555
+ intent.mode = "direct_relation";
556
+ if (!intent.evidence_budget || intent.evidence_budget <= 0 || intent.evidence_budget > 50) {
557
+ intent.evidence_budget = 5;
558
+ }
559
+ if (!intent.result_limit || intent.result_limit <= 0 || intent.result_limit > 100) {
560
+ intent.result_limit = 10;
561
+ }
562
+ intent.relation_constraints = cleanRelationConstraints(intent.relation_constraints ?? []);
563
+ switch (intent.mode) {
564
+ case "direct_relation":
565
+ break;
566
+ case "path_query": {
567
+ const rc = intent.relation_constraints ?? [];
568
+ if (rc.length < 2 || rc.length > 4)
569
+ continue;
570
+ intent.target_slot = "tail";
571
+ break;
572
+ }
573
+ case "typed_neighborhood": {
574
+ const ct = intent.candidate_type?.trim();
575
+ const rc = intent.relation_constraints ?? [];
576
+ if (!ct || rc.length !== 1)
577
+ continue;
578
+ intent.candidate_type = ct;
579
+ intent.target_slot = "tail";
580
+ break;
581
+ }
582
+ default:
583
+ continue;
584
+ }
585
+ const key = JSON.stringify(intent);
586
+ if (seen.has(key))
587
+ continue;
588
+ seen.add(key);
589
+ out.push(intent);
590
+ if (out.length >= 3)
591
+ break;
592
+ }
593
+ return out;
594
+ }
595
+ /**
596
+ * Compile user message into QueryIntent values.
597
+ * Regex fast-path bypasses helper; otherwise helper LLM when provided.
598
+ */
599
+ export async function detectMemoryIntents(query, helper, options = {}) {
600
+ const exact = detectExactMemoryIntents(query);
601
+ if (exact.length > 0)
602
+ return exact;
603
+ if (!helper)
604
+ return [];
605
+ const helperInput = truncateRunes(query, MEMORY_HELPER_MAX_INPUT_RUNES);
606
+ const trimmed = helperInput.trim();
607
+ if (!trimmed || [...trimmed].length > MEMORY_HELPER_MAX_INPUT_RUNES)
608
+ return [];
609
+ if (looksLikeTaskText(helperInput))
610
+ return [];
611
+ if (!options.forceHelper && !looksMemoryRelevant(helperInput))
612
+ return [];
613
+ try {
614
+ const out = await helper.compileIntents(helperInput, options.signal);
615
+ if (!out.should_recall)
616
+ return [];
617
+ const intents = sanitizeMemoryIntents(out.intents ?? []).slice(0, 3);
618
+ return intents;
619
+ }
620
+ catch {
621
+ return [];
622
+ }
623
+ }
624
+ //# sourceMappingURL=detectIntents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectIntents.js","sourceRoot":"","sources":["../../src/preflight/detectIntents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { RerankOptions } from "../fallback/llmRerank.js";
2
+ import type { MemoryConfig } from "../config.js";
3
+ import type { FallbackQuery } from "../types.js";
4
+ import type { MemoryService } from "../service.js";
5
+ import type { QueryIntent } from "../types.js";
6
+ import { type DetectIntentsOptions, type MemoryHelperLLM } from "./detectIntents.js";
7
+ export type { MemoryHelperLLM };
8
+ export declare const MEMORY_PREFLIGHT_QUERY_TIMEOUT_MS = 2000;
9
+ export interface MemoryPreflightOptions extends DetectIntentsOptions {
10
+ helper?: MemoryHelperLLM | null;
11
+ /** When true, run helper even if lexical gate would skip. */
12
+ forceHelper?: boolean;
13
+ /** Fallback query for degraded path when sidecar is not ready. */
14
+ fallback?: FallbackQuery | null;
15
+ /** LLM rerank options for fallback search results. */
16
+ rerankOpts?: RerankOptions | null;
17
+ }
18
+ export interface MemoryPreflightResult {
19
+ /** Full injected user text (scaffold + private memory + payload), or undefined. */
20
+ injectedText?: string;
21
+ /** Raw <private_memory> block when context was returned. */
22
+ privateContext?: string;
23
+ }
24
+ export interface BeforeTurnInput {
25
+ /** Scaffolded user message text sent to the model (may include date/CWD scaffolding). */
26
+ scaffoldedText: string;
27
+ /** Raw user payload without scaffolding — used for intent detection. */
28
+ userPayload: string;
29
+ /** First message in conversation — enables forceHelper gate. */
30
+ isFirstTurn?: boolean;
31
+ /** Set when preflight injected context (not for persistence). */
32
+ privateContext?: string;
33
+ signal?: AbortSignal;
34
+ }
35
+ export type BeforeTurnHook = (input: BeforeTurnInput) => Promise<BeforeTurnInput>;
36
+ /**
37
+ * Fail-silent implicit episodic preflight: detect intents → batch query → inject
38
+ * <private_memory> into the in-flight user message. Never throws.
39
+ */
40
+ export declare function runMemoryPreflight(query: string, service: MemoryService, options?: MemoryPreflightOptions): Promise<MemoryPreflightResult | null>;
41
+ /**
42
+ * Pi beforeTurn hook factory — wire into pi-coding-agent turn lifecycle.
43
+ *
44
+ * ```ts
45
+ * const hook = createBeforeTurnHook(service, config, { helper: mySmallModel });
46
+ * api.onBeforeTurn?.(hook);
47
+ * ```
48
+ *
49
+ * On persist/summary, call `stripPrivateMemory` on user message text so recalled
50
+ * facts are not written to session history.
51
+ */
52
+ export declare function createBeforeTurnHook(service: MemoryService, config: MemoryConfig, options?: {
53
+ helper?: MemoryHelperLLM | null;
54
+ fallback?: FallbackQuery | null;
55
+ }): BeforeTurnHook;
56
+ /** @internal exported for tests */
57
+ export type { QueryIntent };
58
+ //# sourceMappingURL=hook.d.ts.map