@code-yeongyu/senpi-agent-core 2026.9.12-3 → 2026.9.12
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 +0 -4
- package/dist/harness/agent-harness.d.ts +384 -639
- package/dist/harness/agent-harness.d.ts.map +1 -1
- package/dist/harness/agent-harness.js +250 -5
- package/dist/harness/agent-harness.js.map +1 -1
- package/dist/harness/compaction/branch-summarization.d.ts +6 -12
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/harness/compaction/branch-summarization.js +27 -33
- package/dist/harness/compaction/branch-summarization.js.map +1 -1
- package/dist/harness/compaction/compaction.d.ts +8 -30
- package/dist/harness/compaction/compaction.d.ts.map +1 -1
- package/dist/harness/compaction/compaction.js +64 -53
- package/dist/harness/compaction/compaction.js.map +1 -1
- package/dist/harness/env/nodejs.d.ts +28 -25
- package/dist/harness/env/nodejs.d.ts.map +1 -1
- package/dist/harness/env/nodejs.js +125 -368
- package/dist/harness/env/nodejs.js.map +1 -1
- package/dist/harness/events.d.ts +38 -20
- package/dist/harness/events.d.ts.map +1 -1
- package/dist/harness/events.js +55 -233
- package/dist/harness/events.js.map +1 -1
- package/dist/harness/messages.d.ts +2 -2
- package/dist/harness/messages.d.ts.map +1 -1
- package/dist/harness/messages.js.map +1 -1
- package/dist/harness/prompt-templates.d.ts +2 -3
- package/dist/harness/prompt-templates.d.ts.map +1 -1
- package/dist/harness/prompt-templates.js +17 -17
- package/dist/harness/prompt-templates.js.map +1 -1
- package/dist/harness/reducer.d.ts +100 -0
- package/dist/harness/reducer.d.ts.map +1 -0
- package/dist/harness/reducer.js +420 -0
- package/dist/harness/reducer.js.map +1 -0
- package/dist/harness/result.d.ts +0 -93
- package/dist/harness/result.d.ts.map +1 -1
- package/dist/harness/result.js +0 -39
- package/dist/harness/result.js.map +1 -1
- package/dist/harness/session/context.d.ts +19 -6
- package/dist/harness/session/context.d.ts.map +1 -1
- package/dist/harness/session/context.js +53 -31
- package/dist/harness/session/context.js.map +1 -1
- package/dist/harness/session/index.d.ts +5 -9
- package/dist/harness/session/index.d.ts.map +1 -1
- package/dist/harness/session/index.js +4 -7
- package/dist/harness/session/index.js.map +1 -1
- package/dist/harness/session/jsonl/codec.d.ts +8 -19
- package/dist/harness/session/jsonl/codec.d.ts.map +1 -1
- package/dist/harness/session/jsonl/codec.js +219 -34
- package/dist/harness/session/jsonl/codec.js.map +1 -1
- package/dist/harness/session/jsonl/errors.d.ts +9 -0
- package/dist/harness/session/jsonl/errors.d.ts.map +1 -0
- package/dist/harness/session/jsonl/errors.js +18 -0
- package/dist/harness/session/jsonl/errors.js.map +1 -0
- package/dist/harness/session/jsonl/repo.d.ts +24 -27
- package/dist/harness/session/jsonl/repo.d.ts.map +1 -1
- package/dist/harness/session/jsonl/repo.js +151 -276
- package/dist/harness/session/jsonl/repo.js.map +1 -1
- package/dist/harness/session/jsonl/storage.d.ts +41 -39
- package/dist/harness/session/jsonl/storage.d.ts.map +1 -1
- package/dist/harness/session/jsonl/storage.js +196 -175
- package/dist/harness/session/jsonl/storage.js.map +1 -1
- package/dist/harness/session/jsonl/types.d.ts +22 -23
- package/dist/harness/session/jsonl/types.d.ts.map +1 -1
- package/dist/harness/session/jsonl/types.js +1 -2
- package/dist/harness/session/jsonl/types.js.map +1 -1
- package/dist/harness/session/jsonl.d.ts +3 -0
- package/dist/harness/session/jsonl.d.ts.map +1 -0
- package/dist/harness/session/jsonl.js +2 -0
- package/dist/harness/session/jsonl.js.map +1 -0
- package/dist/harness/session/memory.d.ts +40 -44
- package/dist/harness/session/memory.d.ts.map +1 -1
- package/dist/harness/session/memory.js +115 -333
- package/dist/harness/session/memory.js.map +1 -1
- package/dist/harness/session/session.d.ts +51 -78
- package/dist/harness/session/session.d.ts.map +1 -1
- package/dist/harness/session/session.js +207 -327
- package/dist/harness/session/session.js.map +1 -1
- package/dist/harness/session/state.d.ts +65 -0
- package/dist/harness/session/state.d.ts.map +1 -0
- package/dist/harness/session/state.js +320 -0
- package/dist/harness/session/state.js.map +1 -0
- package/dist/harness/session/testing/conformance.d.ts +4 -0
- package/dist/harness/session/testing/conformance.d.ts.map +1 -0
- package/dist/harness/session/testing/conformance.js +762 -0
- package/dist/harness/session/testing/conformance.js.map +1 -0
- package/dist/harness/session/testing/index.d.ts +2 -9
- package/dist/harness/session/testing/index.d.ts.map +1 -1
- package/dist/harness/session/testing/index.js +1 -8
- package/dist/harness/session/testing/index.js.map +1 -1
- package/dist/harness/session/testing/types.d.ts +7 -5
- package/dist/harness/session/testing/types.d.ts.map +1 -1
- package/dist/harness/session/testing/types.js.map +1 -1
- package/dist/harness/session/types.d.ts +265 -425
- package/dist/harness/session/types.d.ts.map +1 -1
- package/dist/harness/session/types.js +7 -7
- package/dist/harness/session/types.js.map +1 -1
- package/dist/harness/skills.d.ts +2 -3
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +26 -29
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/telemetry.d.ts +43 -64
- package/dist/harness/telemetry.d.ts.map +1 -1
- package/dist/harness/telemetry.js +26 -45
- package/dist/harness/telemetry.js.map +1 -1
- package/dist/harness/tools/bash.d.ts +4 -4
- package/dist/harness/tools/bash.d.ts.map +1 -1
- package/dist/harness/tools/bash.js +93 -66
- package/dist/harness/tools/bash.js.map +1 -1
- package/dist/harness/tools/edit.d.ts.map +1 -1
- package/dist/harness/tools/edit.js +13 -17
- package/dist/harness/tools/edit.js.map +1 -1
- package/dist/harness/tools/file-mutation-queue.d.ts +1 -2
- package/dist/harness/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/harness/tools/file-mutation-queue.js +5 -5
- package/dist/harness/tools/file-mutation-queue.js.map +1 -1
- package/dist/harness/tools/path-utils.d.ts +2 -3
- package/dist/harness/tools/path-utils.d.ts.map +1 -1
- package/dist/harness/tools/path-utils.js +5 -5
- package/dist/harness/tools/path-utils.js.map +1 -1
- package/dist/harness/tools/read.d.ts +1 -2
- package/dist/harness/tools/read.d.ts.map +1 -1
- package/dist/harness/tools/read.js +6 -4
- package/dist/harness/tools/read.js.map +1 -1
- package/dist/harness/tools/write.d.ts.map +1 -1
- package/dist/harness/tools/write.js +8 -12
- package/dist/harness/tools/write.js.map +1 -1
- package/dist/harness/types.d.ts +45 -128
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/harness/utils/shell-output.d.ts +5 -19
- package/dist/harness/utils/shell-output.d.ts.map +1 -1
- package/dist/harness/utils/shell-output.js +192 -65
- package/dist/harness/utils/shell-output.js.map +1 -1
- package/dist/harness/utils/truncate.d.ts +0 -1
- package/dist/harness/utils/truncate.d.ts.map +1 -1
- package/dist/harness/utils/truncate.js +1 -1
- package/dist/harness/utils/truncate.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/search/index.d.ts +16 -24
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +1 -1
- package/dist/search/index.js.map +1 -1
- package/dist/search/scanning.d.ts +29 -0
- package/dist/search/scanning.d.ts.map +1 -0
- package/dist/search/scanning.js +103 -0
- package/dist/search/scanning.js.map +1 -0
- package/dist/types.d.ts +0 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -27
- package/dist/harness/config.d.ts +0 -9
- package/dist/harness/config.d.ts.map +0 -1
- package/dist/harness/config.js +0 -35
- package/dist/harness/config.js.map +0 -1
- package/dist/harness/context.d.ts +0 -9
- package/dist/harness/context.d.ts.map +0 -1
- package/dist/harness/context.js +0 -13
- package/dist/harness/context.js.map +0 -1
- package/dist/harness/execution/assistant.d.ts +0 -42
- package/dist/harness/execution/assistant.d.ts.map +0 -1
- package/dist/harness/execution/assistant.js +0 -82
- package/dist/harness/execution/assistant.js.map +0 -1
- package/dist/harness/execution/effect-gate.d.ts +0 -22
- package/dist/harness/execution/effect-gate.d.ts.map +0 -1
- package/dist/harness/execution/effect-gate.js +0 -48
- package/dist/harness/execution/effect-gate.js.map +0 -1
- package/dist/harness/execution/tools.d.ts +0 -67
- package/dist/harness/execution/tools.d.ts.map +0 -1
- package/dist/harness/execution/tools.js +0 -121
- package/dist/harness/execution/tools.js.map +0 -1
- package/dist/harness/hooks.d.ts +0 -38
- package/dist/harness/hooks.d.ts.map +0 -1
- package/dist/harness/hooks.js +0 -404
- package/dist/harness/hooks.js.map +0 -1
- package/dist/harness/runtime/drive/boundary.d.ts +0 -28
- package/dist/harness/runtime/drive/boundary.d.ts.map +0 -1
- package/dist/harness/runtime/drive/boundary.js +0 -173
- package/dist/harness/runtime/drive/boundary.js.map +0 -1
- package/dist/harness/runtime/drive/checkpoint.d.ts +0 -8
- package/dist/harness/runtime/drive/checkpoint.d.ts.map +0 -1
- package/dist/harness/runtime/drive/checkpoint.js +0 -133
- package/dist/harness/runtime/drive/checkpoint.js.map +0 -1
- package/dist/harness/runtime/drive/deferred.d.ts +0 -15
- package/dist/harness/runtime/drive/deferred.d.ts.map +0 -1
- package/dist/harness/runtime/drive/deferred.js +0 -179
- package/dist/harness/runtime/drive/deferred.js.map +0 -1
- package/dist/harness/runtime/drive/generation.d.ts +0 -8
- package/dist/harness/runtime/drive/generation.d.ts.map +0 -1
- package/dist/harness/runtime/drive/generation.js +0 -205
- package/dist/harness/runtime/drive/generation.js.map +0 -1
- package/dist/harness/runtime/drive/reconcile.d.ts +0 -5
- package/dist/harness/runtime/drive/reconcile.d.ts.map +0 -1
- package/dist/harness/runtime/drive/reconcile.js +0 -140
- package/dist/harness/runtime/drive/reconcile.js.map +0 -1
- package/dist/harness/runtime/drive/recovery.d.ts +0 -8
- package/dist/harness/runtime/drive/recovery.d.ts.map +0 -1
- package/dist/harness/runtime/drive/recovery.js +0 -85
- package/dist/harness/runtime/drive/recovery.js.map +0 -1
- package/dist/harness/runtime/drive/response.d.ts +0 -23
- package/dist/harness/runtime/drive/response.d.ts.map +0 -1
- package/dist/harness/runtime/drive/response.js +0 -394
- package/dist/harness/runtime/drive/response.js.map +0 -1
- package/dist/harness/runtime/drive/retry.d.ts +0 -4
- package/dist/harness/runtime/drive/retry.d.ts.map +0 -1
- package/dist/harness/runtime/drive/retry.js +0 -34
- package/dist/harness/runtime/drive/retry.js.map +0 -1
- package/dist/harness/runtime/drive/structural.d.ts +0 -32
- package/dist/harness/runtime/drive/structural.d.ts.map +0 -1
- package/dist/harness/runtime/drive/structural.js +0 -929
- package/dist/harness/runtime/drive/structural.js.map +0 -1
- package/dist/harness/runtime/drive/terminal.d.ts +0 -7
- package/dist/harness/runtime/drive/terminal.d.ts.map +0 -1
- package/dist/harness/runtime/drive/terminal.js +0 -49
- package/dist/harness/runtime/drive/terminal.js.map +0 -1
- package/dist/harness/runtime/drive/tool-placement.d.ts +0 -14
- package/dist/harness/runtime/drive/tool-placement.d.ts.map +0 -1
- package/dist/harness/runtime/drive/tool-placement.js +0 -244
- package/dist/harness/runtime/drive/tool-placement.js.map +0 -1
- package/dist/harness/runtime/drive/tools.d.ts +0 -6
- package/dist/harness/runtime/drive/tools.d.ts.map +0 -1
- package/dist/harness/runtime/drive/tools.js +0 -449
- package/dist/harness/runtime/drive/tools.js.map +0 -1
- package/dist/harness/runtime/drive.d.ts +0 -6
- package/dist/harness/runtime/drive.d.ts.map +0 -1
- package/dist/harness/runtime/drive.js +0 -93
- package/dist/harness/runtime/drive.js.map +0 -1
- package/dist/harness/runtime/harness.d.ts +0 -59
- package/dist/harness/runtime/harness.d.ts.map +0 -1
- package/dist/harness/runtime/harness.js +0 -302
- package/dist/harness/runtime/harness.js.map +0 -1
- package/dist/harness/runtime/index.d.ts +0 -2
- package/dist/harness/runtime/index.d.ts.map +0 -1
- package/dist/harness/runtime/index.js +0 -2
- package/dist/harness/runtime/index.js.map +0 -1
- package/dist/harness/runtime/lane.d.ts +0 -118
- package/dist/harness/runtime/lane.d.ts.map +0 -1
- package/dist/harness/runtime/lane.js +0 -1559
- package/dist/harness/runtime/lane.js.map +0 -1
- package/dist/harness/runtime/progress.d.ts +0 -15
- package/dist/harness/runtime/progress.d.ts.map +0 -1
- package/dist/harness/runtime/progress.js +0 -66
- package/dist/harness/runtime/progress.js.map +0 -1
- package/dist/harness/runtime/reducer.d.ts +0 -5
- package/dist/harness/runtime/reducer.d.ts.map +0 -1
- package/dist/harness/runtime/reducer.js +0 -240
- package/dist/harness/runtime/reducer.js.map +0 -1
- package/dist/harness/runtime/restore.d.ts +0 -24
- package/dist/harness/runtime/restore.d.ts.map +0 -1
- package/dist/harness/runtime/restore.js +0 -117
- package/dist/harness/runtime/restore.js.map +0 -1
- package/dist/harness/runtime/transcript.d.ts +0 -21
- package/dist/harness/runtime/transcript.d.ts.map +0 -1
- package/dist/harness/runtime/transcript.js +0 -72
- package/dist/harness/runtime/transcript.js.map +0 -1
- package/dist/harness/runtime/types.d.ts +0 -105
- package/dist/harness/runtime/types.d.ts.map +0 -1
- package/dist/harness/runtime/types.js +0 -50
- package/dist/harness/runtime/types.js.map +0 -1
- package/dist/harness/session/commit.d.ts +0 -53
- package/dist/harness/session/commit.d.ts.map +0 -1
- package/dist/harness/session/commit.js +0 -57
- package/dist/harness/session/commit.js.map +0 -1
- package/dist/harness/session/fork-policy.d.ts +0 -21
- package/dist/harness/session/fork-policy.d.ts.map +0 -1
- package/dist/harness/session/fork-policy.js +0 -55
- package/dist/harness/session/fork-policy.js.map +0 -1
- package/dist/harness/session/fork.d.ts +0 -16
- package/dist/harness/session/fork.d.ts.map +0 -1
- package/dist/harness/session/fork.js +0 -79
- package/dist/harness/session/fork.js.map +0 -1
- package/dist/harness/session/in-memory-storage-state.d.ts +0 -39
- package/dist/harness/session/in-memory-storage-state.d.ts.map +0 -1
- package/dist/harness/session/in-memory-storage-state.js +0 -269
- package/dist/harness/session/in-memory-storage-state.js.map +0 -1
- package/dist/harness/session/jsonl/fork.d.ts +0 -38
- package/dist/harness/session/jsonl/fork.d.ts.map +0 -1
- package/dist/harness/session/jsonl/fork.js +0 -266
- package/dist/harness/session/jsonl/fork.js.map +0 -1
- package/dist/harness/session/jsonl/index.d.ts +0 -4
- package/dist/harness/session/jsonl/index.d.ts.map +0 -1
- package/dist/harness/session/jsonl/index.js +0 -4
- package/dist/harness/session/jsonl/index.js.map +0 -1
- package/dist/harness/session/jsonl/io.d.ts +0 -14
- package/dist/harness/session/jsonl/io.d.ts.map +0 -1
- package/dist/harness/session/jsonl/io.js +0 -86
- package/dist/harness/session/jsonl/io.js.map +0 -1
- package/dist/harness/session/jsonl/legacy-v3.d.ts +0 -44
- package/dist/harness/session/jsonl/legacy-v3.d.ts.map +0 -1
- package/dist/harness/session/jsonl/legacy-v3.js +0 -454
- package/dist/harness/session/jsonl/legacy-v3.js.map +0 -1
- package/dist/harness/session/mutation-line.d.ts +0 -8
- package/dist/harness/session/mutation-line.d.ts.map +0 -1
- package/dist/harness/session/mutation-line.js +0 -22
- package/dist/harness/session/mutation-line.js.map +0 -1
- package/dist/harness/session/testing/benchmark/datasets.d.ts +0 -12
- package/dist/harness/session/testing/benchmark/datasets.d.ts.map +0 -1
- package/dist/harness/session/testing/benchmark/datasets.js +0 -24
- package/dist/harness/session/testing/benchmark/datasets.js.map +0 -1
- package/dist/harness/session/testing/benchmark/session-repo.d.ts +0 -42
- package/dist/harness/session/testing/benchmark/session-repo.d.ts.map +0 -1
- package/dist/harness/session/testing/benchmark/session-repo.js +0 -127
- package/dist/harness/session/testing/benchmark/session-repo.js.map +0 -1
- package/dist/harness/session/testing/benchmark/storage.d.ts +0 -25
- package/dist/harness/session/testing/benchmark/storage.d.ts.map +0 -1
- package/dist/harness/session/testing/benchmark/storage.js +0 -114
- package/dist/harness/session/testing/benchmark/storage.js.map +0 -1
- package/dist/harness/session/testing/conformance/session-repo.d.ts +0 -23
- package/dist/harness/session/testing/conformance/session-repo.d.ts.map +0 -1
- package/dist/harness/session/testing/conformance/session-repo.js +0 -809
- package/dist/harness/session/testing/conformance/session-repo.js.map +0 -1
- package/dist/harness/session/testing/conformance/storage.d.ts +0 -4
- package/dist/harness/session/testing/conformance/storage.d.ts.map +0 -1
- package/dist/harness/session/testing/conformance/storage.js +0 -600
- package/dist/harness/session/testing/conformance/storage.js.map +0 -1
- package/dist/harness/session/testing/gating-storage.d.ts +0 -26
- package/dist/harness/session/testing/gating-storage.d.ts.map +0 -1
- package/dist/harness/session/testing/gating-storage.js +0 -103
- package/dist/harness/session/testing/gating-storage.js.map +0 -1
- package/dist/harness/session/testing/instrumented-storage.d.ts +0 -11
- package/dist/harness/session/testing/instrumented-storage.d.ts.map +0 -1
- package/dist/harness/session/testing/instrumented-storage.js +0 -19
- package/dist/harness/session/testing/instrumented-storage.js.map +0 -1
- package/dist/harness/session/testing/storage-decorator.d.ts +0 -20
- package/dist/harness/session/testing/storage-decorator.d.ts.map +0 -1
- package/dist/harness/session/testing/storage-decorator.js +0 -40
- package/dist/harness/session/testing/storage-decorator.js.map +0 -1
- package/dist/harness/session/values.d.ts +0 -95
- package/dist/harness/session/values.d.ts.map +0 -1
- package/dist/harness/session/values.js +0 -81
- package/dist/harness/session/values.js.map +0 -1
- package/dist/harness/utils/adaptive-publisher.d.ts +0 -24
- package/dist/harness/utils/adaptive-publisher.d.ts.map +0 -1
- package/dist/harness/utils/adaptive-publisher.js +0 -79
- package/dist/harness/utils/adaptive-publisher.js.map +0 -1
- package/dist/harness/utils/output-capture.d.ts +0 -31
- package/dist/harness/utils/output-capture.d.ts.map +0 -1
- package/dist/harness/utils/output-capture.js +0 -217
- package/dist/harness/utils/output-capture.js.map +0 -1
- package/dist/harness/utils/usage.d.ts +0 -4
- package/dist/harness/utils/usage.d.ts.map +0 -1
- package/dist/harness/utils/usage.js +0 -33
- package/dist/harness/utils/usage.js.map +0 -1
|
@@ -1,345 +1,225 @@
|
|
|
1
|
-
import { uuidv7 } from "@earendil-works/pi-ai
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/** Durable session state is internally inconsistent and cannot be safely advanced. */
|
|
6
|
-
export class SessionInvariantError extends Error {
|
|
7
|
-
constructor(message) {
|
|
8
|
-
super(message);
|
|
9
|
-
this.name = "SessionInvariantError";
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
/** A requested Branch name is invalid. */
|
|
13
|
-
export class SessionInvalidBranchError extends Error {
|
|
14
|
-
constructor(branch, reason) {
|
|
15
|
-
super(`Invalid branch ${JSON.stringify(branch)}: ${reason}`);
|
|
16
|
-
this.name = "SessionInvalidBranchError";
|
|
17
|
-
this.branch = branch;
|
|
18
|
-
this.reason = reason;
|
|
19
|
-
}
|
|
1
|
+
import { uuidv7 } from "@earendil-works/pi-ai";
|
|
2
|
+
import { SessionError } from "./types.js";
|
|
3
|
+
function invalidPayload(reason) {
|
|
4
|
+
throw new SessionError("invalid_payload", `Durable payload ${reason}`);
|
|
20
5
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
super(`Branch already exists: ${branch}`);
|
|
25
|
-
this.name = "SessionBranchExistsError";
|
|
26
|
-
this.branch = branch;
|
|
6
|
+
function assertValidLimit(limit) {
|
|
7
|
+
if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
|
|
8
|
+
throw new SessionError("invalid_query", "limit must be a positive integer");
|
|
27
9
|
}
|
|
28
10
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
super("Cannot persist a pending assistant message");
|
|
33
|
-
this.name = "SessionPendingAssistantMessageError";
|
|
11
|
+
function assertValidCursor(afterSeq) {
|
|
12
|
+
if (afterSeq !== undefined && (!Number.isInteger(afterSeq) || afterSeq < 0)) {
|
|
13
|
+
throw new SessionError("invalid_query", "cursor sequence must be a non-negative integer");
|
|
34
14
|
}
|
|
35
15
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
16
|
+
export function assertJsonSerializable(value) {
|
|
17
|
+
const active = new WeakSet();
|
|
18
|
+
const stack = [{ value }];
|
|
19
|
+
while (stack.length > 0) {
|
|
20
|
+
const frame = stack.pop();
|
|
21
|
+
if ("exit" in frame) {
|
|
22
|
+
active.delete(frame.exit);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const candidate = frame.value;
|
|
26
|
+
if (candidate === null || typeof candidate === "string" || typeof candidate === "boolean") {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (typeof candidate === "number") {
|
|
30
|
+
if (!Number.isFinite(candidate))
|
|
31
|
+
invalidPayload("contains a non-finite number");
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (typeof candidate !== "object")
|
|
35
|
+
invalidPayload(`contains ${typeof candidate}`);
|
|
36
|
+
if (active.has(candidate))
|
|
37
|
+
invalidPayload("contains a cycle");
|
|
38
|
+
active.add(candidate);
|
|
39
|
+
stack.push({ exit: candidate });
|
|
40
|
+
if (Array.isArray(candidate)) {
|
|
41
|
+
if (Object.getPrototypeOf(candidate) !== Array.prototype) {
|
|
42
|
+
invalidPayload("contains a non-standard array");
|
|
43
|
+
}
|
|
44
|
+
if (Object.getOwnPropertySymbols(candidate).length > 0 ||
|
|
45
|
+
Object.getOwnPropertyNames(candidate).length !== candidate.length + 1) {
|
|
46
|
+
invalidPayload("contains an array with unsupported properties");
|
|
62
47
|
}
|
|
63
|
-
|
|
48
|
+
for (let index = candidate.length - 1; index >= 0; index--) {
|
|
49
|
+
if (!Object.hasOwn(candidate, index))
|
|
50
|
+
invalidPayload("contains a sparse array");
|
|
51
|
+
const descriptor = Object.getOwnPropertyDescriptor(candidate, index);
|
|
52
|
+
if (!("value" in descriptor))
|
|
53
|
+
invalidPayload("contains an array accessor");
|
|
54
|
+
stack.push({ value: descriptor.value });
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
64
57
|
}
|
|
65
|
-
|
|
66
|
-
|
|
58
|
+
const prototype = Object.getPrototypeOf(candidate);
|
|
59
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
60
|
+
invalidPayload("contains a non-plain object");
|
|
61
|
+
}
|
|
62
|
+
if (Object.getOwnPropertySymbols(candidate).length > 0) {
|
|
63
|
+
invalidPayload("contains a symbol-keyed property");
|
|
64
|
+
}
|
|
65
|
+
const keys = Object.keys(candidate);
|
|
66
|
+
if (Object.getOwnPropertyNames(candidate).length !== keys.length) {
|
|
67
|
+
invalidPayload("contains a non-enumerable property");
|
|
68
|
+
}
|
|
69
|
+
for (let index = keys.length - 1; index >= 0; index--) {
|
|
70
|
+
const descriptor = Object.getOwnPropertyDescriptor(candidate, keys[index]);
|
|
71
|
+
if (!("value" in descriptor))
|
|
72
|
+
invalidPayload("contains an accessor");
|
|
73
|
+
stack.push({ value: descriptor.value });
|
|
67
74
|
}
|
|
68
|
-
return this.commitResult;
|
|
69
|
-
}
|
|
70
|
-
end(_context) {
|
|
71
|
-
if (this.endPromise !== undefined)
|
|
72
|
-
return this.endPromise;
|
|
73
|
-
this.active = false;
|
|
74
|
-
this.endPromise = this.settle().finally(this.release);
|
|
75
|
-
return this.endPromise;
|
|
76
|
-
}
|
|
77
|
-
getEntries(ids, context) {
|
|
78
|
-
this.assertActive();
|
|
79
|
-
return this.storage.getEntries(ids, context);
|
|
80
|
-
}
|
|
81
|
-
getStats(context) {
|
|
82
|
-
this.assertActive();
|
|
83
|
-
return this.storage.getStats(context);
|
|
84
|
-
}
|
|
85
|
-
getValue(address, context) {
|
|
86
|
-
this.assertActive();
|
|
87
|
-
return this.storage.getValue(address, context);
|
|
88
|
-
}
|
|
89
|
-
scanValues(prefix, context) {
|
|
90
|
-
this.assertActive();
|
|
91
|
-
return this.storage.scanValues(prefix, context);
|
|
92
|
-
}
|
|
93
|
-
readList(address, options, context) {
|
|
94
|
-
this.assertActive();
|
|
95
|
-
return this.storage.readList(address, options, context);
|
|
96
|
-
}
|
|
97
|
-
scanBranch(query, context) {
|
|
98
|
-
this.assertActive();
|
|
99
|
-
return this.storage.scanBranch(query, context);
|
|
100
|
-
}
|
|
101
|
-
settle() {
|
|
102
|
-
return (this.commitResult?.then(() => undefined, () => undefined) ?? Promise.resolve());
|
|
103
|
-
}
|
|
104
|
-
assertActive() {
|
|
105
|
-
if (!this.active)
|
|
106
|
-
throw new Error("SessionMutator cannot be used outside its mutation callback");
|
|
107
75
|
}
|
|
108
76
|
}
|
|
109
|
-
class
|
|
110
|
-
constructor(
|
|
111
|
-
this.
|
|
112
|
-
this.
|
|
77
|
+
export class Session {
|
|
78
|
+
constructor(storage, options = {}) {
|
|
79
|
+
this.storage = storage;
|
|
80
|
+
this.idGenerator = options.idGenerator ?? { next: () => uuidv7() };
|
|
113
81
|
}
|
|
114
|
-
|
|
115
|
-
return this.
|
|
82
|
+
async getMetadata() {
|
|
83
|
+
return this.storage.getMetadata();
|
|
116
84
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
85
|
+
view(lane) {
|
|
86
|
+
if (lane === "main")
|
|
87
|
+
return this;
|
|
88
|
+
return {
|
|
89
|
+
getLeafId: () => this.getLeafIdForLane(lane),
|
|
90
|
+
getEntry: (id) => this.getEntry(id),
|
|
91
|
+
getStats: () => this.getStats(),
|
|
92
|
+
getName: () => this.getName(),
|
|
93
|
+
setName: (name) => this.setName(name),
|
|
94
|
+
getLabel: (targetId) => this.getLabel(targetId),
|
|
95
|
+
setLabel: (targetId, label) => this.setLabel(targetId, label),
|
|
96
|
+
findEntries: (query) => this.queryEntries(query),
|
|
97
|
+
findEntry: async (query = {}) => (await this.queryEntries(query, 1))[0],
|
|
98
|
+
findEntriesOnBranch: (query) => this.queryBranchEntries(lane, query),
|
|
99
|
+
findEntryOnBranch: async (query = {}) => (await this.queryBranchEntries(lane, query, 1))[0],
|
|
100
|
+
appendMessage: (message) => this.appendMessageToLane(lane, message),
|
|
101
|
+
appendCustomEntry: (customType, data) => this.appendCustomEntryToLane(lane, customType, data),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
async getLeafId() {
|
|
105
|
+
return this.getLeafIdForLane("main");
|
|
106
|
+
}
|
|
107
|
+
async getEntry(id) {
|
|
108
|
+
return this.storage.getEntry(id);
|
|
109
|
+
}
|
|
110
|
+
async getStats() {
|
|
111
|
+
return this.storage.getStats();
|
|
112
|
+
}
|
|
113
|
+
async getName() {
|
|
114
|
+
return this.storage.getName();
|
|
115
|
+
}
|
|
116
|
+
async setName(name) {
|
|
117
|
+
await this.storage.setName(name);
|
|
118
|
+
}
|
|
119
|
+
async getLabel(targetId) {
|
|
120
|
+
return this.storage.getLabel(targetId);
|
|
121
|
+
}
|
|
122
|
+
async setLabel(targetId, label) {
|
|
123
|
+
await this.storage.setLabel(targetId, label);
|
|
124
|
+
}
|
|
125
|
+
async findEntries(query) {
|
|
126
|
+
return this.queryEntries(query);
|
|
127
|
+
}
|
|
128
|
+
async findEntry(query = {}) {
|
|
129
|
+
return (await this.queryEntries(query, 1))[0];
|
|
130
|
+
}
|
|
131
|
+
async findEntriesOnBranch(query) {
|
|
132
|
+
return this.queryBranchEntries("main", query);
|
|
133
|
+
}
|
|
134
|
+
async findEntryOnBranch(query = {}) {
|
|
135
|
+
return (await this.queryBranchEntries("main", query, 1))[0];
|
|
136
|
+
}
|
|
137
|
+
async appendMessage(message) {
|
|
138
|
+
return this.appendMessageToLane("main", message);
|
|
139
|
+
}
|
|
140
|
+
async appendCustomEntry(customType, data) {
|
|
141
|
+
return this.appendCustomEntryToLane("main", customType, data);
|
|
142
|
+
}
|
|
143
|
+
async getLanes() {
|
|
144
|
+
return this.storage.getLanes();
|
|
145
|
+
}
|
|
146
|
+
async createLane(lane, at) {
|
|
147
|
+
await this.storage.createLane(lane, at);
|
|
148
|
+
}
|
|
149
|
+
async moveLane(lane, to) {
|
|
150
|
+
await this.storage.moveLane(lane, to);
|
|
151
|
+
}
|
|
152
|
+
async appendEntry(entry, lane) {
|
|
153
|
+
return this.commitEntry(entry, lane);
|
|
154
|
+
}
|
|
155
|
+
async appendRecord(record) {
|
|
156
|
+
return this.commitRecord(record);
|
|
157
|
+
}
|
|
158
|
+
async findRecords(query) {
|
|
159
|
+
return this.queryRecords(query);
|
|
160
|
+
}
|
|
161
|
+
async findOpenOperations(lane, options) {
|
|
162
|
+
assertValidLimit(options?.limit);
|
|
163
|
+
return this.storage.findOpenOperations(lane, options);
|
|
164
|
+
}
|
|
165
|
+
async getLog(options) {
|
|
166
|
+
return this.queryLog(options);
|
|
167
|
+
}
|
|
168
|
+
/** Returns the lane's current leaf, or null when empty. Throws when the lane does not exist. */
|
|
169
|
+
async getLeafIdForLane(lane) {
|
|
170
|
+
const pointer = (await this.getLanes()).find((candidate) => candidate.lane === lane);
|
|
171
|
+
if (!pointer)
|
|
172
|
+
throw new SessionError("invalid_lane", `Lane not found: ${lane}`);
|
|
173
|
+
return pointer.leafId;
|
|
174
|
+
}
|
|
175
|
+
async queryEntries(query = {}, resultLimit = query.limit) {
|
|
176
|
+
assertValidLimit(query.limit);
|
|
177
|
+
assertValidCursor(query.cursor?.afterSeq);
|
|
178
|
+
return this.storage.findEntries(resultLimit === query.limit ? query : { ...query, limit: resultLimit });
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Queries from `query.start` toward the root, defaulting to the lane's current leaf.
|
|
182
|
+
* `resultLimit` lets single-entry queries cap results without changing the caller's query.
|
|
183
|
+
*/
|
|
184
|
+
async queryBranchEntries(defaultLane, query = {}, resultLimit = query.limit) {
|
|
185
|
+
assertValidLimit(query.limit);
|
|
186
|
+
assertValidCursor(query.cursor?.afterSeq);
|
|
187
|
+
const start = query.start ?? (await this.getLeafIdForLane(defaultLane));
|
|
120
188
|
if (start === null)
|
|
121
189
|
return [];
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
appendCustomEntry(customType, data, context) {
|
|
132
|
-
return this.session.appendToBranch(this.name, { type: "custom", customType, ...(data === undefined ? {} : { data }) }, context);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/** Package-internal typed boundary shared by concrete session repositories. */
|
|
136
|
-
export class StorageBackedSession {
|
|
137
|
-
constructor(metadata, storage, options = {}) {
|
|
138
|
-
this.branches = new Map();
|
|
139
|
-
this.closedError = new Error("Session is closed");
|
|
140
|
-
this.state = "open";
|
|
141
|
-
this.metadata = metadata;
|
|
142
|
-
this.idGenerator = options.idGenerator ?? { next: uuidv7 };
|
|
143
|
-
this.storage = storage;
|
|
144
|
-
this.mutationLine = options.mutationLine ?? new MutationLine();
|
|
145
|
-
this.onClose = options.onClose;
|
|
146
|
-
}
|
|
147
|
-
async beginMutation(_context) {
|
|
148
|
-
this.assertOpen();
|
|
149
|
-
let grant;
|
|
150
|
-
let rejectGrant;
|
|
151
|
-
const granted = new Promise((resolve, reject) => {
|
|
152
|
-
grant = resolve;
|
|
153
|
-
rejectGrant = reject;
|
|
154
|
-
});
|
|
155
|
-
let release;
|
|
156
|
-
const finished = new Promise((resolve) => {
|
|
157
|
-
release = resolve;
|
|
158
|
-
});
|
|
159
|
-
const line = this.mutationLine.run(async () => {
|
|
160
|
-
grant(new StorageBackedSessionMutation(this.storage, release));
|
|
161
|
-
await finished;
|
|
162
|
-
});
|
|
163
|
-
void line.catch(rejectGrant);
|
|
164
|
-
return granted;
|
|
165
|
-
}
|
|
166
|
-
async mutate(mutation, context) {
|
|
167
|
-
const mutator = await this.beginMutation(context);
|
|
168
|
-
try {
|
|
169
|
-
return await mutation(mutator, context);
|
|
170
|
-
}
|
|
171
|
-
finally {
|
|
172
|
-
await mutator.end(context);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
async getEntries(ids, context) {
|
|
176
|
-
this.assertOpen();
|
|
177
|
-
return this.storage.getEntries(ids, context);
|
|
178
|
-
}
|
|
179
|
-
async getEntry(id, context) {
|
|
180
|
-
return (await this.getEntries([id], context)).get(id);
|
|
181
|
-
}
|
|
182
|
-
async getValue(address, context) {
|
|
183
|
-
this.assertOpen();
|
|
184
|
-
return this.storage.getValue(address, context);
|
|
185
|
-
}
|
|
186
|
-
async scanValues(prefix, context) {
|
|
187
|
-
this.assertOpen();
|
|
188
|
-
return this.storage.scanValues(prefix, context);
|
|
189
|
-
}
|
|
190
|
-
async readList(address, options, context) {
|
|
191
|
-
this.assertOpen();
|
|
192
|
-
return this.storage.readList(address, options, context);
|
|
193
|
-
}
|
|
194
|
-
async scanBranch(query, context) {
|
|
195
|
-
this.assertOpen();
|
|
196
|
-
return this.storage.scanBranch(query, context);
|
|
197
|
-
}
|
|
198
|
-
async getStats(context) {
|
|
199
|
-
this.assertOpen();
|
|
200
|
-
return this.storage.getStats(context);
|
|
201
|
-
}
|
|
202
|
-
async getName(context) {
|
|
203
|
-
return (await this.getValue(sessionName, context))?.value;
|
|
204
|
-
}
|
|
205
|
-
async getLabel(targetId, context) {
|
|
206
|
-
return (await this.getValue(entryLabel(targetId), context))?.value;
|
|
207
|
-
}
|
|
208
|
-
async findEntries(query, context) {
|
|
209
|
-
query ??= {};
|
|
210
|
-
this.assertOpen();
|
|
211
|
-
const order = query.order ?? "desc";
|
|
212
|
-
if (query.cursor !== undefined) {
|
|
213
|
-
if (order === "asc" && query.cursor.seq === Number.MAX_SAFE_INTEGER)
|
|
214
|
-
return [];
|
|
215
|
-
if (order === "desc" && query.cursor.seq <= 1)
|
|
216
|
-
return [];
|
|
217
|
-
}
|
|
218
|
-
return this.storage.scanEntries({
|
|
219
|
-
type: query.type,
|
|
220
|
-
customType: query.customType,
|
|
221
|
-
order,
|
|
222
|
-
limit: query.limit,
|
|
223
|
-
...(query.cursor === undefined
|
|
224
|
-
? {}
|
|
225
|
-
: order === "asc"
|
|
226
|
-
? { fromSeq: query.cursor.seq + 1 }
|
|
227
|
-
: { toSeq: query.cursor.seq - 1 }),
|
|
228
|
-
}, context);
|
|
229
|
-
}
|
|
230
|
-
async findEntry(query, context) {
|
|
231
|
-
query ??= {};
|
|
232
|
-
return (await this.findEntries({ ...query, limit: query.limit === undefined ? 1 : Math.min(query.limit, 1) }, context))[0];
|
|
233
|
-
}
|
|
234
|
-
async branch(name, context) {
|
|
235
|
-
this.assertValidBranchName(name);
|
|
236
|
-
if ((await this.getValue(branchTip(name), context)) === undefined)
|
|
237
|
-
return undefined;
|
|
238
|
-
return this.getOrCreateBranchObject(name);
|
|
239
|
-
}
|
|
240
|
-
async createBranch(name, at, context) {
|
|
241
|
-
this.assertOpen();
|
|
242
|
-
this.assertValidBranchName(name);
|
|
243
|
-
await this.mutate(async (mutator) => {
|
|
244
|
-
if ((await mutator.getValue(branchTip(name), context)) !== undefined) {
|
|
245
|
-
throw new SessionBranchExistsError(name);
|
|
246
|
-
}
|
|
247
|
-
if (at !== null && !(await mutator.getEntries([at], context)).has(at)) {
|
|
248
|
-
throw new SessionUnknownTargetError(at);
|
|
249
|
-
}
|
|
250
|
-
await mutator.commit([setValueWrite(branchTip(name), at)], context);
|
|
251
|
-
}, context);
|
|
252
|
-
return this.getOrCreateBranchObject(name);
|
|
253
|
-
}
|
|
254
|
-
setValue(address, next, context) {
|
|
255
|
-
return this.mutate(async (mutator) => {
|
|
256
|
-
await mutator.commit([setValueWrite(address, next)], context);
|
|
257
|
-
}, context);
|
|
258
|
-
}
|
|
259
|
-
deleteValue(address, context) {
|
|
260
|
-
return this.mutate(async (mutator) => {
|
|
261
|
-
await mutator.commit([deleteValueWrite(address)], context);
|
|
262
|
-
}, context);
|
|
263
|
-
}
|
|
264
|
-
appendList(address, element, context) {
|
|
265
|
-
return this.mutate(async (mutator) => {
|
|
266
|
-
await mutator.commit([appendListWrite(address, element)], context);
|
|
267
|
-
}, context);
|
|
268
|
-
}
|
|
269
|
-
deleteList(address, context) {
|
|
270
|
-
return this.mutate(async (mutator) => {
|
|
271
|
-
await mutator.commit([deleteListWrite(address)], context);
|
|
272
|
-
}, context);
|
|
273
|
-
}
|
|
274
|
-
setName(name, context) {
|
|
275
|
-
return name === undefined ? this.deleteValue(sessionName, context) : this.setValue(sessionName, name, context);
|
|
276
|
-
}
|
|
277
|
-
setLabel(targetId, label, context) {
|
|
278
|
-
const address = entryLabel(targetId);
|
|
279
|
-
return label === undefined ? this.deleteValue(address, context) : this.setValue(address, label, context);
|
|
280
|
-
}
|
|
281
|
-
close(context) {
|
|
282
|
-
if (this.closePromise !== undefined)
|
|
283
|
-
return this.closePromise;
|
|
284
|
-
this.state = "closing";
|
|
285
|
-
this.closePromise = this.mutationLine
|
|
286
|
-
.seal(this.closedError)
|
|
287
|
-
.then(() => this.storage.close(context))
|
|
288
|
-
.finally(() => {
|
|
289
|
-
this.state = "closed";
|
|
290
|
-
this.onClose?.();
|
|
291
|
-
});
|
|
292
|
-
return this.closePromise;
|
|
293
|
-
}
|
|
294
|
-
async getBranchTip(name, context) {
|
|
295
|
-
const stored = await this.getValue(branchTip(name), context);
|
|
296
|
-
if (stored === undefined)
|
|
297
|
-
throw new SessionInvariantError(`Unknown branch: ${name}`);
|
|
298
|
-
return stored.value;
|
|
299
|
-
}
|
|
300
|
-
async appendToBranch(name, entry, context) {
|
|
301
|
-
this.assertOpen();
|
|
302
|
-
if (entry.type === "message" && entry.message.role === "assistant" && entry.message.stopReason === "pending") {
|
|
303
|
-
throw new SessionPendingAssistantMessageError();
|
|
304
|
-
}
|
|
305
|
-
const id = this.idGenerator.next();
|
|
306
|
-
await this.mutate(async (mutator) => {
|
|
307
|
-
const tip = await mutator.getValue(branchTip(name), context);
|
|
308
|
-
if (tip === undefined)
|
|
309
|
-
throw new SessionInvariantError(`Unknown branch: ${name}`);
|
|
310
|
-
await mutator.commit([
|
|
311
|
-
insertEntry(entry.type === "message"
|
|
312
|
-
? { id, parentId: tip.value, type: "message", message: entry.message }
|
|
313
|
-
: {
|
|
314
|
-
id,
|
|
315
|
-
parentId: tip.value,
|
|
316
|
-
type: "custom",
|
|
317
|
-
customType: entry.customType,
|
|
318
|
-
...(entry.data === undefined ? {} : { data: entry.data }),
|
|
319
|
-
}),
|
|
320
|
-
setValueWrite(branchTip(name), id),
|
|
321
|
-
], context);
|
|
322
|
-
}, context);
|
|
323
|
-
return id;
|
|
324
|
-
}
|
|
325
|
-
getOrCreateBranchObject(name) {
|
|
326
|
-
let branch = this.branches.get(name);
|
|
327
|
-
if (branch === undefined) {
|
|
328
|
-
branch = new StorageBackedBranch(name, this);
|
|
329
|
-
this.branches.set(name, branch);
|
|
190
|
+
const storageQuery = resultLimit === query.limit ? query : { ...query, limit: resultLimit };
|
|
191
|
+
return this.storage.findEntriesOnBranch({ ...storageQuery, start });
|
|
192
|
+
}
|
|
193
|
+
async queryRecords(query = {}) {
|
|
194
|
+
assertValidLimit(query.limit);
|
|
195
|
+
assertValidCursor(query.afterSeq);
|
|
196
|
+
if (query.operationKind !== undefined && query.type !== "operation_started") {
|
|
197
|
+
throw new SessionError("invalid_query", 'operationKind requires type "operation_started"');
|
|
330
198
|
}
|
|
331
|
-
return
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
199
|
+
return this.storage.findRecords(query);
|
|
200
|
+
}
|
|
201
|
+
async queryLog(options = {}) {
|
|
202
|
+
assertValidLimit(options.limit);
|
|
203
|
+
assertValidCursor(options.afterSeq);
|
|
204
|
+
return this.storage.getLog(options);
|
|
205
|
+
}
|
|
206
|
+
async appendMessageToLane(lane, message) {
|
|
207
|
+
const entry = await this.commitEntry({ type: "message", id: this.idGenerator.next(), message }, lane);
|
|
208
|
+
return entry.id;
|
|
209
|
+
}
|
|
210
|
+
async appendCustomEntryToLane(lane, customType, data) {
|
|
211
|
+
const entry = await this.commitEntry(data === undefined
|
|
212
|
+
? { type: "custom", id: this.idGenerator.next(), customType }
|
|
213
|
+
: { type: "custom", id: this.idGenerator.next(), customType, data }, lane);
|
|
214
|
+
return entry.id;
|
|
215
|
+
}
|
|
216
|
+
async commitEntry(entry, lane) {
|
|
217
|
+
assertJsonSerializable(entry);
|
|
218
|
+
return this.storage.appendEntry(entry, lane);
|
|
219
|
+
}
|
|
220
|
+
async commitRecord(record) {
|
|
221
|
+
assertJsonSerializable(record);
|
|
222
|
+
return this.storage.appendRecord(record);
|
|
343
223
|
}
|
|
344
224
|
}
|
|
345
225
|
//# sourceMappingURL=session.js.map
|