@baoanaz/cviauto-core 0.6.5

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 (206) hide show
  1. package/LICENSE +235 -0
  2. package/dist/channel/api/assert.d.ts +3 -0
  3. package/dist/channel/api/assert.d.ts.map +1 -0
  4. package/dist/channel/api/assert.js +11 -0
  5. package/dist/channel/api/assert.js.map +1 -0
  6. package/dist/channel/api/context.d.ts +21 -0
  7. package/dist/channel/api/context.d.ts.map +1 -0
  8. package/dist/channel/api/context.js +99 -0
  9. package/dist/channel/api/context.js.map +1 -0
  10. package/dist/channel/api/create.d.ts +9 -0
  11. package/dist/channel/api/create.d.ts.map +1 -0
  12. package/dist/channel/api/create.js +104 -0
  13. package/dist/channel/api/create.js.map +1 -0
  14. package/dist/channel/api/inbox.d.ts +51 -0
  15. package/dist/channel/api/inbox.d.ts.map +1 -0
  16. package/dist/channel/api/inbox.js +176 -0
  17. package/dist/channel/api/inbox.js.map +1 -0
  18. package/dist/channel/api/interrupt.d.ts +31 -0
  19. package/dist/channel/api/interrupt.d.ts.map +1 -0
  20. package/dist/channel/api/interrupt.js +98 -0
  21. package/dist/channel/api/interrupt.js.map +1 -0
  22. package/dist/channel/api/post-thread.d.ts +14 -0
  23. package/dist/channel/api/post-thread.d.ts.map +1 -0
  24. package/dist/channel/api/post-thread.js +109 -0
  25. package/dist/channel/api/post-thread.js.map +1 -0
  26. package/dist/channel/api/read.d.ts +17 -0
  27. package/dist/channel/api/read.d.ts.map +1 -0
  28. package/dist/channel/api/read.js +44 -0
  29. package/dist/channel/api/read.js.map +1 -0
  30. package/dist/channel/api/resolve.d.ts +21 -0
  31. package/dist/channel/api/resolve.d.ts.map +1 -0
  32. package/dist/channel/api/resolve.js +28 -0
  33. package/dist/channel/api/resolve.js.map +1 -0
  34. package/dist/channel/api/runtime.d.ts +70 -0
  35. package/dist/channel/api/runtime.d.ts.map +1 -0
  36. package/dist/channel/api/runtime.js +11 -0
  37. package/dist/channel/api/runtime.js.map +1 -0
  38. package/dist/channel/api/send.d.ts +4 -0
  39. package/dist/channel/api/send.d.ts.map +1 -0
  40. package/dist/channel/api/send.js +52 -0
  41. package/dist/channel/api/send.js.map +1 -0
  42. package/dist/channel/api/spawn.d.ts +13 -0
  43. package/dist/channel/api/spawn.d.ts.map +1 -0
  44. package/dist/channel/api/spawn.js +52 -0
  45. package/dist/channel/api/spawn.js.map +1 -0
  46. package/dist/channel/api/title.d.ts +5 -0
  47. package/dist/channel/api/title.d.ts.map +1 -0
  48. package/dist/channel/api/title.js +40 -0
  49. package/dist/channel/api/title.js.map +1 -0
  50. package/dist/channel/api/types.d.ts +65 -0
  51. package/dist/channel/api/types.d.ts.map +1 -0
  52. package/dist/channel/api/types.js +2 -0
  53. package/dist/channel/api/types.js.map +1 -0
  54. package/dist/channel/api/watch-channels.d.ts +40 -0
  55. package/dist/channel/api/watch-channels.d.ts.map +1 -0
  56. package/dist/channel/api/watch-channels.js +143 -0
  57. package/dist/channel/api/watch-channels.js.map +1 -0
  58. package/dist/channel/api/watch.d.ts +11 -0
  59. package/dist/channel/api/watch.d.ts.map +1 -0
  60. package/dist/channel/api/watch.js +17 -0
  61. package/dist/channel/api/watch.js.map +1 -0
  62. package/dist/channel/api/workers.d.ts +69 -0
  63. package/dist/channel/api/workers.d.ts.map +1 -0
  64. package/dist/channel/api/workers.js +143 -0
  65. package/dist/channel/api/workers.js.map +1 -0
  66. package/dist/channel/index.d.ts +38 -0
  67. package/dist/channel/index.d.ts.map +1 -0
  68. package/dist/channel/index.js +23 -0
  69. package/dist/channel/index.js.map +1 -0
  70. package/dist/channel/internal/store/channel-metadata.d.ts +23 -0
  71. package/dist/channel/internal/store/channel-metadata.d.ts.map +1 -0
  72. package/dist/channel/internal/store/channel-metadata.js +94 -0
  73. package/dist/channel/internal/store/channel-metadata.js.map +1 -0
  74. package/dist/channel/internal/store/delivery.d.ts +27 -0
  75. package/dist/channel/internal/store/delivery.d.ts.map +1 -0
  76. package/dist/channel/internal/store/delivery.js +37 -0
  77. package/dist/channel/internal/store/delivery.js.map +1 -0
  78. package/dist/channel/internal/store/events.d.ts +215 -0
  79. package/dist/channel/internal/store/events.d.ts.map +1 -0
  80. package/dist/channel/internal/store/events.js +204 -0
  81. package/dist/channel/internal/store/events.js.map +1 -0
  82. package/dist/channel/internal/store/filter.d.ts +21 -0
  83. package/dist/channel/internal/store/filter.d.ts.map +1 -0
  84. package/dist/channel/internal/store/filter.js +75 -0
  85. package/dist/channel/internal/store/filter.js.map +1 -0
  86. package/dist/channel/internal/store/inbox.d.ts +17 -0
  87. package/dist/channel/internal/store/inbox.d.ts.map +1 -0
  88. package/dist/channel/internal/store/inbox.js +30 -0
  89. package/dist/channel/internal/store/inbox.js.map +1 -0
  90. package/dist/channel/internal/store/lock.d.ts +17 -0
  91. package/dist/channel/internal/store/lock.d.ts.map +1 -0
  92. package/dist/channel/internal/store/lock.js +88 -0
  93. package/dist/channel/internal/store/lock.js.map +1 -0
  94. package/dist/channel/internal/store/paths.d.ts +43 -0
  95. package/dist/channel/internal/store/paths.d.ts.map +1 -0
  96. package/dist/channel/internal/store/paths.js +233 -0
  97. package/dist/channel/internal/store/paths.js.map +1 -0
  98. package/dist/channel/internal/store/schema.d.ts +77 -0
  99. package/dist/channel/internal/store/schema.d.ts.map +1 -0
  100. package/dist/channel/internal/store/schema.js +127 -0
  101. package/dist/channel/internal/store/schema.js.map +1 -0
  102. package/dist/channel/internal/store/seq.d.ts +12 -0
  103. package/dist/channel/internal/store/seq.d.ts.map +1 -0
  104. package/dist/channel/internal/store/seq.js +134 -0
  105. package/dist/channel/internal/store/seq.js.map +1 -0
  106. package/dist/channel/internal/store/thread-state.d.ts +37 -0
  107. package/dist/channel/internal/store/thread-state.d.ts.map +1 -0
  108. package/dist/channel/internal/store/thread-state.js +208 -0
  109. package/dist/channel/internal/store/thread-state.js.map +1 -0
  110. package/dist/channel/internal/store/watch.d.ts +10 -0
  111. package/dist/channel/internal/store/watch.d.ts.map +1 -0
  112. package/dist/channel/internal/store/watch.js +122 -0
  113. package/dist/channel/internal/store/watch.js.map +1 -0
  114. package/dist/channel/internal/store/worker-state.d.ts +56 -0
  115. package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
  116. package/dist/channel/internal/store/worker-state.js +220 -0
  117. package/dist/channel/internal/store/worker-state.js.map +1 -0
  118. package/dist/index.d.ts +3 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +7 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/mem/adapters/claude.d.ts +22 -0
  123. package/dist/mem/adapters/claude.d.ts.map +1 -0
  124. package/dist/mem/adapters/claude.js +234 -0
  125. package/dist/mem/adapters/claude.js.map +1 -0
  126. package/dist/mem/adapters/codex.d.ts +35 -0
  127. package/dist/mem/adapters/codex.d.ts.map +1 -0
  128. package/dist/mem/adapters/codex.js +222 -0
  129. package/dist/mem/adapters/codex.js.map +1 -0
  130. package/dist/mem/adapters/opencode.d.ts +19 -0
  131. package/dist/mem/adapters/opencode.d.ts.map +1 -0
  132. package/dist/mem/adapters/opencode.js +25 -0
  133. package/dist/mem/adapters/opencode.js.map +1 -0
  134. package/dist/mem/adapters/pi.d.ts +20 -0
  135. package/dist/mem/adapters/pi.d.ts.map +1 -0
  136. package/dist/mem/adapters/pi.js +299 -0
  137. package/dist/mem/adapters/pi.js.map +1 -0
  138. package/dist/mem/context.d.ts +23 -0
  139. package/dist/mem/context.d.ts.map +1 -0
  140. package/dist/mem/context.js +118 -0
  141. package/dist/mem/context.js.map +1 -0
  142. package/dist/mem/dialogue.d.ts +17 -0
  143. package/dist/mem/dialogue.d.ts.map +1 -0
  144. package/dist/mem/dialogue.js +51 -0
  145. package/dist/mem/dialogue.js.map +1 -0
  146. package/dist/mem/filter.d.ts +31 -0
  147. package/dist/mem/filter.d.ts.map +1 -0
  148. package/dist/mem/filter.js +66 -0
  149. package/dist/mem/filter.js.map +1 -0
  150. package/dist/mem/index.d.ts +18 -0
  151. package/dist/mem/index.d.ts.map +1 -0
  152. package/dist/mem/index.js +17 -0
  153. package/dist/mem/index.js.map +1 -0
  154. package/dist/mem/internal/jsonl.d.ts +35 -0
  155. package/dist/mem/internal/jsonl.d.ts.map +1 -0
  156. package/dist/mem/internal/jsonl.js +125 -0
  157. package/dist/mem/internal/jsonl.js.map +1 -0
  158. package/dist/mem/internal/paths.d.ts +25 -0
  159. package/dist/mem/internal/paths.d.ts.map +1 -0
  160. package/dist/mem/internal/paths.js +97 -0
  161. package/dist/mem/internal/paths.js.map +1 -0
  162. package/dist/mem/phase.d.ts +45 -0
  163. package/dist/mem/phase.d.ts.map +1 -0
  164. package/dist/mem/phase.js +220 -0
  165. package/dist/mem/phase.js.map +1 -0
  166. package/dist/mem/projects.d.ts +13 -0
  167. package/dist/mem/projects.d.ts.map +1 -0
  168. package/dist/mem/projects.js +37 -0
  169. package/dist/mem/projects.js.map +1 -0
  170. package/dist/mem/search.d.ts +32 -0
  171. package/dist/mem/search.d.ts.map +1 -0
  172. package/dist/mem/search.js +125 -0
  173. package/dist/mem/search.js.map +1 -0
  174. package/dist/mem/sessions.d.ts +37 -0
  175. package/dist/mem/sessions.d.ts.map +1 -0
  176. package/dist/mem/sessions.js +279 -0
  177. package/dist/mem/sessions.js.map +1 -0
  178. package/dist/mem/types.d.ts +176 -0
  179. package/dist/mem/types.d.ts.map +1 -0
  180. package/dist/mem/types.js +10 -0
  181. package/dist/mem/types.js.map +1 -0
  182. package/dist/task/index.d.ts +9 -0
  183. package/dist/task/index.d.ts.map +1 -0
  184. package/dist/task/index.js +9 -0
  185. package/dist/task/index.js.map +1 -0
  186. package/dist/task/paths.d.ts +37 -0
  187. package/dist/task/paths.d.ts.map +1 -0
  188. package/dist/task/paths.js +49 -0
  189. package/dist/task/paths.js.map +1 -0
  190. package/dist/task/phase.d.ts +27 -0
  191. package/dist/task/phase.d.ts.map +1 -0
  192. package/dist/task/phase.js +24 -0
  193. package/dist/task/phase.js.map +1 -0
  194. package/dist/task/records.d.ts +39 -0
  195. package/dist/task/records.d.ts.map +1 -0
  196. package/dist/task/records.js +89 -0
  197. package/dist/task/records.js.map +1 -0
  198. package/dist/task/schema.d.ts +77 -0
  199. package/dist/task/schema.d.ts.map +1 -0
  200. package/dist/task/schema.js +220 -0
  201. package/dist/task/schema.js.map +1 -0
  202. package/dist/testing/index.d.ts +2 -0
  203. package/dist/testing/index.d.ts.map +1 -0
  204. package/dist/testing/index.js +4 -0
  205. package/dist/testing/index.js.map +1 -0
  206. package/package.json +78 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Dialogue-window context extraction: resolve a session, optionally merge
3
+ * sub-agent children, then select a token-budgeted window of turns around the
4
+ * top hits.
5
+ */
6
+ import { buildChildIndex, extractDialogue, findSessionById, listAll, MemSessionNotFoundError, resolveFilter, WIDE_LIMIT, } from "./sessions.js";
7
+ /**
8
+ * Pure selection: rank turns against `grep` (user-role first, then hit
9
+ * density), take the top `nTurns`, expand each by `around` turns of context,
10
+ * then emit turns within `maxChars` — head-truncating any single turn that
11
+ * exceeds half the budget. With no `grep`, returns the first `nTurns` turns.
12
+ */
13
+ export function selectContextTurns(turns, grep, nTurns, around, maxChars) {
14
+ let hitIndices = [];
15
+ let totalHitTurns = 0;
16
+ if (grep) {
17
+ const tokens = grep.toLowerCase().split(/\s+/).filter(Boolean);
18
+ const matchCount = (text) => {
19
+ const hay = text.toLowerCase();
20
+ if (!tokens.every((tok) => hay.includes(tok)))
21
+ return 0;
22
+ let n = 0;
23
+ for (const tok of tokens) {
24
+ let from = 0;
25
+ while (true) {
26
+ const idx = hay.indexOf(tok, from);
27
+ if (idx === -1)
28
+ break;
29
+ n++;
30
+ from = idx + tok.length;
31
+ }
32
+ }
33
+ return n;
34
+ };
35
+ const ranked = [];
36
+ for (let i = 0; i < turns.length; i++) {
37
+ const turn = turns[i];
38
+ if (!turn)
39
+ continue;
40
+ const h = tokens.length === 0 ? 0 : matchCount(turn.text);
41
+ if (h > 0)
42
+ ranked.push({ idx: i, role: turn.role, hits: h });
43
+ }
44
+ totalHitTurns = ranked.length;
45
+ ranked.sort((a, b) => {
46
+ if (a.role !== b.role)
47
+ return a.role === "user" ? -1 : 1;
48
+ if (b.hits !== a.hits)
49
+ return b.hits - a.hits;
50
+ return a.idx - b.idx;
51
+ });
52
+ hitIndices = ranked.slice(0, nTurns).map((r) => r.idx);
53
+ }
54
+ else {
55
+ for (let i = 0; i < Math.min(nTurns, turns.length); i++)
56
+ hitIndices.push(i);
57
+ }
58
+ // Expand each hit by `around` turns on either side; dedupe via Set.
59
+ const display = new Set();
60
+ for (const idx of hitIndices) {
61
+ for (let j = Math.max(0, idx - around); j <= Math.min(turns.length - 1, idx + around); j++) {
62
+ display.add(j);
63
+ }
64
+ }
65
+ const ordered = [...display].sort((a, b) => a - b);
66
+ const hitSet = new Set(hitIndices);
67
+ const out = [];
68
+ let used = 0;
69
+ for (const i of ordered) {
70
+ const t = turns[i];
71
+ if (!t)
72
+ continue;
73
+ let text = t.text;
74
+ const cap = Math.floor(maxChars / 2);
75
+ if (text.length > cap)
76
+ text = text.slice(0, cap) + `\n…[+${t.text.length - cap} chars]`;
77
+ if (used + text.length > maxChars && out.length > 0)
78
+ break;
79
+ out.push({ idx: i, role: t.role, text, isHit: hitSet.has(i) });
80
+ used += text.length;
81
+ }
82
+ return { turns: out, totalHitTurns, budgetUsed: used };
83
+ }
84
+ /** Drill into a single session: top-N hit turns plus surrounding context,
85
+ * char-budgeted. With no `grep`, returns the session opening. */
86
+ export function readMemContext(options) {
87
+ const f = resolveFilter(options.filter);
88
+ const s = findSessionById(options.sessionId, f);
89
+ if (!s)
90
+ throw new MemSessionNotFoundError(options.sessionId);
91
+ const grep = typeof options.grep === "string" ? options.grep : undefined;
92
+ const nTurns = options.turns ?? 3;
93
+ const around = options.around ?? 1;
94
+ const maxChars = options.maxChars ?? 6000;
95
+ let turns = extractDialogue(s);
96
+ let mergedChildren = 0;
97
+ if (options.includeChildren === true) {
98
+ const all = listAll({ ...f, cwd: undefined, limit: WIDE_LIMIT });
99
+ const childIndex = buildChildIndex(all);
100
+ const kids = childIndex.get(s.id) ?? [];
101
+ mergedChildren = kids.length;
102
+ for (const c of kids)
103
+ turns = [...turns, ...extractDialogue(c)];
104
+ }
105
+ const selected = selectContextTurns(turns, grep, nTurns, around, maxChars);
106
+ return {
107
+ session: s,
108
+ query: grep,
109
+ totalTurns: turns.length,
110
+ totalHitTurns: selected.totalHitTurns,
111
+ mergedChildren,
112
+ budgetUsed: selected.budgetUsed,
113
+ maxChars,
114
+ turns: selected.turns,
115
+ warnings: [],
116
+ };
117
+ }
118
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/mem/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Dialogue cleaning: injection-tag stripping and bootstrap-turn detection.
3
+ *
4
+ * The cleaning pipeline is what makes plain `String.prototype.includes`
5
+ * relevance ranking viable — without it, Cviauto / platform injection tags
6
+ * would dominate every search hit.
7
+ */
8
+ /** True if this turn is a platform bootstrap injection (AGENTS.md preamble,
9
+ * pure INSTRUCTIONS block, etc.) and should be dropped wholesale rather than
10
+ * partially cleaned. Evaluated AFTER {@link stripInjectionTags}, against the
11
+ * raw `originalLength` so the size threshold is computed on the input. */
12
+ export declare function isBootstrapTurn(cleaned: string, originalLength: number): boolean;
13
+ /** Case-insensitive removal of every `<tag>...</tag>` block in
14
+ * `INJECTION_TAGS`, plus AGENTS.md preamble. Collapses runs of 3+ newlines to
15
+ * a paragraph break and trims. */
16
+ export declare function stripInjectionTags(text: string): string;
17
+ //# sourceMappingURL=dialogue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue.d.ts","sourceRoot":"","sources":["../../src/mem/dialogue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH;;;0EAG0E;AAC1E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB,OAAO,CAIT;AAED;;kCAEkC;AAClC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAcvD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Dialogue cleaning: injection-tag stripping and bootstrap-turn detection.
3
+ *
4
+ * The cleaning pipeline is what makes plain `String.prototype.includes`
5
+ * relevance ranking viable — without it, Cviauto / platform injection tags
6
+ * would dominate every search hit.
7
+ */
8
+ const INJECTION_TAGS = [
9
+ "system-reminder",
10
+ "task-status",
11
+ "ready",
12
+ "current-state",
13
+ "workflow",
14
+ "workflow-state",
15
+ "guidelines",
16
+ "instructions",
17
+ "command-name",
18
+ "command-message",
19
+ "command-args",
20
+ "local-command-stdout",
21
+ "local-command-stderr",
22
+ "permissions instructions",
23
+ "collaboration_mode",
24
+ "environment_context",
25
+ "auto_compact_summary",
26
+ "user_instructions",
27
+ ];
28
+ /** True if this turn is a platform bootstrap injection (AGENTS.md preamble,
29
+ * pure INSTRUCTIONS block, etc.) and should be dropped wholesale rather than
30
+ * partially cleaned. Evaluated AFTER {@link stripInjectionTags}, against the
31
+ * raw `originalLength` so the size threshold is computed on the input. */
32
+ export function isBootstrapTurn(cleaned, originalLength) {
33
+ if (cleaned.startsWith("# AGENTS.md instructions for"))
34
+ return true;
35
+ if (originalLength > 4000 && /^<INSTRUCTIONS>/i.test(cleaned))
36
+ return true;
37
+ return false;
38
+ }
39
+ /** Case-insensitive removal of every `<tag>...</tag>` block in
40
+ * `INJECTION_TAGS`, plus AGENTS.md preamble. Collapses runs of 3+ newlines to
41
+ * a paragraph break and trims. */
42
+ export function stripInjectionTags(text) {
43
+ let out = text;
44
+ for (const tag of INJECTION_TAGS) {
45
+ const escaped = tag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
46
+ out = out.replace(new RegExp(`<${escaped}[^>]*>[\\s\\S]*?</${escaped}>`, "gi"), "");
47
+ }
48
+ out = out.replace(/^# AGENTS\.md instructions for[\s\S]*?(?=\n\n[A-Z一-龥]|$)/m, "");
49
+ return out.replace(/\n{3,}/g, "\n\n").trim();
50
+ }
51
+ //# sourceMappingURL=dialogue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogue.js","sourceRoot":"","sources":["../../src/mem/dialogue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,cAAc,GAAsB;IACxC,iBAAiB;IACjB,aAAa;IACb,OAAO;IACP,eAAe;IACf,UAAU;IACV,gBAAgB;IAChB,YAAY;IACZ,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,cAAc;IACd,sBAAsB;IACtB,sBAAsB;IACtB,0BAA0B;IAC1B,oBAAoB;IACpB,qBAAqB;IACrB,sBAAsB;IACtB,mBAAmB;CACpB,CAAC;AAEF;;;0EAG0E;AAC1E,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,cAAsB;IAEtB,IAAI,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,IAAI,cAAc,GAAG,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;kCAEkC;AAClC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC3D,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,IAAI,MAAM,CAAC,IAAI,OAAO,qBAAqB,OAAO,GAAG,EAAE,IAAI,CAAC,EAC5D,EAAE,CACH,CAAC;IACJ,CAAC;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,2DAA2D,EAC3D,EAAE,CACH,CAAC;IACF,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Project / time-range / source filters for mem session selection.
3
+ *
4
+ * These primitives belong to mem session filtering only — they are not
5
+ * promoted into a cross-domain `core/internal` until another core subdomain
6
+ * needs exactly the same semantics.
7
+ */
8
+ import type { MemFilter } from "./types.js";
9
+ /** Single-point range check: `since ≤ t ≤ until`. Pass-through when `iso` is
10
+ * undefined or unparseable. Internal-only — session list filtering uses
11
+ * {@link inRangeOverlap}. */
12
+ export declare function inRange(iso: string | undefined, f: MemFilter): boolean;
13
+ /**
14
+ * Interval-overlap range check for sessions with both a start and an end
15
+ * timestamp. A session is kept iff its lifetime `[start, end]` overlaps the
16
+ * query window `[since, until]`.
17
+ *
18
+ * Long / cross-day sessions (created before `--since` but still active inside
19
+ * the window) must survive — single-point `inRange(created, f)` dropped them.
20
+ *
21
+ * Degenerate inputs:
22
+ * - both undefined → pass through (no timestamp = don't filter)
23
+ * - one undefined → fall back to single-point semantics on the other end
24
+ * - unparseable iso → defer to the parsable end (or pass through if both bad)
25
+ */
26
+ export declare function inRangeOverlap(start: string | undefined, end: string | undefined, f: MemFilter): boolean;
27
+ /** True iff `sessionCwd` is within `target` (exact match or descendant
28
+ * directory). When `target` is undefined there is no scoping and everything
29
+ * matches; sessions with an unknown cwd are dropped under scoping. */
30
+ export declare function sameProject(sessionCwd: string | undefined, target: string | undefined): boolean;
31
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/mem/filter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;6BAE6B;AAC7B,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAOtE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,CAAC,EAAE,SAAS,GACX,OAAO,CAaT;AAED;;sEAEsE;AACtE,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,OAAO,CAMT"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Project / time-range / source filters for mem session selection.
3
+ *
4
+ * These primitives belong to mem session filtering only — they are not
5
+ * promoted into a cross-domain `core/internal` until another core subdomain
6
+ * needs exactly the same semantics.
7
+ */
8
+ import * as path from "node:path";
9
+ /** Single-point range check: `since ≤ t ≤ until`. Pass-through when `iso` is
10
+ * undefined or unparseable. Internal-only — session list filtering uses
11
+ * {@link inRangeOverlap}. */
12
+ export function inRange(iso, f) {
13
+ if (!iso)
14
+ return true;
15
+ const t = new Date(iso);
16
+ if (Number.isNaN(+t))
17
+ return true;
18
+ if (f.since && t < f.since)
19
+ return false;
20
+ if (f.until && t > f.until)
21
+ return false;
22
+ return true;
23
+ }
24
+ /**
25
+ * Interval-overlap range check for sessions with both a start and an end
26
+ * timestamp. A session is kept iff its lifetime `[start, end]` overlaps the
27
+ * query window `[since, until]`.
28
+ *
29
+ * Long / cross-day sessions (created before `--since` but still active inside
30
+ * the window) must survive — single-point `inRange(created, f)` dropped them.
31
+ *
32
+ * Degenerate inputs:
33
+ * - both undefined → pass through (no timestamp = don't filter)
34
+ * - one undefined → fall back to single-point semantics on the other end
35
+ * - unparseable iso → defer to the parsable end (or pass through if both bad)
36
+ */
37
+ export function inRangeOverlap(start, end, f) {
38
+ const s = start ?? end;
39
+ const e = end ?? start;
40
+ if (!s && !e)
41
+ return true;
42
+ if (f.since && e) {
43
+ const eT = new Date(e);
44
+ if (!Number.isNaN(+eT) && eT < f.since)
45
+ return false;
46
+ }
47
+ if (f.until && s) {
48
+ const sT = new Date(s);
49
+ if (!Number.isNaN(+sT) && sT > f.until)
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ /** True iff `sessionCwd` is within `target` (exact match or descendant
55
+ * directory). When `target` is undefined there is no scoping and everything
56
+ * matches; sessions with an unknown cwd are dropped under scoping. */
57
+ export function sameProject(sessionCwd, target) {
58
+ if (!target)
59
+ return true;
60
+ if (!sessionCwd)
61
+ return false;
62
+ const a = path.resolve(sessionCwd);
63
+ const b = path.resolve(target);
64
+ return a === b || a.startsWith(b + path.sep);
65
+ }
66
+ //# sourceMappingURL=filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/mem/filter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC;;6BAE6B;AAC7B,MAAM,UAAU,OAAO,CAAC,GAAuB,EAAE,CAAY;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAyB,EACzB,GAAuB,EACvB,CAAY;IAEZ,MAAM,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC;IACvB,MAAM,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC;IACvB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;sEAEsE;AACtE,MAAM,UAAU,WAAW,CACzB,UAA8B,EAC9B,MAA0B;IAE1B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Public surface for `@baoanaz/cviauto-core/mem` — reusable retrieval and
3
+ * dialogue-context extraction over persisted Claude Code / Codex / OpenCode
4
+ * sessions.
5
+ *
6
+ * This subpackage is intentionally NOT re-exported from the root
7
+ * `@baoanaz/cviauto-core` barrel. Import it explicitly:
8
+ *
9
+ * import { searchMemSessions } from "@baoanaz/cviauto-core/mem";
10
+ *
11
+ * v1 scope: persisted-session search and context extraction only. It does not
12
+ * read channel / forum / thread event logs and has no cursor / pagination.
13
+ */
14
+ export { listMemSessions, searchMemSessions, extractMemDialogue, MemSessionNotFoundError, } from "./sessions.js";
15
+ export { readMemContext } from "./context.js";
16
+ export { listMemProjects } from "./projects.js";
17
+ export type { MemSourceKind, MemSourceFilter, MemPhase, DialogueRole, DialogueTurn, MemFilter, MemSessionInfo, SearchExcerpt, SearchHit, MemWarning, MemSearchMatch, MemSearchResult, MemContextTurn, MemContextResult, BrainstormWindow, MemDialogueGroup, MemExtractResult, MemProjectSummary, ListMemSessionsOptions, SearchMemSessionsOptions, ReadMemContextOptions, ExtractMemDialogueOptions, ListMemProjectsOptions, } from "./types.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,YAAY,EACV,aAAa,EACb,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,cAAc,EACd,aAAa,EACb,SAAS,EACT,UAAU,EACV,cAAc,EACd,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Public surface for `@baoanaz/cviauto-core/mem` — reusable retrieval and
3
+ * dialogue-context extraction over persisted Claude Code / Codex / OpenCode
4
+ * sessions.
5
+ *
6
+ * This subpackage is intentionally NOT re-exported from the root
7
+ * `@baoanaz/cviauto-core` barrel. Import it explicitly:
8
+ *
9
+ * import { searchMemSessions } from "@baoanaz/cviauto-core/mem";
10
+ *
11
+ * v1 scope: persisted-session search and context extraction only. It does not
12
+ * read channel / forum / thread event logs and has no cursor / pagination.
13
+ */
14
+ export { listMemSessions, searchMemSessions, extractMemDialogue, MemSessionNotFoundError, } from "./sessions.js";
15
+ export { readMemContext } from "./context.js";
16
+ export { listMemProjects } from "./projects.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mem/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Streaming JSONL / JSON readers for the persisted-session adapters.
3
+ *
4
+ * Zero-dependency on purpose — `@baoanaz/cviauto-core` does not depend on
5
+ * `zod`. The original CLI implementation validated every line against a Zod
6
+ * schema; the external session formats were all declared `.loose()` with every
7
+ * field `.optional()`, so the only thing the schema actually rejected was a
8
+ * top-level non-object line — which the `0x7b` byte-prefix fast-reject already
9
+ * filters. Adapters therefore receive each parsed line cast to a hand-written
10
+ * loose interface and read fields defensively.
11
+ */
12
+ /**
13
+ * Walk a JSONL file line-by-line, invoking `onLine` with each parsed object.
14
+ * Bad JSON lines are skipped. Returning the literal `"stop"` from `onLine`
15
+ * halts iteration.
16
+ *
17
+ * Chunked sync streaming: 256 KB read window, leftover preserved across chunks
18
+ * for split-line reassembly — bounded heap on multi-MB session files and a
19
+ * `"stop"` short-circuit that avoids reading the whole file when only the head
20
+ * is needed.
21
+ *
22
+ * Byte-prefix fast-reject: a JSONL event line virtually always begins with `{`.
23
+ * Lines whose first byte is not `{` are blanks / log preambles / partial writes
24
+ * and are skipped before paying the `JSON.parse` cost.
25
+ */
26
+ export declare function readJsonl<T>(file: string, onLine: (obj: T) => unknown): void;
27
+ /** Read just the first parseable JSONL object (stops after one line). */
28
+ export declare function readJsonlFirst<T>(file: string): T | undefined;
29
+ /** Find the first JSONL object satisfying `predicate`, scanning at most
30
+ * `maxLines` lines. */
31
+ export declare function findInJsonl<T>(file: string, predicate: (obj: T) => boolean, maxLines?: number): T | undefined;
32
+ /** Read and JSON-parse a whole file; returns `undefined` on read / parse
33
+ * failure. The caller is responsible for shape-checking the result. */
34
+ export declare function readJsonFile<T>(file: string): T | undefined;
35
+ //# sourceMappingURL=jsonl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.d.ts","sourceRoot":"","sources":["../../../src/mem/internal/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAqD5E;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAO7D;AAED;uBACuB;AACvB,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,EAC9B,QAAQ,SAAM,GACb,CAAC,GAAG,SAAS,CAYf;AAED;uEACuE;AACvE,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAM3D"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Streaming JSONL / JSON readers for the persisted-session adapters.
3
+ *
4
+ * Zero-dependency on purpose — `@baoanaz/cviauto-core` does not depend on
5
+ * `zod`. The original CLI implementation validated every line against a Zod
6
+ * schema; the external session formats were all declared `.loose()` with every
7
+ * field `.optional()`, so the only thing the schema actually rejected was a
8
+ * top-level non-object line — which the `0x7b` byte-prefix fast-reject already
9
+ * filters. Adapters therefore receive each parsed line cast to a hand-written
10
+ * loose interface and read fields defensively.
11
+ */
12
+ import * as fs from "node:fs";
13
+ const CHUNK = 256 * 1024;
14
+ const OPEN_BRACE = 0x7b; // '{'
15
+ /**
16
+ * Walk a JSONL file line-by-line, invoking `onLine` with each parsed object.
17
+ * Bad JSON lines are skipped. Returning the literal `"stop"` from `onLine`
18
+ * halts iteration.
19
+ *
20
+ * Chunked sync streaming: 256 KB read window, leftover preserved across chunks
21
+ * for split-line reassembly — bounded heap on multi-MB session files and a
22
+ * `"stop"` short-circuit that avoids reading the whole file when only the head
23
+ * is needed.
24
+ *
25
+ * Byte-prefix fast-reject: a JSONL event line virtually always begins with `{`.
26
+ * Lines whose first byte is not `{` are blanks / log preambles / partial writes
27
+ * and are skipped before paying the `JSON.parse` cost.
28
+ */
29
+ export function readJsonl(file, onLine) {
30
+ let fd;
31
+ try {
32
+ fd = fs.openSync(file, "r");
33
+ }
34
+ catch {
35
+ return;
36
+ }
37
+ const buf = Buffer.alloc(CHUNK);
38
+ let leftover = "";
39
+ try {
40
+ let stop = false;
41
+ while (!stop) {
42
+ const n = fs.readSync(fd, buf, 0, CHUNK, null);
43
+ if (n === 0)
44
+ break;
45
+ const chunk = leftover + buf.toString("utf8", 0, n);
46
+ let from = 0;
47
+ while (true) {
48
+ const nl = chunk.indexOf("\n", from);
49
+ if (nl === -1) {
50
+ leftover = chunk.slice(from);
51
+ break;
52
+ }
53
+ const line = chunk.slice(from, nl);
54
+ from = nl + 1;
55
+ if (!line)
56
+ continue;
57
+ if (line.charCodeAt(0) !== OPEN_BRACE)
58
+ continue;
59
+ let raw;
60
+ try {
61
+ raw = JSON.parse(line);
62
+ }
63
+ catch {
64
+ continue;
65
+ }
66
+ if (onLine(raw) === "stop") {
67
+ stop = true;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ if (!stop && leftover) {
73
+ // File ended without a trailing newline — process the last partial line.
74
+ const line = leftover;
75
+ if (line.charCodeAt(0) === OPEN_BRACE) {
76
+ try {
77
+ const raw = JSON.parse(line);
78
+ onLine(raw);
79
+ }
80
+ catch {
81
+ /* skip */
82
+ }
83
+ }
84
+ }
85
+ }
86
+ finally {
87
+ fs.closeSync(fd);
88
+ }
89
+ }
90
+ /** Read just the first parseable JSONL object (stops after one line). */
91
+ export function readJsonlFirst(file) {
92
+ let result;
93
+ readJsonl(file, (obj) => {
94
+ result = obj;
95
+ return "stop";
96
+ });
97
+ return result;
98
+ }
99
+ /** Find the first JSONL object satisfying `predicate`, scanning at most
100
+ * `maxLines` lines. */
101
+ export function findInJsonl(file, predicate, maxLines = 200) {
102
+ let count = 0;
103
+ let hit;
104
+ readJsonl(file, (obj) => {
105
+ count++;
106
+ if (predicate(obj)) {
107
+ hit = obj;
108
+ return "stop";
109
+ }
110
+ if (count >= maxLines)
111
+ return "stop";
112
+ });
113
+ return hit;
114
+ }
115
+ /** Read and JSON-parse a whole file; returns `undefined` on read / parse
116
+ * failure. The caller is responsible for shape-checking the result. */
117
+ export function readJsonFile(file) {
118
+ try {
119
+ return JSON.parse(fs.readFileSync(file, "utf8"));
120
+ }
121
+ catch {
122
+ return undefined;
123
+ }
124
+ }
125
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../../src/mem/internal/jsonl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;AACzB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,MAAM;AAE/B;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAI,IAAY,EAAE,MAA2B;IACpE,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAM;YACnB,MAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACpD,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACrC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;oBACd,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM;gBACR,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;gBACd,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU;oBAAE,SAAS;gBAChD,IAAI,GAAY,CAAC;gBACjB,IAAI,CAAC;oBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,MAAM,CAAC,GAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;oBAChC,IAAI,GAAG,IAAI,CAAC;oBACZ,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;YACtB,yEAAyE;YACzE,MAAM,IAAI,GAAG,QAAQ,CAAC;YACtB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACtC,MAAM,CAAC,GAAQ,CAAC,CAAC;gBACnB,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAI,IAAY;IAC5C,IAAI,MAAqB,CAAC;IAC1B,SAAS,CAAI,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,CAAC;QACb,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;uBACuB;AACvB,MAAM,UAAU,WAAW,CACzB,IAAY,EACZ,SAA8B,EAC9B,QAAQ,GAAG,GAAG;IAEd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAkB,CAAC;IACvB,SAAS,CAAI,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;QACzB,KAAK,EAAE,CAAC;QACR,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,GAAG,GAAG,GAAG,CAAC;YACV,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,KAAK,IAAI,QAAQ;YAAE,OAAO,MAAM,CAAC;IACvC,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAED;uEACuE;AACvE,MAAM,UAAU,YAAY,CAAI,IAAY;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Default home-based session roots for the persisted-session adapters.
3
+ *
4
+ * `HOME` is captured once at module load — consumers that need to point the
5
+ * adapters at a fake home (tests) must mock `node:os` before importing any
6
+ * mem module.
7
+ */
8
+ export declare const HOME: string;
9
+ export declare const CLAUDE_PROJECTS: string;
10
+ export declare const CODEX_SESSIONS: string;
11
+ export declare const PI_AGENT_DIR: string;
12
+ export declare const PI_SESSIONS: string;
13
+ /** Claude sanitizes a cwd into its on-disk project dir name by replacing
14
+ * every path separator (`/` and Windows `\`), drive colon (`:`), `_`, and `.`
15
+ * with `-`. Confirmed empirically against `~/.claude/projects/`:
16
+ * `/Users/x/.codex/...` → `-Users-x--codex-...`, `snap_note` → `snap-note`. */
17
+ export declare function claudeProjectDirFromCwd(cwd: string): string;
18
+ /** Pi encodes a cwd as `--<resolved-cwd-with-separators-as-dashes>--`. */
19
+ export declare function piProjectDirFromCwd(cwd: string): string;
20
+ /** Discover Pi session roots visible from the current process. */
21
+ export declare function piSessionRoots(): string[];
22
+ /** Lazy stack-based recursive file walk — yields every file path under
23
+ * `root`. Missing roots and unreadable directories are skipped silently. */
24
+ export declare function walkDir(root: string): Generator<string>;
25
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/mem/internal/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,eAAO,MAAM,IAAI,QAAe,CAAC;AACjC,eAAO,MAAM,eAAe,QAAyC,CAAC;AACtE,eAAO,MAAM,cAAc,QAAwC,CAAC;AASpE,eAAO,MAAM,YAAY,QAExB,CAAC;AACF,eAAO,MAAM,WAAW,QAGvB,CAAC;AAgBF;;;+EAG+E;AAC/E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,kEAAkE;AAClE,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAczC;AAED;4EAC4E;AAC5E,wBAAiB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAkBxD"}