@blulotus/trellis-core 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +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 +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 +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 +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 +215 -0
- package/dist/channel/internal/store/events.d.ts.map +1 -0
- package/dist/channel/internal/store/events.js +206 -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 +57 -0
- package/dist/channel/internal/store/paths.d.ts.map +1 -0
- package/dist/channel/internal/store/paths.js +264 -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 +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 +209 -0
- package/dist/mem/adapters/claude.js.map +1 -0
- package/dist/mem/adapters/codex.d.ts +55 -0
- package/dist/mem/adapters/codex.d.ts.map +1 -0
- package/dist/mem/adapters/codex.js +344 -0
- package/dist/mem/adapters/codex.js.map +1 -0
- package/dist/mem/adapters/grok.d.ts +41 -0
- package/dist/mem/adapters/grok.d.ts.map +1 -0
- package/dist/mem/adapters/grok.js +202 -0
- package/dist/mem/adapters/grok.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 +24 -0
- package/dist/mem/adapters/pi.d.ts.map +1 -0
- package/dist/mem/adapters/pi.js +290 -0
- package/dist/mem/adapters/pi.js.map +1 -0
- package/dist/mem/adapters/zcode.d.ts +76 -0
- package/dist/mem/adapters/zcode.d.ts.map +1 -0
- package/dist/mem/adapters/zcode.js +434 -0
- package/dist/mem/adapters/zcode.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 +120 -0
- package/dist/mem/context.js.map +1 -0
- package/dist/mem/dialogue.d.ts +32 -0
- package/dist/mem/dialogue.d.ts.map +1 -0
- package/dist/mem/dialogue.js +0 -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 +38 -0
- package/dist/mem/internal/paths.d.ts.map +1 -0
- package/dist/mem/internal/paths.js +126 -0
- package/dist/mem/internal/paths.js.map +1 -0
- package/dist/mem/internal/sqlite-readonly.d.ts +77 -0
- package/dist/mem/internal/sqlite-readonly.d.ts.map +1 -0
- package/dist/mem/internal/sqlite-readonly.js +797 -0
- package/dist/mem/internal/sqlite-readonly.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 +47 -0
- package/dist/mem/projects.js.map +1 -0
- package/dist/mem/search.d.ts +39 -0
- package/dist/mem/search.d.ts.map +1 -0
- package/dist/mem/search.js +133 -0
- package/dist/mem/search.js.map +1 -0
- package/dist/mem/sessions.d.ts +38 -0
- package/dist/mem/sessions.d.ts.map +1 -0
- package/dist/mem/sessions.js +313 -0
- package/dist/mem/sessions.js.map +1 -0
- package/dist/mem/types.d.ts +188 -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 +77 -0
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZCode (Zhipu) persisted-session reader.
|
|
3
|
+
*
|
|
4
|
+
* ZCode stores sessions in a SQLite database at `~/.zcode/cli/db/db.sqlite`
|
|
5
|
+
* (WAL mode). The three tables this adapter reads are:
|
|
6
|
+
*
|
|
7
|
+
* - `session` — id / title / directory (workspace cwd) / time_created /
|
|
8
|
+
* time_updated / task_type
|
|
9
|
+
* - `message` — id / session_id / time_created / data (JSON: {role, ...})
|
|
10
|
+
* - `part` — message_id / time_created / data (JSON: {type, text|tool, ...})
|
|
11
|
+
* plus compaction markers that replace earlier dialogue with
|
|
12
|
+
* a summary message.
|
|
13
|
+
*
|
|
14
|
+
* The older `~/.zcode/v2/sessions/*.json` layout is abandoned by current ZCode,
|
|
15
|
+
* and `~/.zcode/cli/rollout/*.jsonl` is a non-persistent model-IO stream that
|
|
16
|
+
* gets cleaned up periodically — neither is read here. SQLite is the single
|
|
17
|
+
* complete source of truth (see `docs-hlaia/06-...` for the investigation).
|
|
18
|
+
*
|
|
19
|
+
* SQLite access is via the zero-dependency parser in `internal/sqlite-readonly.ts`
|
|
20
|
+
* — `better-sqlite3` was rejected because its native build chain broke npm
|
|
21
|
+
* install on Windows for the OpenCode adapter.
|
|
22
|
+
*/
|
|
23
|
+
import * as fs from "node:fs";
|
|
24
|
+
import { compactionBoundaryTurn, stripInjectionTags, isBootstrapTurn, } from "../dialogue.js";
|
|
25
|
+
import { inRangeOverlap, sameProject } from "../filter.js";
|
|
26
|
+
import { openSqliteReadOnly, SqliteParseError, SqliteSnapshotUnstableError, } from "../internal/sqlite-readonly.js";
|
|
27
|
+
import { ZCODE_DB } from "../internal/paths.js";
|
|
28
|
+
import { parseTaskPyCommandsAll } from "../phase.js";
|
|
29
|
+
import { searchInDialogue } from "../search.js";
|
|
30
|
+
function parseDialogueRole(v) {
|
|
31
|
+
return v === "user" || v === "assistant" ? v : undefined;
|
|
32
|
+
}
|
|
33
|
+
/** Safely parse the JSON stored in a `data` column. Returns null on failure. */
|
|
34
|
+
function parseDataJson(raw) {
|
|
35
|
+
if (typeof raw !== "string")
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
const v = JSON.parse(raw);
|
|
39
|
+
return v && typeof v === "object" && !Array.isArray(v)
|
|
40
|
+
? v
|
|
41
|
+
: null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const ZCODE_DB_UNREADABLE_WARNING_CODE = "zcode-db-unreadable";
|
|
48
|
+
const ZCODE_DB_SNAPSHOT_UNSTABLE_WARNING_CODE = "zcode-db-snapshot-unstable";
|
|
49
|
+
function emptySessionStore() {
|
|
50
|
+
return { messagesBySession: new Map(), partsByMsg: new Map() };
|
|
51
|
+
}
|
|
52
|
+
function pushDbWarning(warnings, dbPath, error) {
|
|
53
|
+
const isSnapshotUnstable = error instanceof SqliteSnapshotUnstableError;
|
|
54
|
+
const code = isSnapshotUnstable
|
|
55
|
+
? ZCODE_DB_SNAPSHOT_UNSTABLE_WARNING_CODE
|
|
56
|
+
: ZCODE_DB_UNREADABLE_WARNING_CODE;
|
|
57
|
+
if (warnings.some((warning) => warning.code === code))
|
|
58
|
+
return;
|
|
59
|
+
warnings.push({
|
|
60
|
+
code,
|
|
61
|
+
message: isSnapshotUnstable
|
|
62
|
+
? `ZCode 正在写入,请重试。 (${dbPath})`
|
|
63
|
+
: `cannot read ZCode session database (${dbPath}): ${error.message}`,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function requireTables(db, names) {
|
|
67
|
+
const available = new Set(db.listTables().map((table) => table.name));
|
|
68
|
+
const missing = names.filter((name) => !available.has(name));
|
|
69
|
+
if (missing.length > 0) {
|
|
70
|
+
throw new SqliteParseError(`ZCode database schema is missing table(s): ${missing.join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function requireTableColumns(db, tableName, names) {
|
|
74
|
+
const table = db.listTables().find((item) => item.name === tableName);
|
|
75
|
+
if (!table) {
|
|
76
|
+
throw new SqliteParseError(`ZCode database schema is missing table: ${tableName}`);
|
|
77
|
+
}
|
|
78
|
+
const missing = names.filter((name) => {
|
|
79
|
+
const pattern = new RegExp(`(?:\\(|,)\\s*["\`\\[]?${name}(?:["\`\\]]|\\b)`, "i");
|
|
80
|
+
return !pattern.test(table.sql);
|
|
81
|
+
});
|
|
82
|
+
if (missing.length > 0) {
|
|
83
|
+
throw new SqliteParseError(`ZCode table ${tableName} is missing column(s): ${missing.join(", ")}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function requireRowColumns(rows, tableName, names) {
|
|
87
|
+
const first = rows[0];
|
|
88
|
+
if (!first)
|
|
89
|
+
return;
|
|
90
|
+
const missing = names.filter((name) => !(name in first));
|
|
91
|
+
if (missing.length > 0) {
|
|
92
|
+
throw new SqliteParseError(`ZCode table ${tableName} is missing column(s): ${missing.join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function buildSessionStore(allMessages, allParts) {
|
|
96
|
+
const messagesBySession = new Map();
|
|
97
|
+
for (const row of allMessages) {
|
|
98
|
+
const sessionId = typeof row.session_id === "string" ? row.session_id : "";
|
|
99
|
+
if (!sessionId)
|
|
100
|
+
continue;
|
|
101
|
+
const data = parseDataJson(row.data);
|
|
102
|
+
const role = parseDialogueRole(data?.role);
|
|
103
|
+
if (!role)
|
|
104
|
+
continue;
|
|
105
|
+
const tc = typeof row.time_created === "number" ? row.time_created : 0;
|
|
106
|
+
const id = typeof row.id === "string" ? row.id : "";
|
|
107
|
+
if (!id)
|
|
108
|
+
continue;
|
|
109
|
+
const list = messagesBySession.get(sessionId) ?? [];
|
|
110
|
+
list.push({ id, time_created: tc, role });
|
|
111
|
+
messagesBySession.set(sessionId, list);
|
|
112
|
+
}
|
|
113
|
+
for (const list of messagesBySession.values()) {
|
|
114
|
+
list.sort((a, b) => a.time_created - b.time_created);
|
|
115
|
+
}
|
|
116
|
+
const partsByMsg = new Map();
|
|
117
|
+
for (const row of allParts) {
|
|
118
|
+
const msgId = typeof row.message_id === "string" ? row.message_id : "";
|
|
119
|
+
if (!msgId)
|
|
120
|
+
continue;
|
|
121
|
+
const data = parseDataJson(row.data);
|
|
122
|
+
if (!data)
|
|
123
|
+
continue;
|
|
124
|
+
const tc = typeof row.time_created === "number" ? row.time_created : 0;
|
|
125
|
+
const list = partsByMsg.get(msgId) ?? [];
|
|
126
|
+
list.push({ message_id: msgId, time_created: tc, data });
|
|
127
|
+
partsByMsg.set(msgId, list);
|
|
128
|
+
}
|
|
129
|
+
for (const list of partsByMsg.values()) {
|
|
130
|
+
list.sort((a, b) => a.time_created - b.time_created);
|
|
131
|
+
}
|
|
132
|
+
return { messagesBySession, partsByMsg };
|
|
133
|
+
}
|
|
134
|
+
/** Search-scoped whole-db store. It is explicitly prepared/released by the
|
|
135
|
+
* orchestrator; one-session extract/context calls never populate it. */
|
|
136
|
+
let preparedStore = null;
|
|
137
|
+
/** Load a full-db search store for `dbPath`. Returns a degraded empty store
|
|
138
|
+
* when the db is missing/corrupt so callers never crash. */
|
|
139
|
+
function loadSessionStore(dbPath, warnings) {
|
|
140
|
+
if (!fs.existsSync(dbPath))
|
|
141
|
+
return emptySessionStore();
|
|
142
|
+
let allMessages;
|
|
143
|
+
let allParts;
|
|
144
|
+
try {
|
|
145
|
+
const db = openSqliteReadOnly(dbPath);
|
|
146
|
+
try {
|
|
147
|
+
requireTables(db, ["message", "part"]);
|
|
148
|
+
requireTableColumns(db, "message", ["id", "session_id", "data"]);
|
|
149
|
+
requireTableColumns(db, "part", ["message_id", "data"]);
|
|
150
|
+
allMessages = db.scanTable("message");
|
|
151
|
+
allParts = db.scanTable("part");
|
|
152
|
+
requireRowColumns(allMessages, "message", ["id", "session_id", "data"]);
|
|
153
|
+
requireRowColumns(allParts, "part", ["message_id", "data"]);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
db.close();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
if (e instanceof SqliteParseError) {
|
|
161
|
+
pushDbWarning(warnings, dbPath, e);
|
|
162
|
+
return emptySessionStore();
|
|
163
|
+
}
|
|
164
|
+
throw e;
|
|
165
|
+
}
|
|
166
|
+
return buildSessionStore(allMessages, allParts);
|
|
167
|
+
}
|
|
168
|
+
export function prepareZcodeSessionStore(dbPath, warnings) {
|
|
169
|
+
preparedStore = { dbPath, store: loadSessionStore(dbPath, warnings) };
|
|
170
|
+
}
|
|
171
|
+
export function releaseZcodeSessionStore() {
|
|
172
|
+
preparedStore = null;
|
|
173
|
+
}
|
|
174
|
+
/** Read one session with row filtering unless a search-scoped whole-db store
|
|
175
|
+
* has been prepared by the orchestrator. */
|
|
176
|
+
function readSessionMessages(dbPath, sessionId, warnings) {
|
|
177
|
+
if (preparedStore?.dbPath === dbPath) {
|
|
178
|
+
return {
|
|
179
|
+
messages: preparedStore.store.messagesBySession.get(sessionId) ?? [],
|
|
180
|
+
partsByMsg: preparedStore.store.partsByMsg,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (!fs.existsSync(dbPath))
|
|
184
|
+
return { messages: [], partsByMsg: new Map() };
|
|
185
|
+
let store;
|
|
186
|
+
try {
|
|
187
|
+
const db = openSqliteReadOnly(dbPath);
|
|
188
|
+
try {
|
|
189
|
+
requireTables(db, ["message", "part"]);
|
|
190
|
+
requireTableColumns(db, "message", ["id", "session_id", "data"]);
|
|
191
|
+
requireTableColumns(db, "part", ["message_id", "data"]);
|
|
192
|
+
const messages = db.scanTable("message", (row) => row.session_id === sessionId);
|
|
193
|
+
const messageIds = new Set(messages
|
|
194
|
+
.map((row) => row.id)
|
|
195
|
+
.filter((id) => typeof id === "string"));
|
|
196
|
+
const parts = db.scanTable("part", (row) => typeof row.message_id === "string" && messageIds.has(row.message_id));
|
|
197
|
+
requireRowColumns(messages, "message", ["id", "session_id", "data"]);
|
|
198
|
+
requireRowColumns(parts, "part", ["message_id", "data"]);
|
|
199
|
+
store = buildSessionStore(messages, parts);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
db.close();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (error instanceof SqliteParseError) {
|
|
207
|
+
pushDbWarning(warnings, dbPath, error);
|
|
208
|
+
return { messages: [], partsByMsg: new Map() };
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
return {
|
|
213
|
+
messages: store.messagesBySession.get(sessionId) ?? [],
|
|
214
|
+
partsByMsg: store.partsByMsg,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function isRecord(value) {
|
|
218
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
219
|
+
}
|
|
220
|
+
function isCompactionSummaryPart(data) {
|
|
221
|
+
return (data.type === "compaction" &&
|
|
222
|
+
(typeof data.tail_start_id === "string" || isRecord(data.compactBoundary)));
|
|
223
|
+
}
|
|
224
|
+
function compactionMarkerSummaryId(data) {
|
|
225
|
+
return data.type === "compaction" &&
|
|
226
|
+
data.replace === true &&
|
|
227
|
+
typeof data.summaryMessageId === "string"
|
|
228
|
+
? data.summaryMessageId
|
|
229
|
+
: undefined;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* ZCode compaction writes two markers:
|
|
233
|
+
* - an assistant marker with `replace: true` and `summaryMessageId`
|
|
234
|
+
* - a summary message carrying text plus a `compaction` part with
|
|
235
|
+
* `tail_start_id` / `compactBoundary`
|
|
236
|
+
*
|
|
237
|
+
* Those say where ZCode cut its own context. The summarized messages are still
|
|
238
|
+
* rows in the same database, so extraction keeps them and renders each summary
|
|
239
|
+
* message as a boundary marker in place.
|
|
240
|
+
*/
|
|
241
|
+
function compactSummaryMessageIds(messages, partsByMsg) {
|
|
242
|
+
const summaryIds = new Set();
|
|
243
|
+
const markerSummaryIds = new Set();
|
|
244
|
+
for (const msg of messages) {
|
|
245
|
+
if (markerSummaryIds.has(msg.id))
|
|
246
|
+
summaryIds.add(msg.id);
|
|
247
|
+
for (const part of partsByMsg.get(msg.id) ?? []) {
|
|
248
|
+
const markerSummaryId = compactionMarkerSummaryId(part.data);
|
|
249
|
+
if (markerSummaryId)
|
|
250
|
+
markerSummaryIds.add(markerSummaryId);
|
|
251
|
+
if (isCompactionSummaryPart(part.data)) {
|
|
252
|
+
summaryIds.add(msg.id);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return summaryIds;
|
|
258
|
+
}
|
|
259
|
+
function buildTextTurn(msg, parts, compactSummaryIds) {
|
|
260
|
+
const collected = [];
|
|
261
|
+
let totalRaw = 0;
|
|
262
|
+
for (const part of parts) {
|
|
263
|
+
const pd = part.data;
|
|
264
|
+
if (pd.type !== "text")
|
|
265
|
+
continue;
|
|
266
|
+
const txt = typeof pd.text === "string" ? pd.text : "";
|
|
267
|
+
if (!txt)
|
|
268
|
+
continue;
|
|
269
|
+
totalRaw += txt.length;
|
|
270
|
+
collected.push(stripInjectionTags(txt));
|
|
271
|
+
}
|
|
272
|
+
if (!collected.length)
|
|
273
|
+
return null;
|
|
274
|
+
const merged = collected.join("\n\n");
|
|
275
|
+
if (compactSummaryIds.has(msg.id)) {
|
|
276
|
+
return compactionBoundaryTurn("context compacted here; the turns above are still in the ZCode database", merged);
|
|
277
|
+
}
|
|
278
|
+
if (isBootstrapTurn(merged, totalRaw))
|
|
279
|
+
return null;
|
|
280
|
+
return merged.trim() ? { role: msg.role, text: merged } : null;
|
|
281
|
+
}
|
|
282
|
+
// ---------- list ----------
|
|
283
|
+
export function zcodeListSessions(f, warnings = []) {
|
|
284
|
+
if (!fs.existsSync(ZCODE_DB))
|
|
285
|
+
return [];
|
|
286
|
+
let rows;
|
|
287
|
+
try {
|
|
288
|
+
const db = openSqliteReadOnly(ZCODE_DB);
|
|
289
|
+
try {
|
|
290
|
+
requireTables(db, ["session"]);
|
|
291
|
+
requireTableColumns(db, "session", [
|
|
292
|
+
"id",
|
|
293
|
+
"directory",
|
|
294
|
+
"time_created",
|
|
295
|
+
"time_updated",
|
|
296
|
+
]);
|
|
297
|
+
rows = db.scanTable("session");
|
|
298
|
+
requireRowColumns(rows, "session", [
|
|
299
|
+
"id",
|
|
300
|
+
"directory",
|
|
301
|
+
"time_created",
|
|
302
|
+
"time_updated",
|
|
303
|
+
]);
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
db.close();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
if (e instanceof SqliteParseError) {
|
|
311
|
+
pushDbWarning(warnings, ZCODE_DB, e);
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
throw e;
|
|
315
|
+
}
|
|
316
|
+
const out = [];
|
|
317
|
+
for (const row of rows) {
|
|
318
|
+
// `subagent_child` sessions are sub-agent conversations (Explore/research
|
|
319
|
+
// dispatches). Exclude them from the default list — they are noise for
|
|
320
|
+
// daily-review workflows, which care about the user's interactive sessions.
|
|
321
|
+
// They are excluded across list/search/extract; relax this filter if a
|
|
322
|
+
// future workflow needs to inspect sub-agent runs.
|
|
323
|
+
const taskType = typeof row.task_type === "string" ? row.task_type : "";
|
|
324
|
+
if (taskType === "subagent_child")
|
|
325
|
+
continue;
|
|
326
|
+
const directory = typeof row.directory === "string" ? row.directory : undefined;
|
|
327
|
+
if (f.cwd && !sameProject(directory, f.cwd))
|
|
328
|
+
continue;
|
|
329
|
+
const created = toIso(row.time_created);
|
|
330
|
+
const updated = toIso(row.time_updated) ?? created;
|
|
331
|
+
if (!inRangeOverlap(created, updated, f))
|
|
332
|
+
continue;
|
|
333
|
+
out.push({
|
|
334
|
+
platform: "zcode",
|
|
335
|
+
id: typeof row.id === "string" ? row.id : "",
|
|
336
|
+
title: typeof row.title === "string" ? row.title : undefined,
|
|
337
|
+
cwd: directory,
|
|
338
|
+
created,
|
|
339
|
+
updated,
|
|
340
|
+
filePath: ZCODE_DB,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
return out;
|
|
344
|
+
}
|
|
345
|
+
function toIso(epochMs) {
|
|
346
|
+
return typeof epochMs === "number" && epochMs > 0
|
|
347
|
+
? new Date(epochMs).toISOString()
|
|
348
|
+
: undefined;
|
|
349
|
+
}
|
|
350
|
+
// ---------- extract ----------
|
|
351
|
+
/**
|
|
352
|
+
* Build cleaned dialogue turns from a session's messages + parts. Each message
|
|
353
|
+
* is one turn; its text is the concatenation of its `text`-typed parts after
|
|
354
|
+
* injection-tag stripping. Messages with no surviving text are dropped.
|
|
355
|
+
*/
|
|
356
|
+
export function zcodeExtractDialogue(s, warnings = []) {
|
|
357
|
+
const { messages, partsByMsg } = readSessionMessages(s.filePath, s.id, warnings);
|
|
358
|
+
const summaryIds = compactSummaryMessageIds(messages, partsByMsg);
|
|
359
|
+
const turns = [];
|
|
360
|
+
for (const msg of messages) {
|
|
361
|
+
const parts = partsByMsg.get(msg.id) ?? [];
|
|
362
|
+
const turn = buildTextTurn(msg, parts, summaryIds);
|
|
363
|
+
if (turn)
|
|
364
|
+
turns.push(turn);
|
|
365
|
+
}
|
|
366
|
+
return turns;
|
|
367
|
+
}
|
|
368
|
+
export function zcodeSearch(s, kw, warnings = []) {
|
|
369
|
+
return searchInDialogue(zcodeExtractDialogue(s, warnings), kw);
|
|
370
|
+
}
|
|
371
|
+
// ---------- phase slicing (task.py boundary detection) ----------
|
|
372
|
+
/**
|
|
373
|
+
* Single pass over messages + parts. Emits both the cleaned dialogue turns and
|
|
374
|
+
* the list of `task.py create|start` invocations found in `Bash` tool parts
|
|
375
|
+
* (`{type:"tool", tool:"Bash", state:{input:{command:"..."}}}`). `turnIndex`
|
|
376
|
+
* for each event is the turn count at the time the tool ran.
|
|
377
|
+
*
|
|
378
|
+
* Compaction: ZCode writes a summary message with a `compaction` part carrying
|
|
379
|
+
* `tail_start_id` / `compactBoundary`. The summarized messages remain in the
|
|
380
|
+
* database, so they stay in the turn pool and the summary message becomes a
|
|
381
|
+
* boundary marker — `task.py` boundaries from before a compaction keep pointing
|
|
382
|
+
* at turns that are still there.
|
|
383
|
+
*
|
|
384
|
+
* turnIndex note (differs slightly from claude/codex): in ZCode a message's
|
|
385
|
+
* text parts and tool parts are siblings within one message. This loop pushes
|
|
386
|
+
* the message's text turn *before* recording its tool events, so a tool event
|
|
387
|
+
* on message M has turnIndex = (turns including M's text). claude/codex
|
|
388
|
+
* instead record the event before pushing the text, so their turnIndex is one
|
|
389
|
+
* less. Both are internally self-consistent for brainstorm-window slicing
|
|
390
|
+
* (create and start use the same convention within a platform), so phase
|
|
391
|
+
* boundaries compute correctly. The ZCode ordering reflects real time order
|
|
392
|
+
* (the assistant writes, then the tool runs). Do not "align" this without also
|
|
393
|
+
* adjusting the test expectations.
|
|
394
|
+
*/
|
|
395
|
+
export function collectZcodeTurnsAndEvents(s, warnings = []) {
|
|
396
|
+
const { messages, partsByMsg } = readSessionMessages(s.filePath, s.id, warnings);
|
|
397
|
+
const summaryIds = compactSummaryMessageIds(messages, partsByMsg);
|
|
398
|
+
const turns = [];
|
|
399
|
+
const events = [];
|
|
400
|
+
for (const msg of messages) {
|
|
401
|
+
const parts = partsByMsg.get(msg.id) ?? [];
|
|
402
|
+
// First emit any text the message produced (so turnIndex reflects turns
|
|
403
|
+
// accumulated so far before tool events are recorded).
|
|
404
|
+
const turn = buildTextTurn(msg, parts, summaryIds);
|
|
405
|
+
if (turn)
|
|
406
|
+
turns.push(turn);
|
|
407
|
+
// Then scan for Bash tool parts carrying task.py commands.
|
|
408
|
+
for (const part of parts) {
|
|
409
|
+
const pd = part.data;
|
|
410
|
+
if (pd.type !== "tool")
|
|
411
|
+
continue;
|
|
412
|
+
if (pd.tool !== "Bash" && pd.tool !== "bash")
|
|
413
|
+
continue;
|
|
414
|
+
const cmd = pd.state?.input?.command;
|
|
415
|
+
if (typeof cmd !== "string" || !cmd)
|
|
416
|
+
continue;
|
|
417
|
+
const parsedAll = parseTaskPyCommandsAll(cmd);
|
|
418
|
+
const ts = toIso(part.time_created) ?? "";
|
|
419
|
+
for (const parsed of parsedAll) {
|
|
420
|
+
const ev = {
|
|
421
|
+
action: parsed.action,
|
|
422
|
+
timestamp: ts,
|
|
423
|
+
turnIndex: turns.length,
|
|
424
|
+
...(parsed.action === "create"
|
|
425
|
+
? { slug: parsed.slug }
|
|
426
|
+
: { taskDir: parsed.taskDir }),
|
|
427
|
+
};
|
|
428
|
+
events.push(ev);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return { turns, events };
|
|
433
|
+
}
|
|
434
|
+
//# sourceMappingURL=zcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zcode.js","sourceRoot":"","sources":["../../../src/mem/adapters/zcode.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,EAEd,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,CAoClB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
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 warnings = [];
|
|
89
|
+
const s = findSessionById(options.sessionId, f, warnings);
|
|
90
|
+
if (!s)
|
|
91
|
+
throw new MemSessionNotFoundError(options.sessionId, warnings);
|
|
92
|
+
const grep = typeof options.grep === "string" ? options.grep : undefined;
|
|
93
|
+
const nTurns = options.turns ?? 3;
|
|
94
|
+
const around = options.around ?? 1;
|
|
95
|
+
const maxChars = options.maxChars ?? 6000;
|
|
96
|
+
let turns = extractDialogue(s, warnings);
|
|
97
|
+
let mergedChildren = 0;
|
|
98
|
+
if (options.includeChildren === true) {
|
|
99
|
+
const all = listAll({ ...f, cwd: undefined, limit: WIDE_LIMIT }, warnings);
|
|
100
|
+
const childIndex = buildChildIndex(all);
|
|
101
|
+
const kids = childIndex.get(s.id) ?? [];
|
|
102
|
+
mergedChildren = kids.length;
|
|
103
|
+
for (const c of kids) {
|
|
104
|
+
turns = [...turns, ...extractDialogue(c, warnings)];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const selected = selectContextTurns(turns, grep, nTurns, around, maxChars);
|
|
108
|
+
return {
|
|
109
|
+
session: s,
|
|
110
|
+
query: grep,
|
|
111
|
+
totalTurns: turns.length,
|
|
112
|
+
totalHitTurns: selected.totalHitTurns,
|
|
113
|
+
mergedChildren,
|
|
114
|
+
budgetUsed: selected.budgetUsed,
|
|
115
|
+
maxChars,
|
|
116
|
+
turns: selected.turns,
|
|
117
|
+
warnings,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# 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,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialogue cleaning: injection-tag stripping, bootstrap-turn detection, and the
|
|
3
|
+
* compaction-boundary marker shared by every adapter.
|
|
4
|
+
*
|
|
5
|
+
* The cleaning pipeline is what makes plain `String.prototype.includes`
|
|
6
|
+
* relevance ranking viable — without it, Trellis / platform injection tags
|
|
7
|
+
* would dominate every search hit.
|
|
8
|
+
*/
|
|
9
|
+
import type { DialogueTurn } from "./types.js";
|
|
10
|
+
/** True if this turn is a platform bootstrap injection (AGENTS.md preamble,
|
|
11
|
+
* pure INSTRUCTIONS block, etc.) and should be dropped wholesale rather than
|
|
12
|
+
* partially cleaned. Evaluated AFTER {@link stripInjectionTags}, against the
|
|
13
|
+
* raw `originalLength` so the size threshold is computed on the input. */
|
|
14
|
+
export declare function isBootstrapTurn(cleaned: string, originalLength: number): boolean;
|
|
15
|
+
/** Case-insensitive removal of every `<tag>...</tag>` block in
|
|
16
|
+
* `INJECTION_TAGS`, plus AGENTS.md preamble. Collapses runs of 3+ newlines to
|
|
17
|
+
* a paragraph break and trims. */
|
|
18
|
+
export declare function stripInjectionTags(text: string): string;
|
|
19
|
+
/** Opening of every compaction-boundary marker turn. Stable so callers (and
|
|
20
|
+
* tests) can recognise a boundary without depending on the detail wording. */
|
|
21
|
+
export declare const COMPACT_BOUNDARY_PREFIX = "[compaction boundary]";
|
|
22
|
+
/**
|
|
23
|
+
* Build the marker turn an adapter emits where the platform compacted its
|
|
24
|
+
* context. `detail` states what happened to the turns before this point;
|
|
25
|
+
* `summary` is the platform's own summary / retained-history text, kept as
|
|
26
|
+
* marker content because it records what the model thought mattered — but never
|
|
27
|
+
* counted as dialogue (see {@link DialogueTurn.kind}).
|
|
28
|
+
*/
|
|
29
|
+
export declare function compactionBoundaryTurn(detail: string, summary?: string): DialogueTurn;
|
|
30
|
+
/** Dedupe key for a dialogue turn: role plus exact cleaned text. */
|
|
31
|
+
export declare function turnKey(turn: DialogueTurn): string;
|
|
32
|
+
//# sourceMappingURL=dialogue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue.d.ts","sourceRoot":"","sources":["../../src/mem/dialogue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAuB/C;;;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;AAED;8EAC8E;AAC9E,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,YAAY,CASd;AAED,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAElD"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogue.js","sourceRoot":"","sources":["../../src/mem/dialogue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,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;AAED;8EAC8E;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,OAAgB;IAEhB,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7B,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,IAAI;YACR,CAAC,CAAC,GAAG,uBAAuB,IAAI,MAAM,OAAO,IAAI,EAAE;YACnD,CAAC,CAAC,GAAG,uBAAuB,IAAI,MAAM,EAAE;QAC1C,IAAI,EAAE,QAAQ;KACf,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,OAAO,CAAC,IAAkB;IACxC,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC"}
|