@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
package/dist/harness/events.js
CHANGED
|
@@ -1,245 +1,67 @@
|
|
|
1
|
-
/** Passive harness event bus with isolated handler failures. */
|
|
2
1
|
export class HarnessEventBus {
|
|
3
2
|
constructor() {
|
|
4
3
|
this.listeners = new Map();
|
|
5
4
|
this.watchListeners = new Set();
|
|
6
|
-
this.deliveryTail = Promise.resolve();
|
|
7
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Register a listener for future events of one type and return its unsubscribe function.
|
|
8
|
+
* Earlier events are not replayed, and no snapshot or event buffer is provided.
|
|
9
|
+
*/
|
|
8
10
|
on(type, listener) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
listeners.add(wrapped);
|
|
18
|
-
return () => listeners?.delete(wrapped);
|
|
19
|
-
}
|
|
20
|
-
emit(event, context) {
|
|
21
|
-
return this.emitBatch([event], context);
|
|
22
|
-
}
|
|
23
|
-
/** Bind current recipients and append one contiguous batch to the global delivery tail. */
|
|
24
|
-
emitBatch(events, context) {
|
|
25
|
-
if (this.closedError !== undefined || events.length === 0)
|
|
26
|
-
return Promise.resolve();
|
|
27
|
-
const bound = events.map((event) => {
|
|
28
|
-
const payload = structuredClone(event);
|
|
29
|
-
return { payload, recipients: this.snapshotRecipients(payload) };
|
|
30
|
-
});
|
|
31
|
-
const delivery = this.deliveryTail.then(async () => {
|
|
32
|
-
for (const { payload, recipients } of bound)
|
|
33
|
-
await this.deliver(payload, recipients, true, context);
|
|
34
|
-
});
|
|
35
|
-
this.deliveryTail = delivery.catch(() => { });
|
|
36
|
-
return delivery;
|
|
37
|
-
}
|
|
38
|
-
watch(snapshot, filter, _context, resnapshot) {
|
|
39
|
-
if (this.closedError !== undefined)
|
|
40
|
-
throw this.closedError;
|
|
41
|
-
return this.installWatcher(snapshot, filter, resnapshot);
|
|
42
|
-
}
|
|
43
|
-
async watchFromSnapshot(capture, filter, context) {
|
|
44
|
-
if (this.closedError !== undefined)
|
|
45
|
-
throw this.closedError;
|
|
46
|
-
const watcher = this.installWatcher(undefined, filter, async (captureContext, markBoundary) => {
|
|
47
|
-
const snapshot = await capture(captureContext);
|
|
48
|
-
markBoundary();
|
|
49
|
-
return snapshot;
|
|
50
|
-
});
|
|
51
|
-
try {
|
|
52
|
-
watcher.setSnapshot(await capture(context));
|
|
53
|
-
return watcher;
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
watcher.unsubscribe();
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
close(error) {
|
|
61
|
-
this.closedError ??= error;
|
|
62
|
-
void this.deliveryTail.finally(() => {
|
|
63
|
-
this.listeners.clear();
|
|
64
|
-
this.watchListeners.clear();
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
installWatcher(snapshot, filter, resnapshot) {
|
|
68
|
-
let watcher;
|
|
69
|
-
const capture = resnapshot === undefined
|
|
70
|
-
? undefined
|
|
71
|
-
: async (context) => {
|
|
72
|
-
let marked = false;
|
|
73
|
-
const next = await resnapshot(context, () => {
|
|
74
|
-
if (marked)
|
|
75
|
-
throw new Error("Resnapshot boundary was already marked");
|
|
76
|
-
marked = true;
|
|
77
|
-
this.enqueueBarrier(() => watcher.markResnapshotBoundary());
|
|
78
|
-
});
|
|
79
|
-
if (!marked)
|
|
80
|
-
throw new Error("Resnapshot capture did not mark its boundary");
|
|
81
|
-
return next;
|
|
82
|
-
};
|
|
83
|
-
watcher = new BufferedEventWatcher(snapshot, capture, async (error, event, context) => {
|
|
84
|
-
if (event.type === "handler_error")
|
|
85
|
-
return;
|
|
86
|
-
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
87
|
-
const lane = "lane" in event && typeof event.lane === "string" ? event.lane : undefined;
|
|
88
|
-
await this.emit({
|
|
89
|
-
type: "handler_error",
|
|
90
|
-
kind: "event",
|
|
91
|
-
event: event.type,
|
|
92
|
-
error: normalized.message,
|
|
93
|
-
...(normalized.stack === undefined ? {} : { stack: normalized.stack }),
|
|
94
|
-
...(lane === undefined ? {} : { lane }),
|
|
95
|
-
}, context);
|
|
96
|
-
});
|
|
97
|
-
const watchListener = (event, context) => {
|
|
98
|
-
if (filter(event))
|
|
99
|
-
watcher.push(event, context);
|
|
11
|
+
// Reuse this event type's listener set, or create its first set.
|
|
12
|
+
const listeners = this.listeners.get(type) ?? new Set();
|
|
13
|
+
this.listeners.set(type, listeners);
|
|
14
|
+
// Wrap this event-specific callback so it can be stored as a general HarnessEvent listener.
|
|
15
|
+
// Keep the wrapper reference so unsubscribe can remove that exact function from the set.
|
|
16
|
+
const receive = (event) => {
|
|
17
|
+
if (event.type === type)
|
|
18
|
+
return listener(event);
|
|
100
19
|
};
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const delivery = this.deliveryTail.then(barrier);
|
|
107
|
-
this.deliveryTail = delivery.catch(() => { });
|
|
108
|
-
}
|
|
109
|
-
snapshotRecipients(event) {
|
|
110
|
-
return [...(this.listeners.get(event.type) ?? []), ...this.watchListeners];
|
|
111
|
-
}
|
|
112
|
-
async deliver(event, recipients, reportErrors, context) {
|
|
113
|
-
for (const listener of recipients) {
|
|
114
|
-
try {
|
|
115
|
-
await listener(structuredClone(event), context);
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
if (!reportErrors || event.type === "handler_error")
|
|
119
|
-
continue;
|
|
120
|
-
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
121
|
-
const lane = "lane" in event && typeof event.lane === "string" ? event.lane : undefined;
|
|
122
|
-
const handlerError = {
|
|
123
|
-
type: "handler_error",
|
|
124
|
-
kind: "event",
|
|
125
|
-
event: event.type,
|
|
126
|
-
error: normalized.message,
|
|
127
|
-
...(normalized.stack === undefined ? {} : { stack: normalized.stack }),
|
|
128
|
-
...(lane === undefined ? {} : { lane }),
|
|
129
|
-
};
|
|
130
|
-
await this.deliver(handlerError, this.snapshotRecipients(handlerError), false, context);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
class BufferedEventWatcher {
|
|
136
|
-
constructor(snapshot, resnapshot, onError) {
|
|
137
|
-
this.buffer = [];
|
|
138
|
-
this.deliveryTail = Promise.resolve();
|
|
139
|
-
this.epoch = 0;
|
|
140
|
-
this.state = "buffering";
|
|
141
|
-
this.snapshot = snapshot;
|
|
142
|
-
this.resnapshotCallback = resnapshot;
|
|
143
|
-
this.onError = onError;
|
|
144
|
-
}
|
|
145
|
-
setSnapshot(snapshot) {
|
|
146
|
-
this.snapshot = snapshot;
|
|
147
|
-
}
|
|
148
|
-
start(listener) {
|
|
149
|
-
if (this.state !== "buffering")
|
|
150
|
-
throw new Error("WatchHandle.start() may be called only once");
|
|
151
|
-
this.state = "started";
|
|
152
|
-
this.listener = listener;
|
|
153
|
-
const buffered = this.buffer;
|
|
154
|
-
this.buffer = [];
|
|
155
|
-
for (const bufferedEvent of buffered) {
|
|
156
|
-
this.enqueue(bufferedEvent.event, bufferedEvent.context, bufferedEvent.epoch);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
async resnapshot(context) {
|
|
160
|
-
if (this.state === "unsubscribed")
|
|
161
|
-
throw new Error("WatchHandle is unsubscribed");
|
|
162
|
-
if (this.resnapshotCallback === undefined)
|
|
163
|
-
throw new Error("WatchHandle does not support resnapshot");
|
|
164
|
-
if (this.resnapshotState !== undefined)
|
|
165
|
-
throw new Error("WatchHandle resnapshot is already in progress");
|
|
166
|
-
let resolveReached;
|
|
167
|
-
const reached = new Promise((resolve) => {
|
|
168
|
-
resolveReached = resolve;
|
|
169
|
-
});
|
|
170
|
-
const resnapshotState = {
|
|
171
|
-
phase: "dropping",
|
|
172
|
-
held: [],
|
|
173
|
-
reached,
|
|
174
|
-
resolveReached,
|
|
20
|
+
listeners.add(receive);
|
|
21
|
+
return () => {
|
|
22
|
+
listeners.delete(receive);
|
|
23
|
+
if (listeners.size === 0)
|
|
24
|
+
this.listeners.delete(type);
|
|
175
25
|
};
|
|
176
|
-
this.epoch++;
|
|
177
|
-
this.resnapshotState = resnapshotState;
|
|
178
|
-
try {
|
|
179
|
-
const snapshot = await this.resnapshotCallback(context);
|
|
180
|
-
await reached;
|
|
181
|
-
this.snapshot = snapshot;
|
|
182
|
-
this.resnapshotState = undefined;
|
|
183
|
-
for (const held of resnapshotState.held)
|
|
184
|
-
this.push(held.event, held.context);
|
|
185
|
-
return snapshot;
|
|
186
|
-
}
|
|
187
|
-
catch (error) {
|
|
188
|
-
this.resnapshotState = undefined;
|
|
189
|
-
for (const held of resnapshotState.held)
|
|
190
|
-
this.push(held.event, held.context);
|
|
191
|
-
throw error;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
markResnapshotBoundary() {
|
|
195
|
-
const resnapshot = this.resnapshotState;
|
|
196
|
-
if (resnapshot === undefined || resnapshot.phase !== "dropping")
|
|
197
|
-
return;
|
|
198
|
-
resnapshot.phase = "holding";
|
|
199
|
-
resnapshot.resolveReached();
|
|
200
26
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
this.
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
await this.onError(error, event, context);
|
|
240
|
-
}
|
|
241
|
-
catch { }
|
|
242
|
-
});
|
|
27
|
+
/** Publish an event to current event subscriptions and watch subscriptions. */
|
|
28
|
+
emit(event) {
|
|
29
|
+
// Deliver only to direct listeners registered for this event type.
|
|
30
|
+
// Async results are not awaited because emit() is synchronous.
|
|
31
|
+
for (const listener of this.listeners.get(event.type) ?? [])
|
|
32
|
+
void listener(event);
|
|
33
|
+
// Deliver every event to each watcher; watch() handles buffering until start().
|
|
34
|
+
for (const listener of this.watchListeners)
|
|
35
|
+
listener(event);
|
|
36
|
+
}
|
|
37
|
+
watch(captureSnapshot) {
|
|
38
|
+
let listener;
|
|
39
|
+
let buffered = [];
|
|
40
|
+
const receive = (event) => {
|
|
41
|
+
if (listener)
|
|
42
|
+
void listener(event);
|
|
43
|
+
else
|
|
44
|
+
buffered.push(event);
|
|
45
|
+
};
|
|
46
|
+
this.watchListeners.add(receive);
|
|
47
|
+
const snapshot = captureSnapshot();
|
|
48
|
+
return {
|
|
49
|
+
snapshot,
|
|
50
|
+
start: (nextListener) => {
|
|
51
|
+
// Stay in buffering mode while flushing so reentrant emissions preserve order.
|
|
52
|
+
while (buffered.length > 0) {
|
|
53
|
+
const pending = buffered;
|
|
54
|
+
buffered = [];
|
|
55
|
+
for (const event of pending)
|
|
56
|
+
void nextListener(event);
|
|
57
|
+
}
|
|
58
|
+
listener = nextListener;
|
|
59
|
+
},
|
|
60
|
+
unsubscribe: () => {
|
|
61
|
+
this.watchListeners.delete(receive);
|
|
62
|
+
buffered = [];
|
|
63
|
+
},
|
|
64
|
+
};
|
|
243
65
|
}
|
|
244
66
|
}
|
|
245
67
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/harness/events.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventListener, Events, HarnessEvent, HarnessEventType, WatchHandle } from \"./agent-harness.ts\";\nimport type { Context } from \"./context.ts\";\n\ntype UntypedEventListener = (event: HarnessEvent, context: Context) => void | Promise<void>;\ntype ResnapshotCapture<T> = (context: Context, markBoundary: () => void) => Promise<T>;\n\n/** Passive harness event bus with isolated handler failures. */\nexport class HarnessEventBus implements Events {\n\tprivate readonly listeners = new Map<HarnessEventType, Set<UntypedEventListener>>();\n\tprivate readonly watchListeners = new Set<UntypedEventListener>();\n\tprivate deliveryTail: Promise<void> = Promise.resolve();\n\tprivate closedError: Error | undefined;\n\n\ton<TType extends HarnessEventType>(\n\t\ttype: TType,\n\t\tlistener: EventListener<Extract<HarnessEvent, { type: TType }>>,\n\t): () => void {\n\t\tif (this.closedError !== undefined) throw this.closedError;\n\t\tconst wrapped: UntypedEventListener = (event, context) =>\n\t\t\tlistener(event as Extract<HarnessEvent, { type: TType }>, context);\n\t\tlet listeners = this.listeners.get(type);\n\t\tif (listeners === undefined) {\n\t\t\tlisteners = new Set();\n\t\t\tthis.listeners.set(type, listeners);\n\t\t}\n\t\tlisteners.add(wrapped);\n\t\treturn () => listeners?.delete(wrapped);\n\t}\n\n\temit(event: HarnessEvent, context: Context): Promise<void> {\n\t\treturn this.emitBatch([event], context);\n\t}\n\n\t/** Bind current recipients and append one contiguous batch to the global delivery tail. */\n\temitBatch(events: readonly HarnessEvent[], context: Context): Promise<void> {\n\t\tif (this.closedError !== undefined || events.length === 0) return Promise.resolve();\n\t\tconst bound = events.map((event) => {\n\t\t\tconst payload = structuredClone(event);\n\t\t\treturn { payload, recipients: this.snapshotRecipients(payload) };\n\t\t});\n\t\tconst delivery = this.deliveryTail.then(async () => {\n\t\t\tfor (const { payload, recipients } of bound) await this.deliver(payload, recipients, true, context);\n\t\t});\n\t\tthis.deliveryTail = delivery.catch(() => {});\n\t\treturn delivery;\n\t}\n\n\twatch<T>(\n\t\tsnapshot: T,\n\t\tfilter: (event: HarnessEvent) => boolean,\n\t\t_context: Context,\n\t\tresnapshot?: ResnapshotCapture<T>,\n\t): WatchHandle<T> {\n\t\tif (this.closedError !== undefined) throw this.closedError;\n\t\treturn this.installWatcher(snapshot, filter, resnapshot);\n\t}\n\n\tasync watchFromSnapshot<T>(\n\t\tcapture: (context: Context) => Promise<T>,\n\t\tfilter: (event: HarnessEvent) => boolean,\n\t\tcontext: Context,\n\t): Promise<WatchHandle<T>> {\n\t\tif (this.closedError !== undefined) throw this.closedError;\n\t\tconst watcher = this.installWatcher<T>(undefined, filter, async (captureContext, markBoundary) => {\n\t\t\tconst snapshot = await capture(captureContext);\n\t\t\tmarkBoundary();\n\t\t\treturn snapshot;\n\t\t});\n\t\ttry {\n\t\t\twatcher.setSnapshot(await capture(context));\n\t\t\treturn watcher;\n\t\t} catch (error) {\n\t\t\twatcher.unsubscribe();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tclose(error: Error): void {\n\t\tthis.closedError ??= error;\n\t\tvoid this.deliveryTail.finally(() => {\n\t\t\tthis.listeners.clear();\n\t\t\tthis.watchListeners.clear();\n\t\t});\n\t}\n\n\tprivate installWatcher<T>(\n\t\tsnapshot: T | undefined,\n\t\tfilter: (event: HarnessEvent) => boolean,\n\t\tresnapshot: ResnapshotCapture<T> | undefined,\n\t): BufferedEventWatcher<T> {\n\t\tlet watcher!: BufferedEventWatcher<T>;\n\t\tconst capture =\n\t\t\tresnapshot === undefined\n\t\t\t\t? undefined\n\t\t\t\t: async (context: Context) => {\n\t\t\t\t\t\tlet marked = false;\n\t\t\t\t\t\tconst next = await resnapshot(context, () => {\n\t\t\t\t\t\t\tif (marked) throw new Error(\"Resnapshot boundary was already marked\");\n\t\t\t\t\t\t\tmarked = true;\n\t\t\t\t\t\t\tthis.enqueueBarrier(() => watcher.markResnapshotBoundary());\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!marked) throw new Error(\"Resnapshot capture did not mark its boundary\");\n\t\t\t\t\t\treturn next;\n\t\t\t\t\t};\n\t\twatcher = new BufferedEventWatcher(snapshot, capture, async (error, event, context) => {\n\t\t\tif (event.type === \"handler_error\") return;\n\t\t\tconst normalized = error instanceof Error ? error : new Error(String(error));\n\t\t\tconst lane = \"lane\" in event && typeof event.lane === \"string\" ? event.lane : undefined;\n\t\t\tawait this.emit(\n\t\t\t\t{\n\t\t\t\t\ttype: \"handler_error\",\n\t\t\t\t\tkind: \"event\",\n\t\t\t\t\tevent: event.type,\n\t\t\t\t\terror: normalized.message,\n\t\t\t\t\t...(normalized.stack === undefined ? {} : { stack: normalized.stack }),\n\t\t\t\t\t...(lane === undefined ? {} : { lane }),\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t);\n\t\t});\n\t\tconst watchListener: UntypedEventListener = (event, context) => {\n\t\t\tif (filter(event)) watcher.push(event, context);\n\t\t};\n\t\tthis.watchListeners.add(watchListener);\n\t\twatcher.setUnsubscribe(() => this.watchListeners.delete(watchListener));\n\t\treturn watcher;\n\t}\n\n\tprivate enqueueBarrier(barrier: () => void): void {\n\t\tconst delivery = this.deliveryTail.then(barrier);\n\t\tthis.deliveryTail = delivery.catch(() => {});\n\t}\n\n\tprivate snapshotRecipients(event: HarnessEvent): UntypedEventListener[] {\n\t\treturn [...(this.listeners.get(event.type) ?? []), ...this.watchListeners];\n\t}\n\n\tprivate async deliver(\n\t\tevent: HarnessEvent,\n\t\trecipients: readonly UntypedEventListener[],\n\t\treportErrors: boolean,\n\t\tcontext: Context,\n\t): Promise<void> {\n\t\tfor (const listener of recipients) {\n\t\t\ttry {\n\t\t\t\tawait listener(structuredClone(event), context);\n\t\t\t} catch (error) {\n\t\t\t\tif (!reportErrors || event.type === \"handler_error\") continue;\n\t\t\t\tconst normalized = error instanceof Error ? error : new Error(String(error));\n\t\t\t\tconst lane = \"lane\" in event && typeof event.lane === \"string\" ? event.lane : undefined;\n\t\t\t\tconst handlerError: HarnessEvent = {\n\t\t\t\t\ttype: \"handler_error\",\n\t\t\t\t\tkind: \"event\",\n\t\t\t\t\tevent: event.type,\n\t\t\t\t\terror: normalized.message,\n\t\t\t\t\t...(normalized.stack === undefined ? {} : { stack: normalized.stack }),\n\t\t\t\t\t...(lane === undefined ? {} : { lane }),\n\t\t\t\t};\n\t\t\t\tawait this.deliver(handlerError, this.snapshotRecipients(handlerError), false, context);\n\t\t\t}\n\t\t}\n\t}\n}\n\nclass BufferedEventWatcher<T> implements WatchHandle<T> {\n\tsnapshot: T;\n\tprivate readonly resnapshotCallback: ((context: Context) => Promise<T>) | undefined;\n\tprivate readonly onError: (error: unknown, event: HarnessEvent, context: Context) => void | Promise<void>;\n\tprivate buffer: Array<{ event: HarnessEvent; context: Context; epoch: number }> = [];\n\tprivate listener: EventListener | undefined;\n\tprivate unsubscribeCallback: (() => void) | undefined;\n\tprivate deliveryTail: Promise<void> = Promise.resolve();\n\tprivate epoch = 0;\n\tprivate resnapshotState:\n\t\t| {\n\t\t\t\tphase: \"dropping\" | \"holding\";\n\t\t\t\theld: Array<{ event: HarnessEvent; context: Context }>;\n\t\t\t\treached: Promise<void>;\n\t\t\t\tresolveReached: () => void;\n\t\t }\n\t\t| undefined;\n\tprivate state: \"buffering\" | \"started\" | \"unsubscribed\" = \"buffering\";\n\n\tconstructor(\n\t\tsnapshot: T | undefined,\n\t\tresnapshot: ((context: Context) => Promise<T>) | undefined,\n\t\tonError: (error: unknown, event: HarnessEvent, context: Context) => void | Promise<void>,\n\t) {\n\t\tthis.snapshot = snapshot as T;\n\t\tthis.resnapshotCallback = resnapshot;\n\t\tthis.onError = onError;\n\t}\n\n\tsetSnapshot(snapshot: T): void {\n\t\tthis.snapshot = snapshot;\n\t}\n\n\tstart(listener: EventListener): void {\n\t\tif (this.state !== \"buffering\") throw new Error(\"WatchHandle.start() may be called only once\");\n\t\tthis.state = \"started\";\n\t\tthis.listener = listener;\n\t\tconst buffered = this.buffer;\n\t\tthis.buffer = [];\n\t\tfor (const bufferedEvent of buffered) {\n\t\t\tthis.enqueue(bufferedEvent.event, bufferedEvent.context, bufferedEvent.epoch);\n\t\t}\n\t}\n\n\tasync resnapshot(context: Context): Promise<T> {\n\t\tif (this.state === \"unsubscribed\") throw new Error(\"WatchHandle is unsubscribed\");\n\t\tif (this.resnapshotCallback === undefined) throw new Error(\"WatchHandle does not support resnapshot\");\n\t\tif (this.resnapshotState !== undefined) throw new Error(\"WatchHandle resnapshot is already in progress\");\n\t\tlet resolveReached!: () => void;\n\t\tconst reached = new Promise<void>((resolve) => {\n\t\t\tresolveReached = resolve;\n\t\t});\n\t\tconst resnapshotState = {\n\t\t\tphase: \"dropping\" as const,\n\t\t\theld: [] as Array<{ event: HarnessEvent; context: Context }>,\n\t\t\treached,\n\t\t\tresolveReached,\n\t\t};\n\t\tthis.epoch++;\n\t\tthis.resnapshotState = resnapshotState;\n\t\ttry {\n\t\t\tconst snapshot = await this.resnapshotCallback(context);\n\t\t\tawait reached;\n\t\t\tthis.snapshot = snapshot;\n\t\t\tthis.resnapshotState = undefined;\n\t\t\tfor (const held of resnapshotState.held) this.push(held.event, held.context);\n\t\t\treturn snapshot;\n\t\t} catch (error) {\n\t\t\tthis.resnapshotState = undefined;\n\t\t\tfor (const held of resnapshotState.held) this.push(held.event, held.context);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tmarkResnapshotBoundary(): void {\n\t\tconst resnapshot = this.resnapshotState;\n\t\tif (resnapshot === undefined || resnapshot.phase !== \"dropping\") return;\n\t\tresnapshot.phase = \"holding\";\n\t\tresnapshot.resolveReached();\n\t}\n\n\tunsubscribe(): void {\n\t\tif (this.state === \"unsubscribed\") return;\n\t\tthis.state = \"unsubscribed\";\n\t\tthis.buffer = [];\n\t\tthis.listener = undefined;\n\t\tthis.unsubscribeCallback?.();\n\t\tthis.unsubscribeCallback = undefined;\n\t}\n\n\tpush(event: HarnessEvent, context: Context): void {\n\t\tif (this.state === \"unsubscribed\") return;\n\t\tif (this.resnapshotState?.phase === \"dropping\") return;\n\t\tif (this.resnapshotState?.phase === \"holding\") {\n\t\t\tthis.resnapshotState.held.push({ event, context });\n\t\t\treturn;\n\t\t}\n\t\tif (this.state === \"buffering\") {\n\t\t\tthis.buffer.push({ event, context, epoch: this.epoch });\n\t\t\treturn;\n\t\t}\n\t\tthis.enqueue(event, context, this.epoch);\n\t}\n\n\tsetUnsubscribe(callback: () => void): void {\n\t\tthis.unsubscribeCallback = callback;\n\t}\n\n\tprivate enqueue(event: HarnessEvent, context: Context, epoch: number): void {\n\t\tconst listener = this.listener;\n\t\tif (listener === undefined) return;\n\t\tthis.deliveryTail = this.deliveryTail\n\t\t\t.then(async () => {\n\t\t\t\tif (this.state === \"started\" && epoch === this.epoch) await listener(event, context);\n\t\t\t})\n\t\t\t.catch(async (error) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.onError(error, event, context);\n\t\t\t\t} catch {}\n\t\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/harness/events.ts"],"names":[],"mappings":"AAoCA,MAAM,OAAO,eAAe;IAA5B;QACkB,cAAS,GAAG,IAAI,GAAG,EAA+C,CAAC;QACnE,mBAAc,GAAG,IAAI,GAAG,EAAiC,CAAC;IA+D5E,CAAC;IA7DA;;;OAGG;IACH,EAAE,CACD,IAAW,EACX,QAAyD;QAEzD,iEAAiE;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAwB,CAAC;QAC9E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAEpC,4FAA4F;QAC5F,yFAAyF;QACzF,MAAM,OAAO,GAAyB,CAAC,KAAK,EAAE,EAAE;YAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO,QAAQ,CAAC,KAAkC,CAAC,CAAC;QAC9E,CAAC,CAAC;QACF,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACX,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAC,KAAmB;QACvB,mEAAmE;QACnE,+DAA+D;QAC/D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;QAElF,gFAAgF;QAChF,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc;YAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAY,eAAgC;QAChD,IAAI,QAA0C,CAAC;QAC/C,IAAI,QAAQ,GAAmB,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC7C,IAAI,QAAQ;gBAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;;gBAC9B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,OAAO;YACN,QAAQ;YACR,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE;gBACvB,+EAA+E;gBAC/E,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC;oBACzB,QAAQ,GAAG,EAAE,CAAC;oBACd,KAAK,MAAM,KAAK,IAAI,OAAO;wBAAE,KAAK,YAAY,CAAC,KAAK,CAAC,CAAC;gBACvD,CAAC;gBACD,QAAQ,GAAG,YAAY,CAAC;YACzB,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACpC,QAAQ,GAAG,EAAE,CAAC;YACf,CAAC;SACD,CAAC;IACH,CAAC;CACD","sourcesContent":["export interface RunStartEvent {\n\ttype: \"run_start\";\n\tlane: string;\n\trunId: string;\n}\n\nexport interface RunEndEvent {\n\ttype: \"run_end\";\n\tlane: string;\n\trunId: string;\n\toutcome: \"completed\" | \"aborted\" | \"failed\";\n\tleafId: string;\n}\n\nexport type HarnessEvent = RunStartEvent | RunEndEvent;\nexport type HarnessEventType = HarnessEvent[\"type\"];\nexport type HarnessEventOfType<TType extends HarnessEventType> = Extract<HarnessEvent, { type: TType }>;\nexport type HarnessEventListener<TEvent extends HarnessEvent = HarnessEvent> = (event: TEvent) => void | Promise<void>;\n\nexport interface Events {\n\t/**\n\t * Register a passive listener for future events and return its unsubscribe function.\n\t * Earlier events are not replayed and no current-state snapshot is provided; use a lane or session watch for both.\n\t */\n\ton<TType extends HarnessEventType>(\n\t\ttype: TType,\n\t\tlistener: HarnessEventListener<HarnessEventOfType<TType>>,\n\t): () => void;\n}\n\nexport interface WatchHandle<TSnapshot> {\n\tsnapshot: TSnapshot;\n\tstart(listener: HarnessEventListener): void;\n\tunsubscribe(): void;\n}\n\nexport class HarnessEventBus implements Events {\n\tprivate readonly listeners = new Map<HarnessEventType, Set<HarnessEventListener>>();\n\tprivate readonly watchListeners = new Set<(event: HarnessEvent) => void>();\n\n\t/**\n\t * Register a listener for future events of one type and return its unsubscribe function.\n\t * Earlier events are not replayed, and no snapshot or event buffer is provided.\n\t */\n\ton<TType extends HarnessEventType>(\n\t\ttype: TType,\n\t\tlistener: HarnessEventListener<HarnessEventOfType<TType>>,\n\t): () => void {\n\t\t// Reuse this event type's listener set, or create its first set.\n\t\tconst listeners = this.listeners.get(type) ?? new Set<HarnessEventListener>();\n\t\tthis.listeners.set(type, listeners);\n\n\t\t// Wrap this event-specific callback so it can be stored as a general HarnessEvent listener.\n\t\t// Keep the wrapper reference so unsubscribe can remove that exact function from the set.\n\t\tconst receive: HarnessEventListener = (event) => {\n\t\t\tif (event.type === type) return listener(event as HarnessEventOfType<TType>);\n\t\t};\n\t\tlisteners.add(receive);\n\t\treturn () => {\n\t\t\tlisteners.delete(receive);\n\t\t\tif (listeners.size === 0) this.listeners.delete(type);\n\t\t};\n\t}\n\n\t/** Publish an event to current event subscriptions and watch subscriptions. */\n\temit(event: HarnessEvent): void {\n\t\t// Deliver only to direct listeners registered for this event type.\n\t\t// Async results are not awaited because emit() is synchronous.\n\t\tfor (const listener of this.listeners.get(event.type) ?? []) void listener(event);\n\n\t\t// Deliver every event to each watcher; watch() handles buffering until start().\n\t\tfor (const listener of this.watchListeners) listener(event);\n\t}\n\n\twatch<TSnapshot>(captureSnapshot: () => TSnapshot): WatchHandle<TSnapshot> {\n\t\tlet listener: HarnessEventListener | undefined;\n\t\tlet buffered: HarnessEvent[] = [];\n\t\tconst receive = (event: HarnessEvent): void => {\n\t\t\tif (listener) void listener(event);\n\t\t\telse buffered.push(event);\n\t\t};\n\t\tthis.watchListeners.add(receive);\n\t\tconst snapshot = captureSnapshot();\n\n\t\treturn {\n\t\t\tsnapshot,\n\t\t\tstart: (nextListener) => {\n\t\t\t\t// Stay in buffering mode while flushing so reentrant emissions preserve order.\n\t\t\t\twhile (buffered.length > 0) {\n\t\t\t\t\tconst pending = buffered;\n\t\t\t\t\tbuffered = [];\n\t\t\t\t\tfor (const event of pending) void nextListener(event);\n\t\t\t\t}\n\t\t\t\tlistener = nextListener;\n\t\t\t},\n\t\t\tunsubscribe: () => {\n\t\t\t\tthis.watchListeners.delete(receive);\n\t\t\t\tbuffered = [];\n\t\t\t},\n\t\t};\n\t}\n}\n"]}
|
|
@@ -26,7 +26,7 @@ export interface CustomMessage<T = unknown> {
|
|
|
26
26
|
export interface BranchSummaryMessage {
|
|
27
27
|
role: "branchSummary";
|
|
28
28
|
summary: string;
|
|
29
|
-
fromId: string
|
|
29
|
+
fromId: string;
|
|
30
30
|
timestamp: number;
|
|
31
31
|
}
|
|
32
32
|
export interface CompactionSummaryMessage {
|
|
@@ -45,7 +45,7 @@ declare module "../types.ts" {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
export declare function bashExecutionToText(msg: BashExecutionMessage): string;
|
|
48
|
-
export declare function createBranchSummaryMessage(summary: string, fromId: string
|
|
48
|
+
export declare function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string | number): BranchSummaryMessage;
|
|
49
49
|
export declare function createCompactionSummaryMessage(summary: string, tokensBefore: number, timestamp: string | number): CompactionSummaryMessage;
|
|
50
50
|
export declare function createCustomMessage(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details: unknown | undefined, timestamp: string | number): CustomMessage;
|
|
51
51
|
export declare function convertToLlm(messages: AgentMessage[]): Message[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/harness/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/harness/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,yBAAyB,wGAGrC,CAAC;AAEF,eAAO,MAAM,yBAAyB,iBAC3B,CAAC;AAEZ,eAAO,MAAM,qBAAqB,iGAGjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,OAAO,QAAQ,aAAa,CAAC;IAC5B,UAAU,mBAAmB;QAC5B,aAAa,EAAE,oBAAoB,CAAC;QACpC,MAAM,EAAE,aAAa,CAAC;QACtB,aAAa,EAAE,oBAAoB,CAAC;QACpC,iBAAiB,EAAE,wBAAwB,CAAC;KAC5C;CACD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,oBAAoB,GAAG,MAAM,CAgBrE;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,MAAM,GACxB,oBAAoB,CAOtB;AAED,wBAAgB,8BAA8B,CAC7C,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAAG,MAAM,GACxB,wBAAwB,CAO1B;AAED,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,GAAG,MAAM,GACxB,aAAa,CASf;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,CAgDhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/harness/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAqD,MAAM,uBAAuB,CAAC;AAGpH,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;CAGxC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG;WAC9B,CAAC;AAEZ,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;CAGpC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;AA+ClD,MAAM,UAAU,mBAAmB,CAAC,GAAyB;IAC5D,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,OAAO,MAAM,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,IAAI,WAAW,GAAG,CAAC,MAAM,UAAU,CAAC;IACzC,CAAC;SAAM,CAAC;QACP,IAAI,IAAI,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,IAAI,yBAAyB,CAAC;IACnC,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACtF,IAAI,IAAI,gCAAgC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,IAAI,uCAAuC,GAAG,CAAC,cAAc,GAAG,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,OAAe,EACf,
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/harness/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { dropFailedAssistantTurns, type ImageContent, type Message, type TextContent } from \"@earendil-works/pi-ai\";\nimport type { AgentMessage } from \"../types.ts\";\n\nexport const COMPACTION_SUMMARY_PREFIX = `The conversation history before this point was compacted into the following summary:\n\n<summary>\n`;\n\nexport const COMPACTION_SUMMARY_SUFFIX = `\n</summary>`;\n\nexport const BRANCH_SUMMARY_PREFIX = `The following is a summary of a branch that this conversation came back from:\n\n<summary>\n`;\n\nexport const BRANCH_SUMMARY_SUFFIX = `</summary>`;\n\nexport interface BashExecutionMessage {\n\trole: \"bashExecution\";\n\tcommand: string;\n\toutput: string;\n\texitCode: number | undefined;\n\tcancelled: boolean;\n\ttruncated: boolean;\n\tfullOutputPath?: string;\n\ttimestamp: number;\n\texcludeFromContext?: boolean;\n}\n\nexport interface CustomMessage<T = unknown> {\n\trole: \"custom\";\n\tcustomType: string;\n\tcontent: string | (TextContent | ImageContent)[];\n\tdisplay: boolean;\n\tdetails?: T;\n\ttimestamp: number;\n}\n\nexport interface BranchSummaryMessage {\n\trole: \"branchSummary\";\n\tsummary: string;\n\tfromId: string;\n\ttimestamp: number;\n}\n\nexport interface CompactionSummaryMessage {\n\trole: \"compactionSummary\";\n\tsummary: string;\n\ttokensBefore: number;\n\tdetails?: unknown;\n\ttimestamp: number;\n}\n\ndeclare module \"../types.ts\" {\n\tinterface CustomAgentMessages {\n\t\tbashExecution: BashExecutionMessage;\n\t\tcustom: CustomMessage;\n\t\tbranchSummary: BranchSummaryMessage;\n\t\tcompactionSummary: CompactionSummaryMessage;\n\t}\n}\n\nexport function bashExecutionToText(msg: BashExecutionMessage): string {\n\tlet text = `Ran \\`${msg.command}\\`\\n`;\n\tif (msg.output) {\n\t\ttext += `\\`\\`\\`\\n${msg.output}\\n\\`\\`\\``;\n\t} else {\n\t\ttext += \"(no output)\";\n\t}\n\tif (msg.cancelled) {\n\t\ttext += \"\\n\\n(command cancelled)\";\n\t} else if (msg.exitCode !== null && msg.exitCode !== undefined && msg.exitCode !== 0) {\n\t\ttext += `\\n\\nCommand exited with code ${msg.exitCode}`;\n\t}\n\tif (msg.truncated && msg.fullOutputPath) {\n\t\ttext += `\\n\\n[Output truncated. Full output: ${msg.fullOutputPath}]`;\n\t}\n\treturn text;\n}\n\nexport function createBranchSummaryMessage(\n\tsummary: string,\n\tfromId: string,\n\ttimestamp: string | number,\n): BranchSummaryMessage {\n\treturn {\n\t\trole: \"branchSummary\",\n\t\tsummary,\n\t\tfromId,\n\t\ttimestamp: typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCompactionSummaryMessage(\n\tsummary: string,\n\ttokensBefore: number,\n\ttimestamp: string | number,\n): CompactionSummaryMessage {\n\treturn {\n\t\trole: \"compactionSummary\",\n\t\tsummary,\n\t\ttokensBefore,\n\t\ttimestamp: typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime(),\n\t};\n}\n\nexport function createCustomMessage(\n\tcustomType: string,\n\tcontent: string | (TextContent | ImageContent)[],\n\tdisplay: boolean,\n\tdetails: unknown | undefined,\n\ttimestamp: string | number,\n): CustomMessage {\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType,\n\t\tcontent,\n\t\tdisplay,\n\t\tdetails,\n\t\ttimestamp: typeof timestamp === \"number\" ? timestamp : new Date(timestamp).getTime(),\n\t};\n}\n\nexport function convertToLlm(messages: AgentMessage[]): Message[] {\n\tconst converted = messages\n\t\t.map((m): Message | undefined => {\n\t\t\tswitch (m.role) {\n\t\t\t\tcase \"bashExecution\":\n\t\t\t\t\tif (m.excludeFromContext) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: bashExecutionToText(m) }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"custom\": {\n\t\t\t\t\tconst content = typeof m.content === \"string\" ? [{ type: \"text\" as const, text: m.content }] : m.content;\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"branchSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: BRANCH_SUMMARY_PREFIX + m.summary + BRANCH_SUMMARY_SUFFIX }],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"compactionSummary\":\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: COMPACTION_SUMMARY_PREFIX + m.summary + COMPACTION_SUMMARY_SUFFIX },\n\t\t\t\t\t\t],\n\t\t\t\t\t\ttimestamp: m.timestamp,\n\t\t\t\t\t};\n\t\t\t\tcase \"user\":\n\t\t\t\tcase \"assistant\":\n\t\t\t\tcase \"toolResult\":\n\t\t\t\t\treturn m;\n\t\t\t\tdefault:\n\t\t\t\t\treturn undefined;\n\t\t\t}\n\t\t})\n\t\t.filter((m): m is Message => m !== undefined);\n\t// Failed provider turns (stopReason error/aborted) must not be replayed by\n\t// any lane that builds an LLM request from this output; dropping is\n\t// deterministic, so earlier requests stay a prefix of later ones.\n\treturn dropFailedAssistantTurns(converted);\n}\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Context } from "./context.ts";
|
|
2
1
|
import { type ExecutionEnv, type PromptTemplate } from "./types.ts";
|
|
3
2
|
export type PromptTemplateDiagnosticCode = "file_info_failed" | "list_failed" | "read_failed" | "parse_failed";
|
|
4
3
|
/** Warning produced while loading prompt templates. */
|
|
@@ -18,7 +17,7 @@ export interface PromptTemplateDiagnostic {
|
|
|
18
17
|
* Directory inputs load direct `.md` children non-recursively. File inputs load explicit `.md` files. Missing paths and
|
|
19
18
|
* non-markdown files are skipped. Read and parse failures are returned as diagnostics.
|
|
20
19
|
*/
|
|
21
|
-
export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | string[]
|
|
20
|
+
export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | string[]): Promise<{
|
|
22
21
|
promptTemplates: PromptTemplate[];
|
|
23
22
|
diagnostics: PromptTemplateDiagnostic[];
|
|
24
23
|
}>;
|
|
@@ -31,7 +30,7 @@ export declare function loadPromptTemplates(env: ExecutionEnv, paths: string | s
|
|
|
31
30
|
export declare function loadSourcedPromptTemplates<TSource, TPromptTemplate extends PromptTemplate = PromptTemplate>(env: ExecutionEnv, inputs: Array<{
|
|
32
31
|
path: string;
|
|
33
32
|
source: TSource;
|
|
34
|
-
}>, mapPromptTemplate
|
|
33
|
+
}>, mapPromptTemplate?: (promptTemplate: PromptTemplate, source: TSource) => TPromptTemplate): Promise<{
|
|
35
34
|
promptTemplates: Array<{
|
|
36
35
|
promptTemplate: TPromptTemplate;
|
|
37
36
|
source: TSource;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/harness/prompt-templates.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../src/harness/prompt-templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAiB,KAAK,cAAc,EAAwB,MAAM,YAAY,CAAC;AAEzG,MAAM,MAAM,4BAA4B,GAAG,kBAAkB,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;AAE/G,uDAAuD;AACvD,MAAM,WAAW,wBAAwB;IACxC,gEAAgE;IAChE,IAAI,EAAE,SAAS,CAAC;IAChB,8BAA8B;IAC9B,IAAI,EAAE,4BAA4B,CAAC;IACnC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACb;AAQD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GACtB,OAAO,CAAC;IAAE,eAAe,EAAE,cAAc,EAAE,CAAC;IAAC,WAAW,EAAE,wBAAwB,EAAE,CAAA;CAAE,CAAC,CA6BzF;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,eAAe,SAAS,cAAc,GAAG,cAAc,EAChH,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,KAAK,eAAe,GACtF,OAAO,CAAC;IACV,eAAe,EAAE,KAAK,CAAC;QAAE,cAAc,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7E,WAAW,EAAE,KAAK,CAAC,wBAAwB,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE,CAAC,CAgBD;AA4HD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB7D;AAED,uHAAuH;AACvH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAatE;AAED,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,MAAM,CAEpG"}
|
|
@@ -6,11 +6,11 @@ import { toError } from "./types.js";
|
|
|
6
6
|
* Directory inputs load direct `.md` children non-recursively. File inputs load explicit `.md` files. Missing paths and
|
|
7
7
|
* non-markdown files are skipped. Read and parse failures are returned as diagnostics.
|
|
8
8
|
*/
|
|
9
|
-
export async function loadPromptTemplates(env, paths
|
|
9
|
+
export async function loadPromptTemplates(env, paths) {
|
|
10
10
|
const promptTemplates = [];
|
|
11
11
|
const diagnostics = [];
|
|
12
12
|
for (const path of Array.isArray(paths) ? paths : [paths]) {
|
|
13
|
-
const infoResult = await env.fileInfo(path
|
|
13
|
+
const infoResult = await env.fileInfo(path);
|
|
14
14
|
if (!infoResult.ok) {
|
|
15
15
|
if (infoResult.error.code !== "not_found") {
|
|
16
16
|
diagnostics.push({
|
|
@@ -23,14 +23,14 @@ export async function loadPromptTemplates(env, paths, context) {
|
|
|
23
23
|
continue;
|
|
24
24
|
}
|
|
25
25
|
const info = infoResult.value;
|
|
26
|
-
const kind = await resolveKind(env, info, diagnostics
|
|
26
|
+
const kind = await resolveKind(env, info, diagnostics);
|
|
27
27
|
if (kind === "directory") {
|
|
28
|
-
const result = await loadTemplatesFromDir(env, info.path
|
|
28
|
+
const result = await loadTemplatesFromDir(env, info.path);
|
|
29
29
|
promptTemplates.push(...result.promptTemplates);
|
|
30
30
|
diagnostics.push(...result.diagnostics);
|
|
31
31
|
}
|
|
32
32
|
else if (kind === "file" && info.name.endsWith(".md")) {
|
|
33
|
-
const result = await loadTemplateFromFile(env, info.path, info.name
|
|
33
|
+
const result = await loadTemplateFromFile(env, info.path, info.name);
|
|
34
34
|
if (result.promptTemplate)
|
|
35
35
|
promptTemplates.push(result.promptTemplate);
|
|
36
36
|
diagnostics.push(...result.diagnostics);
|
|
@@ -44,15 +44,15 @@ export async function loadPromptTemplates(env, paths, context) {
|
|
|
44
44
|
* Source values are preserved exactly and attached to every loaded prompt template and diagnostic. The agent package does
|
|
45
45
|
* not interpret source values; applications define their own provenance shape.
|
|
46
46
|
*/
|
|
47
|
-
export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate
|
|
47
|
+
export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate) {
|
|
48
48
|
const promptTemplates = [];
|
|
49
49
|
const diagnostics = [];
|
|
50
50
|
for (const input of inputs) {
|
|
51
|
-
const result = await loadPromptTemplates(env, input.path
|
|
51
|
+
const result = await loadPromptTemplates(env, input.path);
|
|
52
52
|
for (const promptTemplate of result.promptTemplates) {
|
|
53
53
|
promptTemplates.push({
|
|
54
54
|
promptTemplate: mapPromptTemplate
|
|
55
|
-
? mapPromptTemplate(promptTemplate, input.source
|
|
55
|
+
? mapPromptTemplate(promptTemplate, input.source)
|
|
56
56
|
: promptTemplate,
|
|
57
57
|
source: input.source,
|
|
58
58
|
});
|
|
@@ -62,10 +62,10 @@ export async function loadSourcedPromptTemplates(env, inputs, mapPromptTemplate,
|
|
|
62
62
|
}
|
|
63
63
|
return { promptTemplates, diagnostics };
|
|
64
64
|
}
|
|
65
|
-
async function loadTemplatesFromDir(env, dir
|
|
65
|
+
async function loadTemplatesFromDir(env, dir) {
|
|
66
66
|
const promptTemplates = [];
|
|
67
67
|
const diagnostics = [];
|
|
68
|
-
const entriesResult = await env.listDir(dir
|
|
68
|
+
const entriesResult = await env.listDir(dir);
|
|
69
69
|
if (!entriesResult.ok) {
|
|
70
70
|
diagnostics.push({
|
|
71
71
|
type: "warning",
|
|
@@ -77,19 +77,19 @@ async function loadTemplatesFromDir(env, dir, context) {
|
|
|
77
77
|
}
|
|
78
78
|
const entries = entriesResult.value;
|
|
79
79
|
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
80
|
-
const kind = await resolveKind(env, entry, diagnostics
|
|
80
|
+
const kind = await resolveKind(env, entry, diagnostics);
|
|
81
81
|
if (kind !== "file" || !entry.name.endsWith(".md"))
|
|
82
82
|
continue;
|
|
83
|
-
const result = await loadTemplateFromFile(env, entry.path, entry.name
|
|
83
|
+
const result = await loadTemplateFromFile(env, entry.path, entry.name);
|
|
84
84
|
if (result.promptTemplate)
|
|
85
85
|
promptTemplates.push(result.promptTemplate);
|
|
86
86
|
diagnostics.push(...result.diagnostics);
|
|
87
87
|
}
|
|
88
88
|
return { promptTemplates, diagnostics };
|
|
89
89
|
}
|
|
90
|
-
async function loadTemplateFromFile(env, filePath, fileName
|
|
90
|
+
async function loadTemplateFromFile(env, filePath, fileName) {
|
|
91
91
|
const diagnostics = [];
|
|
92
|
-
const rawContent = await env.readTextFile(filePath
|
|
92
|
+
const rawContent = await env.readTextFile(filePath);
|
|
93
93
|
if (!rawContent.ok) {
|
|
94
94
|
diagnostics.push({
|
|
95
95
|
type: "warning",
|
|
@@ -126,10 +126,10 @@ async function loadTemplateFromFile(env, filePath, fileName, context) {
|
|
|
126
126
|
diagnostics,
|
|
127
127
|
};
|
|
128
128
|
}
|
|
129
|
-
async function resolveKind(env, info, diagnostics
|
|
129
|
+
async function resolveKind(env, info, diagnostics) {
|
|
130
130
|
if (info.kind === "file" || info.kind === "directory")
|
|
131
131
|
return info.kind;
|
|
132
|
-
const canonicalPath = await env.canonicalPath(info.path
|
|
132
|
+
const canonicalPath = await env.canonicalPath(info.path);
|
|
133
133
|
if (!canonicalPath.ok) {
|
|
134
134
|
if (canonicalPath.error.code !== "not_found") {
|
|
135
135
|
diagnostics.push({
|
|
@@ -141,7 +141,7 @@ async function resolveKind(env, info, diagnostics, context) {
|
|
|
141
141
|
}
|
|
142
142
|
return undefined;
|
|
143
143
|
}
|
|
144
|
-
const target = await env.fileInfo(canonicalPath.value
|
|
144
|
+
const target = await env.fileInfo(canonicalPath.value);
|
|
145
145
|
if (!target.ok) {
|
|
146
146
|
if (target.error.code !== "not_found") {
|
|
147
147
|
diagnostics.push({
|