draken 0.1.6 → 0.2.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/ACCEPTANCE.md +31 -0
- package/CHANGELOG.md +33 -0
- package/CONTRIBUTING.md +129 -0
- package/MEMORY.md +98 -0
- package/PERSONA.md +67 -0
- package/README.md +156 -78
- package/SETUP.md +111 -0
- package/SOURCES.md +75 -0
- package/TRAY.md +54 -0
- package/VOICE.md +118 -0
- package/dist/auth/middleware.d.ts +3 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +20 -15
- package/dist/auth/middleware.js.map +1 -1
- package/dist/cli.js +77 -113
- package/dist/cli.js.map +1 -1
- package/dist/db/agent-migration.d.ts +7 -0
- package/dist/db/agent-migration.d.ts.map +1 -0
- package/dist/db/agent-migration.js +36 -0
- package/dist/db/agent-migration.js.map +1 -0
- package/dist/db/evidence.d.ts +37 -0
- package/dist/db/evidence.d.ts.map +1 -0
- package/dist/db/evidence.js +110 -0
- package/dist/db/evidence.js.map +1 -0
- package/dist/db/pointer-migration.d.ts +7 -0
- package/dist/db/pointer-migration.d.ts.map +1 -0
- package/dist/db/pointer-migration.js +117 -0
- package/dist/db/pointer-migration.js.map +1 -0
- package/dist/db/retained-text.d.ts +8 -0
- package/dist/db/retained-text.d.ts.map +1 -0
- package/dist/db/retained-text.js +36 -0
- package/dist/db/retained-text.js.map +1 -0
- package/dist/db/schema.d.ts +1 -5
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +200 -55
- package/dist/db/schema.js.map +1 -1
- package/dist/db/snapshot-pointers.d.ts +5 -0
- package/dist/db/snapshot-pointers.d.ts.map +1 -0
- package/dist/db/snapshot-pointers.js +174 -0
- package/dist/db/snapshot-pointers.js.map +1 -0
- package/dist/memory/automatic.d.ts +38 -0
- package/dist/memory/automatic.d.ts.map +1 -0
- package/dist/memory/automatic.js +155 -0
- package/dist/memory/automatic.js.map +1 -0
- package/dist/memory/context.d.ts +12 -0
- package/dist/memory/context.d.ts.map +1 -0
- package/dist/memory/context.js +59 -0
- package/dist/memory/context.js.map +1 -0
- package/dist/memory/embedding-pool.d.ts +28 -0
- package/dist/memory/embedding-pool.d.ts.map +1 -0
- package/dist/memory/embedding-pool.js +135 -0
- package/dist/memory/embedding-pool.js.map +1 -0
- package/dist/memory/embedding-worker.d.ts +2 -0
- package/dist/memory/embedding-worker.d.ts.map +1 -0
- package/dist/memory/embedding-worker.js +32 -0
- package/dist/memory/embedding-worker.js.map +1 -0
- package/dist/memory/index.d.ts +26 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +283 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/model.d.ts +15 -0
- package/dist/memory/model.d.ts.map +1 -0
- package/dist/memory/model.js +152 -0
- package/dist/memory/model.js.map +1 -0
- package/dist/memory/service.d.ts +8 -0
- package/dist/memory/service.d.ts.map +1 -0
- package/dist/memory/service.js +217 -0
- package/dist/memory/service.js.map +1 -0
- package/dist/memory/sources.d.ts +15 -0
- package/dist/memory/sources.d.ts.map +1 -0
- package/dist/memory/sources.js +87 -0
- package/dist/memory/sources.js.map +1 -0
- package/dist/memory/stamps.d.ts +13 -0
- package/dist/memory/stamps.d.ts.map +1 -0
- package/dist/memory/stamps.js +101 -0
- package/dist/memory/stamps.js.map +1 -0
- package/dist/memory/storage.d.ts +5 -0
- package/dist/memory/storage.d.ts.map +1 -0
- package/dist/memory/storage.js +107 -0
- package/dist/memory/storage.js.map +1 -0
- package/dist/memory/types.d.ts +68 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/worker.d.ts +2 -0
- package/dist/memory/worker.d.ts.map +1 -0
- package/dist/memory/worker.js +82 -0
- package/dist/memory/worker.js.map +1 -0
- package/dist/npm-cli.d.ts +4 -0
- package/dist/npm-cli.d.ts.map +1 -0
- package/dist/npm-cli.js +36 -0
- package/dist/npm-cli.js.map +1 -0
- package/dist/pi/runtime.d.ts +34 -0
- package/dist/pi/runtime.d.ts.map +1 -0
- package/dist/pi/runtime.js +210 -0
- package/dist/pi/runtime.js.map +1 -0
- package/dist/pi/setup.d.ts +5 -0
- package/dist/pi/setup.d.ts.map +1 -0
- package/dist/pi/setup.js +147 -0
- package/dist/pi/setup.js.map +1 -0
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +3 -1
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/live-voice.d.ts +3 -0
- package/dist/routes/live-voice.d.ts.map +1 -0
- package/dist/routes/live-voice.js +49 -0
- package/dist/routes/live-voice.js.map +1 -0
- package/dist/routes/{browse.d.ts → memory.d.ts} +1 -1
- package/dist/routes/memory.d.ts.map +1 -0
- package/dist/routes/memory.js +18 -0
- package/dist/routes/memory.js.map +1 -0
- package/dist/routes/{tasks.d.ts → sync.d.ts} +1 -1
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +127 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/routes/{projects.d.ts → voice.d.ts} +1 -1
- package/dist/routes/voice.d.ts.map +1 -0
- package/dist/routes/voice.js +35 -0
- package/dist/routes/voice.js.map +1 -0
- package/dist/server-state.d.ts +30 -0
- package/dist/server-state.d.ts.map +1 -0
- package/dist/server-state.js +113 -0
- package/dist/server-state.js.map +1 -0
- package/dist/server-status.d.ts +7 -0
- package/dist/server-status.d.ts.map +1 -0
- package/dist/server-status.js +34 -0
- package/dist/server-status.js.map +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +148 -46
- package/dist/server.js.map +1 -1
- package/dist/sources/adapters.d.ts +15 -0
- package/dist/sources/adapters.d.ts.map +1 -0
- package/dist/sources/adapters.js +159 -0
- package/dist/sources/adapters.js.map +1 -0
- package/dist/sources/registry.d.ts +17 -0
- package/dist/sources/registry.d.ts.map +1 -0
- package/dist/sources/registry.js +56 -0
- package/dist/sources/registry.js.map +1 -0
- package/dist/sync/collector.d.ts +3 -0
- package/dist/sync/collector.d.ts.map +1 -0
- package/dist/sync/collector.js +284 -0
- package/dist/sync/collector.js.map +1 -0
- package/dist/sync/cost.d.ts +7 -0
- package/dist/sync/cost.d.ts.map +1 -0
- package/dist/sync/cost.js +31 -0
- package/dist/sync/cost.js.map +1 -0
- package/dist/sync/jsonl.d.ts +34 -0
- package/dist/sync/jsonl.d.ts.map +1 -0
- package/dist/sync/jsonl.js +161 -0
- package/dist/sync/jsonl.js.map +1 -0
- package/dist/sync/manager.d.ts +12 -0
- package/dist/sync/manager.d.ts.map +1 -0
- package/dist/sync/manager.js +211 -0
- package/dist/sync/manager.js.map +1 -0
- package/dist/sync/normalize.d.ts +22 -0
- package/dist/sync/normalize.d.ts.map +1 -0
- package/dist/sync/normalize.js +107 -0
- package/dist/sync/normalize.js.map +1 -0
- package/dist/sync/pi-output.d.ts +33 -0
- package/dist/sync/pi-output.d.ts.map +1 -0
- package/dist/sync/pi-output.js +186 -0
- package/dist/sync/pi-output.js.map +1 -0
- package/dist/sync/pi.d.ts +15 -0
- package/dist/sync/pi.d.ts.map +1 -0
- package/dist/sync/pi.js +149 -0
- package/dist/sync/pi.js.map +1 -0
- package/dist/sync/recap.d.ts +25 -0
- package/dist/sync/recap.d.ts.map +1 -0
- package/dist/sync/recap.js +118 -0
- package/dist/sync/recap.js.map +1 -0
- package/dist/sync/references.d.ts +10 -0
- package/dist/sync/references.d.ts.map +1 -0
- package/dist/sync/references.js +50 -0
- package/dist/sync/references.js.map +1 -0
- package/dist/sync/source-files.d.ts +16 -0
- package/dist/sync/source-files.d.ts.map +1 -0
- package/dist/sync/source-files.js +56 -0
- package/dist/sync/source-files.js.map +1 -0
- package/dist/sync/store.d.ts +36 -0
- package/dist/sync/store.d.ts.map +1 -0
- package/dist/sync/store.js +359 -0
- package/dist/sync/store.js.map +1 -0
- package/dist/sync/summary-budget.d.ts +19 -0
- package/dist/sync/summary-budget.d.ts.map +1 -0
- package/dist/sync/summary-budget.js +39 -0
- package/dist/sync/summary-budget.js.map +1 -0
- package/dist/sync/tree.d.ts +69 -0
- package/dist/sync/tree.d.ts.map +1 -0
- package/dist/sync/tree.js +599 -0
- package/dist/sync/tree.js.map +1 -0
- package/dist/tray/controller.d.ts +51 -0
- package/dist/tray/controller.d.ts.map +1 -0
- package/dist/tray/controller.js +178 -0
- package/dist/tray/controller.js.map +1 -0
- package/dist/tray/launcher.d.ts +3 -0
- package/dist/tray/launcher.d.ts.map +1 -0
- package/dist/tray/launcher.js +47 -0
- package/dist/tray/launcher.js.map +1 -0
- package/dist/tray/native.d.ts +12 -0
- package/dist/tray/native.d.ts.map +1 -0
- package/dist/tray/native.js +93 -0
- package/dist/tray/native.js.map +1 -0
- package/dist/tray/processes.d.ts +5 -0
- package/dist/tray/processes.d.ts.map +1 -0
- package/dist/tray/processes.js +99 -0
- package/dist/tray/processes.js.map +1 -0
- package/dist/tray/worker.d.ts +4 -0
- package/dist/tray/worker.d.ts.map +1 -0
- package/dist/tray/worker.js +150 -0
- package/dist/tray/worker.js.map +1 -0
- package/dist/types.d.ts +212 -20
- package/dist/types.d.ts.map +1 -1
- package/dist/voice/continuation.d.ts +25 -0
- package/dist/voice/continuation.d.ts.map +1 -0
- package/dist/voice/continuation.js +94 -0
- package/dist/voice/continuation.js.map +1 -0
- package/dist/voice/legacy-history.d.ts +5 -0
- package/dist/voice/legacy-history.d.ts.map +1 -0
- package/dist/voice/legacy-history.js +34 -0
- package/dist/voice/legacy-history.js.map +1 -0
- package/dist/voice/live-context.d.ts +14 -0
- package/dist/voice/live-context.d.ts.map +1 -0
- package/dist/voice/live-context.js +137 -0
- package/dist/voice/live-context.js.map +1 -0
- package/dist/voice/live.d.ts +37 -0
- package/dist/voice/live.d.ts.map +1 -0
- package/dist/voice/live.js +448 -0
- package/dist/voice/live.js.map +1 -0
- package/package.json +49 -16
- package/public/assets/index-CYz_kpAp.js +126 -0
- package/public/assets/index-DmRid5xE.css +1 -0
- package/public/assets/index-Ymd62i3g.js +40 -0
- package/public/assets/persona-C_m1CVKe.css +1 -0
- package/public/assets/persona-XbLvCqRT.js +1 -0
- package/public/assets/scene-CBV2oPhA.js +3854 -0
- package/public/index.html +6 -8
- package/public/persona/THREE-LICENSE.txt +21 -0
- package/public/persona/call-poster.webp +0 -0
- package/public/persona/reference.jpg +0 -0
- package/public/persona/sample.wav +0 -0
- package/public/persona.html +7 -0
- package/runtime/pi/package-lock.json +1549 -0
- package/runtime/pi/package.json +12 -0
- package/tests/fixtures/voice-question.wav +0 -0
- package/tray/assets/error.ico +0 -0
- package/tray/assets/error.png +0 -0
- package/tray/assets/running.ico +0 -0
- package/tray/assets/running.png +0 -0
- package/tray/assets/starting.ico +0 -0
- package/tray/assets/starting.png +0 -0
- package/tray/assets/stopped.ico +0 -0
- package/tray/assets/stopped.png +0 -0
- package/tray/assets/stopping.ico +0 -0
- package/tray/assets/stopping.png +0 -0
- package/tray/macos.js +72 -0
- package/tray/windows.ps1 +104 -0
- package/voice/realtime/README.md +84 -0
- package/voice/realtime/backend.mjs +81 -0
- package/voice/realtime/native.mjs +210 -0
- package/voice/realtime/peer.d.mts +15 -0
- package/voice/realtime/peer.mjs +116 -0
- package/voice/realtime/probe-browser.mjs +81 -0
- package/voice/realtime/probe-server.mjs +86 -0
- package/voice/realtime/probe.html +11 -0
- package/voice/realtime/probe.mjs +42 -0
- package/voice/realtime/rpc.mjs +118 -0
- package/voice/realtime/setup.mjs +32 -0
- package/voice/tls.mjs +49 -0
- package/dist/db/queries.d.ts +0 -16
- package/dist/db/queries.d.ts.map +0 -1
- package/dist/db/queries.js +0 -91
- package/dist/db/queries.js.map +0 -1
- package/dist/docker/dockerfile.d.ts +0 -50
- package/dist/docker/dockerfile.d.ts.map +0 -1
- package/dist/docker/dockerfile.js +0 -160
- package/dist/docker/dockerfile.js.map +0 -1
- package/dist/docker/manager.d.ts +0 -42
- package/dist/docker/manager.d.ts.map +0 -1
- package/dist/docker/manager.js +0 -421
- package/dist/docker/manager.js.map +0 -1
- package/dist/git/status.d.ts +0 -76
- package/dist/git/status.d.ts.map +0 -1
- package/dist/git/status.js +0 -332
- package/dist/git/status.js.map +0 -1
- package/dist/routes/browse.d.ts.map +0 -1
- package/dist/routes/browse.js +0 -49
- package/dist/routes/browse.js.map +0 -1
- package/dist/routes/git.d.ts +0 -9
- package/dist/routes/git.d.ts.map +0 -1
- package/dist/routes/git.js +0 -338
- package/dist/routes/git.js.map +0 -1
- package/dist/routes/projects.d.ts.map +0 -1
- package/dist/routes/projects.js +0 -220
- package/dist/routes/projects.js.map +0 -1
- package/dist/routes/tasks.d.ts.map +0 -1
- package/dist/routes/tasks.js +0 -313
- package/dist/routes/tasks.js.map +0 -1
- package/draken.dockerfile.template +0 -18
- package/public/assets/index-3ngsG5kF.css +0 -1
- package/public/assets/index-B3YSD0ee.js +0 -252
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgentKind } from '../types';
|
|
2
|
+
import type { PointerRecord } from '../sync/jsonl';
|
|
3
|
+
import { type NormalizedEntry, type NormalizationVersion } from '../sync/normalize';
|
|
4
|
+
import { type SourceIdentity } from './registry';
|
|
5
|
+
export interface SourceHeader extends SourceIdentity {
|
|
6
|
+
id: string;
|
|
7
|
+
cwd: string;
|
|
8
|
+
}
|
|
9
|
+
/** Bounded header/identity discovery. Never read credentials, history.jsonl,
|
|
10
|
+
* request dumps or tool definitions as session headers. */
|
|
11
|
+
export declare function identifySource(agent: AgentKind, records: Iterable<PointerRecord>): SourceHeader;
|
|
12
|
+
/** v1 adapter recipes are immutable: live and frozen pointers use the same
|
|
13
|
+
* normalizer. One physical record projects to at most one evidence entry. */
|
|
14
|
+
export declare function normalizeSource(source: SourceIdentity, record: PointerRecord, version?: NormalizationVersion): NormalizedEntry | null;
|
|
15
|
+
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/sources/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAqC,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvH,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,YAAa,SAAQ,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAEhF;2DAC2D;AAC3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,YAAY,CA0B/F;AAYD;6EAC6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,oBAAwB,GAAG,eAAe,GAAG,IAAI,CAkDxI"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.identifySource = identifySource;
|
|
4
|
+
exports.normalizeSource = normalizeSource;
|
|
5
|
+
const normalize_1 = require("../sync/normalize");
|
|
6
|
+
const registry_1 = require("./registry");
|
|
7
|
+
const identifier = (value) => typeof value === 'string' && /^[\w-]{1,128}$/.test(value);
|
|
8
|
+
/** Bounded header/identity discovery. Never read credentials, history.jsonl,
|
|
9
|
+
* request dumps or tool definitions as session headers. */
|
|
10
|
+
function identifySource(agent, records) {
|
|
11
|
+
let count = 0;
|
|
12
|
+
for (const { value: r } of records) {
|
|
13
|
+
if (++count > 256)
|
|
14
|
+
break;
|
|
15
|
+
if (!r || typeof r !== 'object')
|
|
16
|
+
continue;
|
|
17
|
+
if (agent === 'pi') {
|
|
18
|
+
if (r.type === 'session' && r.version !== 3)
|
|
19
|
+
throw new Error('Unsupported pi session version; only v3 JSONL is supported');
|
|
20
|
+
if (r.type !== 'session' || typeof r.id !== 'string' || typeof r.cwd !== 'string')
|
|
21
|
+
break;
|
|
22
|
+
return { agent, external_id: r.id, parser_version: 1, id: r.id, cwd: r.cwd };
|
|
23
|
+
}
|
|
24
|
+
if (agent === 'codex') {
|
|
25
|
+
const p = r.payload;
|
|
26
|
+
if (r.type !== 'session_meta' || !identifier(p?.id) || typeof p.cwd !== 'string')
|
|
27
|
+
break;
|
|
28
|
+
if (p.history_base)
|
|
29
|
+
throw new Error('Codex external history-base rollouts are not supported; no inherited evidence was guessed');
|
|
30
|
+
const source = { agent, external_id: p.id, parser_version: 1 };
|
|
31
|
+
return { ...source, id: (0, registry_1.sessionId)(source), cwd: p.cwd };
|
|
32
|
+
}
|
|
33
|
+
if (identifier(r.sessionId) && identifier(r.uuid) && typeof r.cwd === 'string') {
|
|
34
|
+
// Subagent files often share their parent's sessionId. A recorded agent ID
|
|
35
|
+
// (or the first sidechain message UUID) separates them without relying on a filename.
|
|
36
|
+
const suffix = r.isSidechain === true ? (identifier(r.agentId) ? r.agentId : r.uuid) : undefined;
|
|
37
|
+
const source = { agent, external_id: r.sessionId + (suffix ? '/' + suffix : ''), parser_version: 1 };
|
|
38
|
+
return { ...source, id: (0, registry_1.sessionId)(source), cwd: r.cwd };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`No supported ${agent} session header/identity found`);
|
|
42
|
+
}
|
|
43
|
+
function textBlocks(value) {
|
|
44
|
+
if (typeof value === 'string')
|
|
45
|
+
return value;
|
|
46
|
+
if (!Array.isArray(value))
|
|
47
|
+
return '';
|
|
48
|
+
return value.filter(part => part && ['text', 'input_text', 'output_text'].includes(part.type) && typeof part.text === 'string').map(part => part.text).join('\n');
|
|
49
|
+
}
|
|
50
|
+
function tool(name, args) {
|
|
51
|
+
if (typeof args === 'string') {
|
|
52
|
+
try {
|
|
53
|
+
args = JSON.parse(args);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
args = {};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { type: 'toolCall', name: typeof name === 'string' ? name.slice(0, 100) : 'unknown', arguments: args && typeof args === 'object' ? args : {} };
|
|
60
|
+
}
|
|
61
|
+
const contextOnly = (text) => /^(?:# AGENTS\.md instructions for [^\n]*\n\s*)?<(environment_context|INSTRUCTIONS|permissions instructions)>[\s\S]*<\/\1>\s*$/.test(text.trim());
|
|
62
|
+
/** v1 adapter recipes are immutable: live and frozen pointers use the same
|
|
63
|
+
* normalizer. One physical record projects to at most one evidence entry. */
|
|
64
|
+
function normalizeSource(source, record, version = 2) {
|
|
65
|
+
if (source.parser_version !== 1)
|
|
66
|
+
throw new Error('Unknown agent parser version');
|
|
67
|
+
if (source.agent === 'pi')
|
|
68
|
+
return (0, normalize_1.normalizeEntry)(record.value, version);
|
|
69
|
+
const r = record.value;
|
|
70
|
+
if (!r || typeof r !== 'object')
|
|
71
|
+
return null;
|
|
72
|
+
let value;
|
|
73
|
+
if (source.agent === 'codex') {
|
|
74
|
+
const p = r.payload;
|
|
75
|
+
if (r.type === 'event_msg' && p?.type === 'thread_rolled_back')
|
|
76
|
+
throw new Error('Codex rollback replay is not supported; scan stopped rather than treating abandoned turns as current');
|
|
77
|
+
const id = `record-${record.record_offset}`, timestamp = typeof r.timestamp === 'string' ? r.timestamp : '';
|
|
78
|
+
if (r.type === 'response_item' && p && typeof p === 'object') {
|
|
79
|
+
let role = '', content = '';
|
|
80
|
+
if (p.type === 'message' && ['user', 'assistant'].includes(p.role) && p.channel !== 'analysis') {
|
|
81
|
+
role = p.role;
|
|
82
|
+
const text = textBlocks(p.content);
|
|
83
|
+
content = role === 'user' && contextOnly(text) ? '' : text;
|
|
84
|
+
}
|
|
85
|
+
else if (p.type === 'function_call') {
|
|
86
|
+
role = 'assistant';
|
|
87
|
+
content = [tool(p.name, p.arguments)];
|
|
88
|
+
}
|
|
89
|
+
else if (p.type === 'custom_tool_call') {
|
|
90
|
+
role = 'assistant';
|
|
91
|
+
content = [tool(p.name, {})];
|
|
92
|
+
}
|
|
93
|
+
else if (['function_call_output', 'custom_tool_call_output'].includes(p.type)) {
|
|
94
|
+
role = 'toolResult';
|
|
95
|
+
content = textBlocks(p.output);
|
|
96
|
+
}
|
|
97
|
+
else if (p.type === 'local_shell_call') {
|
|
98
|
+
role = 'assistant';
|
|
99
|
+
content = [tool('shell', { command: Array.isArray(p.action?.command) ? p.action.command.filter((part) => typeof part === 'string').join(' ') : '' })];
|
|
100
|
+
}
|
|
101
|
+
if (role)
|
|
102
|
+
value = { id, timestamp, type: 'message', message: { role, content, toolName: 'Codex tool output; success not inferred', stopReason: p.status === 'incomplete' ? 'length' : undefined } };
|
|
103
|
+
}
|
|
104
|
+
else if (r.type === 'compacted' && typeof p?.message === 'string')
|
|
105
|
+
value = { id, timestamp, type: 'compaction', summary: p.message };
|
|
106
|
+
else if (r.type === 'event_msg' && p?.type === 'turn_aborted')
|
|
107
|
+
value = { id, timestamp, type: 'custom_message', content: '[Codex turn aborted. Earlier generated text does not establish completed work.]' };
|
|
108
|
+
// event_msg user_message/agent_message echo response_item messages; never
|
|
109
|
+
// import both. Reasoning, token counts, request context and system/developer messages are not evidence.
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
if (!identifier(r.uuid))
|
|
113
|
+
return null;
|
|
114
|
+
if (r.sessionId !== undefined && r.sessionId !== source.external_id.split('/')[0])
|
|
115
|
+
throw new Error('Mixed Claude session identities; scan stopped rather than guessing fork attribution');
|
|
116
|
+
const parentId = typeof r.parentUuid === 'string' ? r.parentUuid : typeof r.logicalParentUuid === 'string' ? r.logicalParentUuid : null;
|
|
117
|
+
if (r.type === 'system' && r.subtype === 'compact_boundary' && !parentId)
|
|
118
|
+
throw new Error('Claude compaction boundary has no verified history link');
|
|
119
|
+
value = { id: r.uuid, parentId, timestamp: typeof r.timestamp === 'string' ? r.timestamp : '', type: String(r.type || 'metadata') };
|
|
120
|
+
if (['user', 'assistant'].includes(r.type) && r.message) {
|
|
121
|
+
if (r.isCompactSummary === true) {
|
|
122
|
+
value.type = 'compaction';
|
|
123
|
+
value.summary = textBlocks(r.message.content);
|
|
124
|
+
}
|
|
125
|
+
else if (r.isMeta !== true) {
|
|
126
|
+
if (typeof r.message.role === 'string' && r.message.role !== r.type)
|
|
127
|
+
throw new Error('Claude role attribution mismatch');
|
|
128
|
+
const parts = typeof r.message.content === 'string' ? [{ type: 'text', text: r.message.content }] : Array.isArray(r.message.content) ? r.message.content : [];
|
|
129
|
+
const blocks = [];
|
|
130
|
+
let results = 0, ordinary = 0;
|
|
131
|
+
for (const part of parts) {
|
|
132
|
+
if (part?.type === 'text' && typeof part.text === 'string') {
|
|
133
|
+
blocks.push(part);
|
|
134
|
+
ordinary++;
|
|
135
|
+
}
|
|
136
|
+
else if (part?.type === 'tool_use') {
|
|
137
|
+
blocks.push(tool(part.name, part.input));
|
|
138
|
+
ordinary++;
|
|
139
|
+
}
|
|
140
|
+
else if (part?.type === 'tool_result') {
|
|
141
|
+
blocks.push({ type: 'text', text: `Tool result (${(0, normalize_1.cleanText)(String(part.tool_use_id || 'unknown'), 150)}; ${part.is_error === true ? 'error' : 'not flagged as error'}):\n${textBlocks(part.content)}` });
|
|
142
|
+
results++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
value.type = 'message';
|
|
146
|
+
value.message = { role: results && !ordinary ? 'toolResult' : r.type, content: blocks, toolName: 'Claude tool output', stopReason: ['max_tokens', 'model_context_window_exceeded'].includes(r.message.stop_reason) ? 'length' : undefined };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!value)
|
|
151
|
+
return null;
|
|
152
|
+
const entry = (0, normalize_1.normalizeEntry)(value, version);
|
|
153
|
+
if (!entry)
|
|
154
|
+
return null;
|
|
155
|
+
// Agent domains prevent identical pi/Claude UUIDs from sharing review coverage.
|
|
156
|
+
entry.event_key = (0, normalize_1.digest)(JSON.stringify([source.agent, 1, source.agent === 'codex' ? record.record_hash : entry.event_key, entry.type, entry.role, entry.text]));
|
|
157
|
+
return entry;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/sources/adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { AgentKind, AgentSource } from '../types';
|
|
3
|
+
export type SourceRoots = Record<AgentKind, string[]>;
|
|
4
|
+
export type RootInput = string | SourceRoots;
|
|
5
|
+
export interface SourceIdentity {
|
|
6
|
+
agent: AgentKind;
|
|
7
|
+
external_id: string;
|
|
8
|
+
parser_version: 1;
|
|
9
|
+
}
|
|
10
|
+
export declare const AGENTS: AgentKind[];
|
|
11
|
+
export declare function getSourceRoots(): SourceRoots;
|
|
12
|
+
export declare function sourceRoots(value?: RootInput): SourceRoots;
|
|
13
|
+
export declare function validIdentity(value: SourceIdentity): boolean;
|
|
14
|
+
export declare function sessionId(source: SourceIdentity): string;
|
|
15
|
+
export declare const admittedAgent: (alias: string) => string;
|
|
16
|
+
export declare function agentSources(db: Database.Database): AgentSource[];
|
|
17
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/sources/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAC7C,MAAM,WAAW,cAAc;IAAG,KAAK,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,CAAC,CAAA;CAAE;AAC5F,eAAO,MAAM,MAAM,EAAE,SAAS,EAA8B,CAAC;AAC7D,wBAAgB,cAAc,IAAI,WAAW,CAO5C;AACD,wBAAgB,WAAW,CAAC,KAAK,GAAE,SAA4B,GAAG,WAAW,CAK5E;AACD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAE5D;AACD,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAIxD;AACD,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,WAAuE,CAAC;AACnH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,WAAW,EAAE,CAKjE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.admittedAgent = exports.AGENTS = void 0;
|
|
7
|
+
exports.getSourceRoots = getSourceRoots;
|
|
8
|
+
exports.sourceRoots = sourceRoots;
|
|
9
|
+
exports.validIdentity = validIdentity;
|
|
10
|
+
exports.sessionId = sessionId;
|
|
11
|
+
exports.agentSources = agentSources;
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const os_1 = __importDefault(require("os"));
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
exports.AGENTS = ['pi', 'codex', 'claude'];
|
|
16
|
+
function getSourceRoots() {
|
|
17
|
+
const home = os_1.default.homedir(), codex = path_1.default.resolve(process.env.CODEX_HOME || path_1.default.join(home, '.codex'));
|
|
18
|
+
return {
|
|
19
|
+
pi: [path_1.default.resolve(process.env.DRAKEN_PI_SESSIONS_DIR || path_1.default.join(home, '.pi/agent/sessions'))],
|
|
20
|
+
codex: process.env.DRAKEN_CODEX_SESSIONS_DIR ? [path_1.default.resolve(process.env.DRAKEN_CODEX_SESSIONS_DIR)] : [path_1.default.join(codex, 'sessions'), path_1.default.join(codex, 'archived_sessions')],
|
|
21
|
+
claude: [path_1.default.resolve(process.env.DRAKEN_CLAUDE_SESSIONS_DIR || path_1.default.join(process.env.CLAUDE_CONFIG_DIR || path_1.default.join(home, '.claude'), 'projects'))],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function sourceRoots(value = getSourceRoots()) {
|
|
25
|
+
// An explicit legacy/test root grants access only to that pi directory.
|
|
26
|
+
if (typeof value === 'string')
|
|
27
|
+
return { pi: [path_1.default.resolve(value)], codex: [], claude: [] };
|
|
28
|
+
if (!value || exports.AGENTS.some(agent => !Array.isArray(value[agent]) || value[agent].some(root => typeof root !== 'string' || !path_1.default.isAbsolute(root))))
|
|
29
|
+
throw new Error('Invalid agent source roots');
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
function validIdentity(value) {
|
|
33
|
+
return Boolean(value && exports.AGENTS.includes(value.agent) && value.parser_version === 1 && typeof value.external_id === 'string' && /^[\w-]{1,128}(?:\/[\w-]{1,128})?$/.test(value.external_id));
|
|
34
|
+
}
|
|
35
|
+
function sessionId(source) {
|
|
36
|
+
if (source.agent === 'pi')
|
|
37
|
+
return source.external_id;
|
|
38
|
+
if (!validIdentity(source))
|
|
39
|
+
throw new Error('Invalid agent session identity');
|
|
40
|
+
return `${source.agent}:${source.external_id.replace('/', ':')}`;
|
|
41
|
+
}
|
|
42
|
+
const admittedAgent = (alias) => `${alias}.agent IN (SELECT id FROM agent_sources WHERE enabled=1)`;
|
|
43
|
+
exports.admittedAgent = admittedAgent;
|
|
44
|
+
function agentSources(db) {
|
|
45
|
+
const roots = getSourceRoots(), names = { pi: 'pi', codex: 'Codex CLI', claude: 'Claude Code' };
|
|
46
|
+
return exports.AGENTS.map(id => ({ id, name: names[id], enabled: Boolean(db.prepare('SELECT enabled FROM agent_sources WHERE id=?').get(id)?.enabled),
|
|
47
|
+
roots: roots[id].map(root => {
|
|
48
|
+
try {
|
|
49
|
+
return { path: root, status: fs_1.default.statSync(root).isDirectory() ? 'present' : 'unavailable' };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return { path: root, status: error.code === 'ENOENT' ? 'missing' : 'unavailable' };
|
|
53
|
+
}
|
|
54
|
+
}) }));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sources/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/sync/collector.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAkB,MAAM,UAAU,CAAC;AA0MtD,wBAAgB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAiClD"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.scanSessions = scanSessions;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const schema_1 = require("../db/schema");
|
|
10
|
+
const normalize_1 = require("./normalize");
|
|
11
|
+
const source_files_1 = require("./source-files");
|
|
12
|
+
const registry_1 = require("../sources/registry");
|
|
13
|
+
const adapters_1 = require("../sources/adapters");
|
|
14
|
+
function inside(candidate, root) {
|
|
15
|
+
const relative = path_1.default.relative(root, candidate);
|
|
16
|
+
return relative === '' || (!relative.startsWith(`..${path_1.default.sep}`) && relative !== '..' && !path_1.default.isAbsolute(relative));
|
|
17
|
+
}
|
|
18
|
+
async function discover(root, warnings) {
|
|
19
|
+
const files = [];
|
|
20
|
+
const visit = async (directory, depth) => {
|
|
21
|
+
if (depth > 8 || inside(directory, (0, schema_1.getDataDir)()))
|
|
22
|
+
return;
|
|
23
|
+
let children;
|
|
24
|
+
try {
|
|
25
|
+
children = await fs_1.default.promises.readdir(directory, { withFileTypes: true });
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
warnings.push(`Cannot read session directory: ${directory}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
for (const child of children) {
|
|
32
|
+
const target = path_1.default.join(directory, child.name);
|
|
33
|
+
// Do not walk symlinks into unrelated directories.
|
|
34
|
+
if (child.isDirectory())
|
|
35
|
+
await visit(target, depth + 1);
|
|
36
|
+
else if (child.isFile() && child.name.endsWith('.jsonl'))
|
|
37
|
+
files.push(target);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
await visit(root, 0);
|
|
41
|
+
return files.sort();
|
|
42
|
+
}
|
|
43
|
+
async function hashRegion(file, start, length) {
|
|
44
|
+
const buffer = Buffer.alloc(length);
|
|
45
|
+
const { bytesRead } = await file.read(buffer, 0, length, start);
|
|
46
|
+
return (0, normalize_1.digest)(buffer.subarray(0, bytesRead));
|
|
47
|
+
}
|
|
48
|
+
/** Read only complete LF-terminated records. Never mutate a pi session file. */
|
|
49
|
+
async function readRecords(handle, file, offset, size, warnings) {
|
|
50
|
+
const records = [];
|
|
51
|
+
let pending = Buffer.alloc(0);
|
|
52
|
+
let consumed = offset;
|
|
53
|
+
const end = Math.min(size, offset + 32 * 1024 * 1024);
|
|
54
|
+
if (end <= offset)
|
|
55
|
+
return { records, offset };
|
|
56
|
+
for await (const chunk of fs_1.default.createReadStream(file, { fd: handle.fd, autoClose: false, start: offset, end: end - 1 })) {
|
|
57
|
+
pending = Buffer.concat([pending, chunk]);
|
|
58
|
+
let newline;
|
|
59
|
+
while ((newline = pending.indexOf(10)) !== -1) {
|
|
60
|
+
const bytes = pending.subarray(0, newline + 1), start = consumed;
|
|
61
|
+
if (bytes.length > source_files_1.RECORD_BYTES) {
|
|
62
|
+
warnings.push(`Paused ${file}: a record exceeds the 8 MiB safety limit.`);
|
|
63
|
+
return { records, offset: consumed };
|
|
64
|
+
}
|
|
65
|
+
const line = bytes.toString('utf8').trim();
|
|
66
|
+
consumed += bytes.length;
|
|
67
|
+
pending = pending.subarray(newline + 1);
|
|
68
|
+
if (!line)
|
|
69
|
+
continue;
|
|
70
|
+
try {
|
|
71
|
+
records.push({ value: JSON.parse(line), record_offset: start, record_bytes: bytes.length, record_hash: (0, normalize_1.digest)(bytes) });
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
warnings.push(`Skipped malformed JSON in ${file} near byte ${consumed}.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (pending.length > 8 * 1024 * 1024) {
|
|
78
|
+
warnings.push(`Paused ${file}: a record exceeds the 8 MiB safety limit.`);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (end < size)
|
|
83
|
+
warnings.push(`Large session ${file}: scan again to index the remaining records.`);
|
|
84
|
+
return { records, offset: consumed };
|
|
85
|
+
}
|
|
86
|
+
function updateProjection(sessionId, leaf, agent) {
|
|
87
|
+
const db = (0, schema_1.getDb)();
|
|
88
|
+
if (agent === 'codex') {
|
|
89
|
+
db.prepare('UPDATE agent_entries SET active=present,effective_length=text_length,effective_id=NULL WHERE session_id=?').run(sessionId);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const rows = db.prepare('SELECT * FROM agent_entries WHERE session_id = ? AND present = 1 ORDER BY id').all(sessionId);
|
|
93
|
+
const byId = new Map(rows.map(row => [row.entry_id, row]));
|
|
94
|
+
const branch = [];
|
|
95
|
+
const visited = new Set();
|
|
96
|
+
let cursor = leaf;
|
|
97
|
+
while (cursor && !visited.has(cursor)) {
|
|
98
|
+
visited.add(cursor);
|
|
99
|
+
const entry = byId.get(cursor);
|
|
100
|
+
if (!entry)
|
|
101
|
+
break;
|
|
102
|
+
branch.push(entry);
|
|
103
|
+
cursor = entry.parent_id;
|
|
104
|
+
}
|
|
105
|
+
branch.reverse();
|
|
106
|
+
db.prepare('UPDATE agent_entries SET active=0,effective_length=text_length,effective_id=NULL WHERE session_id=?').run(sessionId);
|
|
107
|
+
const activate = db.prepare('UPDATE agent_entries SET active = 1 WHERE id = ?');
|
|
108
|
+
for (const row of branch)
|
|
109
|
+
activate.run(row.id);
|
|
110
|
+
// Context edits are branch-relative. Null replacements omit the target.
|
|
111
|
+
const edit = db.prepare('UPDATE agent_entries SET effective_id=?,effective_length=? WHERE session_id=? AND entry_id=? AND active=1');
|
|
112
|
+
for (const row of branch) {
|
|
113
|
+
if (row.type === 'context_edit' && row.target_id)
|
|
114
|
+
edit.run(row.id, row.replacement_length, sessionId, row.target_id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function pointersMatch(file, sessionId) {
|
|
118
|
+
const pointers = (0, schema_1.getDb)().prepare('SELECT record_offset,record_bytes,record_hash FROM agent_entries WHERE session_id=? AND present=1').all(sessionId);
|
|
119
|
+
for (const pointer of pointers) {
|
|
120
|
+
if (!Number.isSafeInteger(pointer.record_offset) || pointer.record_offset < 0 || !Number.isSafeInteger(pointer.record_bytes) || pointer.record_bytes < 1 || pointer.record_bytes > source_files_1.RECORD_BYTES || !pointer.record_hash)
|
|
121
|
+
return false;
|
|
122
|
+
const bytes = Buffer.alloc(pointer.record_bytes);
|
|
123
|
+
const read = await file.read(bytes, 0, bytes.length, pointer.record_offset);
|
|
124
|
+
if (read.bytesRead !== bytes.length || (0, normalize_1.digest)(bytes) !== pointer.record_hash)
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
async function indexFile(filePath, agent, root, warnings) {
|
|
130
|
+
const db = (0, schema_1.getDb)();
|
|
131
|
+
const previous = db.prepare('SELECT * FROM agent_sessions WHERE path = ?').get(filePath);
|
|
132
|
+
if (previous && previous.agent !== agent)
|
|
133
|
+
throw new Error('Session path belongs to another agent');
|
|
134
|
+
const real = fs_1.default.realpathSync(filePath), base = fs_1.default.realpathSync(root);
|
|
135
|
+
if (real === base || !inside(real, base))
|
|
136
|
+
throw new Error('Session path is outside its source root');
|
|
137
|
+
const before = fs_1.default.statSync(real), file = await fs_1.default.promises.open(real, fs_1.default.constants.O_RDONLY | (fs_1.default.constants.O_NOFOLLOW || 0));
|
|
138
|
+
try {
|
|
139
|
+
const stat = await file.stat();
|
|
140
|
+
if (!stat.isFile() || stat.dev !== before.dev || stat.ino !== before.ino)
|
|
141
|
+
throw new Error('Session file identity changed');
|
|
142
|
+
const header = (0, adapters_1.identifySource)(agent, (0, source_files_1.fileRecords)(file.fd, Math.min(stat.size, source_files_1.RECORD_BYTES)));
|
|
143
|
+
if (inside(path_1.default.resolve(header.cwd), (0, schema_1.getDataDir)()))
|
|
144
|
+
return { added: 0 };
|
|
145
|
+
const identity = `${stat.dev}:${stat.ino}`;
|
|
146
|
+
const modified = stat.mtime.toISOString();
|
|
147
|
+
let reset = !previous || previous.id !== header.id || previous.file_identity !== identity || stat.size < previous.byte_offset;
|
|
148
|
+
if (previous && !reset) {
|
|
149
|
+
const boundary = await hashRegion(file, Math.max(0, previous.byte_offset - 256), Math.min(256, previous.byte_offset));
|
|
150
|
+
const prefix = await hashRegion(file, 0, Math.min(512, previous.byte_offset));
|
|
151
|
+
reset = boundary !== previous.boundary_hash || prefix !== previous.prefix_hash ||
|
|
152
|
+
(stat.size === previous.byte_offset && modified !== previous.modified_at);
|
|
153
|
+
// A middle rewrite followed by an append can leave both prefix and old
|
|
154
|
+
// tail unchanged. Verify old pointers before treating it as append-only.
|
|
155
|
+
if (!reset && modified !== previous.modified_at)
|
|
156
|
+
reset = !await pointersMatch(file, previous.id);
|
|
157
|
+
if (!reset && stat.size === previous.byte_offset && modified === previous.modified_at) {
|
|
158
|
+
return { id: previous.id, added: 0 };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const warningStart = warnings.length;
|
|
162
|
+
const result = await readRecords(file, filePath, reset ? 0 : previous.byte_offset, stat.size, warnings);
|
|
163
|
+
if (agent !== 'pi' && warnings.slice(warningStart).some(warning => warning.startsWith('Skipped malformed JSON')))
|
|
164
|
+
throw new Error('Malformed agent transcript; no partial record set was admitted');
|
|
165
|
+
const duplicate = db.prepare('SELECT path,agent FROM agent_sessions WHERE id = ?').get(header.id);
|
|
166
|
+
if (duplicate && duplicate.agent !== agent)
|
|
167
|
+
throw new Error('Agent session ID collision');
|
|
168
|
+
if (duplicate && duplicate.path !== filePath && fs_1.default.existsSync(duplicate.path)) {
|
|
169
|
+
warnings.push(`Ignored duplicate session ${header.id} at ${filePath}.`);
|
|
170
|
+
return { id: header.id, added: 0 };
|
|
171
|
+
}
|
|
172
|
+
const entries = [];
|
|
173
|
+
let name = reset ? '' : previous.name;
|
|
174
|
+
let leaf = reset ? null : previous.leaf_id;
|
|
175
|
+
const identities = new Map(agent === 'claude' && previous && !reset
|
|
176
|
+
? db.prepare('SELECT entry_id,event_key FROM agent_entries WHERE session_id=? AND present=1').all(previous.id).map(row => [row.entry_id, row.event_key]) : []);
|
|
177
|
+
for (const { value: record, ...pointer } of result.records) {
|
|
178
|
+
if (agent === 'pi' && record?.type === 'session')
|
|
179
|
+
continue;
|
|
180
|
+
if (agent === 'pi' && record?.type === 'session_info' && typeof record.name === 'string')
|
|
181
|
+
name = (0, normalize_1.cleanText)(record.name, 200);
|
|
182
|
+
if (agent === 'claude' && record?.type === 'custom-title' && typeof record.customTitle === 'string')
|
|
183
|
+
name = (0, normalize_1.cleanText)(record.customTitle, 200);
|
|
184
|
+
const entry = (0, adapters_1.normalizeSource)(header, { ...pointer, value: record });
|
|
185
|
+
if (entry) {
|
|
186
|
+
if (agent === 'claude' && identities.has(entry.entry_id) && identities.get(entry.entry_id) !== entry.event_key)
|
|
187
|
+
throw new Error('Conflicting Claude message UUID; no earlier content was overwritten');
|
|
188
|
+
identities.set(entry.entry_id, entry.event_key);
|
|
189
|
+
entries.push({ ...entry, ...pointer });
|
|
190
|
+
// Claude progress/request metadata can carry UUIDs without selecting a
|
|
191
|
+
// new conversation branch. Keep them as structural links only.
|
|
192
|
+
if (agent !== 'claude' || ['user', 'assistant'].includes(record.type) || (record.type === 'system' && record.subtype === 'compact_boundary'))
|
|
193
|
+
leaf = entry.entry_id;
|
|
194
|
+
if (!name && entry.role === 'user' && entry.text)
|
|
195
|
+
name = (0, normalize_1.cleanText)(entry.text.replace(/\s+/g, ' '), 100);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (agent === 'codex' && !entries.some(entry => entry.is_activity) && (!previous || reset) && result.records.some(record => record.value?.type === 'event_msg' && ['user_message', 'agent_message'].includes(record.value?.payload?.type))) {
|
|
199
|
+
throw new Error('Codex event-only transcript layout is unsupported or not yet complete; response_item evidence is required');
|
|
200
|
+
}
|
|
201
|
+
const boundary = await hashRegion(file, Math.max(0, result.offset - 256), Math.min(256, result.offset));
|
|
202
|
+
const prefix = await hashRegion(file, 0, Math.min(512, result.offset));
|
|
203
|
+
return db.transaction(() => {
|
|
204
|
+
// A replacement file may represent a different session; retain its old evidence/history.
|
|
205
|
+
if (previous && previous.id !== header.id) {
|
|
206
|
+
db.prepare('UPDATE agent_sessions SET path = ?, missing = 1 WHERE id = ?').run(`${filePath}#replaced:${previous.id}`, previous.id);
|
|
207
|
+
}
|
|
208
|
+
db.prepare(`INSERT INTO agent_sessions(id, path, cwd, name, modified_at, file_identity, byte_offset, boundary_hash, prefix_hash, leaf_id, agent, external_id)
|
|
209
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
210
|
+
ON CONFLICT(id) DO UPDATE SET path=excluded.path, cwd=excluded.cwd, name=excluded.name,
|
|
211
|
+
modified_at=excluded.modified_at, file_identity=excluded.file_identity, byte_offset=excluded.byte_offset,
|
|
212
|
+
boundary_hash=excluded.boundary_hash, prefix_hash=excluded.prefix_hash, leaf_id=excluded.leaf_id, missing=0`).run(header.id, filePath, header.cwd, name, modified, identity, result.offset, boundary, prefix, leaf, agent, header.external_id);
|
|
213
|
+
if (reset)
|
|
214
|
+
db.prepare('UPDATE agent_entries SET present = 0, active = 0 WHERE session_id = ?').run(header.id);
|
|
215
|
+
const upsert = db.prepare(`INSERT INTO agent_entries
|
|
216
|
+
(session_id,entry_id,parent_id,timestamp,type,role,event_key,is_activity,target_id,record_offset,record_bytes,record_hash,text_length,replacement_length,effective_length)
|
|
217
|
+
VALUES (@session_id,@entry_id,@parent_id,@timestamp,@type,@role,@event_key,@is_activity,@target_id,@record_offset,@record_bytes,@record_hash,@text_length,@replacement_length,@text_length)
|
|
218
|
+
ON CONFLICT(session_id,entry_id) DO UPDATE SET parent_id=excluded.parent_id,timestamp=excluded.timestamp,
|
|
219
|
+
type=excluded.type,role=excluded.role,event_key=excluded.event_key,is_activity=excluded.is_activity,target_id=excluded.target_id,
|
|
220
|
+
record_offset=excluded.record_offset,record_bytes=excluded.record_bytes,record_hash=excluded.record_hash,
|
|
221
|
+
text_length=excluded.text_length,replacement_length=excluded.replacement_length,effective_length=excluded.text_length,
|
|
222
|
+
effective_id=NULL,normalization=2,present=1`);
|
|
223
|
+
let added = 0;
|
|
224
|
+
const exists = db.prepare('SELECT 1 FROM agent_entries WHERE session_id = ? AND entry_id = ?');
|
|
225
|
+
for (const entry of entries) {
|
|
226
|
+
if (!exists.get(header.id, entry.entry_id))
|
|
227
|
+
added++;
|
|
228
|
+
upsert.run({ ...entry, session_id: header.id, text_length: entry.text.length, replacement_length: entry.replacement?.length || 0 });
|
|
229
|
+
}
|
|
230
|
+
updateProjection(header.id, leaf, agent);
|
|
231
|
+
return { id: header.id, added };
|
|
232
|
+
})();
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
await file.close();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
let scanning = null;
|
|
239
|
+
function scanSessions() {
|
|
240
|
+
if (scanning)
|
|
241
|
+
return scanning;
|
|
242
|
+
scanning = (async () => {
|
|
243
|
+
const warnings = [];
|
|
244
|
+
const db = (0, schema_1.getDb)(), roots = (0, registry_1.getSourceRoots)(), seen = new Set();
|
|
245
|
+
const agents = db.prepare('SELECT id FROM agent_sources WHERE enabled=1').all();
|
|
246
|
+
let added = 0, files = 0;
|
|
247
|
+
for (const { id: agent } of agents) {
|
|
248
|
+
let foundRoot = false;
|
|
249
|
+
for (const root of roots[agent]) {
|
|
250
|
+
if (!fs_1.default.existsSync(root))
|
|
251
|
+
continue;
|
|
252
|
+
foundRoot = true;
|
|
253
|
+
for (const file of await discover(root, warnings)) {
|
|
254
|
+
if (!db.prepare('SELECT enabled FROM agent_sources WHERE id=?').get(agent)?.enabled)
|
|
255
|
+
break;
|
|
256
|
+
if (agent === 'claude' && /\.orphaned-[^/]+\.jsonl$/.test(file))
|
|
257
|
+
continue;
|
|
258
|
+
files++;
|
|
259
|
+
try {
|
|
260
|
+
const result = await indexFile(file, agent, root, warnings);
|
|
261
|
+
if (result.id)
|
|
262
|
+
seen.add(result.id);
|
|
263
|
+
added += result.added;
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
warnings.push(`Could not index ${agent} session ${file}: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (!foundRoot)
|
|
271
|
+
warnings.push(`Session directory not found for ${agent}: ${roots[agent].join(', ')}`);
|
|
272
|
+
}
|
|
273
|
+
db.transaction(() => {
|
|
274
|
+
for (const { id } of agents)
|
|
275
|
+
db.prepare('UPDATE agent_sessions SET missing=1 WHERE agent=? AND agent IN (SELECT id FROM agent_sources WHERE enabled=1)').run(id);
|
|
276
|
+
const mark = db.prepare('UPDATE agent_sessions SET missing = 0 WHERE id = ?');
|
|
277
|
+
for (const id of seen)
|
|
278
|
+
mark.run(id);
|
|
279
|
+
})();
|
|
280
|
+
return { files, added, warnings: warnings.slice(0, 100) };
|
|
281
|
+
})().finally(() => { scanning = null; });
|
|
282
|
+
return scanning;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=collector.js.map
|