@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,14 @@
1
+ import type { RunRecord } from "../registry/types.js";
2
+ export interface HealthResult {
3
+ active: RunRecord[];
4
+ stuck: RunRecord[];
5
+ recentFailed: RunRecord[];
6
+ recentCompleted: RunRecord[];
7
+ }
8
+ /**
9
+ * Produce a health summary string from the registry.
10
+ * Exception-focused: only surfaces issues by default.
11
+ * Pass verbose=true to also list recent completions.
12
+ */
13
+ export declare function healthSummary(registryPath: string, verbose: boolean): string;
14
+ export declare function categorizeRuns(registryPath: string): HealthResult;
@@ -0,0 +1,104 @@
1
+ import { readRegistry } from "../registry/read.js";
2
+ import { renderRunLine, renderListHeader } from "./render.js";
3
+ const STUCK_THRESHOLD_MS = 10 * 60 * 1000; // 10 minutes
4
+ const RECENT_WINDOW_MS = 24 * 60 * 60 * 1000; // 24 hours
5
+ /**
6
+ * Produce a health summary string from the registry.
7
+ * Exception-focused: only surfaces issues by default.
8
+ * Pass verbose=true to also list recent completions.
9
+ */
10
+ export function healthSummary(registryPath, verbose) {
11
+ const result = categorizeRuns(registryPath);
12
+ return renderHealth(result, verbose);
13
+ }
14
+ export function categorizeRuns(registryPath) {
15
+ const now = Date.now();
16
+ const all = readRegistry(registryPath);
17
+ const active = [];
18
+ const stuck = [];
19
+ const recentFailed = [];
20
+ const recentCompleted = [];
21
+ for (const r of all) {
22
+ if (r.status === "running") {
23
+ if (isStuck(r, now)) {
24
+ stuck.push(r);
25
+ }
26
+ else {
27
+ active.push(r);
28
+ }
29
+ continue;
30
+ }
31
+ if (!isRecent(r, now))
32
+ continue;
33
+ if (r.status === "failed" || r.status === "timed_out") {
34
+ recentFailed.push(r);
35
+ }
36
+ else if (r.status === "completed") {
37
+ recentCompleted.push(r);
38
+ }
39
+ }
40
+ return { active, stuck, recentFailed, recentCompleted };
41
+ }
42
+ function isStuck(r, nowMs) {
43
+ if (!r.updated_at)
44
+ return false;
45
+ const updatedMs = new Date(r.updated_at).getTime();
46
+ if (Number.isNaN(updatedMs))
47
+ return false;
48
+ return (nowMs - updatedMs) > STUCK_THRESHOLD_MS;
49
+ }
50
+ function isRecent(r, nowMs) {
51
+ if (!r.updated_at)
52
+ return false;
53
+ const updatedMs = new Date(r.updated_at).getTime();
54
+ if (Number.isNaN(updatedMs))
55
+ return false;
56
+ return (nowMs - updatedMs) <= RECENT_WINDOW_MS;
57
+ }
58
+ function renderHealth(h, verbose) {
59
+ const hasExceptions = h.stuck.length > 0 || h.recentFailed.length > 0;
60
+ if (!hasExceptions && h.active.length === 0) {
61
+ return "All clear. 0 active, " + h.recentCompleted.length + " completed in last 24h.";
62
+ }
63
+ if (!hasExceptions) {
64
+ return "All clear. " + h.active.length + " active, " + h.recentCompleted.length + " completed in last 24h.";
65
+ }
66
+ const lines = [];
67
+ lines.push("Health: " + h.active.length + " active, " +
68
+ h.stuck.length + " stuck, " +
69
+ h.recentFailed.length + " failed (last 24h)");
70
+ lines.push("");
71
+ if (h.stuck.length > 0) {
72
+ lines.push("STUCK:");
73
+ lines.push(renderListHeader());
74
+ for (const r of h.stuck)
75
+ lines.push(renderRunLine(r));
76
+ lines.push("");
77
+ }
78
+ if (h.recentFailed.length > 0) {
79
+ lines.push("FAILED:");
80
+ lines.push(renderListHeader());
81
+ for (const r of h.recentFailed)
82
+ lines.push(renderRunLine(r));
83
+ lines.push("");
84
+ }
85
+ if (h.active.length > 0) {
86
+ lines.push("ACTIVE:");
87
+ lines.push(renderListHeader());
88
+ for (const r of h.active)
89
+ lines.push(renderRunLine(r));
90
+ lines.push("");
91
+ }
92
+ if (verbose && h.recentCompleted.length > 0) {
93
+ lines.push("COMPLETED (last 24h):");
94
+ lines.push(renderListHeader());
95
+ for (const r of h.recentCompleted)
96
+ lines.push(renderRunLine(r));
97
+ lines.push("");
98
+ }
99
+ // Trim trailing blank line
100
+ while (lines.length > 0 && lines[lines.length - 1] === "")
101
+ lines.pop();
102
+ return lines.join("\n");
103
+ }
104
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/loops/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACxD,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AASzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,OAAgB;IAClE,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,YAAoB;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,YAAY,GAAgB,EAAE,CAAC;IACrC,MAAM,eAAe,GAAgB,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;YAAE,SAAS;QAEhC,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACtD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,OAAO,CAAC,CAAY,EAAE,KAAa;IAC1C,IAAI,CAAC,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,kBAAkB,CAAC;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAY,EAAE,KAAa;IAC3C,IAAI,CAAC,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,gBAAgB,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,CAAe,EAAE,OAAgB;IACrD,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAEtE,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,uBAAuB,GAAG,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,yBAAyB,CAAC;IACxF,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,yBAAyB,CAAC;IAC9G,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CACR,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,WAAW;QAC1C,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;QAC3B,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,oBAAoB,CAC7C,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,2BAA2B;IAC3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAEvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * List runs from the registry.
3
+ * When `all` is false, only active (running) runs are shown.
4
+ * When `all` is true, all runs are shown sorted by updated_at descending.
5
+ */
6
+ export declare function listRuns(registryPath: string, all: boolean): string;
@@ -0,0 +1,21 @@
1
+ import { readRegistry, activeRuns } from "../registry/read.js";
2
+ import { renderRunLine, renderListHeader } from "./render.js";
3
+ /**
4
+ * List runs from the registry.
5
+ * When `all` is false, only active (running) runs are shown.
6
+ * When `all` is true, all runs are shown sorted by updated_at descending.
7
+ */
8
+ export function listRuns(registryPath, all) {
9
+ const runs = all
10
+ ? readRegistry(registryPath).sort((a, b) => b.updated_at.localeCompare(a.updated_at))
11
+ : activeRuns(registryPath);
12
+ if (runs.length === 0) {
13
+ return all ? "No runs found." : "No active runs.";
14
+ }
15
+ const lines = [renderListHeader()];
16
+ for (const r of runs) {
17
+ lines.push(renderRunLine(r));
18
+ }
19
+ return lines.join("\n");
20
+ }
21
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/loops/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,YAAoB,EAAE,GAAY;IACzD,MAAM,IAAI,GAAG,GAAG;QACd,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrF,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { RunRecord } from "../registry/types.js";
2
+ /**
3
+ * Render a concise one-line summary for a run record.
4
+ * Format: <short-id> <status> <preset> iter:<N> <latest_event> <updated_at>
5
+ */
6
+ export declare function renderRunLine(r: RunRecord): string;
7
+ /**
8
+ * Render a multi-line detail view for a single run.
9
+ */
10
+ export declare function renderRunDetail(r: RunRecord): string;
11
+ /**
12
+ * Render artifact paths for a run.
13
+ */
14
+ export declare function renderArtifacts(r: RunRecord, registryPath: string): string;
15
+ /**
16
+ * Render a header line for the list view.
17
+ */
18
+ export declare function renderListHeader(): string;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Render a concise one-line summary for a run record.
3
+ * Format: <short-id> <status> <preset> iter:<N> <latest_event> <updated_at>
4
+ */
5
+ export function renderRunLine(r) {
6
+ const shortId = shortRunId(r.run_id);
7
+ const parts = [
8
+ shortId.padEnd(24),
9
+ r.status.padEnd(10),
10
+ r.preset.padEnd(14),
11
+ ("iter:" + r.iteration).padEnd(8),
12
+ r.latest_event.padEnd(18),
13
+ formatTime(r.updated_at),
14
+ ];
15
+ return parts.join(" ");
16
+ }
17
+ /**
18
+ * Render a multi-line detail view for a single run.
19
+ */
20
+ export function renderRunDetail(r) {
21
+ const lines = [
22
+ field("Run", r.run_id),
23
+ field("Status", r.status),
24
+ field("Preset", r.preset),
25
+ field("Objective", truncate(r.objective, 120)),
26
+ field("Trigger", r.trigger),
27
+ field("Backend", r.backend),
28
+ field("Iteration", String(r.iteration)),
29
+ field("Latest", r.latest_event),
30
+ ];
31
+ if (r.stop_reason)
32
+ lines.push(field("Stop", r.stop_reason));
33
+ lines.push(field("Created", r.created_at));
34
+ lines.push(field("Updated", r.updated_at));
35
+ lines.push(field("Work dir", r.work_dir));
36
+ lines.push(field("State dir", r.state_dir));
37
+ if (r.parent_run_id)
38
+ lines.push(field("Parent", r.parent_run_id));
39
+ return lines.join("\n");
40
+ }
41
+ /**
42
+ * Render artifact paths for a run.
43
+ */
44
+ export function renderArtifacts(r, registryPath) {
45
+ const lines = [
46
+ field("Journal", r.journal_file),
47
+ field("Registry", registryPath),
48
+ field("State dir", r.state_dir),
49
+ field("Work dir", r.work_dir),
50
+ ];
51
+ return lines.join("\n");
52
+ }
53
+ /**
54
+ * Render a header line for the list view.
55
+ */
56
+ export function renderListHeader() {
57
+ const parts = [
58
+ "RUN ID".padEnd(24),
59
+ "STATUS".padEnd(10),
60
+ "PRESET".padEnd(14),
61
+ "ITER".padEnd(8),
62
+ "LATEST EVENT".padEnd(18),
63
+ "UPDATED",
64
+ ];
65
+ return parts.join(" ");
66
+ }
67
+ function field(label, value) {
68
+ return (label + ":").padEnd(12) + value;
69
+ }
70
+ function shortRunId(id) {
71
+ // run-abc12345-xyz0 → keep full id but it's already short enough
72
+ // If run IDs are long, truncate to 16 chars
73
+ if (id.length <= 24)
74
+ return id;
75
+ return id.slice(0, 22) + "..";
76
+ }
77
+ function truncate(s, max) {
78
+ if (s.length <= max)
79
+ return s;
80
+ return s.slice(0, max - 3) + "...";
81
+ }
82
+ function formatTime(iso) {
83
+ if (!iso)
84
+ return "-";
85
+ return iso;
86
+ }
87
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/loops/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Show detail view for a run by exact or partial ID.
3
+ */
4
+ export declare function showRun(registryPath: string, partial: string): string;
5
+ /**
6
+ * Show artifact paths for a run by exact or partial ID.
7
+ */
8
+ export declare function showArtifacts(registryPath: string, partial: string): string;
@@ -0,0 +1,31 @@
1
+ import { findRunByPrefix } from "../registry/read.js";
2
+ import { renderRunDetail, renderArtifacts } from "./render.js";
3
+ /**
4
+ * Show detail view for a run by exact or partial ID.
5
+ */
6
+ export function showRun(registryPath, partial) {
7
+ const result = findRunByPrefix(registryPath, partial);
8
+ if (result === undefined) {
9
+ return "No run matching '" + partial + "'.";
10
+ }
11
+ if (Array.isArray(result)) {
12
+ const ids = result.map((r) => " " + r.run_id).join("\n");
13
+ return "Ambiguous run ID '" + partial + "'. Matches:\n" + ids;
14
+ }
15
+ return renderRunDetail(result);
16
+ }
17
+ /**
18
+ * Show artifact paths for a run by exact or partial ID.
19
+ */
20
+ export function showArtifacts(registryPath, partial) {
21
+ const result = findRunByPrefix(registryPath, partial);
22
+ if (result === undefined) {
23
+ return "No run matching '" + partial + "'.";
24
+ }
25
+ if (Array.isArray(result)) {
26
+ const ids = result.map((r) => " " + r.run_id).join("\n");
27
+ return "Ambiguous run ID '" + partial + "'. Matches:\n" + ids;
28
+ }
29
+ return renderArtifacts(result, registryPath);
30
+ }
31
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../src/loops/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,YAAoB,EAAE,OAAe;IAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,mBAAmB,GAAG,OAAO,GAAG,IAAI,CAAC;IAC9C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,oBAAoB,GAAG,OAAO,GAAG,eAAe,GAAG,GAAG,CAAC;IAChE,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,OAAe;IACjE,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAEtD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,mBAAmB,GAAG,OAAO,GAAG,IAAI,CAAC;IAC9C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,oBAAoB,GAAG,OAAO,GAAG,eAAe,GAAG,GAAG,CAAC;IAChE,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Watch a run by polling the registry. Prints compact progress lines when
3
+ * state changes, then a full detail view when the run reaches a terminal
4
+ * status.
5
+ *
6
+ * For already-terminal runs, prints the detail view and returns immediately.
7
+ */
8
+ export declare function watchRun(registryPath: string, partial: string, intervalMs?: number): Promise<void>;
@@ -0,0 +1,77 @@
1
+ import { findRunByPrefix } from "../registry/read.js";
2
+ import { renderRunDetail, renderRunLine, renderListHeader } from "./render.js";
3
+ const DEFAULT_INTERVAL_MS = 2000;
4
+ const TERMINAL_STATUSES = new Set(["completed", "failed", "timed_out", "stopped"]);
5
+ /**
6
+ * Watch a run by polling the registry. Prints compact progress lines when
7
+ * state changes, then a full detail view when the run reaches a terminal
8
+ * status.
9
+ *
10
+ * For already-terminal runs, prints the detail view and returns immediately.
11
+ */
12
+ export async function watchRun(registryPath, partial, intervalMs = DEFAULT_INTERVAL_MS) {
13
+ const initial = resolveRun(registryPath, partial);
14
+ if (typeof initial === "string") {
15
+ console.log(initial);
16
+ return;
17
+ }
18
+ if (isTerminal(initial)) {
19
+ console.log("[watch] Run already " + initial.status + ".");
20
+ console.log(renderRunDetail(initial));
21
+ return;
22
+ }
23
+ console.log("[watch] Watching " + initial.run_id + " (poll every " + (intervalMs / 1000) + "s)");
24
+ console.log(renderListHeader());
25
+ console.log(renderRunLine(initial));
26
+ let prev = snapshot(initial);
27
+ return new Promise((resolve) => {
28
+ const onSigint = () => {
29
+ console.log("\n[watch] Interrupted.");
30
+ clearInterval(timer);
31
+ resolve();
32
+ };
33
+ process.on("SIGINT", onSigint);
34
+ const timer = setInterval(() => {
35
+ const current = resolveRun(registryPath, initial.run_id);
36
+ if (typeof current === "string") {
37
+ // Run disappeared from registry — unusual but handle gracefully
38
+ console.log("[watch] " + current);
39
+ clearInterval(timer);
40
+ process.off("SIGINT", onSigint);
41
+ resolve();
42
+ return;
43
+ }
44
+ const snap = snapshot(current);
45
+ if (snap !== prev) {
46
+ prev = snap;
47
+ console.log(renderRunLine(current));
48
+ }
49
+ if (isTerminal(current)) {
50
+ console.log("");
51
+ console.log("[watch] Run " + current.status + ".");
52
+ console.log(renderRunDetail(current));
53
+ clearInterval(timer);
54
+ process.off("SIGINT", onSigint);
55
+ resolve();
56
+ }
57
+ }, intervalMs);
58
+ });
59
+ }
60
+ function resolveRun(registryPath, partial) {
61
+ const result = findRunByPrefix(registryPath, partial);
62
+ if (result === undefined) {
63
+ return "No run matching '" + partial + "'.";
64
+ }
65
+ if (Array.isArray(result)) {
66
+ const ids = result.map((r) => " " + r.run_id).join("\n");
67
+ return "Ambiguous run ID '" + partial + "'. Matches:\n" + ids;
68
+ }
69
+ return result;
70
+ }
71
+ function isTerminal(r) {
72
+ return TERMINAL_STATUSES.has(r.status);
73
+ }
74
+ function snapshot(r) {
75
+ return r.iteration + "|" + r.latest_event + "|" + r.status + "|" + r.updated_at;
76
+ }
77
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/loops/watch.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,101 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve, join } from "node:path";
3
+ import * as harness from "./harness/index.js";
4
+ import { printUsage, printEmitUsage } from "./usage.js";
5
+ import { dispatchRun } from "./commands/run.js";
6
+ import { dispatchMemory } from "./commands/memory.js";
7
+ import { dispatchChain } from "./commands/chain.js";
8
+ import { dispatchInspect } from "./commands/inspect.js";
9
+ import { dispatchList } from "./commands/list.js";
10
+ import { dispatchPiAdapter } from "./commands/pi-adapter.js";
11
+ import { dispatchLoops } from "./commands/loops.js";
12
+ function main() {
13
+ const argv = process.argv;
14
+ const args = runtimeArgv(argv);
15
+ dispatch(args, argv);
16
+ }
17
+ function dispatch(args, argv) {
18
+ const cmd = args[0] ?? "";
19
+ const selfCmd = selfCommand(argv);
20
+ const bundleRoot = resolveBundleRoot(argv);
21
+ switch (cmd) {
22
+ case "--help":
23
+ case "-h":
24
+ printUsage();
25
+ return;
26
+ case "run":
27
+ dispatchRun(args.slice(1), argv, bundleRoot, selfCmd);
28
+ return;
29
+ case "emit":
30
+ if (!args[1] || args[1] === "--help" || args[1] === "-h") {
31
+ printEmitUsage();
32
+ return;
33
+ }
34
+ harness.emit(resolveRuntimeProjectDir(), args[1], args.slice(2).join(" "));
35
+ return;
36
+ case "list":
37
+ dispatchList(args.slice(1));
38
+ return;
39
+ case "loops":
40
+ dispatchLoops(args.slice(1));
41
+ return;
42
+ case "inspect":
43
+ dispatchInspect(args.slice(1));
44
+ return;
45
+ case "pi-adapter":
46
+ dispatchPiAdapter(args.slice(1));
47
+ return;
48
+ case "branch-run":
49
+ harness.runParallelBranchCli(args[1], args[2], selfCmd);
50
+ return;
51
+ case "memory":
52
+ dispatchMemory(args.slice(1));
53
+ return;
54
+ case "chain":
55
+ dispatchChain(args.slice(1), selfCmd);
56
+ return;
57
+ default:
58
+ dispatchRun(args, argv, bundleRoot, selfCmd);
59
+ }
60
+ }
61
+ function resolveRuntimeProjectDir() {
62
+ return process.env["MINILOOPS_PROJECT_DIR"] || ".";
63
+ }
64
+ function runtimeArgv(argv) {
65
+ // argv[0] is node, argv[1] is script, rest is user args
66
+ const userArgs = argv.slice(2);
67
+ if (userArgs.length === 0)
68
+ return [];
69
+ // If first arg is a CLI command, use as-is
70
+ if (isCliCommand(userArgs[0]))
71
+ return userArgs;
72
+ // For "autoloop run <project>" form, pass through
73
+ if (userArgs[0] === "run" && userArgs.length >= 2) {
74
+ return userArgs;
75
+ }
76
+ return userArgs;
77
+ }
78
+ function isCliCommand(value) {
79
+ return ["run", "emit", "inspect", "memory", "list", "loops", "chain", "pi-adapter", "branch-run", "--help", "-h"].includes(value);
80
+ }
81
+ function selfCommand(argv) {
82
+ // Return a command that re-invokes this program
83
+ return "'" + resolve(argv[1] ?? "autoloop") + "'";
84
+ }
85
+ function resolveBundleRoot(argv) {
86
+ const envRoot = process.env["AUTOLOOPS_BUNDLE_ROOT"];
87
+ if (envRoot)
88
+ return envRoot;
89
+ // Try to resolve from the script location
90
+ const scriptPath = argv[1] ?? "";
91
+ if (scriptPath) {
92
+ // The bundle root is the directory containing the script's parent project
93
+ const scriptDir = resolve(scriptPath, "..");
94
+ const candidate = resolve(scriptDir, "..");
95
+ if (existsSync(join(candidate, "presets")))
96
+ return candidate;
97
+ }
98
+ return ".";
99
+ }
100
+ main();
101
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAY,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,SAAS,IAAI;IACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc,EAAE,IAAc;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE3C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,UAAU,EAAE,CAAC;YACb,OAAO;QACT,KAAK,KAAK;YACR,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO;QACT,KAAK,MAAM;YACT,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAAC,cAAc,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3E,OAAO;QACT,KAAK,MAAM;YACT,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO;QACT,KAAK,OAAO;YACV,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,OAAO;QACT,KAAK,SAAS;YACZ,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO;QACT,KAAK,YAAY;YACf,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO;QACT,KAAK,YAAY;YACf,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO;QACT,KAAK,QAAQ;YACX,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO;QACT,KAAK,OAAO;YACV,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO;QACT;YACE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,GAAG,CAAC;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IACjC,wDAAwD;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,2CAA2C;IAC3C,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE/C,kDAAkD;IAClD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpI,CAAC;AAED,SAAS,WAAW,CAAC,IAAc;IACjC,gDAAgD;IAChD,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,GAAG,CAAC;AACpD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,UAAU,EAAE,CAAC;QACf,0EAA0E;QAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function bold(text: string): string;
2
+ export declare function italic(text: string): string;
3
+ export declare function code(text: string): string;
4
+ export declare function heading(level: number, text: string): string;
5
+ export declare function codeBlock(text: string, lang?: string): string;
6
+ export declare function blockquote(text: string): string;
7
+ export declare function section(title: string, body: string, level?: number): string;
8
+ export declare function bulletList(items: string[]): string;
9
+ export declare function numberedList(items: string[]): string;
10
+ export declare function table(headers: string[], rows: string[][]): string;
@@ -0,0 +1,66 @@
1
+ export function bold(text) {
2
+ return "**" + text + "**";
3
+ }
4
+ export function italic(text) {
5
+ return "_" + text + "_";
6
+ }
7
+ export function code(text) {
8
+ return "`" + text + "`";
9
+ }
10
+ export function heading(level, text) {
11
+ const prefix = "#".repeat(Math.min(Math.max(level, 1), 5));
12
+ return prefix + " " + text;
13
+ }
14
+ export function codeBlock(text, lang = "") {
15
+ return "```" + lang + "\n" + text + "\n```";
16
+ }
17
+ export function blockquote(text) {
18
+ return prefixLines(text, "> ");
19
+ }
20
+ export function section(title, body, level = 2) {
21
+ return heading(level, title) + "\n\n" + body;
22
+ }
23
+ export function bulletList(items) {
24
+ if (items.length === 0)
25
+ return "";
26
+ return items.map((item) => "- " + item).join("\n");
27
+ }
28
+ export function numberedList(items) {
29
+ if (items.length === 0)
30
+ return "";
31
+ return items.map((item, i) => (i + 1) + ". " + item).join("\n");
32
+ }
33
+ export function table(headers, rows) {
34
+ const widths = columnWidths(headers, rows);
35
+ const headerRow = tableRow(headers, widths);
36
+ const separator = separatorRow(widths);
37
+ const body = rows.map((row) => tableRow(row, widths)).join("\n");
38
+ return headerRow + "\n" + separator + (rows.length > 0 ? "\n" + body : "");
39
+ }
40
+ function tableRow(cells, widths) {
41
+ const padded = cells.map((cell, i) => padCell(cell, widths[i] ?? cell.length));
42
+ return "| " + padded.join(" | ") + " |";
43
+ }
44
+ function padCell(cell, width) {
45
+ return cell.padEnd(width);
46
+ }
47
+ function separatorRow(widths) {
48
+ const dashes = widths.map((w) => "-".repeat(w));
49
+ return "| " + dashes.join(" | ") + " |";
50
+ }
51
+ function columnWidths(headers, rows) {
52
+ const widths = headers.map((h) => h.length);
53
+ for (const row of rows) {
54
+ for (let i = 0; i < row.length && i < widths.length; i++) {
55
+ widths[i] = Math.max(widths[i], row[i].length);
56
+ }
57
+ }
58
+ return widths;
59
+ }
60
+ function prefixLines(text, prefix) {
61
+ return text
62
+ .split("\n")
63
+ .map((line) => prefix + line)
64
+ .join("\n");
65
+ }
66
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface MaterializedMemory {
2
+ preferences: string[];
3
+ learnings: string[];
4
+ meta: string[];
5
+ }
6
+ export declare function truncateText(text: string, budgetChars: number, memory: MaterializedMemory): string;