@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.
- package/LICENSE +235 -0
- package/dist/channel/api/assert.d.ts +3 -0
- package/dist/channel/api/assert.d.ts.map +1 -0
- package/dist/channel/api/assert.js +11 -0
- package/dist/channel/api/assert.js.map +1 -0
- package/dist/channel/api/context.d.ts +21 -0
- package/dist/channel/api/context.d.ts.map +1 -0
- package/dist/channel/api/context.js +99 -0
- package/dist/channel/api/context.js.map +1 -0
- package/dist/channel/api/create.d.ts +9 -0
- package/dist/channel/api/create.d.ts.map +1 -0
- package/dist/channel/api/create.js +104 -0
- package/dist/channel/api/create.js.map +1 -0
- package/dist/channel/api/inbox.d.ts +51 -0
- package/dist/channel/api/inbox.d.ts.map +1 -0
- package/dist/channel/api/inbox.js +176 -0
- package/dist/channel/api/inbox.js.map +1 -0
- package/dist/channel/api/interrupt.d.ts +31 -0
- package/dist/channel/api/interrupt.d.ts.map +1 -0
- package/dist/channel/api/interrupt.js +98 -0
- package/dist/channel/api/interrupt.js.map +1 -0
- package/dist/channel/api/post-thread.d.ts +14 -0
- package/dist/channel/api/post-thread.d.ts.map +1 -0
- package/dist/channel/api/post-thread.js +109 -0
- package/dist/channel/api/post-thread.js.map +1 -0
- package/dist/channel/api/read.d.ts +17 -0
- package/dist/channel/api/read.d.ts.map +1 -0
- package/dist/channel/api/read.js +44 -0
- package/dist/channel/api/read.js.map +1 -0
- package/dist/channel/api/resolve.d.ts +21 -0
- package/dist/channel/api/resolve.d.ts.map +1 -0
- package/dist/channel/api/resolve.js +28 -0
- package/dist/channel/api/resolve.js.map +1 -0
- package/dist/channel/api/runtime.d.ts +70 -0
- package/dist/channel/api/runtime.d.ts.map +1 -0
- package/dist/channel/api/runtime.js +11 -0
- package/dist/channel/api/runtime.js.map +1 -0
- package/dist/channel/api/send.d.ts +4 -0
- package/dist/channel/api/send.d.ts.map +1 -0
- package/dist/channel/api/send.js +52 -0
- package/dist/channel/api/send.js.map +1 -0
- package/dist/channel/api/spawn.d.ts +13 -0
- package/dist/channel/api/spawn.d.ts.map +1 -0
- package/dist/channel/api/spawn.js +52 -0
- package/dist/channel/api/spawn.js.map +1 -0
- package/dist/channel/api/title.d.ts +5 -0
- package/dist/channel/api/title.d.ts.map +1 -0
- package/dist/channel/api/title.js +40 -0
- package/dist/channel/api/title.js.map +1 -0
- package/dist/channel/api/types.d.ts +65 -0
- package/dist/channel/api/types.d.ts.map +1 -0
- package/dist/channel/api/types.js +2 -0
- package/dist/channel/api/types.js.map +1 -0
- package/dist/channel/api/watch-channels.d.ts +40 -0
- package/dist/channel/api/watch-channels.d.ts.map +1 -0
- package/dist/channel/api/watch-channels.js +143 -0
- package/dist/channel/api/watch-channels.js.map +1 -0
- package/dist/channel/api/watch.d.ts +11 -0
- package/dist/channel/api/watch.d.ts.map +1 -0
- package/dist/channel/api/watch.js +17 -0
- package/dist/channel/api/watch.js.map +1 -0
- package/dist/channel/api/workers.d.ts +69 -0
- package/dist/channel/api/workers.d.ts.map +1 -0
- package/dist/channel/api/workers.js +143 -0
- package/dist/channel/api/workers.js.map +1 -0
- package/dist/channel/index.d.ts +38 -0
- package/dist/channel/index.d.ts.map +1 -0
- package/dist/channel/index.js +23 -0
- package/dist/channel/index.js.map +1 -0
- package/dist/channel/internal/store/channel-metadata.d.ts +23 -0
- package/dist/channel/internal/store/channel-metadata.d.ts.map +1 -0
- package/dist/channel/internal/store/channel-metadata.js +94 -0
- package/dist/channel/internal/store/channel-metadata.js.map +1 -0
- package/dist/channel/internal/store/delivery.d.ts +27 -0
- package/dist/channel/internal/store/delivery.d.ts.map +1 -0
- package/dist/channel/internal/store/delivery.js +37 -0
- package/dist/channel/internal/store/delivery.js.map +1 -0
- package/dist/channel/internal/store/events.d.ts +215 -0
- package/dist/channel/internal/store/events.d.ts.map +1 -0
- package/dist/channel/internal/store/events.js +204 -0
- package/dist/channel/internal/store/events.js.map +1 -0
- package/dist/channel/internal/store/filter.d.ts +21 -0
- package/dist/channel/internal/store/filter.d.ts.map +1 -0
- package/dist/channel/internal/store/filter.js +75 -0
- package/dist/channel/internal/store/filter.js.map +1 -0
- package/dist/channel/internal/store/inbox.d.ts +17 -0
- package/dist/channel/internal/store/inbox.d.ts.map +1 -0
- package/dist/channel/internal/store/inbox.js +30 -0
- package/dist/channel/internal/store/inbox.js.map +1 -0
- package/dist/channel/internal/store/lock.d.ts +17 -0
- package/dist/channel/internal/store/lock.d.ts.map +1 -0
- package/dist/channel/internal/store/lock.js +88 -0
- package/dist/channel/internal/store/lock.js.map +1 -0
- package/dist/channel/internal/store/paths.d.ts +43 -0
- package/dist/channel/internal/store/paths.d.ts.map +1 -0
- package/dist/channel/internal/store/paths.js +233 -0
- package/dist/channel/internal/store/paths.js.map +1 -0
- package/dist/channel/internal/store/schema.d.ts +77 -0
- package/dist/channel/internal/store/schema.d.ts.map +1 -0
- package/dist/channel/internal/store/schema.js +127 -0
- package/dist/channel/internal/store/schema.js.map +1 -0
- package/dist/channel/internal/store/seq.d.ts +12 -0
- package/dist/channel/internal/store/seq.d.ts.map +1 -0
- package/dist/channel/internal/store/seq.js +134 -0
- package/dist/channel/internal/store/seq.js.map +1 -0
- package/dist/channel/internal/store/thread-state.d.ts +37 -0
- package/dist/channel/internal/store/thread-state.d.ts.map +1 -0
- package/dist/channel/internal/store/thread-state.js +208 -0
- package/dist/channel/internal/store/thread-state.js.map +1 -0
- package/dist/channel/internal/store/watch.d.ts +10 -0
- package/dist/channel/internal/store/watch.d.ts.map +1 -0
- package/dist/channel/internal/store/watch.js +122 -0
- package/dist/channel/internal/store/watch.js.map +1 -0
- package/dist/channel/internal/store/worker-state.d.ts +56 -0
- package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
- package/dist/channel/internal/store/worker-state.js +220 -0
- package/dist/channel/internal/store/worker-state.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mem/adapters/claude.d.ts +22 -0
- package/dist/mem/adapters/claude.d.ts.map +1 -0
- package/dist/mem/adapters/claude.js +234 -0
- package/dist/mem/adapters/claude.js.map +1 -0
- package/dist/mem/adapters/codex.d.ts +35 -0
- package/dist/mem/adapters/codex.d.ts.map +1 -0
- package/dist/mem/adapters/codex.js +222 -0
- package/dist/mem/adapters/codex.js.map +1 -0
- package/dist/mem/adapters/opencode.d.ts +19 -0
- package/dist/mem/adapters/opencode.d.ts.map +1 -0
- package/dist/mem/adapters/opencode.js +25 -0
- package/dist/mem/adapters/opencode.js.map +1 -0
- package/dist/mem/adapters/pi.d.ts +20 -0
- package/dist/mem/adapters/pi.d.ts.map +1 -0
- package/dist/mem/adapters/pi.js +299 -0
- package/dist/mem/adapters/pi.js.map +1 -0
- package/dist/mem/context.d.ts +23 -0
- package/dist/mem/context.d.ts.map +1 -0
- package/dist/mem/context.js +118 -0
- package/dist/mem/context.js.map +1 -0
- package/dist/mem/dialogue.d.ts +17 -0
- package/dist/mem/dialogue.d.ts.map +1 -0
- package/dist/mem/dialogue.js +51 -0
- package/dist/mem/dialogue.js.map +1 -0
- package/dist/mem/filter.d.ts +31 -0
- package/dist/mem/filter.d.ts.map +1 -0
- package/dist/mem/filter.js +66 -0
- package/dist/mem/filter.js.map +1 -0
- package/dist/mem/index.d.ts +18 -0
- package/dist/mem/index.d.ts.map +1 -0
- package/dist/mem/index.js +17 -0
- package/dist/mem/index.js.map +1 -0
- package/dist/mem/internal/jsonl.d.ts +35 -0
- package/dist/mem/internal/jsonl.d.ts.map +1 -0
- package/dist/mem/internal/jsonl.js +125 -0
- package/dist/mem/internal/jsonl.js.map +1 -0
- package/dist/mem/internal/paths.d.ts +25 -0
- package/dist/mem/internal/paths.d.ts.map +1 -0
- package/dist/mem/internal/paths.js +97 -0
- package/dist/mem/internal/paths.js.map +1 -0
- package/dist/mem/phase.d.ts +45 -0
- package/dist/mem/phase.d.ts.map +1 -0
- package/dist/mem/phase.js +220 -0
- package/dist/mem/phase.js.map +1 -0
- package/dist/mem/projects.d.ts +13 -0
- package/dist/mem/projects.d.ts.map +1 -0
- package/dist/mem/projects.js +37 -0
- package/dist/mem/projects.js.map +1 -0
- package/dist/mem/search.d.ts +32 -0
- package/dist/mem/search.d.ts.map +1 -0
- package/dist/mem/search.js +125 -0
- package/dist/mem/search.js.map +1 -0
- package/dist/mem/sessions.d.ts +37 -0
- package/dist/mem/sessions.d.ts.map +1 -0
- package/dist/mem/sessions.js +279 -0
- package/dist/mem/sessions.js.map +1 -0
- package/dist/mem/types.d.ts +176 -0
- package/dist/mem/types.d.ts.map +1 -0
- package/dist/mem/types.js +10 -0
- package/dist/mem/types.js.map +1 -0
- package/dist/task/index.d.ts +9 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/index.js +9 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/paths.d.ts +37 -0
- package/dist/task/paths.d.ts.map +1 -0
- package/dist/task/paths.js +49 -0
- package/dist/task/paths.js.map +1 -0
- package/dist/task/phase.d.ts +27 -0
- package/dist/task/phase.d.ts.map +1 -0
- package/dist/task/phase.js +24 -0
- package/dist/task/phase.js.map +1 -0
- package/dist/task/records.d.ts +39 -0
- package/dist/task/records.d.ts.map +1 -0
- package/dist/task/records.js +89 -0
- package/dist/task/records.js.map +1 -0
- package/dist/task/schema.d.ts +77 -0
- package/dist/task/schema.d.ts.map +1 -0
- package/dist/task/schema.js +220 -0
- package/dist/task/schema.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- 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"}
|