@mobrienv/autoloop 0.1.2
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 +145 -0
- package/bin/autoloop +2 -0
- package/dist/backend/index.d.ts +10 -0
- package/dist/backend/index.js +59 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/run-command.d.ts +7 -0
- package/dist/backend/run-command.js +50 -0
- package/dist/backend/run-command.js.map +1 -0
- package/dist/backend/run-mock.d.ts +1 -0
- package/dist/backend/run-mock.js +6 -0
- package/dist/backend/run-mock.js.map +1 -0
- package/dist/backend/run-pi.d.ts +5 -0
- package/dist/backend/run-pi.js +5 -0
- package/dist/backend/run-pi.js.map +1 -0
- package/dist/backend/types.d.ts +21 -0
- package/dist/backend/types.js +2 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/chains/budget.d.ts +7 -0
- package/dist/chains/budget.js +42 -0
- package/dist/chains/budget.js.map +1 -0
- package/dist/chains/load.d.ts +12 -0
- package/dist/chains/load.js +80 -0
- package/dist/chains/load.js.map +1 -0
- package/dist/chains/render.d.ts +2 -0
- package/dist/chains/render.js +46 -0
- package/dist/chains/render.js.map +1 -0
- package/dist/chains/run.d.ts +17 -0
- package/dist/chains/run.js +175 -0
- package/dist/chains/run.js.map +1 -0
- package/dist/chains/types.d.ts +37 -0
- package/dist/chains/types.js +2 -0
- package/dist/chains/types.js.map +1 -0
- package/dist/chains.d.ts +5 -0
- package/dist/chains.js +5 -0
- package/dist/chains.js.map +1 -0
- package/dist/commands/chain.d.ts +1 -0
- package/dist/commands/chain.js +51 -0
- package/dist/commands/chain.js.map +1 -0
- package/dist/commands/inspect.d.ts +1 -0
- package/dist/commands/inspect.js +95 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +12 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/loops.d.ts +1 -0
- package/dist/commands/loops.js +72 -0
- package/dist/commands/loops.js.map +1 -0
- package/dist/commands/memory.d.ts +1 -0
- package/dist/commands/memory.js +65 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/pi-adapter.d.ts +1 -0
- package/dist/commands/pi-adapter.js +6 -0
- package/dist/commands/pi-adapter.js.map +1 -0
- package/dist/commands/run.d.ts +1 -0
- package/dist/commands/run.js +185 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +169 -0
- package/dist/config.js.map +1 -0
- package/dist/events/decode.d.ts +2 -0
- package/dist/events/decode.js +45 -0
- package/dist/events/decode.js.map +1 -0
- package/dist/events/encode.d.ts +2 -0
- package/dist/events/encode.js +33 -0
- package/dist/events/encode.js.map +1 -0
- package/dist/events/guards.d.ts +5 -0
- package/dist/events/guards.js +42 -0
- package/dist/events/guards.js.map +1 -0
- package/dist/events/types.d.ts +25 -0
- package/dist/events/types.js +2 -0
- package/dist/events/types.js.map +1 -0
- package/dist/harness/config-helpers.d.ts +24 -0
- package/dist/harness/config-helpers.js +231 -0
- package/dist/harness/config-helpers.js.map +1 -0
- package/dist/harness/coordination.d.ts +1 -0
- package/dist/harness/coordination.js +127 -0
- package/dist/harness/coordination.js.map +1 -0
- package/dist/harness/display.d.ts +20 -0
- package/dist/harness/display.js +130 -0
- package/dist/harness/display.js.map +1 -0
- package/dist/harness/emit.d.ts +15 -0
- package/dist/harness/emit.js +220 -0
- package/dist/harness/emit.js.map +1 -0
- package/dist/harness/index.d.ts +13 -0
- package/dist/harness/index.js +124 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/iteration.d.ts +4 -0
- package/dist/harness/iteration.js +129 -0
- package/dist/harness/iteration.js.map +1 -0
- package/dist/harness/journal.d.ts +13 -0
- package/dist/harness/journal.js +106 -0
- package/dist/harness/journal.js.map +1 -0
- package/dist/harness/metareview.d.ts +4 -0
- package/dist/harness/metareview.js +33 -0
- package/dist/harness/metareview.js.map +1 -0
- package/dist/harness/metrics.d.ts +12 -0
- package/dist/harness/metrics.js +180 -0
- package/dist/harness/metrics.js.map +1 -0
- package/dist/harness/parallel.d.ts +37 -0
- package/dist/harness/parallel.js +158 -0
- package/dist/harness/parallel.js.map +1 -0
- package/dist/harness/prompt.d.ts +35 -0
- package/dist/harness/prompt.js +328 -0
- package/dist/harness/prompt.js.map +1 -0
- package/dist/harness/scratchpad.d.ts +2 -0
- package/dist/harness/scratchpad.js +65 -0
- package/dist/harness/scratchpad.js.map +1 -0
- package/dist/harness/stop.d.ts +5 -0
- package/dist/harness/stop.js +63 -0
- package/dist/harness/stop.js.map +1 -0
- package/dist/harness/tools.d.ts +3 -0
- package/dist/harness/tools.js +39 -0
- package/dist/harness/tools.js.map +1 -0
- package/dist/harness/types.d.ts +81 -0
- package/dist/harness/types.js +2 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/wave/finalize-wave.d.ts +9 -0
- package/dist/harness/wave/finalize-wave.js +60 -0
- package/dist/harness/wave/finalize-wave.js.map +1 -0
- package/dist/harness/wave/launch-branches.d.ts +6 -0
- package/dist/harness/wave/launch-branches.js +218 -0
- package/dist/harness/wave/launch-branches.js.map +1 -0
- package/dist/harness/wave/parse-objectives.d.ts +3 -0
- package/dist/harness/wave/parse-objectives.js +29 -0
- package/dist/harness/wave/parse-objectives.js.map +1 -0
- package/dist/harness/wave/types.d.ts +43 -0
- package/dist/harness/wave/types.js +2 -0
- package/dist/harness/wave/types.js.map +1 -0
- package/dist/harness/wave.d.ts +6 -0
- package/dist/harness/wave.js +98 -0
- package/dist/harness/wave.js.map +1 -0
- package/dist/json.d.ts +8 -0
- package/dist/json.js +80 -0
- package/dist/json.js.map +1 -0
- package/dist/loops/health.d.ts +14 -0
- package/dist/loops/health.js +104 -0
- package/dist/loops/health.js.map +1 -0
- package/dist/loops/list.d.ts +6 -0
- package/dist/loops/list.js +21 -0
- package/dist/loops/list.js.map +1 -0
- package/dist/loops/render.d.ts +18 -0
- package/dist/loops/render.js +87 -0
- package/dist/loops/render.js.map +1 -0
- package/dist/loops/show.d.ts +8 -0
- package/dist/loops/show.js +31 -0
- package/dist/loops/show.js.map +1 -0
- package/dist/loops/watch.d.ts +8 -0
- package/dist/loops/watch.js +77 -0
- package/dist/loops/watch.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +101 -0
- package/dist/main.js.map +1 -0
- package/dist/markdown.d.ts +10 -0
- package/dist/markdown.js +66 -0
- package/dist/markdown.js.map +1 -0
- package/dist/memory-render.d.ts +6 -0
- package/dist/memory-render.js +81 -0
- package/dist/memory-render.js.map +1 -0
- package/dist/memory.d.ts +23 -0
- package/dist/memory.js +314 -0
- package/dist/memory.js.map +1 -0
- package/dist/pi-adapter.d.ts +1 -0
- package/dist/pi-adapter.js +220 -0
- package/dist/pi-adapter.js.map +1 -0
- package/dist/registry/derive.d.ts +8 -0
- package/dist/registry/derive.js +81 -0
- package/dist/registry/derive.js.map +1 -0
- package/dist/registry/harness.d.ts +7 -0
- package/dist/registry/harness.js +57 -0
- package/dist/registry/harness.js.map +1 -0
- package/dist/registry/index.d.ts +5 -0
- package/dist/registry/index.js +5 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/read.d.ts +11 -0
- package/dist/registry/read.js +50 -0
- package/dist/registry/read.js.map +1 -0
- package/dist/registry/rebuild.d.ts +5 -0
- package/dist/registry/rebuild.js +19 -0
- package/dist/registry/rebuild.js.map +1 -0
- package/dist/registry/types.d.ts +19 -0
- package/dist/registry/types.js +2 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/registry/update.d.ts +2 -0
- package/dist/registry/update.js +7 -0
- package/dist/registry/update.js.map +1 -0
- package/dist/testing/mock-backend.d.ts +11 -0
- package/dist/testing/mock-backend.js +76 -0
- package/dist/testing/mock-backend.js.map +1 -0
- package/dist/topology.d.ts +25 -0
- package/dist/topology.js +188 -0
- package/dist/topology.js.map +1 -0
- package/dist/usage.d.ts +8 -0
- package/dist/usage.js +114 -0
- package/dist/usage.js.map +1 -0
- package/dist/utils.d.ts +15 -0
- package/dist/utils.js +79 -0
- package/dist/utils.js.map +1 -0
- package/package.json +52 -0
- package/presets/autocode/README.md +81 -0
- package/presets/autocode/autoloops.toml +22 -0
- package/presets/autocode/harness.md +19 -0
- package/presets/autocode/miniloops.toml +22 -0
- package/presets/autocode/roles/build.md +33 -0
- package/presets/autocode/roles/critic.md +40 -0
- package/presets/autocode/roles/finalizer.md +43 -0
- package/presets/autocode/roles/planner.md +40 -0
- package/presets/autocode/topology.toml +32 -0
- package/presets/autodoc/README.md +42 -0
- package/presets/autodoc/autoloops.toml +21 -0
- package/presets/autodoc/harness.md +19 -0
- package/presets/autodoc/miniloops.toml +21 -0
- package/presets/autodoc/roles/auditor.md +39 -0
- package/presets/autodoc/roles/checker.md +43 -0
- package/presets/autodoc/roles/publisher.md +51 -0
- package/presets/autodoc/roles/writer.md +37 -0
- package/presets/autodoc/topology.toml +31 -0
- package/presets/autofix/README.md +56 -0
- package/presets/autofix/autoloops.toml +21 -0
- package/presets/autofix/harness.md +24 -0
- package/presets/autofix/miniloops.toml +21 -0
- package/presets/autofix/roles/closer.md +48 -0
- package/presets/autofix/roles/diagnoser.md +42 -0
- package/presets/autofix/roles/fixer.md +28 -0
- package/presets/autofix/roles/verifier.md +31 -0
- package/presets/autofix/topology.toml +33 -0
- package/presets/autoideas/README.md +73 -0
- package/presets/autoideas/autoloops.toml +18 -0
- package/presets/autoideas/harness.md +31 -0
- package/presets/autoideas/miniloops.toml +18 -0
- package/presets/autoideas/roles/analyst.md +32 -0
- package/presets/autoideas/roles/reviewer.md +36 -0
- package/presets/autoideas/roles/scanner.md +26 -0
- package/presets/autoideas/roles/synthesizer.md +48 -0
- package/presets/autoideas/topology.toml +32 -0
- package/presets/autoperf/README.md +56 -0
- package/presets/autoperf/autoloops.toml +21 -0
- package/presets/autoperf/harness.md +21 -0
- package/presets/autoperf/miniloops.toml +21 -0
- package/presets/autoperf/roles/judge.md +38 -0
- package/presets/autoperf/roles/measurer.md +36 -0
- package/presets/autoperf/roles/optimizer.md +35 -0
- package/presets/autoperf/roles/profiler.md +38 -0
- package/presets/autoperf/topology.toml +32 -0
- package/presets/autoqa/README.md +76 -0
- package/presets/autoqa/autoloops.toml +21 -0
- package/presets/autoqa/harness.md +30 -0
- package/presets/autoqa/miniloops.toml +21 -0
- package/presets/autoqa/roles/executor.md +43 -0
- package/presets/autoqa/roles/inspector.md +45 -0
- package/presets/autoqa/roles/planner.md +55 -0
- package/presets/autoqa/roles/reporter.md +74 -0
- package/presets/autoqa/topology.toml +31 -0
- package/presets/autoresearch/README.md +63 -0
- package/presets/autoresearch/autoloops.toml +18 -0
- package/presets/autoresearch/harness.md +28 -0
- package/presets/autoresearch/miniloops.toml +18 -0
- package/presets/autoresearch/roles/benchmarker.md +34 -0
- package/presets/autoresearch/roles/evaluator.md +33 -0
- package/presets/autoresearch/roles/implementer.md +26 -0
- package/presets/autoresearch/roles/strategist.md +43 -0
- package/presets/autoresearch/topology.toml +31 -0
- package/presets/autoreview/README.md +51 -0
- package/presets/autoreview/autoloops.toml +21 -0
- package/presets/autoreview/harness.md +20 -0
- package/presets/autoreview/miniloops.toml +21 -0
- package/presets/autoreview/roles/checker.md +36 -0
- package/presets/autoreview/roles/reader.md +33 -0
- package/presets/autoreview/roles/suggester.md +26 -0
- package/presets/autoreview/roles/summarizer.md +57 -0
- package/presets/autoreview/topology.toml +31 -0
- package/presets/autosec/README.md +51 -0
- package/presets/autosec/autoloops.toml +21 -0
- package/presets/autosec/harness.md +20 -0
- package/presets/autosec/miniloops.toml +21 -0
- package/presets/autosec/roles/analyst.md +38 -0
- package/presets/autosec/roles/hardener.md +36 -0
- package/presets/autosec/roles/reporter.md +63 -0
- package/presets/autosec/roles/scanner.md +38 -0
- package/presets/autosec/topology.toml +31 -0
- package/presets/autosimplify/README.md +83 -0
- package/presets/autosimplify/autoloops.toml +22 -0
- package/presets/autosimplify/harness.md +25 -0
- package/presets/autosimplify/miniloops.toml +22 -0
- package/presets/autosimplify/roles/reviewer.md +38 -0
- package/presets/autosimplify/roles/scoper.md +42 -0
- package/presets/autosimplify/roles/simplifier.md +51 -0
- package/presets/autosimplify/roles/verifier.md +40 -0
- package/presets/autosimplify/topology.toml +32 -0
- package/presets/autospec/README.md +84 -0
- package/presets/autospec/autoloops.toml +21 -0
- package/presets/autospec/harness.md +23 -0
- package/presets/autospec/miniloops.toml +21 -0
- package/presets/autospec/roles/clarifier.md +38 -0
- package/presets/autospec/roles/critic.md +41 -0
- package/presets/autospec/roles/designer.md +37 -0
- package/presets/autospec/roles/planner.md +38 -0
- package/presets/autospec/roles/researcher.md +33 -0
- package/presets/autospec/topology.toml +38 -0
- package/presets/autotest/README.md +55 -0
- package/presets/autotest/autoloops.toml +21 -0
- package/presets/autotest/harness.md +21 -0
- package/presets/autotest/miniloops.toml +21 -0
- package/presets/autotest/roles/assessor.md +57 -0
- package/presets/autotest/roles/runner.md +31 -0
- package/presets/autotest/roles/surveyor.md +39 -0
- package/presets/autotest/roles/writer.md +37 -0
- package/presets/autotest/topology.toml +32 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsonField } from "../../json.js";
|
|
2
|
+
import { appendEvent, appendHarnessEvent } from "../journal.js";
|
|
3
|
+
import { parallelDispatchBase, parallelJoinedTopic } from "../emit.js";
|
|
4
|
+
import * as topology from "../../topology.js";
|
|
5
|
+
import { joinCsv } from "../../utils.js";
|
|
6
|
+
export function finalizeParallelWave(loop, iter, waveId, results) {
|
|
7
|
+
const timedOut = results.filter(r => r.stopReason === "backend_timeout").map(r => r.branchId);
|
|
8
|
+
if (timedOut.length > 0) {
|
|
9
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.timeout", jsonField("wave_id", waveId) + ", " + jsonField("timed_out_branches", joinCsv(timedOut)));
|
|
10
|
+
return { reason: "parallel_wave_timeout", waveId };
|
|
11
|
+
}
|
|
12
|
+
const failed = results.filter(r => !branchSuccessStatus(r.stopReason)).map(r => r.branchId);
|
|
13
|
+
if (failed.length > 0) {
|
|
14
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.failed", jsonField("wave_id", waveId) + ", " + jsonField("failed_branches", joinCsv(failed)));
|
|
15
|
+
return { reason: "parallel_wave_failed", waveId };
|
|
16
|
+
}
|
|
17
|
+
return { reason: "parallel_wave_complete", waveId };
|
|
18
|
+
}
|
|
19
|
+
function branchSuccessStatus(status) {
|
|
20
|
+
return status === "max_iterations" || status === "completion_event" || status === "completion_promise";
|
|
21
|
+
}
|
|
22
|
+
export function continueAfterParallelJoin(loop, iter, waveId, emittedTopic, totalElapsedMs, iterateFn) {
|
|
23
|
+
const joinedTopic = parallelJoinedTopic(emittedTopic);
|
|
24
|
+
appendWaveJoinFinish(loop, iter, waveId, emittedTopic, joinedTopic, totalElapsedMs);
|
|
25
|
+
appendHarnessEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), joinedTopic, waveId);
|
|
26
|
+
return iterateFn(loop, iter.iteration + 1);
|
|
27
|
+
}
|
|
28
|
+
export function stopAfterParallelWave(loop, iter, reason, waveId) {
|
|
29
|
+
const fields = jsonField("reason", reason) + ", " + jsonField("iteration", String(iter.iteration)) + (waveId ? ", " + jsonField("wave_id", waveId) : "");
|
|
30
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "loop.stop", fields);
|
|
31
|
+
return { iterations: iter.iteration, stopReason: reason };
|
|
32
|
+
}
|
|
33
|
+
function joinedResumeRoutingBasis(iter, emittedTopic) {
|
|
34
|
+
if (emittedTopic === "explore.parallel")
|
|
35
|
+
return iter.recentEvent;
|
|
36
|
+
return parallelDispatchBase(emittedTopic) || iter.recentEvent;
|
|
37
|
+
}
|
|
38
|
+
function joinedResumeRecentEvent(iter, emittedTopic, joinedTopic) {
|
|
39
|
+
if (emittedTopic === "explore.parallel")
|
|
40
|
+
return iter.recentEvent;
|
|
41
|
+
return joinedTopic;
|
|
42
|
+
}
|
|
43
|
+
function joinedResumeRoles(loop, iter, emittedTopic, routingBasis) {
|
|
44
|
+
if (emittedTopic === "explore.parallel")
|
|
45
|
+
return iter.allowedRoles;
|
|
46
|
+
return topology.suggestedRoles(loop.topology, routingBasis);
|
|
47
|
+
}
|
|
48
|
+
function joinedResumeEvents(loop, iter, emittedTopic, routingBasis) {
|
|
49
|
+
if (emittedTopic === "explore.parallel")
|
|
50
|
+
return iter.allowedEvents;
|
|
51
|
+
return topology.allowedEvents(loop.topology, routingBasis);
|
|
52
|
+
}
|
|
53
|
+
function appendWaveJoinFinish(loop, iter, waveId, emittedTopic, joinedTopic, totalElapsed) {
|
|
54
|
+
const routingBasis = joinedResumeRoutingBasis(iter, emittedTopic);
|
|
55
|
+
const resumeRecentEvent = joinedResumeRecentEvent(iter, emittedTopic, joinedTopic);
|
|
56
|
+
const resumeRoles = joinedResumeRoles(loop, iter, emittedTopic, routingBasis);
|
|
57
|
+
const resumeEvents = joinedResumeEvents(loop, iter, emittedTopic, routingBasis);
|
|
58
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.join.finish", jsonField("wave_id", waveId) + ", " + jsonField("trigger_topic", emittedTopic) + ", " + jsonField("joined_topic", joinedTopic) + ", " + jsonField("routing_basis", routingBasis) + ", " + jsonField("resume_recent_event", resumeRecentEvent) + ", " + jsonField("resume_roles", joinCsv(resumeRoles)) + ", " + jsonField("resume_events", joinCsv(resumeEvents)) + ", " + jsonField("elapsed_ms", String(totalElapsed)));
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=finalize-wave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finalize-wave.js","sourceRoot":"","sources":["../../../src/harness/wave/finalize-wave.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LoopContext } from "../types.js";
|
|
2
|
+
import type { IterationContext } from "../prompt.js";
|
|
3
|
+
import type { BranchSpec, BranchResult } from "./types.js";
|
|
4
|
+
export declare function prepareParallelBranches(loop: LoopContext, iter: IterationContext, waveId: string, waveDir: string, emittedTopic: string, objectives: string[]): BranchSpec[];
|
|
5
|
+
export declare function launchParallelBranches(loop: LoopContext, specs: BranchSpec[]): BranchSpec[];
|
|
6
|
+
export declare function joinParallelBranches(loop: LoopContext, iter: IterationContext, waveId: string, pending: BranchSpec[]): BranchResult[];
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync, chmodSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { execSync } from "node:child_process";
|
|
4
|
+
import { jsonField } from "../../json.js";
|
|
5
|
+
import { joinCsv, listText, shellQuote } from "../../utils.js";
|
|
6
|
+
import * as md from "../../markdown.js";
|
|
7
|
+
import * as topology from "../../topology.js";
|
|
8
|
+
import { readIfExists, appendEvent, extractField } from "../journal.js";
|
|
9
|
+
import { parallelDispatchBase } from "../emit.js";
|
|
10
|
+
import { runProcess, writeParallelBranchSummary, renderBranchResult } from "../parallel.js";
|
|
11
|
+
export function prepareParallelBranches(loop, iter, waveId, waveDir, emittedTopic, objectives) {
|
|
12
|
+
return objectives.map((objective, i) => {
|
|
13
|
+
const branchId = `branch-${i + 1}`;
|
|
14
|
+
const branchDir = join(waveDir, "branches", branchId);
|
|
15
|
+
const routingEvent = branchRoutingEvent(iter, emittedTopic);
|
|
16
|
+
const branchRoles = topology.suggestedRoles(loop.topology, routingEvent);
|
|
17
|
+
const branchEvents = topology.allowedEvents(loop.topology, routingEvent);
|
|
18
|
+
const prompt = renderBranchPrompt(loop, objective, emittedTopic, routingEvent, branchRoles, branchEvents);
|
|
19
|
+
const spec = {
|
|
20
|
+
branchId, waveId, objective, emittedTopic, routingEvent,
|
|
21
|
+
allowedRoles: branchRoles, allowedEvents: branchEvents, prompt,
|
|
22
|
+
branchDir,
|
|
23
|
+
launchFile: join(branchDir, "launch.json"),
|
|
24
|
+
summaryFile: join(branchDir, "summary.json"),
|
|
25
|
+
stdoutFile: join(branchDir, "stdout.log"),
|
|
26
|
+
stderrFile: join(branchDir, "stderr.log"),
|
|
27
|
+
statusFile: join(branchDir, "status.txt"),
|
|
28
|
+
pidFile: join(branchDir, "pid.txt"),
|
|
29
|
+
supervisorFile: join(branchDir, "supervisor.sh"),
|
|
30
|
+
launchMs: 0,
|
|
31
|
+
};
|
|
32
|
+
mkdirSync(branchDir, { recursive: true });
|
|
33
|
+
writeFileSync(join(branchDir, "objective.md"), renderBranchObjective(objective, emittedTopic, routingEvent, branchRoles, branchEvents));
|
|
34
|
+
writeBranchLaunch(spec, loop);
|
|
35
|
+
appendWaveBranchStart(loop, iter, waveId, branchId, objective, routingEvent, branchRoles, branchEvents);
|
|
36
|
+
return spec;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export function launchParallelBranches(loop, specs) {
|
|
40
|
+
return specs.map(spec => launchBranch(loop, spec));
|
|
41
|
+
}
|
|
42
|
+
function launchBranch(loop, spec) {
|
|
43
|
+
const launchMs = Date.now();
|
|
44
|
+
writeSupervisor(loop, spec);
|
|
45
|
+
const cmd = `rm -f ${shellQuote(spec.stdoutFile)} ${shellQuote(spec.stderrFile)} ${shellQuote(spec.statusFile)} ${shellQuote(spec.pidFile)} ; ` +
|
|
46
|
+
`nohup sh ${shellQuote(spec.supervisorFile)} >/dev/null 2>&1 & printf '%s' "$!" > ${shellQuote(spec.pidFile)}`;
|
|
47
|
+
runProcess(cmd, 10000);
|
|
48
|
+
const launched = { ...spec, launchMs };
|
|
49
|
+
const pid = readIfExists(spec.pidFile).trim();
|
|
50
|
+
if (!pid)
|
|
51
|
+
recordLaunchFailure(launched);
|
|
52
|
+
return launched;
|
|
53
|
+
}
|
|
54
|
+
export function joinParallelBranches(loop, iter, waveId, pending) {
|
|
55
|
+
const results = [];
|
|
56
|
+
let remaining = [...pending];
|
|
57
|
+
while (remaining.length > 0) {
|
|
58
|
+
const ready = [];
|
|
59
|
+
const stillPending = [];
|
|
60
|
+
for (const spec of remaining) {
|
|
61
|
+
const polled = pollBranch(loop, spec);
|
|
62
|
+
if (polled)
|
|
63
|
+
ready.push(polled);
|
|
64
|
+
else
|
|
65
|
+
stillPending.push(spec);
|
|
66
|
+
}
|
|
67
|
+
if (ready.length > 0) {
|
|
68
|
+
for (const r of sortByFinishedAt(ready)) {
|
|
69
|
+
appendWaveBranchFinish(loop, iter, waveId, r.branchId, r);
|
|
70
|
+
results.push(r);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
remaining = stillPending;
|
|
74
|
+
if (remaining.length > 0 && ready.length === 0) {
|
|
75
|
+
try {
|
|
76
|
+
execSync("sleep 0.1");
|
|
77
|
+
}
|
|
78
|
+
catch { /* */ }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
function writeBranchLaunch(spec, loop) {
|
|
84
|
+
const fields = jsonField("branch_id", spec.branchId) + ", " +
|
|
85
|
+
jsonField("objective", spec.objective) + ", " +
|
|
86
|
+
jsonField("emitted_topic", spec.emittedTopic) + ", " +
|
|
87
|
+
jsonField("routing_event", spec.routingEvent) + ", " +
|
|
88
|
+
jsonField("allowed_roles", joinCsv(spec.allowedRoles)) + ", " +
|
|
89
|
+
jsonField("allowed_events", joinCsv(spec.allowedEvents)) + ", " +
|
|
90
|
+
jsonField("prompt", spec.prompt) + ", " +
|
|
91
|
+
jsonField("backend_kind", loop.backend.kind) + ", " +
|
|
92
|
+
jsonField("backend_command", loop.backend.command) + ", " +
|
|
93
|
+
jsonField("backend_args", joinCsv(loop.backend.args)) + ", " +
|
|
94
|
+
jsonField("backend_prompt_mode", loop.backend.promptMode) + ", " +
|
|
95
|
+
jsonField("log_level", loop.runtime.logLevel);
|
|
96
|
+
writeFileSync(spec.launchFile, "{" + fields + "}\n");
|
|
97
|
+
}
|
|
98
|
+
function writeSupervisor(loop, spec) {
|
|
99
|
+
const cmd = loop.runtime.selfCommand + " branch-run " + shellQuote(loop.paths.projectDir) + " " + shellQuote(spec.branchDir);
|
|
100
|
+
const content = "#!/bin/sh\nset -eu\nchild=''\n" +
|
|
101
|
+
"cleanup() {\n if [ -n \"$child\" ]; then\n kill \"$child\" 2>/dev/null || true\n wait \"$child\" 2>/dev/null || true\n fi\n exit 130\n}\n" +
|
|
102
|
+
"trap cleanup INT TERM\n" +
|
|
103
|
+
cmd + " >" + shellQuote(spec.stdoutFile) + " 2>" + shellQuote(spec.stderrFile) + " &\n" +
|
|
104
|
+
"child=$!\nwait \"$child\"\nstatus=$?\n" +
|
|
105
|
+
"printf '%s' \"$status\" > " + shellQuote(spec.statusFile) + "\n";
|
|
106
|
+
writeFileSync(spec.supervisorFile, content);
|
|
107
|
+
try {
|
|
108
|
+
chmodSync(spec.supervisorFile, 0o755);
|
|
109
|
+
}
|
|
110
|
+
catch { /* */ }
|
|
111
|
+
}
|
|
112
|
+
function recordLaunchFailure(spec) {
|
|
113
|
+
const finishedMs = Date.now();
|
|
114
|
+
const result = branchResultFromSpec(spec, "branch_process_failed", `branch launch failed for \`${spec.branchId}\``, finishedMs - spec.launchMs, finishedMs);
|
|
115
|
+
writeFileSync(spec.statusFile, "1");
|
|
116
|
+
writeFileSync(join(spec.branchDir, "result.md"), renderBranchResult({ ...result, branch_dir: spec.branchDir }));
|
|
117
|
+
writeParallelBranchSummary(spec.branchDir, { ...result, branch_dir: spec.branchDir });
|
|
118
|
+
}
|
|
119
|
+
function pollBranch(loop, spec) {
|
|
120
|
+
if (existsSync(spec.summaryFile))
|
|
121
|
+
return loadSummaryResult(spec);
|
|
122
|
+
if (existsSync(spec.statusFile))
|
|
123
|
+
return ensureBranchResult(spec, "branch_process_failed");
|
|
124
|
+
if (Date.now() - spec.launchMs > loop.parallel.branchTimeoutMs) {
|
|
125
|
+
terminateBranch(spec);
|
|
126
|
+
return ensureBranchResult(spec, "backend_timeout");
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
function loadSummaryResult(spec) {
|
|
131
|
+
const line = readIfExists(spec.summaryFile);
|
|
132
|
+
return {
|
|
133
|
+
branchId: extractField(line, "branch_id"),
|
|
134
|
+
objective: extractField(line, "objective"),
|
|
135
|
+
stopReason: extractField(line, "stop_reason"),
|
|
136
|
+
output: extractField(line, "output"),
|
|
137
|
+
routingEvent: extractField(line, "routing_event"),
|
|
138
|
+
allowedRoles: csvList(line, "allowed_roles"),
|
|
139
|
+
allowedEvents: csvList(line, "allowed_events"),
|
|
140
|
+
branchDir: spec.branchDir,
|
|
141
|
+
elapsedMs: parseInt(extractField(line, "elapsed_ms")) || 0,
|
|
142
|
+
finishedAtMs: parseInt(extractField(line, "finished_at_ms")) || 0,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function ensureBranchResult(spec, fallbackReason) {
|
|
146
|
+
if (existsSync(spec.summaryFile))
|
|
147
|
+
return loadSummaryResult(spec);
|
|
148
|
+
const finishedMs = Date.now();
|
|
149
|
+
const output = combinedOutput(spec);
|
|
150
|
+
const result = branchResultFromSpec(spec, fallbackReason, output, finishedMs - spec.launchMs, finishedMs);
|
|
151
|
+
writeFileSync(join(spec.branchDir, "result.md"), renderBranchResult({ ...result, branch_dir: spec.branchDir }));
|
|
152
|
+
writeParallelBranchSummary(spec.branchDir, { ...result, branch_dir: spec.branchDir });
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
function terminateBranch(spec) {
|
|
156
|
+
const pid = readIfExists(spec.pidFile).trim();
|
|
157
|
+
if (pid) {
|
|
158
|
+
try {
|
|
159
|
+
runProcess(`kill ${shellQuote(pid)} 2>/dev/null || true`, 5000);
|
|
160
|
+
}
|
|
161
|
+
catch { /* */ }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function combinedOutput(spec) {
|
|
165
|
+
const stdout = readIfExists(spec.stdoutFile).trim();
|
|
166
|
+
const stderr = readIfExists(spec.stderrFile).trim();
|
|
167
|
+
if (!stdout)
|
|
168
|
+
return stderr;
|
|
169
|
+
if (!stderr)
|
|
170
|
+
return stdout;
|
|
171
|
+
return stdout + "\n\nstderr:\n" + stderr;
|
|
172
|
+
}
|
|
173
|
+
function csvList(line, field) {
|
|
174
|
+
const v = extractField(line, field);
|
|
175
|
+
return v ? v.split(",").map(s => s.trim()).filter(s => s !== "") : [];
|
|
176
|
+
}
|
|
177
|
+
function branchResultFromSpec(spec, stopReason, output, elapsedMs, finishedAtMs) {
|
|
178
|
+
return { branchId: spec.branchId, objective: spec.objective, stopReason, output, routingEvent: spec.routingEvent, allowedRoles: spec.allowedRoles, allowedEvents: spec.allowedEvents, branchDir: spec.branchDir, elapsedMs, finishedAtMs };
|
|
179
|
+
}
|
|
180
|
+
function sortByFinishedAt(results) {
|
|
181
|
+
return [...results].sort((a, b) => {
|
|
182
|
+
if (a.finishedAtMs !== b.finishedAtMs)
|
|
183
|
+
return a.finishedAtMs - b.finishedAtMs;
|
|
184
|
+
return branchIndex(a.branchId) - branchIndex(b.branchId);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function branchIndex(id) {
|
|
188
|
+
return parseInt(id.replace("branch-", "")) || 0;
|
|
189
|
+
}
|
|
190
|
+
function branchRoutingEvent(iter, emittedTopic) {
|
|
191
|
+
if (emittedTopic === "explore.parallel")
|
|
192
|
+
return iter.recentEvent;
|
|
193
|
+
return parallelDispatchBase(emittedTopic) || iter.recentEvent;
|
|
194
|
+
}
|
|
195
|
+
function renderBranchPrompt(loop, objective, emittedTopic, routingEvent, roles, events) {
|
|
196
|
+
return "Parallel branch objective:\n" + objective + "\n\n" +
|
|
197
|
+
"Parent objective:\n" + loop.objective + "\n\n" +
|
|
198
|
+
"Wave trigger: " + md.code(emittedTopic) + "\n" +
|
|
199
|
+
"Branch routing event: " + md.code(routingEvent) + "\n" +
|
|
200
|
+
"Suggested roles: " + listText(roles) + "\n" +
|
|
201
|
+
"Allowed events: " + listText(events) + "\n" +
|
|
202
|
+
"Work only on this branch objective. Branch state is isolated; do not assume you can control parent routing directly.\n";
|
|
203
|
+
}
|
|
204
|
+
function renderBranchObjective(objective, emittedTopic, routingEvent, roles, events) {
|
|
205
|
+
return md.heading(1, "Branch Objective") + "\n\n" +
|
|
206
|
+
"Trigger: " + md.code(emittedTopic) + "\n" +
|
|
207
|
+
"Routing event: " + md.code(routingEvent) + "\n" +
|
|
208
|
+
"Roles: " + listText(roles) + "\n" +
|
|
209
|
+
"Allowed events: " + listText(events) + "\n\n" +
|
|
210
|
+
objective + "\n";
|
|
211
|
+
}
|
|
212
|
+
function appendWaveBranchStart(loop, iter, waveId, branchId, objective, routingEvent, roles, events) {
|
|
213
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.branch.start", jsonField("wave_id", waveId) + ", " + jsonField("branch_id", branchId) + ", " + jsonField("objective", objective) + ", " + jsonField("routing_event", routingEvent) + ", " + jsonField("branch_roles", joinCsv(roles)) + ", " + jsonField("branch_events", joinCsv(events)));
|
|
214
|
+
}
|
|
215
|
+
function appendWaveBranchFinish(loop, iter, waveId, branchId, result) {
|
|
216
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.branch.finish", jsonField("wave_id", waveId) + ", " + jsonField("branch_id", branchId) + ", " + jsonField("stop_reason", result.stopReason) + ", " + jsonField("elapsed_ms", String(result.elapsedMs)) + ", " + jsonField("output", result.output));
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=launch-branches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-branches.js","sourceRoot":"","sources":["../../../src/harness/wave/launch-branches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { lineSep } from "../../utils.js";
|
|
2
|
+
export function parseParallelObjectives(payload, maxBranches) {
|
|
3
|
+
const lines = payload.split(lineSep()).map((l) => l.trim()).filter((l) => l !== "");
|
|
4
|
+
const objectives = [];
|
|
5
|
+
let invalid = false;
|
|
6
|
+
for (const line of lines) {
|
|
7
|
+
const obj = parseObjectiveLine(line);
|
|
8
|
+
if (obj === "")
|
|
9
|
+
invalid = true;
|
|
10
|
+
else
|
|
11
|
+
objectives.push(obj);
|
|
12
|
+
}
|
|
13
|
+
if (invalid)
|
|
14
|
+
return { ok: false, objectives: [], reason: "invalid_branch_list" };
|
|
15
|
+
if (objectives.length === 0)
|
|
16
|
+
return { ok: false, objectives: [], reason: "empty_branch_list" };
|
|
17
|
+
if (objectives.length > maxBranches)
|
|
18
|
+
return { ok: false, objectives: [], reason: "too_many_branches" };
|
|
19
|
+
return { ok: true, objectives, reason: "" };
|
|
20
|
+
}
|
|
21
|
+
export function parseObjectiveLine(line) {
|
|
22
|
+
if (line.startsWith("- ") || line.startsWith("* "))
|
|
23
|
+
return line.slice(2).trim();
|
|
24
|
+
const dotIdx = line.indexOf(". ");
|
|
25
|
+
if (dotIdx > 0 && /^\d+$/.test(line.slice(0, dotIdx)))
|
|
26
|
+
return line.slice(dotIdx + 2).trim();
|
|
27
|
+
return "";
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=parse-objectives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-objectives.js","sourceRoot":"","sources":["../../../src/harness/wave/parse-objectives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,WAAmB;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACpF,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,GAAG,KAAK,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IACjF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC/F,IAAI,UAAU,CAAC,MAAM,GAAG,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACvG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { RunSummary } from "../types.js";
|
|
2
|
+
export interface WaveResult {
|
|
3
|
+
reason: string;
|
|
4
|
+
waveId: string;
|
|
5
|
+
elapsedMs: number;
|
|
6
|
+
}
|
|
7
|
+
export interface BranchSpec {
|
|
8
|
+
branchId: string;
|
|
9
|
+
waveId: string;
|
|
10
|
+
objective: string;
|
|
11
|
+
emittedTopic: string;
|
|
12
|
+
routingEvent: string;
|
|
13
|
+
allowedRoles: string[];
|
|
14
|
+
allowedEvents: string[];
|
|
15
|
+
prompt: string;
|
|
16
|
+
branchDir: string;
|
|
17
|
+
launchFile: string;
|
|
18
|
+
summaryFile: string;
|
|
19
|
+
stdoutFile: string;
|
|
20
|
+
stderrFile: string;
|
|
21
|
+
statusFile: string;
|
|
22
|
+
pidFile: string;
|
|
23
|
+
supervisorFile: string;
|
|
24
|
+
launchMs: number;
|
|
25
|
+
}
|
|
26
|
+
export interface BranchResult {
|
|
27
|
+
branchId: string;
|
|
28
|
+
objective: string;
|
|
29
|
+
stopReason: string;
|
|
30
|
+
output: string;
|
|
31
|
+
routingEvent: string;
|
|
32
|
+
allowedRoles: string[];
|
|
33
|
+
allowedEvents: string[];
|
|
34
|
+
branchDir: string;
|
|
35
|
+
elapsedMs: number;
|
|
36
|
+
finishedAtMs: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ParseResult {
|
|
39
|
+
ok: boolean;
|
|
40
|
+
objectives: string[];
|
|
41
|
+
reason: string;
|
|
42
|
+
}
|
|
43
|
+
export type IterateFn = (loop: any, iteration: number) => RunSummary;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/harness/wave/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LoopContext } from "./types.js";
|
|
2
|
+
import type { IterationContext } from "./prompt.js";
|
|
3
|
+
import type { WaveResult } from "./wave/types.js";
|
|
4
|
+
export type { WaveResult } from "./wave/types.js";
|
|
5
|
+
export { continueAfterParallelJoin, stopAfterParallelWave } from "./wave/finalize-wave.js";
|
|
6
|
+
export declare function executeParallelWave(loop: LoopContext, iter: IterationContext, emittedTopic: string, emittedPayload: string): WaveResult;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { writeFileSync, existsSync, mkdirSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { jsonField } from "../json.js";
|
|
4
|
+
import { joinCsv, generateCompactId } from "../utils.js";
|
|
5
|
+
import * as md from "../markdown.js";
|
|
6
|
+
import { readIfExists, appendEvent } from "./journal.js";
|
|
7
|
+
import { prepareParallelBranches, launchParallelBranches, joinParallelBranches } from "./wave/launch-branches.js";
|
|
8
|
+
import { parseParallelObjectives } from "./wave/parse-objectives.js";
|
|
9
|
+
import { finalizeParallelWave } from "./wave/finalize-wave.js";
|
|
10
|
+
export { continueAfterParallelJoin, stopAfterParallelWave } from "./wave/finalize-wave.js";
|
|
11
|
+
export function executeParallelWave(loop, iter, emittedTopic, emittedPayload) {
|
|
12
|
+
const markerPath = activeWaveMarkerPath(loop);
|
|
13
|
+
if (existsSync(markerPath)) {
|
|
14
|
+
return rejectActiveWave(loop, iter, emittedTopic, markerPath);
|
|
15
|
+
}
|
|
16
|
+
const parsed = parseParallelObjectives(emittedPayload, loop.parallel.maxBranches);
|
|
17
|
+
if (!parsed.ok) {
|
|
18
|
+
return rejectPayload(loop, iter, emittedTopic, parsed.reason);
|
|
19
|
+
}
|
|
20
|
+
return executeWaveWithObjectives(loop, iter, emittedTopic, parsed.objectives, markerPath);
|
|
21
|
+
}
|
|
22
|
+
function rejectActiveWave(loop, iter, topic, markerPath) {
|
|
23
|
+
const activeWaveId = readIfExists(markerPath);
|
|
24
|
+
appendWaveInvalid(loop, iter, topic, "active_wave_exists", activeWaveId);
|
|
25
|
+
return { reason: "parallel_wave_invalid", waveId: activeWaveId, elapsedMs: 0 };
|
|
26
|
+
}
|
|
27
|
+
function rejectPayload(loop, iter, topic, reason) {
|
|
28
|
+
appendWaveInvalid(loop, iter, topic, reason, "");
|
|
29
|
+
return { reason: "parallel_wave_invalid", waveId: "", elapsedMs: 0 };
|
|
30
|
+
}
|
|
31
|
+
function executeWaveWithObjectives(loop, iter, emittedTopic, objectives, markerPath) {
|
|
32
|
+
const waveId = generateCompactId("wave");
|
|
33
|
+
const waveDir = join(loop.paths.stateDir, "waves", waveId);
|
|
34
|
+
const branchesDir = join(waveDir, "branches");
|
|
35
|
+
const openingRoles = iter.allowedRoles;
|
|
36
|
+
const openingEvents = iter.allowedEvents;
|
|
37
|
+
const waveStartMs = Date.now();
|
|
38
|
+
mkdirSync(branchesDir, { recursive: true });
|
|
39
|
+
writeFileSync(markerPath, waveId);
|
|
40
|
+
writeWaveSpec(waveDir, waveId, emittedTopic, iter, objectives);
|
|
41
|
+
appendWaveStart(loop, iter, waveId, emittedTopic, objectives);
|
|
42
|
+
const specs = prepareParallelBranches(loop, iter, waveId, waveDir, emittedTopic, objectives);
|
|
43
|
+
const launched = launchParallelBranches(loop, specs);
|
|
44
|
+
const results = joinParallelBranches(loop, iter, waveId, launched);
|
|
45
|
+
const ordered = sortByBranchId(results);
|
|
46
|
+
const totalElapsed = Date.now() - waveStartMs;
|
|
47
|
+
writeWaveJoin(waveDir, waveId, emittedTopic, objectives, ordered, iter.recentEvent, openingRoles, openingEvents, totalElapsed);
|
|
48
|
+
appendWaveJoinStart(loop, iter, waveId, emittedTopic, objectives, ordered, totalElapsed);
|
|
49
|
+
try {
|
|
50
|
+
unlinkSync(markerPath);
|
|
51
|
+
}
|
|
52
|
+
catch { /* ok */ }
|
|
53
|
+
const finalized = finalizeParallelWave(loop, iter, waveId, ordered);
|
|
54
|
+
return { ...finalized, elapsedMs: totalElapsed };
|
|
55
|
+
}
|
|
56
|
+
function sortByBranchId(results) {
|
|
57
|
+
return [...results].sort((a, b) => branchIndex(a.branchId) - branchIndex(b.branchId));
|
|
58
|
+
}
|
|
59
|
+
function branchIndex(id) {
|
|
60
|
+
return parseInt(id.replace("branch-", "")) || 0;
|
|
61
|
+
}
|
|
62
|
+
function writeWaveSpec(waveDir, waveId, emittedTopic, iter, objectives) {
|
|
63
|
+
const content = md.heading(1, "Parallel Wave " + waveId) + "\n\n" +
|
|
64
|
+
"Trigger: " + md.code(emittedTopic) + "\n" +
|
|
65
|
+
"Opening recent event: " + md.code(iter.recentEvent) + "\n" +
|
|
66
|
+
"Opening roles: " + iter.allowedRoles.join(", ") + "\n" +
|
|
67
|
+
"Opening events: " + iter.allowedEvents.join(", ") + "\n\n" +
|
|
68
|
+
md.heading(2, "Branch Objectives") + "\n" + md.bulletList(objectives);
|
|
69
|
+
writeFileSync(join(waveDir, "spec.md"), content);
|
|
70
|
+
}
|
|
71
|
+
function writeWaveJoin(waveDir, waveId, emittedTopic, objectives, results, recentEvent, openingRoles, openingEvents, totalElapsed) {
|
|
72
|
+
const items = results.map(r => md.code(r.branchId) + ": " + r.stopReason + " (" + r.elapsedMs + "ms)");
|
|
73
|
+
const content = md.heading(1, "Parallel Join " + waveId) + "\n\n" +
|
|
74
|
+
"Trigger: " + md.code(emittedTopic) + "\n" +
|
|
75
|
+
"Opening recent event: " + md.code(recentEvent) + "\n" +
|
|
76
|
+
"Opening roles: " + openingRoles.join(", ") + "\n" +
|
|
77
|
+
"Opening events: " + openingEvents.join(", ") + "\n" +
|
|
78
|
+
"Total wave elapsed: " + md.code(totalElapsed + "ms") + "\n\n" +
|
|
79
|
+
md.heading(2, "Objectives") + "\n" + md.bulletList(objectives) + "\n\n" +
|
|
80
|
+
md.heading(2, "Branch Results") + "\n" + md.bulletList(items);
|
|
81
|
+
writeFileSync(join(waveDir, "join.md"), content);
|
|
82
|
+
}
|
|
83
|
+
function activeWaveMarkerPath(loop) {
|
|
84
|
+
const wavesDir = join(loop.paths.stateDir, "waves");
|
|
85
|
+
mkdirSync(wavesDir, { recursive: true });
|
|
86
|
+
return join(wavesDir, "active");
|
|
87
|
+
}
|
|
88
|
+
function appendWaveInvalid(loop, iter, topic, reason, activeWaveId) {
|
|
89
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.invalid", jsonField("trigger_topic", topic) + ", " + jsonField("reason", reason) + ", " + jsonField("active_wave_id", activeWaveId) + ", " + jsonField("opening_recent_event", iter.recentEvent));
|
|
90
|
+
}
|
|
91
|
+
function appendWaveStart(loop, iter, waveId, emittedTopic, objectives) {
|
|
92
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.start", jsonField("wave_id", waveId) + ", " + jsonField("trigger_topic", emittedTopic) + ", " + jsonField("branch_count", String(objectives.length)) + ", " + jsonField("opening_recent_event", iter.recentEvent) + ", " + jsonField("opening_roles", joinCsv(iter.allowedRoles)) + ", " + jsonField("opening_events", joinCsv(iter.allowedEvents)) + ", " + jsonField("objectives", joinCsv(objectives)));
|
|
93
|
+
}
|
|
94
|
+
function appendWaveJoinStart(loop, iter, waveId, emittedTopic, objectives, results, totalElapsed) {
|
|
95
|
+
const outcomes = results.map(r => r.branchId + ":" + r.stopReason).join(",");
|
|
96
|
+
appendEvent(loop.paths.journalFile, loop.runtime.runId, String(iter.iteration), "wave.join.start", jsonField("wave_id", waveId) + ", " + jsonField("trigger_topic", emittedTopic) + ", " + jsonField("branch_count", String(objectives.length)) + ", " + jsonField("elapsed_ms", String(totalElapsed)) + ", " + jsonField("branch_outcomes", outcomes));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=wave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wave.js","sourceRoot":"","sources":["../../src/harness/wave.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAClH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAoD,MAAM,yBAAyB,CAAC;AAIjH,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE3F,MAAM,UAAU,mBAAmB,CACjC,IAAiB,EACjB,IAAsB,EACtB,YAAoB,EACpB,cAAsB;IAEtB,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,MAAM,GAAG,uBAAuB,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,yBAAyB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAiB,EAAE,IAAsB,EAAE,KAAa,EAAE,UAAkB;IACpG,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC9C,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,aAAa,CAAC,IAAiB,EAAE,IAAsB,EAAE,KAAa,EAAE,MAAc;IAC7F,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAiB,EAAE,IAAsB,EAAE,YAAoB,EAC/D,UAAoB,EAAE,UAAkB;IAExC,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE/B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/D,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;IAE9C,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/H,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACzF,IAAI,CAAC;QAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,cAAc,CAAC,OAAuB;IAC7C,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,OAAe,EAAE,MAAc,EAAE,YAAoB,EAAE,IAAsB,EAAE,UAAoB;IACxH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,GAAG,MAAM;QAC/D,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI;QAC1C,wBAAwB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI;QAC3D,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACvD,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM;QAC3D,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACxE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CACpB,OAAe,EAAE,MAAc,EAAE,YAAoB,EAAE,UAAoB,EAC3E,OAAuB,EAAE,WAAmB,EAAE,YAAsB,EAAE,aAAuB,EAAE,YAAoB;IAEnH,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,GAAG,MAAM;QAC/D,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI;QAC1C,wBAAwB,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI;QACtD,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QAClD,kBAAkB,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;QACpD,sBAAsB,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,MAAM;QAC9D,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,MAAM;QACvE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAiB;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAiB,EAAE,IAAsB,EAAE,KAAa,EAAE,MAAc,EAAE,YAAoB;IACvH,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAC5F,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,sBAAsB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5L,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB,EAAE,IAAsB,EAAE,MAAc,EAAE,YAAoB,EAAE,UAAoB;IAC5H,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAC1F,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,eAAe,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,sBAAsB,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvY,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB,EAAE,IAAsB,EAAE,MAAc,EAAE,YAAoB,EAAE,UAAoB,EAAE,OAAuB,EAAE,YAAoB;IAC/K,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,iBAAiB,EAC/F,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,eAAe,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzP,CAAC"}
|
package/dist/json.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function jsonString(text: string): string;
|
|
2
|
+
export declare function jsonBool(value: boolean): string;
|
|
3
|
+
export declare function jsonField(key: string, value: string): string;
|
|
4
|
+
export declare function jsonFieldRaw(key: string, rawValue: string): string;
|
|
5
|
+
export declare function extractTopic(line: string): string;
|
|
6
|
+
export declare function extractField(line: string, key: string): string;
|
|
7
|
+
export declare function encodeJsonValue(text: string): string;
|
|
8
|
+
export declare function decodeJsonValue(text: string): string;
|
package/dist/json.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { replaceAll, lineSep } from "./utils.js";
|
|
2
|
+
import { decodeEvent } from "./events/decode.js";
|
|
3
|
+
export function jsonString(text) {
|
|
4
|
+
return '"' + encodeJsonValue(text) + '"';
|
|
5
|
+
}
|
|
6
|
+
export function jsonBool(value) {
|
|
7
|
+
return value ? "true" : "false";
|
|
8
|
+
}
|
|
9
|
+
export function jsonField(key, value) {
|
|
10
|
+
return '"' + key + '": ' + jsonString(value);
|
|
11
|
+
}
|
|
12
|
+
export function jsonFieldRaw(key, rawValue) {
|
|
13
|
+
return '"' + key + '": ' + rawValue;
|
|
14
|
+
}
|
|
15
|
+
export function extractTopic(line) {
|
|
16
|
+
const decoded = decodeEvent(line);
|
|
17
|
+
if (decoded)
|
|
18
|
+
return String(decoded.topic);
|
|
19
|
+
return extractField(line, "topic");
|
|
20
|
+
}
|
|
21
|
+
export function extractField(line, key) {
|
|
22
|
+
const decoded = decodeEvent(line);
|
|
23
|
+
if (decoded) {
|
|
24
|
+
if (key === "run")
|
|
25
|
+
return decoded.run;
|
|
26
|
+
if (key === "iteration")
|
|
27
|
+
return decoded.iteration ?? "";
|
|
28
|
+
if (key === "topic")
|
|
29
|
+
return String(decoded.topic);
|
|
30
|
+
if (decoded.shape === "payload") {
|
|
31
|
+
if (key === "payload")
|
|
32
|
+
return decoded.payload;
|
|
33
|
+
if (key === "source")
|
|
34
|
+
return decoded.source ?? "";
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
return decoded.fields[key] ?? "";
|
|
38
|
+
}
|
|
39
|
+
const marker = '"' + key + '": ';
|
|
40
|
+
return decodeJsonValue(firstQuotedValue(firstAfterMarker(line.split(marker))));
|
|
41
|
+
}
|
|
42
|
+
export function encodeJsonValue(text) {
|
|
43
|
+
let escaped = replaceAll(text, "\\", "\\u005c");
|
|
44
|
+
escaped = replaceAll(escaped, '"', "\\u0022");
|
|
45
|
+
escaped = replaceAll(escaped, lineSep(), "\\u000a");
|
|
46
|
+
escaped = replaceAll(escaped, "\r", "\\u000d");
|
|
47
|
+
escaped = replaceAll(escaped, "\t", "\\u0009");
|
|
48
|
+
return escapeRemainingControlChars(escaped);
|
|
49
|
+
}
|
|
50
|
+
function escapeRemainingControlChars(text) {
|
|
51
|
+
// Replace control chars \x00-\x08, \x0b, \x0c, \x0e-\x1f
|
|
52
|
+
return text.replace(
|
|
53
|
+
// eslint-disable-next-line no-control-regex
|
|
54
|
+
/[\x00-\x08\x0b\x0c\x0e-\x1f]/g, (ch) => "\\u" + ch.charCodeAt(0).toString(16).padStart(4, "0"));
|
|
55
|
+
}
|
|
56
|
+
export function decodeJsonValue(text) {
|
|
57
|
+
let restored = replaceAll(text, "\\u000a", lineSep());
|
|
58
|
+
restored = replaceAll(restored, "\\u000d", "\r");
|
|
59
|
+
restored = replaceAll(restored, "\\u0009", "\t");
|
|
60
|
+
restored = replaceAll(restored, "\\u0022", '"');
|
|
61
|
+
restored = replaceAll(restored, "\\u005c", "\\");
|
|
62
|
+
return restored;
|
|
63
|
+
}
|
|
64
|
+
function firstAfterMarker(parts) {
|
|
65
|
+
if (parts.length <= 1)
|
|
66
|
+
return "";
|
|
67
|
+
return parts[1];
|
|
68
|
+
}
|
|
69
|
+
function firstQuotedValue(text) {
|
|
70
|
+
return firstQuotedValueParts(text.split('"'));
|
|
71
|
+
}
|
|
72
|
+
function firstQuotedValueParts(parts) {
|
|
73
|
+
for (let i = 0; i < parts.length; i++) {
|
|
74
|
+
if (parts[i] === "") {
|
|
75
|
+
return i + 1 < parts.length ? parts[i + 1] : "";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return "";
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=json.js.map
|
package/dist/json.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"}
|