@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.
Files changed (307) hide show
  1. package/README.md +145 -0
  2. package/bin/autoloop +2 -0
  3. package/dist/backend/index.d.ts +10 -0
  4. package/dist/backend/index.js +59 -0
  5. package/dist/backend/index.js.map +1 -0
  6. package/dist/backend/run-command.d.ts +7 -0
  7. package/dist/backend/run-command.js +50 -0
  8. package/dist/backend/run-command.js.map +1 -0
  9. package/dist/backend/run-mock.d.ts +1 -0
  10. package/dist/backend/run-mock.js +6 -0
  11. package/dist/backend/run-mock.js.map +1 -0
  12. package/dist/backend/run-pi.d.ts +5 -0
  13. package/dist/backend/run-pi.js +5 -0
  14. package/dist/backend/run-pi.js.map +1 -0
  15. package/dist/backend/types.d.ts +21 -0
  16. package/dist/backend/types.js +2 -0
  17. package/dist/backend/types.js.map +1 -0
  18. package/dist/chains/budget.d.ts +7 -0
  19. package/dist/chains/budget.js +42 -0
  20. package/dist/chains/budget.js.map +1 -0
  21. package/dist/chains/load.d.ts +12 -0
  22. package/dist/chains/load.js +80 -0
  23. package/dist/chains/load.js.map +1 -0
  24. package/dist/chains/render.d.ts +2 -0
  25. package/dist/chains/render.js +46 -0
  26. package/dist/chains/render.js.map +1 -0
  27. package/dist/chains/run.d.ts +17 -0
  28. package/dist/chains/run.js +175 -0
  29. package/dist/chains/run.js.map +1 -0
  30. package/dist/chains/types.d.ts +37 -0
  31. package/dist/chains/types.js +2 -0
  32. package/dist/chains/types.js.map +1 -0
  33. package/dist/chains.d.ts +5 -0
  34. package/dist/chains.js +5 -0
  35. package/dist/chains.js.map +1 -0
  36. package/dist/commands/chain.d.ts +1 -0
  37. package/dist/commands/chain.js +51 -0
  38. package/dist/commands/chain.js.map +1 -0
  39. package/dist/commands/inspect.d.ts +1 -0
  40. package/dist/commands/inspect.js +95 -0
  41. package/dist/commands/inspect.js.map +1 -0
  42. package/dist/commands/list.d.ts +1 -0
  43. package/dist/commands/list.js +12 -0
  44. package/dist/commands/list.js.map +1 -0
  45. package/dist/commands/loops.d.ts +1 -0
  46. package/dist/commands/loops.js +72 -0
  47. package/dist/commands/loops.js.map +1 -0
  48. package/dist/commands/memory.d.ts +1 -0
  49. package/dist/commands/memory.js +65 -0
  50. package/dist/commands/memory.js.map +1 -0
  51. package/dist/commands/pi-adapter.d.ts +1 -0
  52. package/dist/commands/pi-adapter.js +6 -0
  53. package/dist/commands/pi-adapter.js.map +1 -0
  54. package/dist/commands/run.d.ts +1 -0
  55. package/dist/commands/run.js +185 -0
  56. package/dist/commands/run.js.map +1 -0
  57. package/dist/config.d.ts +16 -0
  58. package/dist/config.js +169 -0
  59. package/dist/config.js.map +1 -0
  60. package/dist/events/decode.d.ts +2 -0
  61. package/dist/events/decode.js +45 -0
  62. package/dist/events/decode.js.map +1 -0
  63. package/dist/events/encode.d.ts +2 -0
  64. package/dist/events/encode.js +33 -0
  65. package/dist/events/encode.js.map +1 -0
  66. package/dist/events/guards.d.ts +5 -0
  67. package/dist/events/guards.js +42 -0
  68. package/dist/events/guards.js.map +1 -0
  69. package/dist/events/types.d.ts +25 -0
  70. package/dist/events/types.js +2 -0
  71. package/dist/events/types.js.map +1 -0
  72. package/dist/harness/config-helpers.d.ts +24 -0
  73. package/dist/harness/config-helpers.js +231 -0
  74. package/dist/harness/config-helpers.js.map +1 -0
  75. package/dist/harness/coordination.d.ts +1 -0
  76. package/dist/harness/coordination.js +127 -0
  77. package/dist/harness/coordination.js.map +1 -0
  78. package/dist/harness/display.d.ts +20 -0
  79. package/dist/harness/display.js +130 -0
  80. package/dist/harness/display.js.map +1 -0
  81. package/dist/harness/emit.d.ts +15 -0
  82. package/dist/harness/emit.js +220 -0
  83. package/dist/harness/emit.js.map +1 -0
  84. package/dist/harness/index.d.ts +13 -0
  85. package/dist/harness/index.js +124 -0
  86. package/dist/harness/index.js.map +1 -0
  87. package/dist/harness/iteration.d.ts +4 -0
  88. package/dist/harness/iteration.js +129 -0
  89. package/dist/harness/iteration.js.map +1 -0
  90. package/dist/harness/journal.d.ts +13 -0
  91. package/dist/harness/journal.js +106 -0
  92. package/dist/harness/journal.js.map +1 -0
  93. package/dist/harness/metareview.d.ts +4 -0
  94. package/dist/harness/metareview.js +33 -0
  95. package/dist/harness/metareview.js.map +1 -0
  96. package/dist/harness/metrics.d.ts +12 -0
  97. package/dist/harness/metrics.js +180 -0
  98. package/dist/harness/metrics.js.map +1 -0
  99. package/dist/harness/parallel.d.ts +37 -0
  100. package/dist/harness/parallel.js +158 -0
  101. package/dist/harness/parallel.js.map +1 -0
  102. package/dist/harness/prompt.d.ts +35 -0
  103. package/dist/harness/prompt.js +328 -0
  104. package/dist/harness/prompt.js.map +1 -0
  105. package/dist/harness/scratchpad.d.ts +2 -0
  106. package/dist/harness/scratchpad.js +65 -0
  107. package/dist/harness/scratchpad.js.map +1 -0
  108. package/dist/harness/stop.d.ts +5 -0
  109. package/dist/harness/stop.js +63 -0
  110. package/dist/harness/stop.js.map +1 -0
  111. package/dist/harness/tools.d.ts +3 -0
  112. package/dist/harness/tools.js +39 -0
  113. package/dist/harness/tools.js.map +1 -0
  114. package/dist/harness/types.d.ts +81 -0
  115. package/dist/harness/types.js +2 -0
  116. package/dist/harness/types.js.map +1 -0
  117. package/dist/harness/wave/finalize-wave.d.ts +9 -0
  118. package/dist/harness/wave/finalize-wave.js +60 -0
  119. package/dist/harness/wave/finalize-wave.js.map +1 -0
  120. package/dist/harness/wave/launch-branches.d.ts +6 -0
  121. package/dist/harness/wave/launch-branches.js +218 -0
  122. package/dist/harness/wave/launch-branches.js.map +1 -0
  123. package/dist/harness/wave/parse-objectives.d.ts +3 -0
  124. package/dist/harness/wave/parse-objectives.js +29 -0
  125. package/dist/harness/wave/parse-objectives.js.map +1 -0
  126. package/dist/harness/wave/types.d.ts +43 -0
  127. package/dist/harness/wave/types.js +2 -0
  128. package/dist/harness/wave/types.js.map +1 -0
  129. package/dist/harness/wave.d.ts +6 -0
  130. package/dist/harness/wave.js +98 -0
  131. package/dist/harness/wave.js.map +1 -0
  132. package/dist/json.d.ts +8 -0
  133. package/dist/json.js +80 -0
  134. package/dist/json.js.map +1 -0
  135. package/dist/loops/health.d.ts +14 -0
  136. package/dist/loops/health.js +104 -0
  137. package/dist/loops/health.js.map +1 -0
  138. package/dist/loops/list.d.ts +6 -0
  139. package/dist/loops/list.js +21 -0
  140. package/dist/loops/list.js.map +1 -0
  141. package/dist/loops/render.d.ts +18 -0
  142. package/dist/loops/render.js +87 -0
  143. package/dist/loops/render.js.map +1 -0
  144. package/dist/loops/show.d.ts +8 -0
  145. package/dist/loops/show.js +31 -0
  146. package/dist/loops/show.js.map +1 -0
  147. package/dist/loops/watch.d.ts +8 -0
  148. package/dist/loops/watch.js +77 -0
  149. package/dist/loops/watch.js.map +1 -0
  150. package/dist/main.d.ts +1 -0
  151. package/dist/main.js +101 -0
  152. package/dist/main.js.map +1 -0
  153. package/dist/markdown.d.ts +10 -0
  154. package/dist/markdown.js +66 -0
  155. package/dist/markdown.js.map +1 -0
  156. package/dist/memory-render.d.ts +6 -0
  157. package/dist/memory-render.js +81 -0
  158. package/dist/memory-render.js.map +1 -0
  159. package/dist/memory.d.ts +23 -0
  160. package/dist/memory.js +314 -0
  161. package/dist/memory.js.map +1 -0
  162. package/dist/pi-adapter.d.ts +1 -0
  163. package/dist/pi-adapter.js +220 -0
  164. package/dist/pi-adapter.js.map +1 -0
  165. package/dist/registry/derive.d.ts +8 -0
  166. package/dist/registry/derive.js +81 -0
  167. package/dist/registry/derive.js.map +1 -0
  168. package/dist/registry/harness.d.ts +7 -0
  169. package/dist/registry/harness.js +57 -0
  170. package/dist/registry/harness.js.map +1 -0
  171. package/dist/registry/index.d.ts +5 -0
  172. package/dist/registry/index.js +5 -0
  173. package/dist/registry/index.js.map +1 -0
  174. package/dist/registry/read.d.ts +11 -0
  175. package/dist/registry/read.js +50 -0
  176. package/dist/registry/read.js.map +1 -0
  177. package/dist/registry/rebuild.d.ts +5 -0
  178. package/dist/registry/rebuild.js +19 -0
  179. package/dist/registry/rebuild.js.map +1 -0
  180. package/dist/registry/types.d.ts +19 -0
  181. package/dist/registry/types.js +2 -0
  182. package/dist/registry/types.js.map +1 -0
  183. package/dist/registry/update.d.ts +2 -0
  184. package/dist/registry/update.js +7 -0
  185. package/dist/registry/update.js.map +1 -0
  186. package/dist/testing/mock-backend.d.ts +11 -0
  187. package/dist/testing/mock-backend.js +76 -0
  188. package/dist/testing/mock-backend.js.map +1 -0
  189. package/dist/topology.d.ts +25 -0
  190. package/dist/topology.js +188 -0
  191. package/dist/topology.js.map +1 -0
  192. package/dist/usage.d.ts +8 -0
  193. package/dist/usage.js +114 -0
  194. package/dist/usage.js.map +1 -0
  195. package/dist/utils.d.ts +15 -0
  196. package/dist/utils.js +79 -0
  197. package/dist/utils.js.map +1 -0
  198. package/package.json +52 -0
  199. package/presets/autocode/README.md +81 -0
  200. package/presets/autocode/autoloops.toml +22 -0
  201. package/presets/autocode/harness.md +19 -0
  202. package/presets/autocode/miniloops.toml +22 -0
  203. package/presets/autocode/roles/build.md +33 -0
  204. package/presets/autocode/roles/critic.md +40 -0
  205. package/presets/autocode/roles/finalizer.md +43 -0
  206. package/presets/autocode/roles/planner.md +40 -0
  207. package/presets/autocode/topology.toml +32 -0
  208. package/presets/autodoc/README.md +42 -0
  209. package/presets/autodoc/autoloops.toml +21 -0
  210. package/presets/autodoc/harness.md +19 -0
  211. package/presets/autodoc/miniloops.toml +21 -0
  212. package/presets/autodoc/roles/auditor.md +39 -0
  213. package/presets/autodoc/roles/checker.md +43 -0
  214. package/presets/autodoc/roles/publisher.md +51 -0
  215. package/presets/autodoc/roles/writer.md +37 -0
  216. package/presets/autodoc/topology.toml +31 -0
  217. package/presets/autofix/README.md +56 -0
  218. package/presets/autofix/autoloops.toml +21 -0
  219. package/presets/autofix/harness.md +24 -0
  220. package/presets/autofix/miniloops.toml +21 -0
  221. package/presets/autofix/roles/closer.md +48 -0
  222. package/presets/autofix/roles/diagnoser.md +42 -0
  223. package/presets/autofix/roles/fixer.md +28 -0
  224. package/presets/autofix/roles/verifier.md +31 -0
  225. package/presets/autofix/topology.toml +33 -0
  226. package/presets/autoideas/README.md +73 -0
  227. package/presets/autoideas/autoloops.toml +18 -0
  228. package/presets/autoideas/harness.md +31 -0
  229. package/presets/autoideas/miniloops.toml +18 -0
  230. package/presets/autoideas/roles/analyst.md +32 -0
  231. package/presets/autoideas/roles/reviewer.md +36 -0
  232. package/presets/autoideas/roles/scanner.md +26 -0
  233. package/presets/autoideas/roles/synthesizer.md +48 -0
  234. package/presets/autoideas/topology.toml +32 -0
  235. package/presets/autoperf/README.md +56 -0
  236. package/presets/autoperf/autoloops.toml +21 -0
  237. package/presets/autoperf/harness.md +21 -0
  238. package/presets/autoperf/miniloops.toml +21 -0
  239. package/presets/autoperf/roles/judge.md +38 -0
  240. package/presets/autoperf/roles/measurer.md +36 -0
  241. package/presets/autoperf/roles/optimizer.md +35 -0
  242. package/presets/autoperf/roles/profiler.md +38 -0
  243. package/presets/autoperf/topology.toml +32 -0
  244. package/presets/autoqa/README.md +76 -0
  245. package/presets/autoqa/autoloops.toml +21 -0
  246. package/presets/autoqa/harness.md +30 -0
  247. package/presets/autoqa/miniloops.toml +21 -0
  248. package/presets/autoqa/roles/executor.md +43 -0
  249. package/presets/autoqa/roles/inspector.md +45 -0
  250. package/presets/autoqa/roles/planner.md +55 -0
  251. package/presets/autoqa/roles/reporter.md +74 -0
  252. package/presets/autoqa/topology.toml +31 -0
  253. package/presets/autoresearch/README.md +63 -0
  254. package/presets/autoresearch/autoloops.toml +18 -0
  255. package/presets/autoresearch/harness.md +28 -0
  256. package/presets/autoresearch/miniloops.toml +18 -0
  257. package/presets/autoresearch/roles/benchmarker.md +34 -0
  258. package/presets/autoresearch/roles/evaluator.md +33 -0
  259. package/presets/autoresearch/roles/implementer.md +26 -0
  260. package/presets/autoresearch/roles/strategist.md +43 -0
  261. package/presets/autoresearch/topology.toml +31 -0
  262. package/presets/autoreview/README.md +51 -0
  263. package/presets/autoreview/autoloops.toml +21 -0
  264. package/presets/autoreview/harness.md +20 -0
  265. package/presets/autoreview/miniloops.toml +21 -0
  266. package/presets/autoreview/roles/checker.md +36 -0
  267. package/presets/autoreview/roles/reader.md +33 -0
  268. package/presets/autoreview/roles/suggester.md +26 -0
  269. package/presets/autoreview/roles/summarizer.md +57 -0
  270. package/presets/autoreview/topology.toml +31 -0
  271. package/presets/autosec/README.md +51 -0
  272. package/presets/autosec/autoloops.toml +21 -0
  273. package/presets/autosec/harness.md +20 -0
  274. package/presets/autosec/miniloops.toml +21 -0
  275. package/presets/autosec/roles/analyst.md +38 -0
  276. package/presets/autosec/roles/hardener.md +36 -0
  277. package/presets/autosec/roles/reporter.md +63 -0
  278. package/presets/autosec/roles/scanner.md +38 -0
  279. package/presets/autosec/topology.toml +31 -0
  280. package/presets/autosimplify/README.md +83 -0
  281. package/presets/autosimplify/autoloops.toml +22 -0
  282. package/presets/autosimplify/harness.md +25 -0
  283. package/presets/autosimplify/miniloops.toml +22 -0
  284. package/presets/autosimplify/roles/reviewer.md +38 -0
  285. package/presets/autosimplify/roles/scoper.md +42 -0
  286. package/presets/autosimplify/roles/simplifier.md +51 -0
  287. package/presets/autosimplify/roles/verifier.md +40 -0
  288. package/presets/autosimplify/topology.toml +32 -0
  289. package/presets/autospec/README.md +84 -0
  290. package/presets/autospec/autoloops.toml +21 -0
  291. package/presets/autospec/harness.md +23 -0
  292. package/presets/autospec/miniloops.toml +21 -0
  293. package/presets/autospec/roles/clarifier.md +38 -0
  294. package/presets/autospec/roles/critic.md +41 -0
  295. package/presets/autospec/roles/designer.md +37 -0
  296. package/presets/autospec/roles/planner.md +38 -0
  297. package/presets/autospec/roles/researcher.md +33 -0
  298. package/presets/autospec/topology.toml +38 -0
  299. package/presets/autotest/README.md +55 -0
  300. package/presets/autotest/autoloops.toml +21 -0
  301. package/presets/autotest/harness.md +21 -0
  302. package/presets/autotest/miniloops.toml +21 -0
  303. package/presets/autotest/roles/assessor.md +57 -0
  304. package/presets/autotest/roles/runner.md +31 -0
  305. package/presets/autotest/roles/surveyor.md +39 -0
  306. package/presets/autotest/roles/writer.md +37 -0
  307. 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,3 @@
1
+ import type { ParseResult } from "./types.js";
2
+ export declare function parseParallelObjectives(payload: string, maxBranches: number): ParseResult;
3
+ export declare function parseObjectiveLine(line: string): string;
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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":"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"}
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"}