trellis-hgl-core 0.6.0-beta.18
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 +102 -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 +106 -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 +44 -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 +54 -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 +64 -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 +145 -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 +203 -0
- package/dist/channel/internal/store/events.d.ts.map +1 -0
- package/dist/channel/internal/store/events.js +185 -0
- package/dist/channel/internal/store/events.js.map +1 -0
- package/dist/channel/internal/store/filter.d.ts +22 -0
- package/dist/channel/internal/store/filter.d.ts.map +1 -0
- package/dist/channel/internal/store/filter.js +78 -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 +133 -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 +206 -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 +49 -0
- package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
- package/dist/channel/internal/store/worker-state.js +207 -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 +252 -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/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 +70 -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 +18 -0
- package/dist/mem/internal/paths.d.ts.map +1 -0
- package/dist/mem/internal/paths.js +51 -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 +270 -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,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persisted Codex session reader.
|
|
3
|
+
*
|
|
4
|
+
* Layout: `~/.codex/sessions/**\/rollout-<ts>-<id>.jsonl`. Metadata is read
|
|
5
|
+
* from the first event's `payload`; the filename timestamp is a fallback
|
|
6
|
+
* `created`.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { stripInjectionTags, isBootstrapTurn } from "../dialogue.js";
|
|
11
|
+
import { inRangeOverlap, sameProject } from "../filter.js";
|
|
12
|
+
import { readJsonl, readJsonlFirst } from "../internal/jsonl.js";
|
|
13
|
+
import { CODEX_SESSIONS, walkDir } from "../internal/paths.js";
|
|
14
|
+
import { parseTaskPyCommandsAll } from "../phase.js";
|
|
15
|
+
import { searchInDialogue } from "../search.js";
|
|
16
|
+
function parseDialogueRole(v) {
|
|
17
|
+
return v === "user" || v === "assistant" ? v : undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Recover the shell command string from a Codex `function_call` event's
|
|
21
|
+
* `arguments` field. Codex versions vary in how they encode it:
|
|
22
|
+
*
|
|
23
|
+
* - a raw shell string
|
|
24
|
+
* - a stringified JSON object with `cmd` / `command` (string) or
|
|
25
|
+
* `argv` (string[] — joined with spaces)
|
|
26
|
+
* - a raw object with the same `cmd` / `command` / `argv` shape
|
|
27
|
+
*
|
|
28
|
+
* Returns `undefined` when no command can be recovered.
|
|
29
|
+
*/
|
|
30
|
+
export function commandFromCodexArguments(argsRaw) {
|
|
31
|
+
const fromObject = (obj) => {
|
|
32
|
+
const cmd = obj.cmd;
|
|
33
|
+
if (typeof cmd === "string")
|
|
34
|
+
return cmd;
|
|
35
|
+
const command = obj.command;
|
|
36
|
+
if (typeof command === "string")
|
|
37
|
+
return command;
|
|
38
|
+
const argv = obj.argv;
|
|
39
|
+
if (Array.isArray(argv)) {
|
|
40
|
+
const parts = argv.filter((a) => typeof a === "string");
|
|
41
|
+
if (parts.length)
|
|
42
|
+
return parts.join(" ");
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
};
|
|
46
|
+
if (typeof argsRaw === "string") {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(argsRaw);
|
|
49
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
50
|
+
return fromObject(parsed);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Not JSON — some Codex versions inline the raw shell string.
|
|
55
|
+
return argsRaw;
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (argsRaw && typeof argsRaw === "object" && !Array.isArray(argsRaw)) {
|
|
60
|
+
return fromObject(argsRaw);
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
// ---------- list ----------
|
|
65
|
+
export function codexListSessions(f) {
|
|
66
|
+
if (!fs.existsSync(CODEX_SESSIONS))
|
|
67
|
+
return [];
|
|
68
|
+
const out = [];
|
|
69
|
+
for (const file of walkDir(CODEX_SESSIONS)) {
|
|
70
|
+
if (!file.endsWith(".jsonl"))
|
|
71
|
+
continue;
|
|
72
|
+
const base = path.basename(file, ".jsonl");
|
|
73
|
+
const m = base.match(/^rollout-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})-(.+)$/);
|
|
74
|
+
const tsFromName = m?.[1]
|
|
75
|
+
? new Date(m[1].replace(/T(\d{2})-(\d{2})-(\d{2})/, "T$1:$2:$3") + "Z").toISOString()
|
|
76
|
+
: undefined;
|
|
77
|
+
const first = readJsonlFirst(file);
|
|
78
|
+
const meta = first?.payload;
|
|
79
|
+
const id = meta?.id ?? m?.[2] ?? base;
|
|
80
|
+
const cwd = meta?.cwd;
|
|
81
|
+
const created = first?.timestamp ?? tsFromName ?? "";
|
|
82
|
+
if (f.cwd && !sameProject(cwd, f.cwd))
|
|
83
|
+
continue;
|
|
84
|
+
const updated = fs.statSync(file).mtime.toISOString();
|
|
85
|
+
if (!inRangeOverlap(created, updated, f))
|
|
86
|
+
continue;
|
|
87
|
+
out.push({
|
|
88
|
+
platform: "codex",
|
|
89
|
+
id,
|
|
90
|
+
cwd,
|
|
91
|
+
created,
|
|
92
|
+
updated,
|
|
93
|
+
filePath: file,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
// ---------- extract ----------
|
|
99
|
+
function buildTurnFromMessage(role, parts) {
|
|
100
|
+
const collected = [];
|
|
101
|
+
let totalRaw = 0;
|
|
102
|
+
for (const c of parts ?? []) {
|
|
103
|
+
const txt = c.text;
|
|
104
|
+
if (typeof txt !== "string")
|
|
105
|
+
continue;
|
|
106
|
+
if (c.type !== "input_text" && c.type !== "output_text")
|
|
107
|
+
continue;
|
|
108
|
+
totalRaw += txt.length;
|
|
109
|
+
const cleaned = stripInjectionTags(txt);
|
|
110
|
+
if (cleaned)
|
|
111
|
+
collected.push(cleaned);
|
|
112
|
+
}
|
|
113
|
+
if (!collected.length)
|
|
114
|
+
return null;
|
|
115
|
+
const merged = collected.join("\n\n");
|
|
116
|
+
if (isBootstrapTurn(merged, totalRaw))
|
|
117
|
+
return null;
|
|
118
|
+
return { role, text: merged };
|
|
119
|
+
}
|
|
120
|
+
export function codexExtractDialogue(s) {
|
|
121
|
+
// payload.type=="message" with role in {user, assistant} only.
|
|
122
|
+
// Compaction: a top-level `compacted` event carries payload.replacement_history
|
|
123
|
+
// — the new authoritative history replacing everything before.
|
|
124
|
+
let turns = [];
|
|
125
|
+
readJsonl(s.filePath, (obj) => {
|
|
126
|
+
if (obj.type === "compacted") {
|
|
127
|
+
const rh = obj.payload?.replacement_history;
|
|
128
|
+
turns = [];
|
|
129
|
+
if (!Array.isArray(rh))
|
|
130
|
+
return;
|
|
131
|
+
for (const item of rh) {
|
|
132
|
+
if (item.type !== "message")
|
|
133
|
+
continue;
|
|
134
|
+
const role = parseDialogueRole(item.role);
|
|
135
|
+
if (!role)
|
|
136
|
+
continue;
|
|
137
|
+
const turn = buildTurnFromMessage(role, item.content);
|
|
138
|
+
if (turn)
|
|
139
|
+
turns.push({ role: turn.role, text: `[compact]\n${turn.text}` });
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const p = obj.payload;
|
|
144
|
+
if (p?.type !== "message")
|
|
145
|
+
return;
|
|
146
|
+
const role = parseDialogueRole(p.role);
|
|
147
|
+
if (!role)
|
|
148
|
+
return;
|
|
149
|
+
const turn = buildTurnFromMessage(role, p.content);
|
|
150
|
+
if (turn)
|
|
151
|
+
turns.push(turn);
|
|
152
|
+
});
|
|
153
|
+
return turns;
|
|
154
|
+
}
|
|
155
|
+
export function codexSearch(s, kw) {
|
|
156
|
+
return searchInDialogue(codexExtractDialogue(s), kw);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Codex twin of `collectClaudeTurnsAndEvents`. Single pass over the rollout
|
|
160
|
+
* file; emits both the cleaned dialogue turns and the list of
|
|
161
|
+
* `task.py create|start` invocations found inside `function_call` events whose
|
|
162
|
+
* `name === "exec_command"` (or `"shell"`). Compaction resets both `turns` and
|
|
163
|
+
* `events`.
|
|
164
|
+
*/
|
|
165
|
+
export function collectCodexTurnsAndEvents(s) {
|
|
166
|
+
let turns = [];
|
|
167
|
+
let events = [];
|
|
168
|
+
readJsonl(s.filePath, (obj) => {
|
|
169
|
+
if (obj.type === "compacted") {
|
|
170
|
+
const rh = obj.payload?.replacement_history;
|
|
171
|
+
turns = [];
|
|
172
|
+
events = [];
|
|
173
|
+
if (!Array.isArray(rh))
|
|
174
|
+
return;
|
|
175
|
+
for (const item of rh) {
|
|
176
|
+
if (item.type !== "message")
|
|
177
|
+
continue;
|
|
178
|
+
const role = parseDialogueRole(item.role);
|
|
179
|
+
if (!role)
|
|
180
|
+
continue;
|
|
181
|
+
const turn = buildTurnFromMessage(role, item.content);
|
|
182
|
+
if (turn)
|
|
183
|
+
turns.push({ role: turn.role, text: `[compact]\n${turn.text}` });
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const p = obj.payload;
|
|
188
|
+
if (!p)
|
|
189
|
+
return;
|
|
190
|
+
if (p.type === "function_call") {
|
|
191
|
+
const fnName = p.name;
|
|
192
|
+
if (fnName !== "exec_command" && fnName !== "shell")
|
|
193
|
+
return;
|
|
194
|
+
const cmd = commandFromCodexArguments(p.arguments);
|
|
195
|
+
if (!cmd)
|
|
196
|
+
return;
|
|
197
|
+
const parsedAll = parseTaskPyCommandsAll(cmd);
|
|
198
|
+
for (const parsed of parsedAll) {
|
|
199
|
+
const ev = {
|
|
200
|
+
action: parsed.action,
|
|
201
|
+
timestamp: obj.timestamp ?? "",
|
|
202
|
+
turnIndex: turns.length,
|
|
203
|
+
...(parsed.action === "create"
|
|
204
|
+
? { slug: parsed.slug }
|
|
205
|
+
: { taskDir: parsed.taskDir }),
|
|
206
|
+
};
|
|
207
|
+
events.push(ev);
|
|
208
|
+
}
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (p.type !== "message")
|
|
212
|
+
return;
|
|
213
|
+
const role = parseDialogueRole(p.role);
|
|
214
|
+
if (!role)
|
|
215
|
+
return;
|
|
216
|
+
const turn = buildTurnFromMessage(role, p.content);
|
|
217
|
+
if (turn)
|
|
218
|
+
turns.push(turn);
|
|
219
|
+
});
|
|
220
|
+
return { turns, events };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/mem/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode session reader — currently a degraded no-op.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode 1.2+ moved to a SQLite store at
|
|
5
|
+
* `~/.local/share/opencode/opencode.db`. The previous SQLite reader required a
|
|
6
|
+
* native dependency (`better-sqlite3`) whose prebuilt-tarball + node-gyp
|
|
7
|
+
* fallback chain broke `npm install` on Windows + restricted networks, so it
|
|
8
|
+
* was reverted. These adapter functions are kept (dispatch / phase slicing
|
|
9
|
+
* rely on them) but degraded to silent no-ops.
|
|
10
|
+
*
|
|
11
|
+
* The "OpenCode reader unavailable" warning is a presentation concern owned by
|
|
12
|
+
* the CLI — core never prints. Re-enabled in a future release once a
|
|
13
|
+
* non-native backend ships.
|
|
14
|
+
*/
|
|
15
|
+
import type { DialogueTurn, MemFilter, MemSessionInfo, SearchHit } from "../types.js";
|
|
16
|
+
export declare function opencodeListSessions(_f: MemFilter): MemSessionInfo[];
|
|
17
|
+
export declare function opencodeExtractDialogue(_s: MemSessionInfo): DialogueTurn[];
|
|
18
|
+
export declare function opencodeSearch(kw: string): SearchHit;
|
|
19
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/mem/adapters/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,cAAc,EACd,SAAS,EACV,MAAM,aAAa,CAAC;AAErB,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,EAAE,CAEpE;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,cAAc,GAAG,YAAY,EAAE,CAE1E;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAEpD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode session reader — currently a degraded no-op.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode 1.2+ moved to a SQLite store at
|
|
5
|
+
* `~/.local/share/opencode/opencode.db`. The previous SQLite reader required a
|
|
6
|
+
* native dependency (`better-sqlite3`) whose prebuilt-tarball + node-gyp
|
|
7
|
+
* fallback chain broke `npm install` on Windows + restricted networks, so it
|
|
8
|
+
* was reverted. These adapter functions are kept (dispatch / phase slicing
|
|
9
|
+
* rely on them) but degraded to silent no-ops.
|
|
10
|
+
*
|
|
11
|
+
* The "OpenCode reader unavailable" warning is a presentation concern owned by
|
|
12
|
+
* the CLI — core never prints. Re-enabled in a future release once a
|
|
13
|
+
* non-native backend ships.
|
|
14
|
+
*/
|
|
15
|
+
import { searchInDialogue } from "../search.js";
|
|
16
|
+
export function opencodeListSessions(_f) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
export function opencodeExtractDialogue(_s) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
export function opencodeSearch(kw) {
|
|
23
|
+
return searchInDialogue([], kw);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/mem/adapters/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAQhD,MAAM,UAAU,oBAAoB,CAAC,EAAa;IAChD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAkB;IACxD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 type { DialogueTurn, MemContextResult, MemContextTurn, ReadMemContextOptions } from "./types.js";
|
|
7
|
+
interface SelectedContext {
|
|
8
|
+
turns: MemContextTurn[];
|
|
9
|
+
totalHitTurns: number;
|
|
10
|
+
budgetUsed: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Pure selection: rank turns against `grep` (user-role first, then hit
|
|
14
|
+
* density), take the top `nTurns`, expand each by `around` turns of context,
|
|
15
|
+
* then emit turns within `maxChars` — head-truncating any single turn that
|
|
16
|
+
* exceeds half the budget. With no `grep`, returns the first `nTurns` turns.
|
|
17
|
+
*/
|
|
18
|
+
export declare function selectContextTurns(turns: readonly DialogueTurn[], grep: string | undefined, nTurns: number, around: number, maxChars: number): SelectedContext;
|
|
19
|
+
/** Drill into a single session: top-N hit turns plus surrounding context,
|
|
20
|
+
* char-budgeted. With no `grep`, returns the session opening. */
|
|
21
|
+
export declare function readMemContext(options: ReadMemContextOptions): MemContextResult;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/mem/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAEV,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,UAAU,eAAe;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,eAAe,CAoEjB;AAED;iEACiE;AACjE,wBAAgB,cAAc,CAC5B,OAAO,EAAE,qBAAqB,GAC7B,gBAAgB,CAiClB"}
|
|
@@ -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, Trellis / 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, Trellis / 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,70 @@
|
|
|
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 = normalizeProjectPath(sessionCwd);
|
|
63
|
+
const b = normalizeProjectPath(target);
|
|
64
|
+
return a === b || a.startsWith(b + path.sep);
|
|
65
|
+
}
|
|
66
|
+
function normalizeProjectPath(value) {
|
|
67
|
+
const normalized = path.resolve(value);
|
|
68
|
+
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
69
|
+
}
|
|
70
|
+
//# 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,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface for `@mindfoldhq/trellis-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
|
+
* `@mindfoldhq/trellis-core` barrel. Import it explicitly:
|
|
8
|
+
*
|
|
9
|
+
* import { searchMemSessions } from "@mindfoldhq/trellis-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
|