general-agent-runtime 0.0.1
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 +311 -0
- package/dist/agent/agent.d.ts +14 -0
- package/dist/agent/agent.js +25 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/builder.d.ts +28 -0
- package/dist/agent/builder.js +178 -0
- package/dist/agent/builder.js.map +1 -0
- package/dist/agent/create-agent.d.ts +2 -0
- package/dist/agent/create-agent.js +29 -0
- package/dist/agent/create-agent.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/integrations/session-context-source.d.ts +12 -0
- package/dist/agent/integrations/session-context-source.js +84 -0
- package/dist/agent/integrations/session-context-source.js.map +1 -0
- package/dist/agent/integrations/session-run-recorder.d.ts +17 -0
- package/dist/agent/integrations/session-run-recorder.js +60 -0
- package/dist/agent/integrations/session-run-recorder.js.map +1 -0
- package/dist/agent/loop-factory.d.ts +11 -0
- package/dist/agent/loop-factory.js +16 -0
- package/dist/agent/loop-factory.js.map +1 -0
- package/dist/agent/run-manager.d.ts +38 -0
- package/dist/agent/run-manager.js +96 -0
- package/dist/agent/run-manager.js.map +1 -0
- package/dist/agent/types.d.ts +38 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +88 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/renderer.d.ts +2 -0
- package/dist/cli/renderer.js +36 -0
- package/dist/cli/renderer.js.map +1 -0
- package/dist/compaction/budget.d.ts +14 -0
- package/dist/compaction/budget.js +28 -0
- package/dist/compaction/budget.js.map +1 -0
- package/dist/compaction/deterministic.d.ts +9 -0
- package/dist/compaction/deterministic.js +106 -0
- package/dist/compaction/deterministic.js.map +1 -0
- package/dist/compaction/index.d.ts +5 -0
- package/dist/compaction/index.js +5 -0
- package/dist/compaction/index.js.map +1 -0
- package/dist/compaction/manager.d.ts +22 -0
- package/dist/compaction/manager.js +111 -0
- package/dist/compaction/manager.js.map +1 -0
- package/dist/compaction/semantic.d.ts +13 -0
- package/dist/compaction/semantic.js +234 -0
- package/dist/compaction/semantic.js.map +1 -0
- package/dist/compaction/strategy.d.ts +1 -0
- package/dist/compaction/strategy.js +2 -0
- package/dist/compaction/strategy.js.map +1 -0
- package/dist/compaction/types.d.ts +40 -0
- package/dist/compaction/types.js +2 -0
- package/dist/compaction/types.js.map +1 -0
- package/dist/context/budget.d.ts +12 -0
- package/dist/context/budget.js +13 -0
- package/dist/context/budget.js.map +1 -0
- package/dist/context/controller.d.ts +17 -0
- package/dist/context/controller.js +78 -0
- package/dist/context/controller.js.map +1 -0
- package/dist/context/index.d.ts +14 -0
- package/dist/context/index.js +13 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/manager.d.ts +10 -0
- package/dist/context/manager.js +65 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/pipeline.d.ts +16 -0
- package/dist/context/pipeline.js +45 -0
- package/dist/context/pipeline.js.map +1 -0
- package/dist/context/projection.d.ts +8 -0
- package/dist/context/projection.js +10 -0
- package/dist/context/projection.js.map +1 -0
- package/dist/context/source.d.ts +6 -0
- package/dist/context/source.js +2 -0
- package/dist/context/source.js.map +1 -0
- package/dist/context/sources/dynamic.d.ts +10 -0
- package/dist/context/sources/dynamic.js +13 -0
- package/dist/context/sources/dynamic.js.map +1 -0
- package/dist/context/sources/project.d.ts +19 -0
- package/dist/context/sources/project.js +75 -0
- package/dist/context/sources/project.js.map +1 -0
- package/dist/context/sources/system.d.ts +14 -0
- package/dist/context/sources/system.js +23 -0
- package/dist/context/sources/system.js.map +1 -0
- package/dist/context/sources/user.d.ts +14 -0
- package/dist/context/sources/user.js +23 -0
- package/dist/context/sources/user.js.map +1 -0
- package/dist/context/stages/deduplicate.d.ts +7 -0
- package/dist/context/stages/deduplicate.js +19 -0
- package/dist/context/stages/deduplicate.js.map +1 -0
- package/dist/context/stages/expiration.d.ts +5 -0
- package/dist/context/stages/expiration.js +14 -0
- package/dist/context/stages/expiration.js.map +1 -0
- package/dist/context/stages/visibility.d.ts +5 -0
- package/dist/context/stages/visibility.js +7 -0
- package/dist/context/stages/visibility.js.map +1 -0
- package/dist/context/types.d.ts +72 -0
- package/dist/context/types.js +2 -0
- package/dist/context/types.js.map +1 -0
- package/dist/errors/codes.d.ts +1 -0
- package/dist/errors/codes.js +2 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/normalize.d.ts +2 -0
- package/dist/errors/normalize.js +32 -0
- package/dist/errors/normalize.js.map +1 -0
- package/dist/errors/runtime-error.d.ts +18 -0
- package/dist/errors/runtime-error.js +21 -0
- package/dist/errors/runtime-error.js.map +1 -0
- package/dist/errors/serialize.d.ts +2 -0
- package/dist/errors/serialize.js +12 -0
- package/dist/errors/serialize.js.map +1 -0
- package/dist/events/bus.d.ts +17 -0
- package/dist/events/bus.js +52 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +6 -0
- package/dist/events/index.js +5 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/publisher.d.ts +12 -0
- package/dist/events/publisher.js +22 -0
- package/dist/events/publisher.js.map +1 -0
- package/dist/events/sequence.d.ts +6 -0
- package/dist/events/sequence.js +14 -0
- package/dist/events/sequence.js.map +1 -0
- package/dist/events/sink.d.ts +5 -0
- package/dist/events/sink.js +2 -0
- package/dist/events/sink.js.map +1 -0
- package/dist/events/stream.d.ts +12 -0
- package/dist/events/stream.js +46 -0
- package/dist/events/stream.js.map +1 -0
- package/dist/events/types.d.ts +42 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/hooks/bus.d.ts +14 -0
- package/dist/hooks/bus.js +104 -0
- package/dist/hooks/bus.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/policy.d.ts +3 -0
- package/dist/hooks/policy.js +33 -0
- package/dist/hooks/policy.js.map +1 -0
- package/dist/hooks/registry.d.ts +13 -0
- package/dist/hooks/registry.js +31 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/timeout.d.ts +2 -0
- package/dist/hooks/timeout.js +63 -0
- package/dist/hooks/timeout.js.map +1 -0
- package/dist/hooks/types.d.ts +40 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/loop/index.d.ts +7 -0
- package/dist/loop/index.js +6 -0
- package/dist/loop/index.js.map +1 -0
- package/dist/loop/loop.d.ts +22 -0
- package/dist/loop/loop.js +623 -0
- package/dist/loop/loop.js.map +1 -0
- package/dist/loop/policy.d.ts +21 -0
- package/dist/loop/policy.js +54 -0
- package/dist/loop/policy.js.map +1 -0
- package/dist/loop/recorder.d.ts +9 -0
- package/dist/loop/recorder.js +2 -0
- package/dist/loop/recorder.js.map +1 -0
- package/dist/loop/state.d.ts +18 -0
- package/dist/loop/state.js +81 -0
- package/dist/loop/state.js.map +1 -0
- package/dist/loop/stream-assembler.d.ts +12 -0
- package/dist/loop/stream-assembler.js +76 -0
- package/dist/loop/stream-assembler.js.map +1 -0
- package/dist/loop/transition.d.ts +2 -0
- package/dist/loop/transition.js +27 -0
- package/dist/loop/transition.js.map +1 -0
- package/dist/loop/types.d.ts +53 -0
- package/dist/loop/types.js +2 -0
- package/dist/loop/types.js.map +1 -0
- package/dist/model/index.d.ts +6 -0
- package/dist/model/index.js +5 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/provider.d.ts +6 -0
- package/dist/model/provider.js +2 -0
- package/dist/model/provider.js.map +1 -0
- package/dist/model/providers/openai-compatible/adapter.d.ts +3 -0
- package/dist/model/providers/openai-compatible/adapter.js +92 -0
- package/dist/model/providers/openai-compatible/adapter.js.map +1 -0
- package/dist/model/providers/openai-compatible/errors.d.ts +3 -0
- package/dist/model/providers/openai-compatible/errors.js +68 -0
- package/dist/model/providers/openai-compatible/errors.js.map +1 -0
- package/dist/model/providers/openai-compatible/provider.d.ts +18 -0
- package/dist/model/providers/openai-compatible/provider.js +182 -0
- package/dist/model/providers/openai-compatible/provider.js.map +1 -0
- package/dist/model/providers/openai-compatible/stream-parser.d.ts +1 -0
- package/dist/model/providers/openai-compatible/stream-parser.js +45 -0
- package/dist/model/providers/openai-compatible/stream-parser.js.map +1 -0
- package/dist/model/registry.d.ts +9 -0
- package/dist/model/registry.js +35 -0
- package/dist/model/registry.js.map +1 -0
- package/dist/model/types.d.ts +49 -0
- package/dist/model/types.js +2 -0
- package/dist/model/types.js.map +1 -0
- package/dist/session/factory.d.ts +13 -0
- package/dist/session/factory.js +14 -0
- package/dist/session/factory.js.map +1 -0
- package/dist/session/index.d.ts +8 -0
- package/dist/session/index.js +7 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/jsonl-store.d.ts +20 -0
- package/dist/session/jsonl-store.js +264 -0
- package/dist/session/jsonl-store.js.map +1 -0
- package/dist/session/projector.d.ts +4 -0
- package/dist/session/projector.js +104 -0
- package/dist/session/projector.js.map +1 -0
- package/dist/session/serializer.d.ts +5 -0
- package/dist/session/serializer.js +126 -0
- package/dist/session/serializer.js.map +1 -0
- package/dist/session/session.d.ts +32 -0
- package/dist/session/session.js +129 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/store.d.ts +9 -0
- package/dist/session/store.js +2 -0
- package/dist/session/store.js.map +1 -0
- package/dist/session/types.d.ts +29 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/settings/defaults.d.ts +7 -0
- package/dist/settings/defaults.js +40 -0
- package/dist/settings/defaults.js.map +1 -0
- package/dist/settings/env-source.d.ts +8 -0
- package/dist/settings/env-source.js +26 -0
- package/dist/settings/env-source.js.map +1 -0
- package/dist/settings/file-source.d.ts +9 -0
- package/dist/settings/file-source.js +32 -0
- package/dist/settings/file-source.js.map +1 -0
- package/dist/settings/index.d.ts +8 -0
- package/dist/settings/index.js +7 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/resolver.d.ts +5 -0
- package/dist/settings/resolver.js +29 -0
- package/dist/settings/resolver.js.map +1 -0
- package/dist/settings/runtime-source.d.ts +8 -0
- package/dist/settings/runtime-source.js +11 -0
- package/dist/settings/runtime-source.js.map +1 -0
- package/dist/settings/schema.d.ts +37 -0
- package/dist/settings/schema.js +47 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/settings/source.d.ts +5 -0
- package/dist/settings/source.js +2 -0
- package/dist/settings/source.js.map +1 -0
- package/dist/settings/types.d.ts +46 -0
- package/dist/settings/types.js +2 -0
- package/dist/settings/types.js.map +1 -0
- package/dist/tools/builtin/list-directory.d.ts +17 -0
- package/dist/tools/builtin/list-directory.js +31 -0
- package/dist/tools/builtin/list-directory.js.map +1 -0
- package/dist/tools/builtin/read-file.d.ts +14 -0
- package/dist/tools/builtin/read-file.js +23 -0
- package/dist/tools/builtin/read-file.js.map +1 -0
- package/dist/tools/builtin/run-command.d.ts +19 -0
- package/dist/tools/builtin/run-command.js +46 -0
- package/dist/tools/builtin/run-command.js.map +1 -0
- package/dist/tools/builtin/write-file.d.ts +20 -0
- package/dist/tools/builtin/write-file.js +29 -0
- package/dist/tools/builtin/write-file.js.map +1 -0
- package/dist/tools/executor.d.ts +29 -0
- package/dist/tools/executor.js +212 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +19 -0
- package/dist/tools/registry.js +42 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/result-processor.d.ts +4 -0
- package/dist/tools/result-processor.js +122 -0
- package/dist/tools/result-processor.js.map +1 -0
- package/dist/tools/tool.d.ts +8 -0
- package/dist/tools/tool.js +2 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/tools/types.d.ts +44 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/validator.d.ts +5 -0
- package/dist/tools/validator.js +112 -0
- package/dist/tools/validator.js.map +1 -0
- package/dist/types/compaction.d.ts +22 -0
- package/dist/types/compaction.js +2 -0
- package/dist/types/compaction.js.map +1 -0
- package/dist/types/error.d.ts +10 -0
- package/dist/types/error.js +2 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/ids.d.ts +12 -0
- package/dist/types/ids.js +2 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/json.d.ts +7 -0
- package/dist/types/json.js +2 -0
- package/dist/types/json.js.map +1 -0
- package/dist/types/message.d.ts +39 -0
- package/dist/types/message.js +2 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/metadata.d.ts +2 -0
- package/dist/types/metadata.js +2 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/runtime.d.ts +20 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/tool.d.ts +12 -0
- package/dist/types/tool.js +2 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/types/usage.d.ts +17 -0
- package/dist/types/usage.js +2 -0
- package/dist/types/usage.js.map +1 -0
- package/dist/utils/deep.d.ts +2 -0
- package/dist/utils/deep.js +34 -0
- package/dist/utils/deep.js.map +1 -0
- package/dist/utils/id.d.ts +10 -0
- package/dist/utils/id.js +14 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/message.d.ts +11 -0
- package/dist/utils/message.js +31 -0
- package/dist/utils/message.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { access, appendFile, mkdir, open, readdir, readFile, } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { RuntimeError, normalizeUnknownError } from "../errors/index.js";
|
|
4
|
+
import { deserializeSessionEntry, serializeSessionEntry, } from "./serializer.js";
|
|
5
|
+
function abortIfNeeded(signal) {
|
|
6
|
+
signal?.throwIfAborted();
|
|
7
|
+
}
|
|
8
|
+
function notFound(sessionId, cause) {
|
|
9
|
+
return new RuntimeError({
|
|
10
|
+
code: "SESSION_NOT_FOUND",
|
|
11
|
+
category: "session",
|
|
12
|
+
message: `Session not found: ${sessionId}`,
|
|
13
|
+
...(cause === undefined ? {} : { cause }),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function writeFailed(message, cause) {
|
|
17
|
+
return new RuntimeError({
|
|
18
|
+
code: "SESSION_WRITE_FAILED",
|
|
19
|
+
category: "storage",
|
|
20
|
+
message,
|
|
21
|
+
...(cause === undefined ? {} : { cause }),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function readFailed(message, cause) {
|
|
25
|
+
return new RuntimeError({
|
|
26
|
+
code: "INTERNAL",
|
|
27
|
+
category: "session",
|
|
28
|
+
message,
|
|
29
|
+
...(cause === undefined ? {} : { cause }),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function isNodeError(error, code) {
|
|
33
|
+
return (error instanceof Error &&
|
|
34
|
+
"code" in error &&
|
|
35
|
+
error.code === code);
|
|
36
|
+
}
|
|
37
|
+
export class JsonlSessionStore {
|
|
38
|
+
directory;
|
|
39
|
+
writeTails = new Map();
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.directory =
|
|
42
|
+
typeof options === "string" ? options : options.directory;
|
|
43
|
+
}
|
|
44
|
+
async create(sessionId, initial, signal) {
|
|
45
|
+
await this.withSessionLock(sessionId, async () => {
|
|
46
|
+
abortIfNeeded(signal);
|
|
47
|
+
this.validateSessionId(sessionId);
|
|
48
|
+
if (initial.sessionId !== sessionId) {
|
|
49
|
+
throw writeFailed("Initial entry sessionId does not match target session");
|
|
50
|
+
}
|
|
51
|
+
if (initial.seq !== 0) {
|
|
52
|
+
throw writeFailed("Initial session entry seq must be 0");
|
|
53
|
+
}
|
|
54
|
+
if (initial.parentId !== undefined) {
|
|
55
|
+
throw writeFailed("Initial session entry must not have a parentId");
|
|
56
|
+
}
|
|
57
|
+
const line = `${serializeSessionEntry(initial)}\n`;
|
|
58
|
+
try {
|
|
59
|
+
await mkdir(this.directory, { recursive: true });
|
|
60
|
+
abortIfNeeded(signal);
|
|
61
|
+
const handle = await open(this.filePath(sessionId), "wx");
|
|
62
|
+
try {
|
|
63
|
+
await handle.writeFile(line, { encoding: "utf8", signal });
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
await handle.close();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const normalized = normalizeUnknownError(error);
|
|
71
|
+
if (normalized.code === "ABORTED") {
|
|
72
|
+
throw normalized;
|
|
73
|
+
}
|
|
74
|
+
throw writeFailed(isNodeError(error, "EEXIST")
|
|
75
|
+
? `Session already exists: ${sessionId}`
|
|
76
|
+
: `Failed to create session: ${sessionId}`, error);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async append(sessionId, entries, signal) {
|
|
81
|
+
if (entries.length === 0) {
|
|
82
|
+
abortIfNeeded(signal);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
await this.withSessionLock(sessionId, async () => {
|
|
86
|
+
abortIfNeeded(signal);
|
|
87
|
+
this.validateSessionId(sessionId);
|
|
88
|
+
const existing = await this.loadEntries(sessionId, signal);
|
|
89
|
+
const previous = existing.at(-1);
|
|
90
|
+
if (!previous) {
|
|
91
|
+
throw writeFailed(`Cannot append to empty session log: ${sessionId}`);
|
|
92
|
+
}
|
|
93
|
+
let expectedSeq = previous.seq + 1;
|
|
94
|
+
let expectedParent = previous.id;
|
|
95
|
+
for (const entry of entries) {
|
|
96
|
+
if (entry.sessionId !== sessionId) {
|
|
97
|
+
throw writeFailed(`Entry sessionId does not match target session: ${sessionId}`);
|
|
98
|
+
}
|
|
99
|
+
if (entry.seq !== expectedSeq) {
|
|
100
|
+
throw writeFailed(`Session seq must be strictly increasing: expected ${expectedSeq}, received ${entry.seq}`);
|
|
101
|
+
}
|
|
102
|
+
if (entry.parentId !== expectedParent) {
|
|
103
|
+
throw writeFailed(`Session parentId mismatch at seq ${entry.seq}`);
|
|
104
|
+
}
|
|
105
|
+
expectedSeq += 1;
|
|
106
|
+
expectedParent = entry.id;
|
|
107
|
+
}
|
|
108
|
+
const content = entries.map((entry) => serializeSessionEntry(entry)).join("\n") + "\n";
|
|
109
|
+
try {
|
|
110
|
+
await appendFile(this.filePath(sessionId), content, {
|
|
111
|
+
encoding: "utf8",
|
|
112
|
+
signal,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const normalized = normalizeUnknownError(error);
|
|
117
|
+
if (normalized.code === "ABORTED") {
|
|
118
|
+
throw normalized;
|
|
119
|
+
}
|
|
120
|
+
if (isNodeError(error, "ENOENT")) {
|
|
121
|
+
throw notFound(sessionId, error);
|
|
122
|
+
}
|
|
123
|
+
throw writeFailed(`Failed to append session: ${sessionId}`, error);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async *read(sessionId, signal) {
|
|
128
|
+
const entries = await this.loadEntries(sessionId, signal);
|
|
129
|
+
for (const entry of entries) {
|
|
130
|
+
abortIfNeeded(signal);
|
|
131
|
+
yield entry;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async exists(sessionId, signal) {
|
|
135
|
+
abortIfNeeded(signal);
|
|
136
|
+
this.validateSessionId(sessionId);
|
|
137
|
+
try {
|
|
138
|
+
await access(this.filePath(sessionId));
|
|
139
|
+
abortIfNeeded(signal);
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const normalized = normalizeUnknownError(error);
|
|
144
|
+
if (normalized.code === "ABORTED") {
|
|
145
|
+
throw normalized;
|
|
146
|
+
}
|
|
147
|
+
if (isNodeError(error, "ENOENT")) {
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
throw readFailed(`Failed to check session: ${sessionId}`, error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async list(signal) {
|
|
154
|
+
abortIfNeeded(signal);
|
|
155
|
+
try {
|
|
156
|
+
const names = await readdir(this.directory, { encoding: "utf8" });
|
|
157
|
+
abortIfNeeded(signal);
|
|
158
|
+
return names
|
|
159
|
+
.filter((name) => name.endsWith(".jsonl"))
|
|
160
|
+
.map((name) => name.slice(0, -".jsonl".length))
|
|
161
|
+
.sort();
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const normalized = normalizeUnknownError(error);
|
|
165
|
+
if (normalized.code === "ABORTED") {
|
|
166
|
+
throw normalized;
|
|
167
|
+
}
|
|
168
|
+
if (isNodeError(error, "ENOENT")) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
throw readFailed("Failed to list sessions", error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async loadEntries(sessionId, signal) {
|
|
175
|
+
abortIfNeeded(signal);
|
|
176
|
+
this.validateSessionId(sessionId);
|
|
177
|
+
let text;
|
|
178
|
+
try {
|
|
179
|
+
text = await readFile(this.filePath(sessionId), {
|
|
180
|
+
encoding: "utf8",
|
|
181
|
+
signal,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const normalized = normalizeUnknownError(error);
|
|
186
|
+
if (normalized.code === "ABORTED") {
|
|
187
|
+
throw normalized;
|
|
188
|
+
}
|
|
189
|
+
if (isNodeError(error, "ENOENT")) {
|
|
190
|
+
throw notFound(sessionId, error);
|
|
191
|
+
}
|
|
192
|
+
throw readFailed(`Failed to read session: ${sessionId}`, error);
|
|
193
|
+
}
|
|
194
|
+
if (text.length === 0) {
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
const lines = text.split(/\r?\n/);
|
|
198
|
+
if (lines.at(-1) === "") {
|
|
199
|
+
lines.pop();
|
|
200
|
+
}
|
|
201
|
+
const entries = [];
|
|
202
|
+
let expectedSeq = 0;
|
|
203
|
+
let previousId;
|
|
204
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
205
|
+
abortIfNeeded(signal);
|
|
206
|
+
const line = lines[index];
|
|
207
|
+
if (line === undefined || line.length === 0) {
|
|
208
|
+
throw readFailed(`Corrupted session JSONL at line ${index + 1}: empty line`);
|
|
209
|
+
}
|
|
210
|
+
const entry = deserializeSessionEntry(line, index + 1);
|
|
211
|
+
if (entry.sessionId !== sessionId) {
|
|
212
|
+
throw readFailed(`Session entry at line ${index + 1} belongs to a different session`);
|
|
213
|
+
}
|
|
214
|
+
if (entry.seq !== expectedSeq) {
|
|
215
|
+
throw readFailed(`Invalid session seq at line ${index + 1}: expected ${expectedSeq}, received ${entry.seq}`);
|
|
216
|
+
}
|
|
217
|
+
if (expectedSeq === 0) {
|
|
218
|
+
if (entry.parentId !== undefined) {
|
|
219
|
+
throw readFailed("Initial session entry must not have a parentId");
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (entry.parentId !== previousId) {
|
|
223
|
+
throw readFailed(`Invalid parentId at line ${index + 1}`);
|
|
224
|
+
}
|
|
225
|
+
entries.push(entry);
|
|
226
|
+
expectedSeq += 1;
|
|
227
|
+
previousId = entry.id;
|
|
228
|
+
}
|
|
229
|
+
return entries;
|
|
230
|
+
}
|
|
231
|
+
filePath(sessionId) {
|
|
232
|
+
return path.join(this.directory, `${sessionId}.jsonl`);
|
|
233
|
+
}
|
|
234
|
+
validateSessionId(sessionId) {
|
|
235
|
+
if (!/^[A-Za-z0-9._-]+$/.test(sessionId)) {
|
|
236
|
+
throw new RuntimeError({
|
|
237
|
+
code: "INTERNAL",
|
|
238
|
+
category: "session",
|
|
239
|
+
message: "Session id contains unsupported path characters",
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async withSessionLock(sessionId, operation) {
|
|
244
|
+
const key = String(sessionId);
|
|
245
|
+
const previous = this.writeTails.get(key) ?? Promise.resolve();
|
|
246
|
+
let release;
|
|
247
|
+
const gate = new Promise((resolve) => {
|
|
248
|
+
release = resolve;
|
|
249
|
+
});
|
|
250
|
+
const tail = previous.catch(() => undefined).then(() => gate);
|
|
251
|
+
this.writeTails.set(key, tail);
|
|
252
|
+
await previous.catch(() => undefined);
|
|
253
|
+
try {
|
|
254
|
+
return await operation();
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
release();
|
|
258
|
+
if (this.writeTails.get(key) === tail) {
|
|
259
|
+
this.writeTails.delete(key);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=jsonl-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-store.js","sourceRoot":"","sources":["../../src/session/jsonl-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { RuntimeError } from "../errors/index.js";
|
|
2
|
+
function projectionError(message) {
|
|
3
|
+
return new RuntimeError({
|
|
4
|
+
code: "INTERNAL",
|
|
5
|
+
category: "session",
|
|
6
|
+
message,
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function asMessage(payload) {
|
|
13
|
+
if (!isRecord(payload) ||
|
|
14
|
+
typeof payload.id !== "string" ||
|
|
15
|
+
typeof payload.role !== "string" ||
|
|
16
|
+
!["system", "user", "assistant", "tool"].includes(payload.role) ||
|
|
17
|
+
!Array.isArray(payload.parts) ||
|
|
18
|
+
typeof payload.createdAt !== "string") {
|
|
19
|
+
throw projectionError("Invalid message payload in session");
|
|
20
|
+
}
|
|
21
|
+
return payload;
|
|
22
|
+
}
|
|
23
|
+
function asUsage(payload) {
|
|
24
|
+
if (!isRecord(payload) ||
|
|
25
|
+
!isRecord(payload.tokens) ||
|
|
26
|
+
typeof payload.tokens.inputTokens !== "number" ||
|
|
27
|
+
typeof payload.tokens.outputTokens !== "number" ||
|
|
28
|
+
typeof payload.tokens.totalTokens !== "number") {
|
|
29
|
+
throw projectionError("Invalid usage payload in session");
|
|
30
|
+
}
|
|
31
|
+
return payload;
|
|
32
|
+
}
|
|
33
|
+
function asCompaction(payload) {
|
|
34
|
+
if (!isRecord(payload) ||
|
|
35
|
+
typeof payload.id !== "string" ||
|
|
36
|
+
typeof payload.createdAt !== "string" ||
|
|
37
|
+
typeof payload.reason !== "string" ||
|
|
38
|
+
typeof payload.summary !== "string") {
|
|
39
|
+
throw projectionError("Invalid compaction payload in session");
|
|
40
|
+
}
|
|
41
|
+
return payload;
|
|
42
|
+
}
|
|
43
|
+
export class DefaultSessionProjector {
|
|
44
|
+
async project(entries, signal) {
|
|
45
|
+
let sessionId;
|
|
46
|
+
let expectedSeq = 0;
|
|
47
|
+
let previousId;
|
|
48
|
+
let headEntryId;
|
|
49
|
+
const messages = [];
|
|
50
|
+
let latestCompaction;
|
|
51
|
+
let latestUsage;
|
|
52
|
+
for await (const entry of entries) {
|
|
53
|
+
signal?.throwIfAborted();
|
|
54
|
+
if (sessionId === undefined) {
|
|
55
|
+
sessionId = entry.sessionId;
|
|
56
|
+
}
|
|
57
|
+
else if (entry.sessionId !== sessionId) {
|
|
58
|
+
throw projectionError("Cannot project entries from multiple sessions");
|
|
59
|
+
}
|
|
60
|
+
if (entry.seq !== expectedSeq) {
|
|
61
|
+
throw projectionError(`Invalid session seq during projection: expected ${expectedSeq}, received ${entry.seq}`);
|
|
62
|
+
}
|
|
63
|
+
if (expectedSeq === 0) {
|
|
64
|
+
if (entry.parentId !== undefined) {
|
|
65
|
+
throw projectionError("Initial projected entry must not have a parentId");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (entry.parentId !== previousId) {
|
|
69
|
+
throw projectionError(`Invalid parentId during projection at seq ${entry.seq}`);
|
|
70
|
+
}
|
|
71
|
+
switch (entry.type) {
|
|
72
|
+
case "message":
|
|
73
|
+
messages.push(asMessage(entry.payload));
|
|
74
|
+
break;
|
|
75
|
+
case "compaction":
|
|
76
|
+
latestCompaction = asCompaction(entry.payload);
|
|
77
|
+
break;
|
|
78
|
+
case "usage":
|
|
79
|
+
latestUsage = asUsage(entry.payload);
|
|
80
|
+
break;
|
|
81
|
+
case "session_meta":
|
|
82
|
+
case "context_patch":
|
|
83
|
+
case "model_change":
|
|
84
|
+
break;
|
|
85
|
+
default:
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
expectedSeq += 1;
|
|
89
|
+
previousId = entry.id;
|
|
90
|
+
headEntryId = entry.id;
|
|
91
|
+
}
|
|
92
|
+
if (sessionId === undefined) {
|
|
93
|
+
throw projectionError("Cannot project an empty session log");
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
sessionId,
|
|
97
|
+
messages,
|
|
98
|
+
...(latestCompaction === undefined ? {} : { latestCompaction }),
|
|
99
|
+
...(latestUsage === undefined ? {} : { latestUsage }),
|
|
100
|
+
...(headEntryId === undefined ? {} : { headEntryId }),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=projector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projector.js","sourceRoot":"","sources":["../../src/session/projector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { JsonValue } from "../types/index.js";
|
|
2
|
+
import { type SessionEntry } from "./types.js";
|
|
3
|
+
export declare function isJsonSafe(value: unknown, seen?: Set<object>): value is JsonValue;
|
|
4
|
+
export declare function serializeSessionEntry(entry: SessionEntry): string;
|
|
5
|
+
export declare function deserializeSessionEntry(line: string, lineNumber?: number): SessionEntry;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { RuntimeError } from "../errors/index.js";
|
|
2
|
+
import { SESSION_SCHEMA_VERSION, } from "./types.js";
|
|
3
|
+
function sessionDataError(message, cause) {
|
|
4
|
+
return new RuntimeError({
|
|
5
|
+
code: "INTERNAL",
|
|
6
|
+
category: "session",
|
|
7
|
+
message,
|
|
8
|
+
...(cause === undefined ? {} : { cause }),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function isPlainObject(value) {
|
|
12
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const prototype = Object.getPrototypeOf(value);
|
|
16
|
+
return prototype === Object.prototype || prototype === null;
|
|
17
|
+
}
|
|
18
|
+
export function isJsonSafe(value, seen = new Set()) {
|
|
19
|
+
if (value === null ||
|
|
20
|
+
typeof value === "string" ||
|
|
21
|
+
typeof value === "boolean") {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (typeof value === "number") {
|
|
25
|
+
return Number.isFinite(value);
|
|
26
|
+
}
|
|
27
|
+
if (typeof value !== "object") {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (seen.has(value)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
seen.add(value);
|
|
34
|
+
try {
|
|
35
|
+
if (Array.isArray(value)) {
|
|
36
|
+
return value.every((item) => isJsonSafe(item, seen));
|
|
37
|
+
}
|
|
38
|
+
if (!isPlainObject(value)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return Object.values(value).every((item) => isJsonSafe(item, seen));
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
seen.delete(value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function assertMetadata(value) {
|
|
48
|
+
if (!isPlainObject(value) || !isJsonSafe(value)) {
|
|
49
|
+
throw sessionDataError("Session entry metadata must be a JSON-safe object");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function serializeSessionEntry(entry) {
|
|
53
|
+
if (!isJsonSafe(entry.payload)) {
|
|
54
|
+
throw sessionDataError("Session entry payload must be JSON-safe");
|
|
55
|
+
}
|
|
56
|
+
if (entry.metadata !== undefined) {
|
|
57
|
+
assertMetadata(entry.metadata);
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
return JSON.stringify(entry);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
throw sessionDataError("Failed to serialize session entry", error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function deserializeSessionEntry(line, lineNumber) {
|
|
67
|
+
let value;
|
|
68
|
+
try {
|
|
69
|
+
value = JSON.parse(line);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const suffix = lineNumber === undefined ? "" : ` at line ${lineNumber}`;
|
|
73
|
+
throw sessionDataError(`Corrupted session JSONL${suffix}`, error);
|
|
74
|
+
}
|
|
75
|
+
if (!isPlainObject(value)) {
|
|
76
|
+
throw sessionDataError("Session entry must be a JSON object");
|
|
77
|
+
}
|
|
78
|
+
const { id, parentId, sessionId, seq, type, timestamp, schemaVersion, payload, metadata, } = value;
|
|
79
|
+
if (typeof schemaVersion !== "number" || !Number.isInteger(schemaVersion)) {
|
|
80
|
+
throw sessionDataError("Session entry has an invalid schemaVersion");
|
|
81
|
+
}
|
|
82
|
+
if (schemaVersion !== SESSION_SCHEMA_VERSION) {
|
|
83
|
+
throw sessionDataError(`Unsupported session schema version: ${schemaVersion}; supported version: ${SESSION_SCHEMA_VERSION}`);
|
|
84
|
+
}
|
|
85
|
+
if (typeof id !== "string" || id.length === 0) {
|
|
86
|
+
throw sessionDataError("Session entry has an invalid id");
|
|
87
|
+
}
|
|
88
|
+
if (parentId !== undefined &&
|
|
89
|
+
(typeof parentId !== "string" || parentId.length === 0)) {
|
|
90
|
+
throw sessionDataError("Session entry has an invalid parentId");
|
|
91
|
+
}
|
|
92
|
+
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
93
|
+
throw sessionDataError("Session entry has an invalid sessionId");
|
|
94
|
+
}
|
|
95
|
+
if (typeof seq !== "number" || !Number.isSafeInteger(seq) || seq < 0) {
|
|
96
|
+
throw sessionDataError("Session entry has an invalid seq");
|
|
97
|
+
}
|
|
98
|
+
if (typeof type !== "string" || type.length === 0) {
|
|
99
|
+
throw sessionDataError("Session entry has an invalid type");
|
|
100
|
+
}
|
|
101
|
+
if (typeof timestamp !== "string" ||
|
|
102
|
+
timestamp.length === 0 ||
|
|
103
|
+
Number.isNaN(Date.parse(timestamp))) {
|
|
104
|
+
throw sessionDataError("Session entry has an invalid timestamp");
|
|
105
|
+
}
|
|
106
|
+
if (!isJsonSafe(payload)) {
|
|
107
|
+
throw sessionDataError("Session entry payload is not JSON-safe");
|
|
108
|
+
}
|
|
109
|
+
if (metadata !== undefined) {
|
|
110
|
+
assertMetadata(metadata);
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
id: id,
|
|
114
|
+
...(parentId === undefined
|
|
115
|
+
? {}
|
|
116
|
+
: { parentId: parentId }),
|
|
117
|
+
sessionId: sessionId,
|
|
118
|
+
seq,
|
|
119
|
+
type: type,
|
|
120
|
+
timestamp,
|
|
121
|
+
schemaVersion,
|
|
122
|
+
payload,
|
|
123
|
+
...(metadata === undefined ? {} : { metadata }),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/session/serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Metadata, SessionEntryId, SessionId } from "../types/index.js";
|
|
2
|
+
import type { SessionStore } from "./store.js";
|
|
3
|
+
import { type NewSessionEntry, type SessionEntry } from "./types.js";
|
|
4
|
+
export interface Session {
|
|
5
|
+
readonly id: SessionId;
|
|
6
|
+
append(entry: NewSessionEntry, signal?: AbortSignal): Promise<SessionEntry>;
|
|
7
|
+
appendMany(entries: readonly NewSessionEntry[], signal?: AbortSignal): Promise<readonly SessionEntry[]>;
|
|
8
|
+
entries(signal?: AbortSignal): AsyncIterable<SessionEntry>;
|
|
9
|
+
head(): SessionEntryId | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface CreateSessionOptions {
|
|
12
|
+
id?: SessionId;
|
|
13
|
+
metadata?: Metadata;
|
|
14
|
+
}
|
|
15
|
+
export declare class DefaultSession implements Session {
|
|
16
|
+
private readonly store;
|
|
17
|
+
readonly id: SessionId;
|
|
18
|
+
private nextSeq;
|
|
19
|
+
private headEntryId;
|
|
20
|
+
private tail;
|
|
21
|
+
private constructor();
|
|
22
|
+
static create(store: SessionStore, options?: CreateSessionOptions, signal?: AbortSignal): Promise<DefaultSession>;
|
|
23
|
+
static open(store: SessionStore, id: SessionId, signal?: AbortSignal): Promise<DefaultSession>;
|
|
24
|
+
append(entry: NewSessionEntry, signal?: AbortSignal): Promise<SessionEntry>;
|
|
25
|
+
appendMany(entries: readonly NewSessionEntry[], signal?: AbortSignal): Promise<readonly SessionEntry[]>;
|
|
26
|
+
entries(signal?: AbortSignal): AsyncIterable<SessionEntry>;
|
|
27
|
+
head(): SessionEntryId | undefined;
|
|
28
|
+
private appendUnlocked;
|
|
29
|
+
private lock;
|
|
30
|
+
}
|
|
31
|
+
export declare function createSession(store: SessionStore, options?: CreateSessionOptions, signal?: AbortSignal): Promise<DefaultSession>;
|
|
32
|
+
export declare function openSession(store: SessionStore, id: SessionId, signal?: AbortSignal): Promise<DefaultSession>;
|