spexcode 0.6.7 → 0.7.0-next.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/README.md +12 -7
- package/node_modules/@spexcode/session-application/dist/index.d.ts +17 -0
- package/node_modules/@spexcode/session-application/dist/index.js +35 -0
- package/node_modules/@spexcode/session-application/dist/migration.d.ts +51 -0
- package/node_modules/@spexcode/session-application/dist/migration.js +694 -0
- package/node_modules/@spexcode/session-application/dist/production.d.ts +109 -0
- package/node_modules/@spexcode/session-application/dist/production.js +438 -0
- package/node_modules/@spexcode/session-application/dist/schema.d.ts +2 -0
- package/node_modules/@spexcode/session-application/dist/schema.js +39 -0
- package/node_modules/@spexcode/session-application/package.json +29 -0
- package/node_modules/@spexcode/session-events/dist/errors.d.ts +6 -0
- package/node_modules/@spexcode/session-events/dist/errors.js +11 -0
- package/node_modules/@spexcode/session-events/dist/index.d.ts +46 -0
- package/node_modules/@spexcode/session-events/dist/index.js +245 -0
- package/node_modules/@spexcode/session-events/dist/schema.d.ts +3 -0
- package/node_modules/@spexcode/session-events/dist/schema.js +44 -0
- package/node_modules/@spexcode/session-events/package.json +24 -0
- package/node_modules/@spexcode/session-protocol/dist/canonical.d.ts +36 -0
- package/node_modules/@spexcode/session-protocol/dist/canonical.js +139 -0
- package/node_modules/@spexcode/session-protocol/dist/engine.d.ts +22 -0
- package/node_modules/@spexcode/session-protocol/dist/engine.js +478 -0
- package/node_modules/@spexcode/session-protocol/dist/errors.d.ts +8 -0
- package/node_modules/@spexcode/session-protocol/dist/errors.js +39 -0
- package/node_modules/@spexcode/session-protocol/dist/index.d.ts +60 -0
- package/node_modules/@spexcode/session-protocol/dist/index.js +4 -0
- package/node_modules/@spexcode/session-protocol/dist/schema.d.ts +36 -0
- package/node_modules/@spexcode/session-protocol/dist/schema.js +192 -0
- package/node_modules/@spexcode/{session-core → session-protocol}/package.json +4 -8
- package/node_modules/@spexcode/session-runtime/dist/errors.d.ts +6 -0
- package/node_modules/@spexcode/session-runtime/dist/errors.js +11 -0
- package/node_modules/@spexcode/session-runtime/dist/index.d.ts +33 -0
- package/node_modules/@spexcode/session-runtime/dist/index.js +193 -0
- package/node_modules/@spexcode/session-runtime/dist/schema.d.ts +2 -0
- package/node_modules/@spexcode/session-runtime/dist/schema.js +37 -0
- package/node_modules/@spexcode/session-runtime/package.json +24 -0
- package/node_modules/@spexcode/session-selflaunch/bin/spex-session.mjs +4 -0
- package/node_modules/@spexcode/session-selflaunch/dist/cli.d.ts +25 -0
- package/node_modules/@spexcode/session-selflaunch/dist/cli.js +156 -0
- package/node_modules/@spexcode/session-selflaunch/dist/index.d.ts +28 -0
- package/node_modules/@spexcode/session-selflaunch/dist/index.js +25 -0
- package/node_modules/@spexcode/session-selflaunch/dist/locality.d.ts +31 -0
- package/node_modules/@spexcode/session-selflaunch/dist/locality.js +135 -0
- package/node_modules/@spexcode/session-selflaunch/dist/path.d.ts +13 -0
- package/node_modules/@spexcode/session-selflaunch/dist/path.js +45 -0
- package/node_modules/@spexcode/session-selflaunch/package.json +35 -0
- package/node_modules/@spexcode/session-topology/dist/errors.d.ts +6 -0
- package/node_modules/@spexcode/session-topology/dist/errors.js +11 -0
- package/node_modules/@spexcode/session-topology/dist/index.d.ts +24 -0
- package/node_modules/@spexcode/session-topology/dist/index.js +173 -0
- package/node_modules/@spexcode/session-topology/dist/schema.d.ts +3 -0
- package/node_modules/@spexcode/session-topology/dist/schema.js +27 -0
- package/node_modules/@spexcode/session-topology/package.json +24 -0
- package/node_modules/@spexcode/spec-cli/bin/spex.mjs +175 -21
- package/node_modules/@spexcode/spec-cli/dist/cli.js +121 -59
- package/node_modules/@spexcode/spec-cli/dist/client.d.ts +1 -3
- package/node_modules/@spexcode/spec-cli/dist/client.js +49 -30
- package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.d.ts +11 -0
- package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.js +46 -9
- package/node_modules/@spexcode/spec-cli/dist/delivery-lock.d.ts +2 -0
- package/node_modules/@spexcode/spec-cli/dist/delivery-lock.js +58 -0
- package/node_modules/@spexcode/spec-cli/dist/doctor.js +53 -11
- package/node_modules/@spexcode/spec-cli/dist/file-write.js +14 -2
- package/node_modules/@spexcode/spec-cli/dist/gateway-hub.js +2 -1
- package/node_modules/@spexcode/spec-cli/dist/gateway.js +6 -3
- package/node_modules/@spexcode/spec-cli/dist/graphCache.js +32 -2
- package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.js +57 -2
- package/node_modules/@spexcode/spec-cli/dist/graphStream.d.ts +2 -0
- package/node_modules/@spexcode/spec-cli/dist/graphStream.js +83 -3
- package/node_modules/@spexcode/spec-cli/dist/guide.js +29 -18
- package/node_modules/@spexcode/spec-cli/dist/harness-select.js +16 -3
- package/node_modules/@spexcode/spec-cli/dist/harness.d.ts +24 -6
- package/node_modules/@spexcode/spec-cli/dist/harness.js +510 -72
- package/node_modules/@spexcode/spec-cli/dist/help.js +11 -8
- package/node_modules/@spexcode/spec-cli/dist/hook-prompts.js +8 -0
- package/node_modules/@spexcode/spec-cli/dist/host-resources.js +29 -8
- package/node_modules/@spexcode/spec-cli/dist/host.d.ts +7 -0
- package/node_modules/@spexcode/spec-cli/dist/host.js +98 -1
- package/node_modules/@spexcode/spec-cli/dist/index.js +294 -36
- package/node_modules/@spexcode/spec-cli/dist/init.js +1 -1
- package/node_modules/@spexcode/spec-cli/dist/lint.js +70 -35
- package/node_modules/@spexcode/spec-cli/dist/listen.d.ts +3 -2
- package/node_modules/@spexcode/spec-cli/dist/listen.js +14 -2
- package/node_modules/@spexcode/spec-cli/dist/machine-peer.d.ts +2 -1
- package/node_modules/@spexcode/spec-cli/dist/machine-peer.js +46 -15
- package/node_modules/@spexcode/spec-cli/dist/materialize.d.ts +2 -2
- package/node_modules/@spexcode/spec-cli/dist/materialize.js +176 -35
- package/node_modules/@spexcode/spec-cli/dist/opencode.js +10 -2
- package/node_modules/@spexcode/spec-cli/dist/pi-harness.js +18 -5
- package/node_modules/@spexcode/spec-cli/dist/pi-headless.d.ts +2 -0
- package/node_modules/@spexcode/spec-cli/dist/pi-headless.js +27 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-bridge.js +14 -14
- package/node_modules/@spexcode/spec-cli/dist/reviews.js +12 -7
- package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.d.ts +11 -0
- package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.js +79 -1
- package/node_modules/@spexcode/spec-cli/dist/session-application.d.ts +23 -0
- package/node_modules/@spexcode/spec-cli/dist/session-application.js +189 -0
- package/node_modules/@spexcode/spec-cli/dist/session-declarations.js +13 -1
- package/node_modules/@spexcode/spec-cli/dist/session-files.d.ts +6 -0
- package/node_modules/@spexcode/spec-cli/dist/session-files.js +13 -1
- package/node_modules/@spexcode/spec-cli/dist/session-follow.js +39 -22
- package/node_modules/@spexcode/{session-core/dist/record-lock.d.ts → spec-cli/dist/session-record-lock.d.ts} +0 -4
- package/node_modules/@spexcode/spec-cli/dist/session-record-lock.js +94 -0
- package/node_modules/@spexcode/spec-cli/dist/session-runtime-adapter.d.ts +44 -0
- package/node_modules/@spexcode/spec-cli/dist/session-runtime-adapter.js +37 -0
- package/node_modules/@spexcode/spec-cli/dist/session-timeline.d.ts +25 -2
- package/node_modules/@spexcode/spec-cli/dist/session-timeline.js +68 -11
- package/node_modules/@spexcode/spec-cli/dist/session-transcript.d.ts +57 -0
- package/node_modules/@spexcode/spec-cli/dist/session-transcript.js +137 -0
- package/node_modules/@spexcode/spec-cli/dist/session-web.js +4 -4
- package/node_modules/@spexcode/spec-cli/dist/sessions.d.ts +112 -15
- package/node_modules/@spexcode/spec-cli/dist/sessions.js +1553 -764
- package/node_modules/@spexcode/spec-cli/dist/shim-runtime.js +14 -0
- package/node_modules/@spexcode/spec-cli/dist/source-list.d.ts +13 -0
- package/node_modules/@spexcode/spec-cli/dist/source-list.js +99 -0
- package/node_modules/@spexcode/spec-cli/dist/source-read.d.ts +16 -0
- package/node_modules/@spexcode/spec-cli/dist/source-read.js +84 -0
- package/node_modules/@spexcode/spec-cli/dist/spec-attachments.d.ts +7 -0
- package/node_modules/@spexcode/spec-cli/dist/spec-attachments.js +89 -0
- package/node_modules/@spexcode/spec-cli/dist/spec-body-edit.d.ts +23 -0
- package/node_modules/@spexcode/spec-cli/dist/spec-body-edit.js +138 -0
- package/node_modules/@spexcode/spec-cli/dist/supervise.js +15 -6
- package/node_modules/@spexcode/spec-cli/hooks/dispatch.sh +19 -31
- package/node_modules/@spexcode/spec-cli/hooks/harness.sh +6 -6
- package/node_modules/@spexcode/spec-cli/package.json +8 -6
- package/node_modules/@spexcode/spec-cli/templates/hooks/post-checkout +4 -2
- package/node_modules/@spexcode/spec-cli/templates/hooks/post-merge +2 -1
- package/node_modules/@spexcode/spec-cli/templates/hooks/pre-commit +5 -3
- package/node_modules/@spexcode/spec-cli/templates/hooks/reference-transaction +5 -3
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/commands/spec.md +2 -7
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/idle/idle.sh +4 -10
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/idle/spec.md +1 -1
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/mark-active/mark-active.sh +22 -24
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/mark-active/spec.md +10 -2
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/session-fail/fail.sh +8 -7
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/session-fail/spec.md +3 -1
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/session-listen/session-listen.sh +133 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/session-listen/spec.md +36 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/spec.md +2 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/stop-gate/spec.md +1 -1
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +17 -20
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/skills/merge/spec.md +33 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/skills/spec.md +2 -6
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/spec.md +7 -0
- package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +13 -2
- package/node_modules/@spexcode/spec-core/dist/anchors.js +311 -15
- package/node_modules/@spexcode/spec-core/dist/git.d.ts +4 -0
- package/node_modules/@spexcode/spec-core/dist/git.js +9 -9
- package/node_modules/@spexcode/spec-core/dist/layout.d.ts +12 -1
- package/node_modules/@spexcode/spec-core/dist/layout.js +4 -2
- package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +1 -0
- package/node_modules/@spexcode/spec-core/dist/resilience.js +8 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +1 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +7 -3
- package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +1 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +4 -0
- package/node_modules/@spexcode/spec-core/dist/specs.d.ts +2 -0
- package/node_modules/@spexcode/spec-core/dist/specs.js +30 -0
- package/node_modules/@spexcode/spec-core/package.json +4 -1
- package/node_modules/@spexcode/spec-core/templates/spexcode.json +36 -13
- package/node_modules/@spexcode/spec-eval/dist/cli.js +1 -1
- package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +1 -0
- package/node_modules/@spexcode/spec-eval/dist/evaltab.js +6 -1
- package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +1 -1
- package/node_modules/@spexcode/spec-eval/dist/freshness.js +12 -12
- package/node_modules/@spexcode/spec-eval/dist/host.d.ts +2 -1
- package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +2 -1
- package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +20 -3
- package/node_modules/@spexcode/spec-eval/package.json +2 -2
- package/node_modules/@spexcode/spec-forge/package.json +2 -2
- package/node_modules/@spexcode/transcript/dist/frames.d.ts +44 -0
- package/node_modules/@spexcode/transcript/dist/frames.js +85 -0
- package/node_modules/@spexcode/transcript/dist/index.d.ts +5 -0
- package/node_modules/@spexcode/transcript/dist/index.js +5 -0
- package/node_modules/@spexcode/transcript/dist/live.d.ts +16 -0
- package/node_modules/@spexcode/transcript/dist/live.js +65 -0
- package/node_modules/@spexcode/transcript/dist/parsers.d.ts +47 -0
- package/node_modules/@spexcode/transcript/dist/parsers.js +285 -0
- package/node_modules/@spexcode/transcript/dist/readers.d.ts +10 -0
- package/node_modules/@spexcode/transcript/dist/readers.js +296 -0
- package/node_modules/@spexcode/transcript/dist/turns.d.ts +42 -0
- package/node_modules/@spexcode/transcript/dist/turns.js +11 -0
- package/node_modules/@spexcode/transcript/package.json +30 -0
- package/node_modules/@vscode/tree-sitter-wasm/LICENSE +21 -0
- package/node_modules/@vscode/tree-sitter-wasm/README.md +36 -0
- package/node_modules/@vscode/tree-sitter-wasm/SECURITY.md +41 -0
- package/node_modules/@vscode/tree-sitter-wasm/cgmanifest.json +16 -0
- package/node_modules/@vscode/tree-sitter-wasm/package.json +42 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-bash.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-c-sharp.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-cpp.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-css.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-go.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-ini.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-java.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-javascript.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-php.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-powershell.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-python.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-regex.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-ruby.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-rust.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-tsx.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-typescript.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter.js +4075 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter.wasm +0 -0
- package/node_modules/@vscode/tree-sitter-wasm/wasm/web-tree-sitter.d.ts +1027 -0
- package/node_modules/smol-toml/LICENSE +24 -0
- package/node_modules/smol-toml/README.md +418 -0
- package/node_modules/smol-toml/dist/date.d.ts +41 -0
- package/node_modules/smol-toml/dist/date.js +127 -0
- package/node_modules/smol-toml/dist/error.d.ts +38 -0
- package/node_modules/smol-toml/dist/error.js +63 -0
- package/node_modules/smol-toml/dist/extract.js +69 -0
- package/node_modules/smol-toml/dist/index.cjs +734 -0
- package/node_modules/smol-toml/dist/index.d.ts +43 -0
- package/node_modules/smol-toml/dist/index.js +33 -0
- package/node_modules/smol-toml/dist/parse.d.ts +36 -0
- package/node_modules/smol-toml/dist/parse.js +149 -0
- package/node_modules/smol-toml/dist/primitive.js +238 -0
- package/node_modules/smol-toml/dist/stringify.d.ts +31 -0
- package/node_modules/smol-toml/dist/stringify.js +181 -0
- package/node_modules/smol-toml/dist/struct.js +179 -0
- package/node_modules/smol-toml/dist/util.d.ts +38 -0
- package/node_modules/smol-toml/dist/util.js +89 -0
- package/node_modules/smol-toml/package.json +68 -0
- package/package.json +9 -3
- package/node_modules/@spexcode/session-core/dist/delivery-queue.d.ts +0 -24
- package/node_modules/@spexcode/session-core/dist/delivery-queue.js +0 -206
- package/node_modules/@spexcode/session-core/dist/index.d.ts +0 -5
- package/node_modules/@spexcode/session-core/dist/index.js +0 -5
- package/node_modules/@spexcode/session-core/dist/internal.d.ts +0 -3
- package/node_modules/@spexcode/session-core/dist/internal.js +0 -3
- package/node_modules/@spexcode/session-core/dist/message.d.ts +0 -22
- package/node_modules/@spexcode/session-core/dist/message.js +0 -53
- package/node_modules/@spexcode/session-core/dist/record-lock.js +0 -152
- package/node_modules/@spexcode/session-core/dist/runtime-session.d.ts +0 -62
- package/node_modules/@spexcode/session-core/dist/runtime-session.js +0 -326
- package/node_modules/@spexcode/session-core/dist/session-cursors.d.ts +0 -14
- package/node_modules/@spexcode/session-core/dist/session-cursors.js +0 -82
- package/node_modules/@spexcode/session-core/dist/session-timeline.d.ts +0 -47
- package/node_modules/@spexcode/session-core/dist/session-timeline.js +0 -216
- package/node_modules/@spexcode/spec-cli/dist/execution-trace.d.ts +0 -26
- package/node_modules/@spexcode/spec-cli/dist/execution-trace.js +0 -475
- package/node_modules/@spexcode/spec-cli/dist/session-execution.d.ts +0 -10
- package/node_modules/@spexcode/spec-cli/dist/session-execution.js +0 -70
- package/node_modules/@spexcode/spec-cli/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -53
- package/node_modules/@spexcode/spec-cli/hooks/compat/mark-active-sed-v0.fixture +0 -46
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { existsSync, readFileSync, appendFileSync, mkdirSync, statSync, readdirSync, openSync, closeSync, readSync } from 'node:fs';
|
|
3
|
-
import { basename, join } from 'node:path';
|
|
4
|
-
import { sessionStoreDir, sessionArtifactPath } from '@spexcode/spec-core';
|
|
5
|
-
const timelinePath = (id) => sessionArtifactPath(id, 'timeline.ndjson');
|
|
6
|
-
const segmentsDir = (id) => sessionArtifactPath(id, 'timeline');
|
|
7
|
-
const SEGMENT = /^(\d+)\.ndjson$/;
|
|
8
|
-
const SEGMENT_NAME_WIDTH = 12;
|
|
9
|
-
const TAIL_BLOCK_BYTES = 64 * 1024;
|
|
10
|
-
// One logical timeline is legacy timeline.ndjson followed by immutable numbered segments. The directory
|
|
11
|
-
// listing is its only index: numbering is append order, so there is no mutable manifest to repair.
|
|
12
|
-
function segmentFiles(id) {
|
|
13
|
-
try {
|
|
14
|
-
const dir = segmentsDir(id);
|
|
15
|
-
const names = readdirSync(dir).filter((name) => SEGMENT.test(name)).sort((a, b) => {
|
|
16
|
-
const an = BigInt(SEGMENT.exec(a)[1]), bn = BigInt(SEGMENT.exec(b)[1]);
|
|
17
|
-
return an < bn ? -1 : an > bn ? 1 : 0;
|
|
18
|
-
});
|
|
19
|
-
return names.map((name) => join(dir, name));
|
|
20
|
-
}
|
|
21
|
-
catch { /* no numbered segments yet */ }
|
|
22
|
-
return [];
|
|
23
|
-
}
|
|
24
|
-
function timelineFiles(id) {
|
|
25
|
-
const files = [];
|
|
26
|
-
const legacy = timelinePath(id);
|
|
27
|
-
if (existsSync(legacy))
|
|
28
|
-
files.push(legacy);
|
|
29
|
-
files.push(...segmentFiles(id));
|
|
30
|
-
return files;
|
|
31
|
-
}
|
|
32
|
-
const segmentLimit = () => {
|
|
33
|
-
const configured = Number(process.env.SPEXCODE_TIMELINE_SEGMENT_BYTES);
|
|
34
|
-
return Number.isFinite(configured) ? Math.max(1024, Math.floor(configured)) : 4 * 1024 * 1024;
|
|
35
|
-
};
|
|
36
|
-
function activeSegment(id, bytes) {
|
|
37
|
-
const dir = segmentsDir(id);
|
|
38
|
-
mkdirSync(dir, { recursive: true });
|
|
39
|
-
const segments = segmentFiles(id);
|
|
40
|
-
const current = segments.at(-1);
|
|
41
|
-
if (!current)
|
|
42
|
-
return join(dir, `${String(1).padStart(SEGMENT_NAME_WIDTH, '0')}.ndjson`);
|
|
43
|
-
try {
|
|
44
|
-
if (statSync(current).size === 0 || statSync(current).size + bytes <= segmentLimit())
|
|
45
|
-
return current;
|
|
46
|
-
}
|
|
47
|
-
catch { /* a vanished active segment is recreated under its next number */ }
|
|
48
|
-
const n = BigInt(SEGMENT.exec(basename(current))[1]) + 1n;
|
|
49
|
-
return join(dir, `${String(n).padStart(SEGMENT_NAME_WIDTH, '0')}.ndjson`);
|
|
50
|
-
}
|
|
51
|
-
function append(id, ev) {
|
|
52
|
-
mkdirSync(sessionStoreDir(id), { recursive: true });
|
|
53
|
-
const line = JSON.stringify(ev) + '\n';
|
|
54
|
-
appendFileSync(activeSegment(id, Buffer.byteLength(line)), line);
|
|
55
|
-
}
|
|
56
|
-
function parseLines(lines) {
|
|
57
|
-
return lines.map((l) => {
|
|
58
|
-
try {
|
|
59
|
-
return JSON.parse(l);
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
}).filter((e) => e != null && (e.kind === 'status' || e.kind === 'sent' || e.kind === 'dispatch-settled'));
|
|
65
|
-
}
|
|
66
|
-
function tailPublicEvents(path, limit) {
|
|
67
|
-
let fd = null;
|
|
68
|
-
try {
|
|
69
|
-
const size = statSync(path).size;
|
|
70
|
-
fd = openSync(path, 'r');
|
|
71
|
-
let start = size;
|
|
72
|
-
let text = '';
|
|
73
|
-
while (start > 0) {
|
|
74
|
-
const next = Math.max(0, start - TAIL_BLOCK_BYTES);
|
|
75
|
-
const buf = Buffer.alloc(start - next);
|
|
76
|
-
readSync(fd, buf, 0, buf.length, next);
|
|
77
|
-
text = buf.toString('utf8') + text;
|
|
78
|
-
const publicCount = parseLines(text.split('\n').filter(Boolean)).filter((event) => event.kind !== 'dispatch-settled').length;
|
|
79
|
-
if (publicCount >= limit || next === 0)
|
|
80
|
-
break;
|
|
81
|
-
start = next;
|
|
82
|
-
}
|
|
83
|
-
return parseLines(text.split('\n').filter(Boolean))
|
|
84
|
-
.filter((event) => event.kind !== 'dispatch-settled')
|
|
85
|
-
.slice(-limit);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
return [];
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
if (fd !== null)
|
|
92
|
-
closeSync(fd);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Record a lifecycle value that has already landed in session.json. TypeScript state writers call this
|
|
96
|
-
// synchronously before returning, so a later write cannot erase an intermediate declaration note from the
|
|
97
|
-
// conversation. Best-effort: history is an accessory to the state machine, and failing to write it must never
|
|
98
|
-
// break the transition that already happened.
|
|
99
|
-
export function recordStatus(id, status, proposal, note) {
|
|
100
|
-
try {
|
|
101
|
-
append(id, { ts: new Date().toISOString(), kind: 'status', status, proposal, note });
|
|
102
|
-
}
|
|
103
|
-
catch { /* the record already moved; the history line is the only loss */ }
|
|
104
|
-
}
|
|
105
|
-
// The DELIVERY ([[dispatch]]): appending this line IS the send, so unlike a status line it must fail LOUD —
|
|
106
|
-
// the caller reports the throw rather than a false success. `text` is the message BEFORE any mechanism insert
|
|
107
|
-
// (hints are transport, not conversation); `replyVia` is the effective channel the prompt seam chose. Returns
|
|
108
|
-
// the new line's `mid`, which a best-effort poke carries.
|
|
109
|
-
export function appendSent(id, text, from, replyVia, dispatchReceipt) {
|
|
110
|
-
const mid = randomUUID();
|
|
111
|
-
append(id, { ts: new Date().toISOString(), kind: 'sent', mid, text, from, ...(replyVia ? { replyVia } : {}), ...(dispatchReceipt ? { dispatchReceipt } : {}) });
|
|
112
|
-
return { mid };
|
|
113
|
-
}
|
|
114
|
-
export function sentDispatchReceipt(id, operation, requestDigest) {
|
|
115
|
-
let found = null;
|
|
116
|
-
const settled = new Set();
|
|
117
|
-
for (const path of timelineFiles(id)) {
|
|
118
|
-
for (const event of parseLines(readFileSync(path, 'utf8').split('\n').filter(Boolean))) {
|
|
119
|
-
if (event.kind === 'sent' && !found && event.dispatchReceipt?.operation === operation && event.dispatchReceipt.requestDigest === requestDigest) {
|
|
120
|
-
found = { mid: event.mid, payloadHash: event.dispatchReceipt.payloadHash, delivery: event.dispatchReceipt.delivery ?? null };
|
|
121
|
-
}
|
|
122
|
-
else if (event.kind === 'dispatch-settled' && event.operation === operation && event.requestDigest === requestDigest) {
|
|
123
|
-
settled.add(event.mid);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return found ? { ...found, delivered: settled.has(found.mid) } : null;
|
|
128
|
-
}
|
|
129
|
-
export function settleSentDispatch(id, mid) {
|
|
130
|
-
let receipt = null;
|
|
131
|
-
let settled = false;
|
|
132
|
-
for (const path of timelineFiles(id)) {
|
|
133
|
-
for (const event of parseLines(readFileSync(path, 'utf8').split('\n').filter(Boolean))) {
|
|
134
|
-
if (event.kind === 'sent' && event.mid === mid && event.dispatchReceipt?.delivery)
|
|
135
|
-
receipt = event.dispatchReceipt;
|
|
136
|
-
if (event.kind === 'dispatch-settled' && event.mid === mid)
|
|
137
|
-
settled = true;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
if (!receipt || settled)
|
|
141
|
-
return;
|
|
142
|
-
append(id, { ts: new Date().toISOString(), kind: 'dispatch-settled', operation: receipt.operation, requestDigest: receipt.requestDigest, mid });
|
|
143
|
-
}
|
|
144
|
-
// The unowned read: any process may take it with nothing but filesystem access, and taking it perturbs
|
|
145
|
-
// nothing. Index = event position, which is what a cursor names ([[session-cursors]]).
|
|
146
|
-
export function timelineEvents(id) {
|
|
147
|
-
try {
|
|
148
|
-
return timelineFiles(id).flatMap((path) => parseLines(readFileSync(path, 'utf8').split('\n').filter(Boolean)))
|
|
149
|
-
.flatMap((stored) => {
|
|
150
|
-
if (stored.kind === 'dispatch-settled')
|
|
151
|
-
return [];
|
|
152
|
-
if (stored.kind === 'status')
|
|
153
|
-
return [stored];
|
|
154
|
-
const { dispatchReceipt: _receipt, ...event } = stored;
|
|
155
|
-
return [event];
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
return [];
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
// the same L0 read taken as CHEAPLY as it can be: a follower ([[session-follow]]) ticks over many logs, so it
|
|
163
|
-
// stats first and parses only what grew. null = no log yet (a session that has authored nothing).
|
|
164
|
-
export function timelineStamp(id) {
|
|
165
|
-
try {
|
|
166
|
-
const path = timelineFiles(id).at(-1);
|
|
167
|
-
if (!path)
|
|
168
|
-
return null;
|
|
169
|
-
const s = statSync(path);
|
|
170
|
-
return `${path}:${s.size}:${s.mtimeMs}`;
|
|
171
|
-
}
|
|
172
|
-
catch {
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// the channel of the LAST HUMAN send (from == null): 'note' when the note-reply hint rode along, else null.
|
|
177
|
-
// This is what makes the reply-channel hints SYMMETRIC ([[session-timeline]]): a human send with no note flag
|
|
178
|
-
// arriving after a note-send is the "back at a terminal" transition, and the delivery gets the counter-insert.
|
|
179
|
-
// Derived from the durable log — no new state, and it survives a server restart. Agent senders (`from` set)
|
|
180
|
-
// say nothing about where the HUMAN is reading, so they neither set nor clear it.
|
|
181
|
-
export function lastHumanSendVia(id) {
|
|
182
|
-
const evs = timelineEvents(id);
|
|
183
|
-
for (let i = evs.length - 1; i >= 0; i--) {
|
|
184
|
-
const e = evs[i];
|
|
185
|
-
if (e.kind === 'sent' && e.from == null)
|
|
186
|
-
return e.replyVia === 'note' ? 'note' : null;
|
|
187
|
-
}
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
export function currentHumanTurn(id) {
|
|
191
|
-
const evs = timelineEvents(id);
|
|
192
|
-
for (let i = evs.length - 1; i >= 0; i--) {
|
|
193
|
-
const e = evs[i];
|
|
194
|
-
if (e.kind === 'sent' && e.from == null)
|
|
195
|
-
return { token: e.mid, acceptedAt: e.ts };
|
|
196
|
-
}
|
|
197
|
-
return null;
|
|
198
|
-
}
|
|
199
|
-
// Durable tail read with no board/governance policy. A runtime that owns a compatible session directory can
|
|
200
|
-
// consume the same protocol; product surfaces decide separately whether that id is visible to them.
|
|
201
|
-
export function timelineTail(id, limit = 500) {
|
|
202
|
-
const wanted = Math.max(1, limit);
|
|
203
|
-
const tail = [];
|
|
204
|
-
for (const path of timelineFiles(id).reverse()) {
|
|
205
|
-
const remaining = wanted - tail.length;
|
|
206
|
-
if (remaining <= 0)
|
|
207
|
-
break;
|
|
208
|
-
tail.unshift(...tailPublicEvents(path, remaining));
|
|
209
|
-
}
|
|
210
|
-
return tail.map((e) => {
|
|
211
|
-
if (e.kind === 'status')
|
|
212
|
-
return e;
|
|
213
|
-
const { dispatchReceipt: _receipt, ...event } = e;
|
|
214
|
-
return event;
|
|
215
|
-
});
|
|
216
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export type ExecutionTurn = Readonly<{
|
|
2
|
-
token: string;
|
|
3
|
-
acceptedAt: string;
|
|
4
|
-
}>;
|
|
5
|
-
export type ExecutionStepKind = 'command' | 'read' | 'write' | 'search' | 'tool';
|
|
6
|
-
export type ExecutionStep = Readonly<{
|
|
7
|
-
id: string;
|
|
8
|
-
kind: ExecutionStepKind;
|
|
9
|
-
label: string;
|
|
10
|
-
detail?: string;
|
|
11
|
-
state: 'running' | 'done';
|
|
12
|
-
}>;
|
|
13
|
-
export type ExecutionTrace = Readonly<{
|
|
14
|
-
revision: string;
|
|
15
|
-
turnId: string | null;
|
|
16
|
-
workingNote: string | null;
|
|
17
|
-
steps: readonly ExecutionStep[];
|
|
18
|
-
}>;
|
|
19
|
-
type ExportLoader = (threadId: string) => string;
|
|
20
|
-
export declare function codexRolloutPath(threadId: string, root?: string): string | null;
|
|
21
|
-
export declare function readCodexExecutionTrace(threadId: string, turn: ExecutionTurn | null, root?: string): ExecutionTrace;
|
|
22
|
-
export declare function readProjectJsonlExecutionTrace(threadId: string, turn: ExecutionTurn | null, root?: string): ExecutionTrace;
|
|
23
|
-
export declare function readSessionJsonlExecutionTrace(threadId: string, turn: ExecutionTurn | null, root?: string): ExecutionTrace;
|
|
24
|
-
export declare function readLocalStoreExecutionTrace(threadId: string, turn: ExecutionTurn | null, root?: string, load?: ExportLoader): ExecutionTrace;
|
|
25
|
-
export declare const noExecutionTrace: (_threadId: string, _turn: ExecutionTurn | null) => ExecutionTrace | null;
|
|
26
|
-
export {};
|