@ashlr/hub 2.2.0

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 (477) hide show
  1. package/CHANGELOG.md +1158 -0
  2. package/LICENSE +21 -0
  3. package/README.md +833 -0
  4. package/bin/ashlr +8 -0
  5. package/dist/api/core.d.ts +28 -0
  6. package/dist/api/core.js +42 -0
  7. package/dist/api/core.js.map +1 -0
  8. package/dist/api/index.d.ts +9 -0
  9. package/dist/api/index.js +9 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/plugin.d.ts +12 -0
  12. package/dist/api/plugin.js +13 -0
  13. package/dist/api/plugin.js.map +1 -0
  14. package/dist/api/types.d.ts +9 -0
  15. package/dist/api/types.js +9 -0
  16. package/dist/api/types.js.map +1 -0
  17. package/dist/cli/args.d.ts +20 -0
  18. package/dist/cli/args.js +23 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/ask.d.ts +22 -0
  21. package/dist/cli/ask.js +240 -0
  22. package/dist/cli/ask.js.map +1 -0
  23. package/dist/cli/audit.d.ts +26 -0
  24. package/dist/cli/audit.js +199 -0
  25. package/dist/cli/audit.js.map +1 -0
  26. package/dist/cli/backlog.d.ts +26 -0
  27. package/dist/cli/backlog.js +322 -0
  28. package/dist/cli/backlog.js.map +1 -0
  29. package/dist/cli/completions.d.ts +18 -0
  30. package/dist/cli/completions.js +156 -0
  31. package/dist/cli/completions.js.map +1 -0
  32. package/dist/cli/daemon.d.ts +31 -0
  33. package/dist/cli/daemon.js +334 -0
  34. package/dist/cli/daemon.js.map +1 -0
  35. package/dist/cli/demo-sandbox.d.ts +78 -0
  36. package/dist/cli/demo-sandbox.js +227 -0
  37. package/dist/cli/demo-sandbox.js.map +1 -0
  38. package/dist/cli/demo.d.ts +76 -0
  39. package/dist/cli/demo.js +285 -0
  40. package/dist/cli/demo.js.map +1 -0
  41. package/dist/cli/digest.d.ts +46 -0
  42. package/dist/cli/digest.js +352 -0
  43. package/dist/cli/digest.js.map +1 -0
  44. package/dist/cli/doctor-init.d.ts +28 -0
  45. package/dist/cli/doctor-init.js +335 -0
  46. package/dist/cli/doctor-init.js.map +1 -0
  47. package/dist/cli/genome.d.ts +62 -0
  48. package/dist/cli/genome.js +1061 -0
  49. package/dist/cli/genome.js.map +1 -0
  50. package/dist/cli/gh.d.ts +27 -0
  51. package/dist/cli/gh.js +322 -0
  52. package/dist/cli/gh.js.map +1 -0
  53. package/dist/cli/goals.d.ts +55 -0
  54. package/dist/cli/goals.js +667 -0
  55. package/dist/cli/goals.js.map +1 -0
  56. package/dist/cli/health.d.ts +56 -0
  57. package/dist/cli/health.js +407 -0
  58. package/dist/cli/health.js.map +1 -0
  59. package/dist/cli/help.d.ts +51 -0
  60. package/dist/cli/help.js +436 -0
  61. package/dist/cli/help.js.map +1 -0
  62. package/dist/cli/inbox.d.ts +28 -0
  63. package/dist/cli/inbox.js +589 -0
  64. package/dist/cli/inbox.js.map +1 -0
  65. package/dist/cli/index.d.ts +41 -0
  66. package/dist/cli/index.js +1208 -0
  67. package/dist/cli/index.js.map +1 -0
  68. package/dist/cli/knowledge.d.ts +33 -0
  69. package/dist/cli/knowledge.js +575 -0
  70. package/dist/cli/knowledge.js.map +1 -0
  71. package/dist/cli/mcp.d.ts +26 -0
  72. package/dist/cli/mcp.js +487 -0
  73. package/dist/cli/mcp.js.map +1 -0
  74. package/dist/cli/models.d.ts +26 -0
  75. package/dist/cli/models.js +435 -0
  76. package/dist/cli/models.js.map +1 -0
  77. package/dist/cli/new.d.ts +32 -0
  78. package/dist/cli/new.js +565 -0
  79. package/dist/cli/new.js.map +1 -0
  80. package/dist/cli/notify.d.ts +20 -0
  81. package/dist/cli/notify.js +188 -0
  82. package/dist/cli/notify.js.map +1 -0
  83. package/dist/cli/onboard.d.ts +85 -0
  84. package/dist/cli/onboard.js +305 -0
  85. package/dist/cli/onboard.js.map +1 -0
  86. package/dist/cli/open.d.ts +38 -0
  87. package/dist/cli/open.js +86 -0
  88. package/dist/cli/open.js.map +1 -0
  89. package/dist/cli/orient.d.ts +14 -0
  90. package/dist/cli/orient.js +110 -0
  91. package/dist/cli/orient.js.map +1 -0
  92. package/dist/cli/picker.d.ts +21 -0
  93. package/dist/cli/picker.js +177 -0
  94. package/dist/cli/picker.js.map +1 -0
  95. package/dist/cli/plugins.d.ts +21 -0
  96. package/dist/cli/plugins.js +394 -0
  97. package/dist/cli/plugins.js.map +1 -0
  98. package/dist/cli/preflight.d.ts +29 -0
  99. package/dist/cli/preflight.js +131 -0
  100. package/dist/cli/preflight.js.map +1 -0
  101. package/dist/cli/pulse.d.ts +26 -0
  102. package/dist/cli/pulse.js +482 -0
  103. package/dist/cli/pulse.js.map +1 -0
  104. package/dist/cli/reflect.d.ts +42 -0
  105. package/dist/cli/reflect.js +381 -0
  106. package/dist/cli/reflect.js.map +1 -0
  107. package/dist/cli/run.d.ts +29 -0
  108. package/dist/cli/run.js +687 -0
  109. package/dist/cli/run.js.map +1 -0
  110. package/dist/cli/sandbox.d.ts +20 -0
  111. package/dist/cli/sandbox.js +345 -0
  112. package/dist/cli/sandbox.js.map +1 -0
  113. package/dist/cli/seams.d.ts +41 -0
  114. package/dist/cli/seams.js +167 -0
  115. package/dist/cli/seams.js.map +1 -0
  116. package/dist/cli/serve.d.ts +25 -0
  117. package/dist/cli/serve.js +249 -0
  118. package/dist/cli/serve.js.map +1 -0
  119. package/dist/cli/ship.d.ts +33 -0
  120. package/dist/cli/ship.js +433 -0
  121. package/dist/cli/ship.js.map +1 -0
  122. package/dist/cli/spec.d.ts +19 -0
  123. package/dist/cli/spec.js +478 -0
  124. package/dist/cli/spec.js.map +1 -0
  125. package/dist/cli/swarm.d.ts +42 -0
  126. package/dist/cli/swarm.js +1365 -0
  127. package/dist/cli/swarm.js.map +1 -0
  128. package/dist/cli/telemetry.d.ts +26 -0
  129. package/dist/cli/telemetry.js +364 -0
  130. package/dist/cli/telemetry.js.map +1 -0
  131. package/dist/cli/tui.d.ts +17 -0
  132. package/dist/cli/tui.js +52 -0
  133. package/dist/cli/tui.js.map +1 -0
  134. package/dist/cli/ui.d.ts +53 -0
  135. package/dist/cli/ui.js +66 -0
  136. package/dist/cli/ui.js.map +1 -0
  137. package/dist/cli/update.d.ts +38 -0
  138. package/dist/cli/update.js +682 -0
  139. package/dist/cli/update.js.map +1 -0
  140. package/dist/cli/vercel.d.ts +20 -0
  141. package/dist/cli/vercel.js +193 -0
  142. package/dist/cli/vercel.js.map +1 -0
  143. package/dist/cli/verify-safety.d.ts +96 -0
  144. package/dist/cli/verify-safety.js +509 -0
  145. package/dist/cli/verify-safety.js.map +1 -0
  146. package/dist/cli/wire.d.ts +22 -0
  147. package/dist/cli/wire.js +205 -0
  148. package/dist/cli/wire.js.map +1 -0
  149. package/dist/core/classify.d.ts +51 -0
  150. package/dist/core/classify.js +450 -0
  151. package/dist/core/classify.js.map +1 -0
  152. package/dist/core/config.d.ts +63 -0
  153. package/dist/core/config.js +474 -0
  154. package/dist/core/config.js.map +1 -0
  155. package/dist/core/daemon/loop.d.ts +74 -0
  156. package/dist/core/daemon/loop.js +618 -0
  157. package/dist/core/daemon/loop.js.map +1 -0
  158. package/dist/core/daemon/state.d.ts +66 -0
  159. package/dist/core/daemon/state.js +197 -0
  160. package/dist/core/daemon/state.js.map +1 -0
  161. package/dist/core/dashboard.d.ts +40 -0
  162. package/dist/core/dashboard.js +463 -0
  163. package/dist/core/dashboard.js.map +1 -0
  164. package/dist/core/digest/build.d.ts +51 -0
  165. package/dist/core/digest/build.js +230 -0
  166. package/dist/core/digest/build.js.map +1 -0
  167. package/dist/core/digest/deliver.d.ts +47 -0
  168. package/dist/core/digest/deliver.js +230 -0
  169. package/dist/core/digest/deliver.js.map +1 -0
  170. package/dist/core/digest/store.d.ts +57 -0
  171. package/dist/core/digest/store.js +223 -0
  172. package/dist/core/digest/store.js.map +1 -0
  173. package/dist/core/doctor-fix.d.ts +21 -0
  174. package/dist/core/doctor-fix.js +440 -0
  175. package/dist/core/doctor-fix.js.map +1 -0
  176. package/dist/core/doctor.d.ts +18 -0
  177. package/dist/core/doctor.js +806 -0
  178. package/dist/core/doctor.js.map +1 -0
  179. package/dist/core/env-bridge.d.ts +64 -0
  180. package/dist/core/env-bridge.js +103 -0
  181. package/dist/core/env-bridge.js.map +1 -0
  182. package/dist/core/genome/capture.d.ts +49 -0
  183. package/dist/core/genome/capture.js +352 -0
  184. package/dist/core/genome/capture.js.map +1 -0
  185. package/dist/core/genome/consolidate.d.ts +38 -0
  186. package/dist/core/genome/consolidate.js +426 -0
  187. package/dist/core/genome/consolidate.js.map +1 -0
  188. package/dist/core/genome/export.d.ts +29 -0
  189. package/dist/core/genome/export.js +102 -0
  190. package/dist/core/genome/export.js.map +1 -0
  191. package/dist/core/genome/playbook.d.ts +33 -0
  192. package/dist/core/genome/playbook.js +320 -0
  193. package/dist/core/genome/playbook.js.map +1 -0
  194. package/dist/core/genome/recall.d.ts +45 -0
  195. package/dist/core/genome/recall.js +293 -0
  196. package/dist/core/genome/recall.js.map +1 -0
  197. package/dist/core/genome/store.d.ts +62 -0
  198. package/dist/core/genome/store.js +711 -0
  199. package/dist/core/genome/store.js.map +1 -0
  200. package/dist/core/git.d.ts +34 -0
  201. package/dist/core/git.js +115 -0
  202. package/dist/core/git.js.map +1 -0
  203. package/dist/core/goals/advance.d.ts +82 -0
  204. package/dist/core/goals/advance.js +263 -0
  205. package/dist/core/goals/advance.js.map +1 -0
  206. package/dist/core/goals/planner.d.ts +58 -0
  207. package/dist/core/goals/planner.js +233 -0
  208. package/dist/core/goals/planner.js.map +1 -0
  209. package/dist/core/goals/store.d.ts +128 -0
  210. package/dist/core/goals/store.js +442 -0
  211. package/dist/core/goals/store.js.map +1 -0
  212. package/dist/core/inbox/apply.d.ts +36 -0
  213. package/dist/core/inbox/apply.js +407 -0
  214. package/dist/core/inbox/apply.js.map +1 -0
  215. package/dist/core/inbox/notify-proposal.d.ts +13 -0
  216. package/dist/core/inbox/notify-proposal.js +21 -0
  217. package/dist/core/inbox/notify-proposal.js.map +1 -0
  218. package/dist/core/inbox/store.d.ts +67 -0
  219. package/dist/core/inbox/store.js +258 -0
  220. package/dist/core/inbox/store.js.map +1 -0
  221. package/dist/core/index-engine.d.ts +62 -0
  222. package/dist/core/index-engine.js +486 -0
  223. package/dist/core/index-engine.js.map +1 -0
  224. package/dist/core/integrations/desktop-notify.d.ts +18 -0
  225. package/dist/core/integrations/desktop-notify.js +42 -0
  226. package/dist/core/integrations/desktop-notify.js.map +1 -0
  227. package/dist/core/integrations/editors.d.ts +50 -0
  228. package/dist/core/integrations/editors.js +216 -0
  229. package/dist/core/integrations/editors.js.map +1 -0
  230. package/dist/core/integrations/github.d.ts +66 -0
  231. package/dist/core/integrations/github.js +332 -0
  232. package/dist/core/integrations/github.js.map +1 -0
  233. package/dist/core/integrations/identity.d.ts +29 -0
  234. package/dist/core/integrations/identity.js +359 -0
  235. package/dist/core/integrations/identity.js.map +1 -0
  236. package/dist/core/integrations/notify.d.ts +23 -0
  237. package/dist/core/integrations/notify.js +96 -0
  238. package/dist/core/integrations/notify.js.map +1 -0
  239. package/dist/core/integrations/vercel.d.ts +37 -0
  240. package/dist/core/integrations/vercel.js +192 -0
  241. package/dist/core/integrations/vercel.js.map +1 -0
  242. package/dist/core/knowledge/ask.d.ts +34 -0
  243. package/dist/core/knowledge/ask.js +325 -0
  244. package/dist/core/knowledge/ask.js.map +1 -0
  245. package/dist/core/knowledge/graph.d.ts +51 -0
  246. package/dist/core/knowledge/graph.js +564 -0
  247. package/dist/core/knowledge/graph.js.map +1 -0
  248. package/dist/core/knowledge/index.d.ts +74 -0
  249. package/dist/core/knowledge/index.js +586 -0
  250. package/dist/core/knowledge/index.js.map +1 -0
  251. package/dist/core/learn/playbooks.d.ts +84 -0
  252. package/dist/core/learn/playbooks.js +241 -0
  253. package/dist/core/learn/playbooks.js.map +1 -0
  254. package/dist/core/learn/reflect.d.ts +87 -0
  255. package/dist/core/learn/reflect.js +435 -0
  256. package/dist/core/learn/reflect.js.map +1 -0
  257. package/dist/core/learn/store.d.ts +51 -0
  258. package/dist/core/learn/store.js +165 -0
  259. package/dist/core/learn/store.js.map +1 -0
  260. package/dist/core/learn/tuning.d.ts +48 -0
  261. package/dist/core/learn/tuning.js +201 -0
  262. package/dist/core/learn/tuning.js.map +1 -0
  263. package/dist/core/lifecycle/scaffold.d.ts +43 -0
  264. package/dist/core/lifecycle/scaffold.js +260 -0
  265. package/dist/core/lifecycle/scaffold.js.map +1 -0
  266. package/dist/core/lifecycle/ship.d.ts +48 -0
  267. package/dist/core/lifecycle/ship.js +513 -0
  268. package/dist/core/lifecycle/ship.js.map +1 -0
  269. package/dist/core/lifecycle/templates.d.ts +20 -0
  270. package/dist/core/lifecycle/templates.js +605 -0
  271. package/dist/core/lifecycle/templates.js.map +1 -0
  272. package/dist/core/mcp-gateway.d.ts +59 -0
  273. package/dist/core/mcp-gateway.js +385 -0
  274. package/dist/core/mcp-gateway.js.map +1 -0
  275. package/dist/core/mcp-native.d.ts +53 -0
  276. package/dist/core/mcp-native.js +507 -0
  277. package/dist/core/mcp-native.js.map +1 -0
  278. package/dist/core/mcp-registry.d.ts +36 -0
  279. package/dist/core/mcp-registry.js +180 -0
  280. package/dist/core/mcp-registry.js.map +1 -0
  281. package/dist/core/observability/budget-alert.d.ts +18 -0
  282. package/dist/core/observability/budget-alert.js +90 -0
  283. package/dist/core/observability/budget-alert.js.map +1 -0
  284. package/dist/core/observability/estimate.d.ts +27 -0
  285. package/dist/core/observability/estimate.js +188 -0
  286. package/dist/core/observability/estimate.js.map +1 -0
  287. package/dist/core/observability/forecast.d.ts +19 -0
  288. package/dist/core/observability/forecast.js +101 -0
  289. package/dist/core/observability/forecast.js.map +1 -0
  290. package/dist/core/observability/governance.d.ts +28 -0
  291. package/dist/core/observability/governance.js +101 -0
  292. package/dist/core/observability/governance.js.map +1 -0
  293. package/dist/core/observability/otlp.d.ts +88 -0
  294. package/dist/core/observability/otlp.js +217 -0
  295. package/dist/core/observability/otlp.js.map +1 -0
  296. package/dist/core/observability/rollup.d.ts +35 -0
  297. package/dist/core/observability/rollup.js +311 -0
  298. package/dist/core/observability/rollup.js.map +1 -0
  299. package/dist/core/observability/telemetry-sink.d.ts +63 -0
  300. package/dist/core/observability/telemetry-sink.js +350 -0
  301. package/dist/core/observability/telemetry-sink.js.map +1 -0
  302. package/dist/core/observability/usage-source.d.ts +60 -0
  303. package/dist/core/observability/usage-source.js +347 -0
  304. package/dist/core/observability/usage-source.js.map +1 -0
  305. package/dist/core/onboard.d.ts +27 -0
  306. package/dist/core/onboard.js +288 -0
  307. package/dist/core/onboard.js.map +1 -0
  308. package/dist/core/orient.d.ts +23 -0
  309. package/dist/core/orient.js +135 -0
  310. package/dist/core/orient.js.map +1 -0
  311. package/dist/core/phantom.d.ts +23 -0
  312. package/dist/core/phantom.js +279 -0
  313. package/dist/core/phantom.js.map +1 -0
  314. package/dist/core/plugins/host-api.d.ts +29 -0
  315. package/dist/core/plugins/host-api.js +113 -0
  316. package/dist/core/plugins/host-api.js.map +1 -0
  317. package/dist/core/plugins/integrity.d.ts +36 -0
  318. package/dist/core/plugins/integrity.js +73 -0
  319. package/dist/core/plugins/integrity.js.map +1 -0
  320. package/dist/core/plugins/manifest.d.ts +31 -0
  321. package/dist/core/plugins/manifest.js +316 -0
  322. package/dist/core/plugins/manifest.js.map +1 -0
  323. package/dist/core/plugins/registry.d.ts +87 -0
  324. package/dist/core/plugins/registry.js +415 -0
  325. package/dist/core/plugins/registry.js.map +1 -0
  326. package/dist/core/plugins/types.d.ts +182 -0
  327. package/dist/core/plugins/types.js +40 -0
  328. package/dist/core/plugins/types.js.map +1 -0
  329. package/dist/core/plugins/wrappers.d.ts +40 -0
  330. package/dist/core/plugins/wrappers.js +229 -0
  331. package/dist/core/plugins/wrappers.js.map +1 -0
  332. package/dist/core/portfolio/backlog.d.ts +40 -0
  333. package/dist/core/portfolio/backlog.js +177 -0
  334. package/dist/core/portfolio/backlog.js.map +1 -0
  335. package/dist/core/portfolio/scanners.d.ts +21 -0
  336. package/dist/core/portfolio/scanners.js +600 -0
  337. package/dist/core/portfolio/scanners.js.map +1 -0
  338. package/dist/core/providers.d.ts +34 -0
  339. package/dist/core/providers.js +250 -0
  340. package/dist/core/providers.js.map +1 -0
  341. package/dist/core/quality/conventions.d.ts +35 -0
  342. package/dist/core/quality/conventions.js +267 -0
  343. package/dist/core/quality/conventions.js.map +1 -0
  344. package/dist/core/quality/fixes.d.ts +56 -0
  345. package/dist/core/quality/fixes.js +209 -0
  346. package/dist/core/quality/fixes.js.map +1 -0
  347. package/dist/core/quality/health.d.ts +69 -0
  348. package/dist/core/quality/health.js +350 -0
  349. package/dist/core/quality/health.js.map +1 -0
  350. package/dist/core/quality/store.d.ts +56 -0
  351. package/dist/core/quality/store.js +195 -0
  352. package/dist/core/quality/store.js.map +1 -0
  353. package/dist/core/readiness.d.ts +112 -0
  354. package/dist/core/readiness.js +431 -0
  355. package/dist/core/readiness.js.map +1 -0
  356. package/dist/core/run/agent-loop.d.ts +40 -0
  357. package/dist/core/run/agent-loop.js +291 -0
  358. package/dist/core/run/agent-loop.js.map +1 -0
  359. package/dist/core/run/budget.d.ts +47 -0
  360. package/dist/core/run/budget.js +113 -0
  361. package/dist/core/run/budget.js.map +1 -0
  362. package/dist/core/run/engines.d.ts +75 -0
  363. package/dist/core/run/engines.js +199 -0
  364. package/dist/core/run/engines.js.map +1 -0
  365. package/dist/core/run/model-manager.d.ts +64 -0
  366. package/dist/core/run/model-manager.js +339 -0
  367. package/dist/core/run/model-manager.js.map +1 -0
  368. package/dist/core/run/orchestrator.d.ts +100 -0
  369. package/dist/core/run/orchestrator.js +1515 -0
  370. package/dist/core/run/orchestrator.js.map +1 -0
  371. package/dist/core/run/provider-client.d.ts +46 -0
  372. package/dist/core/run/provider-client.js +796 -0
  373. package/dist/core/run/provider-client.js.map +1 -0
  374. package/dist/core/run/retry.d.ts +19 -0
  375. package/dist/core/run/retry.js +68 -0
  376. package/dist/core/run/retry.js.map +1 -0
  377. package/dist/core/run/router.d.ts +50 -0
  378. package/dist/core/run/router.js +257 -0
  379. package/dist/core/run/router.js.map +1 -0
  380. package/dist/core/run/self-heal.d.ts +52 -0
  381. package/dist/core/run/self-heal.js +181 -0
  382. package/dist/core/run/self-heal.js.map +1 -0
  383. package/dist/core/run/streaming.d.ts +31 -0
  384. package/dist/core/run/streaming.js +122 -0
  385. package/dist/core/run/streaming.js.map +1 -0
  386. package/dist/core/run/verify.d.ts +30 -0
  387. package/dist/core/run/verify.js +204 -0
  388. package/dist/core/run/verify.js.map +1 -0
  389. package/dist/core/sandbox/audit.d.ts +31 -0
  390. package/dist/core/sandbox/audit.js +169 -0
  391. package/dist/core/sandbox/audit.js.map +1 -0
  392. package/dist/core/sandbox/policy.d.ts +61 -0
  393. package/dist/core/sandbox/policy.js +211 -0
  394. package/dist/core/sandbox/policy.js.map +1 -0
  395. package/dist/core/sandbox/worktree.d.ts +175 -0
  396. package/dist/core/sandbox/worktree.js +673 -0
  397. package/dist/core/sandbox/worktree.js.map +1 -0
  398. package/dist/core/seams/backlog.d.ts +47 -0
  399. package/dist/core/seams/backlog.js +47 -0
  400. package/dist/core/seams/backlog.js.map +1 -0
  401. package/dist/core/seams/daemon-coordinator.d.ts +72 -0
  402. package/dist/core/seams/daemon-coordinator.js +76 -0
  403. package/dist/core/seams/daemon-coordinator.js.map +1 -0
  404. package/dist/core/seams/genome.d.ts +45 -0
  405. package/dist/core/seams/genome.js +53 -0
  406. package/dist/core/seams/genome.js.map +1 -0
  407. package/dist/core/seams/identity.d.ts +40 -0
  408. package/dist/core/seams/identity.js +44 -0
  409. package/dist/core/seams/identity.js.map +1 -0
  410. package/dist/core/seams/inbox.d.ts +60 -0
  411. package/dist/core/seams/inbox.js +66 -0
  412. package/dist/core/seams/inbox.js.map +1 -0
  413. package/dist/core/seams/index.d.ts +20 -0
  414. package/dist/core/seams/index.js +21 -0
  415. package/dist/core/seams/index.js.map +1 -0
  416. package/dist/core/seams/portfolio.d.ts +50 -0
  417. package/dist/core/seams/portfolio.js +61 -0
  418. package/dist/core/seams/portfolio.js.map +1 -0
  419. package/dist/core/seams/registry.d.ts +42 -0
  420. package/dist/core/seams/registry.js +128 -0
  421. package/dist/core/seams/registry.js.map +1 -0
  422. package/dist/core/seams/run-swarm.d.ts +66 -0
  423. package/dist/core/seams/run-swarm.js +74 -0
  424. package/dist/core/seams/run-swarm.js.map +1 -0
  425. package/dist/core/seams/types.d.ts +123 -0
  426. package/dist/core/seams/types.js +35 -0
  427. package/dist/core/seams/types.js.map +1 -0
  428. package/dist/core/spec/spec-store.d.ts +62 -0
  429. package/dist/core/spec/spec-store.js +359 -0
  430. package/dist/core/spec/spec-store.js.map +1 -0
  431. package/dist/core/swarm/gate.d.ts +45 -0
  432. package/dist/core/swarm/gate.js +114 -0
  433. package/dist/core/swarm/gate.js.map +1 -0
  434. package/dist/core/swarm/planner.d.ts +32 -0
  435. package/dist/core/swarm/planner.js +293 -0
  436. package/dist/core/swarm/planner.js.map +1 -0
  437. package/dist/core/swarm/rollback.d.ts +56 -0
  438. package/dist/core/swarm/rollback.js +266 -0
  439. package/dist/core/swarm/rollback.js.map +1 -0
  440. package/dist/core/swarm/runner.d.ts +62 -0
  441. package/dist/core/swarm/runner.js +1263 -0
  442. package/dist/core/swarm/runner.js.map +1 -0
  443. package/dist/core/swarm/sign.d.ts +71 -0
  444. package/dist/core/swarm/sign.js +362 -0
  445. package/dist/core/swarm/sign.js.map +1 -0
  446. package/dist/core/swarm/store.d.ts +52 -0
  447. package/dist/core/swarm/store.js +195 -0
  448. package/dist/core/swarm/store.js.map +1 -0
  449. package/dist/core/tidy.d.ts +32 -0
  450. package/dist/core/tidy.js +354 -0
  451. package/dist/core/tidy.js.map +1 -0
  452. package/dist/core/tools-registry.d.ts +16 -0
  453. package/dist/core/tools-registry.js +308 -0
  454. package/dist/core/tools-registry.js.map +1 -0
  455. package/dist/core/types.d.ts +2545 -0
  456. package/dist/core/types.js +9 -0
  457. package/dist/core/types.js.map +1 -0
  458. package/dist/core/web/api.d.ts +53 -0
  459. package/dist/core/web/api.js +698 -0
  460. package/dist/core/web/api.js.map +1 -0
  461. package/dist/core/web/public/app.js +1906 -0
  462. package/dist/core/web/public/index.html +721 -0
  463. package/dist/core/web/public/styles.css +2007 -0
  464. package/dist/core/web/server.d.ts +18 -0
  465. package/dist/core/web/server.js +122 -0
  466. package/dist/core/web/server.js.map +1 -0
  467. package/dist/core/web/static.d.ts +18 -0
  468. package/dist/core/web/static.js +122 -0
  469. package/dist/core/web/static.js.map +1 -0
  470. package/dist/tui/app.d.ts +33 -0
  471. package/dist/tui/app.js +350 -0
  472. package/dist/tui/app.js.map +1 -0
  473. package/dist/tui/render.d.ts +20 -0
  474. package/dist/tui/render.js +558 -0
  475. package/dist/tui/render.js.map +1 -0
  476. package/package.json +80 -0
  477. package/schema/config.schema.json +223 -0
@@ -0,0 +1,687 @@
1
+ /**
2
+ * `ashlr run` and `ashlr runs` CLI commands.
3
+ *
4
+ * `ashlr run "<goal>" [--budget N] [--max-steps N] [--parallel N]
5
+ * [--engine builtin|ashlrcode|aw|claude] [--allow-cloud] [--no-tools]
6
+ * [--resume <id>] [--json] [--no-memory] [--stream|--no-stream] [--no-capture]`
7
+ *
8
+ * Subcommand `ashlr run show <id>` prints a saved run.
9
+ *
10
+ * `ashlr runs [--json]` — list past runs.
11
+ *
12
+ * Exit codes:
13
+ * 0 success
14
+ * 1 run failed / aborted / not-found
15
+ * 2 bad usage
16
+ * 3 local-first cloud refusal
17
+ */
18
+ import { DEFAULT_MAX_TOKENS, DEFAULT_MAX_STEPS, DEFAULT_PARALLEL, } from '../core/run/orchestrator.js';
19
+ // ---------------------------------------------------------------------------
20
+ // Lazy imports — core/run modules are built by other M4/M11 agents
21
+ // ---------------------------------------------------------------------------
22
+ async function importOrchestrator() {
23
+ return import('../core/run/orchestrator.js');
24
+ }
25
+ async function importConfig() {
26
+ return import('../core/config.js');
27
+ }
28
+ /**
29
+ * Lazily import streaming.ts (M11 — written by streaming agent).
30
+ * Falls back gracefully: if the module isn't present yet, returns stubs
31
+ * so the CLI can still run without the streaming module landing first.
32
+ */
33
+ async function importStreaming() {
34
+ try {
35
+ return await import('../core/run/streaming.js');
36
+ }
37
+ catch {
38
+ // streaming.ts not yet present (other agent hasn't landed it); return stubs
39
+ const noop = () => (_e) => { };
40
+ return { nullSink: noop, makeCliSink: noop };
41
+ }
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // ANSI helpers (non-TTY safe)
45
+ // ---------------------------------------------------------------------------
46
+ import { pad, makeColors, isTty, isStderrTty } from './ui.js';
47
+ import { parsePositiveInt } from './args.js';
48
+ const { bold, dim, red, green, yellow, cyan, gray } = makeColors(isTty());
49
+ // Stderr equivalents (respect stderr TTY)
50
+ const seColors = makeColors(isStderrTty());
51
+ const seDim = seColors.dim;
52
+ const seCyan = seColors.cyan;
53
+ const seGreen = seColors.green;
54
+ const seYellow = seColors.yellow;
55
+ const seGray = seColors.gray;
56
+ function parseRunArgs(args) {
57
+ // Handle `run show <id>` subcommand
58
+ if (args[0] === 'show') {
59
+ const showId = args[1];
60
+ if (!showId) {
61
+ return {
62
+ subcommand: 'run',
63
+ allowCloud: false,
64
+ noTools: false,
65
+ noMemory: false,
66
+ json: false,
67
+ stream: false,
68
+ verifyModel: false,
69
+ noCapture: false,
70
+ usageError: 'Usage: ashlr run show <id>',
71
+ };
72
+ }
73
+ return { subcommand: 'show', showId, allowCloud: false, noTools: false, noMemory: false, json: false, stream: false, verifyModel: false, noCapture: false };
74
+ }
75
+ const result = {
76
+ subcommand: 'run',
77
+ allowCloud: false,
78
+ noTools: false,
79
+ noMemory: false,
80
+ json: false,
81
+ // Default: stream ON when stderr is a TTY (overridden by --stream/--no-stream)
82
+ stream: Boolean(process.stderr.isTTY),
83
+ // Default: heuristic-only verification (no extra model calls). --verify-model enables it.
84
+ verifyModel: false,
85
+ // Default: genome auto-capture is ON; --no-capture disables it for this run.
86
+ noCapture: false,
87
+ };
88
+ let i = 0;
89
+ while (i < args.length) {
90
+ const arg = args[i];
91
+ if (arg === '--stream') {
92
+ result.stream = true;
93
+ i++;
94
+ }
95
+ else if (arg === '--no-stream') {
96
+ result.stream = false;
97
+ i++;
98
+ }
99
+ else if (arg === '--allow-cloud') {
100
+ result.allowCloud = true;
101
+ i++;
102
+ }
103
+ else if (arg === '--no-tools') {
104
+ result.noTools = true;
105
+ i++;
106
+ }
107
+ else if (arg === '--no-memory') {
108
+ result.noMemory = true;
109
+ i++;
110
+ }
111
+ else if (arg === '--json') {
112
+ result.json = true;
113
+ i++;
114
+ }
115
+ else if (arg === '--verify-model') {
116
+ result.verifyModel = true;
117
+ i++;
118
+ }
119
+ else if (arg === '--estimate') {
120
+ result.estimate = true;
121
+ i++;
122
+ }
123
+ else if (arg === '--budget') {
124
+ const parsed = parsePositiveInt('budget', args[++i]);
125
+ if ('error' in parsed) {
126
+ result.usageError = parsed.error;
127
+ return result;
128
+ }
129
+ result.budget = parsed.n;
130
+ i++;
131
+ }
132
+ else if (arg === '--max-steps') {
133
+ const parsed = parsePositiveInt('max-steps', args[++i]);
134
+ if ('error' in parsed) {
135
+ result.usageError = parsed.error;
136
+ return result;
137
+ }
138
+ result.maxSteps = parsed.n;
139
+ i++;
140
+ }
141
+ else if (arg === '--parallel') {
142
+ const parsed = parsePositiveInt('parallel', args[++i]);
143
+ if ('error' in parsed) {
144
+ result.usageError = parsed.error;
145
+ return result;
146
+ }
147
+ result.parallel = parsed.n;
148
+ i++;
149
+ }
150
+ else if (arg === '--engine') {
151
+ const val = args[++i];
152
+ if (!val || !['builtin', 'ashlrcode', 'aw', 'claude'].includes(val)) {
153
+ result.usageError = `--engine requires one of: builtin, ashlrcode, aw, claude; got: ${val ?? '(missing)'}`;
154
+ return result;
155
+ }
156
+ result.engine = val;
157
+ i++;
158
+ }
159
+ else if (arg === '--model') {
160
+ const val = args[++i];
161
+ if (!val) {
162
+ result.usageError = `--model requires a model name (e.g. llama3.2:3b)`;
163
+ return result;
164
+ }
165
+ // Consumed by provider-client.pickModel(); also honors the ASHLR_MODEL env var.
166
+ process.env.ASHLR_MODEL = val;
167
+ i++;
168
+ }
169
+ else if (arg === '--no-capture') {
170
+ result.noCapture = true;
171
+ i++;
172
+ }
173
+ else if (arg === '--over-budget') {
174
+ // M19 spend-governance escape hatch — proceed even when over the period cap.
175
+ result.overBudget = true;
176
+ i++;
177
+ }
178
+ else if (arg === '--resume') {
179
+ const val = args[++i];
180
+ if (!val) {
181
+ result.usageError = `--resume requires a run id`;
182
+ return result;
183
+ }
184
+ result.resumeId = val;
185
+ i++;
186
+ }
187
+ else if (!arg.startsWith('--')) {
188
+ // positional = goal
189
+ if (result.goal !== undefined) {
190
+ result.usageError = `unexpected positional argument: ${arg}`;
191
+ return result;
192
+ }
193
+ result.goal = arg;
194
+ i++;
195
+ }
196
+ else {
197
+ result.usageError = `unknown flag: ${arg}`;
198
+ return result;
199
+ }
200
+ }
201
+ // goal is required unless --resume is set (resume re-uses stored goal)
202
+ if (!result.goal && !result.resumeId) {
203
+ result.usageError =
204
+ 'Usage: ashlr run "<goal>" [--budget N] [--max-steps N] [--parallel N]\n' +
205
+ ' [--engine builtin|ashlrcode|aw|claude] [--allow-cloud] [--no-tools]\n' +
206
+ ' [--resume <id>] [--json] [--no-memory] [--stream|--no-stream] [--verify-model] [--no-capture]\n' +
207
+ ' ashlr run show <id>';
208
+ }
209
+ return result;
210
+ }
211
+ // ---------------------------------------------------------------------------
212
+ // Step progress printer (goes to stderr when --json so stdout stays clean)
213
+ // ---------------------------------------------------------------------------
214
+ /**
215
+ * Emit a step event line. When jsonMode is true we write to stderr so stdout
216
+ * remains a single JSON object at the end.
217
+ */
218
+ function printStep(step, taskGoal, jsonMode) {
219
+ const ts = new Date(step.ts).toLocaleTimeString('en-US', { hour12: false });
220
+ const kindEmoji = {
221
+ plan: '📋',
222
+ model: '🤖',
223
+ tool: '🔧',
224
+ synthesize: '✨',
225
+ };
226
+ const icon = kindEmoji[step.kind] ?? '·';
227
+ const usageStr = step.usage
228
+ ? seDim(` [${step.usage.tokensIn + step.usage.tokensOut} tok]`)
229
+ : '';
230
+ const line = ` ${seGray(ts)} ${icon} ${seCyan(`[${step.taskId}]`)} ${step.summary}${usageStr}` +
231
+ (taskGoal ? ` ${seGray(`— ${taskGoal.slice(0, 60)}${taskGoal.length > 60 ? '…' : ''}`)}` : '');
232
+ if (jsonMode) {
233
+ process.stderr.write(line + '\n');
234
+ }
235
+ else {
236
+ process.stdout.write(line + '\n');
237
+ }
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // Human summary renderer
241
+ // ---------------------------------------------------------------------------
242
+ function formatDuration(createdAt, updatedAt) {
243
+ const ms = new Date(updatedAt).getTime() - new Date(createdAt).getTime();
244
+ if (ms < 1000)
245
+ return `${ms}ms`;
246
+ if (ms < 60_000)
247
+ return `${(ms / 1000).toFixed(1)}s`;
248
+ const mins = Math.floor(ms / 60_000);
249
+ const secs = Math.floor((ms % 60_000) / 1000);
250
+ return `${mins}m ${secs}s`;
251
+ }
252
+ function statusColor(status) {
253
+ switch (status) {
254
+ case 'done': return green(status);
255
+ case 'running': return cyan(status);
256
+ case 'aborted': return yellow(status);
257
+ case 'failed': return red(status);
258
+ case 'pending': return gray(status);
259
+ case 'skipped': return dim(status);
260
+ default: return String(status);
261
+ }
262
+ }
263
+ function printRunSummary(state) {
264
+ const { id, goal, engine, provider, status, usage, budget, tasks, result, createdAt, updatedAt } = state;
265
+ const duration = formatDuration(createdAt, updatedAt);
266
+ const totalTokens = usage.tokensIn + usage.tokensOut;
267
+ console.log('');
268
+ console.log(bold(' ashlr run') + gray(` — ${id}`));
269
+ console.log('');
270
+ console.log(` ${bold('Goal:')} ${goal}`);
271
+ console.log(` ${bold('Status:')} ${statusColor(status)}` +
272
+ (status === 'aborted' ? yellow(' ⚠ budget/step limit reached') : ''));
273
+ console.log(` ${bold('Engine:')} ${engine} ${dim('·')} ${bold('Provider:')} ${cyan(provider)}`);
274
+ console.log(` ${bold('Duration:')} ${duration}`);
275
+ console.log('');
276
+ // ── Tasks table ──────────────────────────────────────────────────────────
277
+ if (tasks.length > 0) {
278
+ const idW = Math.max(4, ...tasks.map(t => t.id.length));
279
+ const statusW = 8;
280
+ const tokW = 7;
281
+ const goalW = 44;
282
+ console.log(` ${bold(pad('Tasks', 0))}`);
283
+ console.log('');
284
+ console.log(` ${bold(pad('ID', idW))} ${bold(pad('Status', statusW))} ` +
285
+ `${bold(pad('Tokens', tokW, 'right'))} ${bold('Goal')}`);
286
+ console.log(` ${'─'.repeat(idW)} ${'─'.repeat(statusW)} ${'─'.repeat(tokW)} ${'─'.repeat(goalW)}`);
287
+ for (const t of tasks) {
288
+ const tok = t.usage ? String(t.usage.tokensIn + t.usage.tokensOut) : '—';
289
+ const goalTrunc = t.goal.length > goalW ? t.goal.slice(0, goalW - 1) + '…' : t.goal;
290
+ const errorNote = t.error ? red(` ✗ ${t.error.slice(0, 40)}`) : '';
291
+ console.log(` ${pad(dim(t.id), idW)} ${pad(statusColor(t.status), statusW)} ` +
292
+ `${pad(tok, tokW, 'right')} ${goalTrunc}${errorNote}`);
293
+ }
294
+ console.log('');
295
+ }
296
+ // ── Result ───────────────────────────────────────────────────────────────
297
+ if (result) {
298
+ console.log(` ${bold('Result:')}`);
299
+ // Indent result lines for readability
300
+ const lines = result.split('\n');
301
+ for (const line of lines) {
302
+ console.log(` ${line}`);
303
+ }
304
+ console.log('');
305
+ }
306
+ // ── Usage / cost summary ─────────────────────────────────────────────────
307
+ const localProvider = /ollama|lmstudio/i.test(provider);
308
+ const cloudNote = localProvider ? green('local — $0.00') : yellow('cloud provider');
309
+ console.log(` ${bold('Usage:')}`);
310
+ console.log(` Tokens in: ${usage.tokensIn.toLocaleString()}`);
311
+ console.log(` Tokens out: ${usage.tokensOut.toLocaleString()}`);
312
+ console.log(` Total: ${totalTokens.toLocaleString()} / ${budget.maxTokens.toLocaleString()} max`);
313
+ console.log(` Steps: ${usage.steps} / ${budget.maxSteps} max`);
314
+ console.log(` Est. cost: ${usage.estCostUsd > 0 ? '$' + usage.estCostUsd.toFixed(6) : '$0.00'} ${dim('·')} ${cloudNote}`);
315
+ console.log(` Provider: ${cyan(provider)}`);
316
+ console.log('');
317
+ // ── Resume hint ──────────────────────────────────────────────────────────
318
+ if (status === 'aborted' || status === 'failed') {
319
+ console.log(` ${yellow('Tip:')} resume this run with ${bold(`ashlr run --resume ${id}`)}`);
320
+ console.log('');
321
+ }
322
+ // ── Show hint ────────────────────────────────────────────────────────────
323
+ console.log(dim(` Run ID: ${id} | ashlr run show ${id}`));
324
+ console.log('');
325
+ }
326
+ // ---------------------------------------------------------------------------
327
+ // Cloud refusal message
328
+ // ---------------------------------------------------------------------------
329
+ const CLOUD_REFUSAL_RE = /local.first|cloud.provider|allow.cloud|no local/i;
330
+ function isCloudRefusalError(err) {
331
+ if (!(err instanceof Error))
332
+ return false;
333
+ return CLOUD_REFUSAL_RE.test(err.message);
334
+ }
335
+ function printCloudRefusal(err, jsonMode) {
336
+ const msg = [
337
+ '',
338
+ ` ${red('Local-first refusal:')} ${err.message}`,
339
+ '',
340
+ ` ashlr run only uses LOCAL providers (Ollama / LM Studio) by default.`,
341
+ ` To allow a cloud provider, pass ${bold('--allow-cloud')} and ensure the API key is set.`,
342
+ '',
343
+ ` Example: ashlr run "<goal>" --allow-cloud`,
344
+ '',
345
+ ].join('\n');
346
+ if (jsonMode) {
347
+ process.stderr.write(msg + '\n');
348
+ }
349
+ else {
350
+ process.stdout.write(msg + '\n');
351
+ }
352
+ }
353
+ // ---------------------------------------------------------------------------
354
+ // `run show <id>`
355
+ // ---------------------------------------------------------------------------
356
+ async function cmdRunShow(id, jsonMode) {
357
+ const { loadRun } = await importOrchestrator();
358
+ const state = loadRun(id);
359
+ if (!state) {
360
+ const msg = `Run not found: ${id}`;
361
+ if (jsonMode) {
362
+ process.stdout.write(JSON.stringify({ error: msg }) + '\n');
363
+ }
364
+ else {
365
+ process.stderr.write(red('error: ') + msg + '\n');
366
+ }
367
+ return 1;
368
+ }
369
+ if (jsonMode) {
370
+ process.stdout.write(JSON.stringify(state, null, 2) + '\n');
371
+ return 0;
372
+ }
373
+ printRunSummary(state);
374
+ return 0;
375
+ }
376
+ // ---------------------------------------------------------------------------
377
+ // `ashlr run` — main
378
+ // ---------------------------------------------------------------------------
379
+ /**
380
+ * `ashlr run "<goal>" [--budget N] [--max-steps N] [--parallel N]
381
+ * [--engine builtin|ashlrcode|aw] [--allow-cloud] [--no-tools]
382
+ * [--resume <id>] [--json]`
383
+ *
384
+ * Also handles `ashlr run show <id>`.
385
+ */
386
+ export async function cmdRun(args) {
387
+ // Help shortcircuit
388
+ if (args[0] === '--help' || args[0] === '-h' || args[0] === 'help') {
389
+ printRunHelp();
390
+ return 0;
391
+ }
392
+ const parsed = parseRunArgs(args);
393
+ if (parsed.usageError) {
394
+ process.stderr.write(red('error: ') + parsed.usageError + '\n');
395
+ return 2;
396
+ }
397
+ // Subcommand: show
398
+ if (parsed.subcommand === 'show' && parsed.showId) {
399
+ return cmdRunShow(parsed.showId, parsed.json);
400
+ }
401
+ // M32: --estimate — pre-flight cost prediction; prints and exits 0 (no run).
402
+ if (parsed.estimate) {
403
+ if (!parsed.goal) {
404
+ process.stderr.write(red('error: ') + '--estimate requires a goal\n');
405
+ return 2;
406
+ }
407
+ const { loadConfig } = await import('../core/config.js');
408
+ const { estimateRun, renderEstimate } = await import('../core/observability/estimate.js');
409
+ const est = await estimateRun(parsed.goal, { maxTokens: parsed.budget, allowCloud: parsed.allowCloud }, loadConfig());
410
+ if (parsed.json) {
411
+ process.stdout.write(JSON.stringify(est, null, 2) + '\n');
412
+ }
413
+ else {
414
+ process.stdout.write(renderEstimate(est) + '\n');
415
+ }
416
+ return 0;
417
+ }
418
+ // Build RunOptions
419
+ const opts = {
420
+ allowCloud: parsed.allowCloud,
421
+ tools: !parsed.noTools,
422
+ parallel: parsed.parallel,
423
+ engine: parsed.engine,
424
+ json: parsed.json,
425
+ resumeId: parsed.resumeId,
426
+ verifyModel: parsed.verifyModel,
427
+ };
428
+ if (parsed.budget !== undefined || parsed.maxSteps !== undefined) {
429
+ opts.budget = {};
430
+ if (parsed.budget !== undefined)
431
+ opts.budget.maxTokens = parsed.budget;
432
+ if (parsed.maxSteps !== undefined)
433
+ opts.budget.maxSteps = parsed.maxSteps;
434
+ if (parsed.allowCloud !== undefined)
435
+ opts.budget.allowCloud = parsed.allowCloud;
436
+ }
437
+ // Determine goal — either explicit or from resumed run
438
+ let goal = parsed.goal ?? '';
439
+ // If --resume only (no goal), we need to load stored goal for display
440
+ if (!goal && parsed.resumeId) {
441
+ try {
442
+ const { loadRun } = await importOrchestrator();
443
+ const prior = loadRun(parsed.resumeId);
444
+ if (!prior) {
445
+ process.stderr.write(red('error: ') + `Cannot resume: run not found: ${parsed.resumeId}\n`);
446
+ return 1;
447
+ }
448
+ goal = prior.goal;
449
+ }
450
+ catch (err) {
451
+ process.stderr.write(red('error: ') + `Failed to load run ${parsed.resumeId}: ` +
452
+ (err instanceof Error ? err.message : String(err)) + '\n');
453
+ return 1;
454
+ }
455
+ }
456
+ if (!parsed.json) {
457
+ console.log('');
458
+ console.log(bold(' ashlr run') + gray(` — starting`));
459
+ console.log(` ${dim('Goal:')} ${goal}`);
460
+ if (parsed.resumeId) {
461
+ console.log(` ${dim('Resuming:')} ${parsed.resumeId}`);
462
+ }
463
+ if (parsed.noMemory) {
464
+ console.log(` ${dim('Memory:')} disabled (--no-memory)`);
465
+ }
466
+ console.log('');
467
+ }
468
+ else {
469
+ process.stderr.write(`[ashlr run] goal: ${goal}` + (parsed.resumeId ? ` (resuming ${parsed.resumeId})` : '') + '\n');
470
+ }
471
+ // Load config
472
+ let cfg;
473
+ try {
474
+ const { loadConfig } = await importConfig();
475
+ cfg = loadConfig();
476
+ }
477
+ catch (err) {
478
+ process.stderr.write(red('error: ') + 'Failed to load config: ' +
479
+ (err instanceof Error ? err.message : String(err)) + '\n');
480
+ return 1;
481
+ }
482
+ // Load orchestrator
483
+ let runGoal;
484
+ try {
485
+ const mod = await importOrchestrator();
486
+ runGoal = mod.runGoal;
487
+ }
488
+ catch (err) {
489
+ process.stderr.write(red('error: ') + 'Failed to load orchestrator (M4 module not yet built): ' +
490
+ (err instanceof Error ? err.message : String(err)) + '\n');
491
+ return 1;
492
+ }
493
+ // Step callback — accumulate tasks map for goal lookup
494
+ const taskGoalMap = new Map();
495
+ const streaming = await importStreaming();
496
+ const sink = parsed.stream
497
+ ? streaming.makeCliSink({ json: parsed.json })
498
+ : streaming.nullSink();
499
+ // Wire CLI progress via an optional __onStep side-channel on RunOptions:
500
+ // the orchestrator calls it per step if present, else we just print the
501
+ // final summary. Kept off the typed contract (extra props ignored at runtime).
502
+ // M11: also attach the StreamSink as __sink so the orchestrator/agent-loop
503
+ // can emit RunStreamEvents for live streaming (same escape-hatch pattern).
504
+ const optsWithHook = opts;
505
+ optsWithHook.__sink = sink;
506
+ optsWithHook.__onStep = (step, tasks) => {
507
+ // Keep task goal map updated
508
+ for (const t of tasks) {
509
+ taskGoalMap.set(t.id, t.goal);
510
+ }
511
+ const taskGoal = taskGoalMap.get(step.taskId) ?? '';
512
+ printStep(step, taskGoal, parsed.json);
513
+ };
514
+ // Pass --no-memory so the orchestrator skips genome injection.
515
+ // Orchestrator checks: (cfg.genome?.injectOnRun ?? true) && !opts.noMemory
516
+ if (parsed.noMemory) {
517
+ optsWithHook.noMemory = true;
518
+ }
519
+ // Pass --no-capture so captureFromRun skips genome auto-capture for this run.
520
+ if (parsed.noCapture) {
521
+ optsWithHook.noCapture = true;
522
+ }
523
+ // Pass --over-budget so checkGovernance lets an over-cap run proceed (M19).
524
+ if (parsed.overBudget) {
525
+ optsWithHook.overBudget = true;
526
+ }
527
+ let state;
528
+ try {
529
+ state = await runGoal(goal, cfg, optsWithHook);
530
+ }
531
+ catch (err) {
532
+ if (isCloudRefusalError(err)) {
533
+ printCloudRefusal(err, parsed.json);
534
+ return 3;
535
+ }
536
+ const msg = err instanceof Error ? err.message : String(err);
537
+ process.stderr.write(red('error: ') + msg + '\n');
538
+ return 1;
539
+ }
540
+ // Output
541
+ if (parsed.json) {
542
+ process.stdout.write(JSON.stringify(state, null, 2) + '\n');
543
+ }
544
+ else {
545
+ printRunSummary(state);
546
+ }
547
+ // Exit code
548
+ if (state.status === 'done')
549
+ return 0;
550
+ if (state.status === 'aborted')
551
+ return 1;
552
+ if (state.status === 'failed')
553
+ return 1;
554
+ return 0;
555
+ }
556
+ // ---------------------------------------------------------------------------
557
+ // `ashlr runs` — list past runs
558
+ // ---------------------------------------------------------------------------
559
+ function relativeTime(iso) {
560
+ const ms = Date.now() - new Date(iso).getTime();
561
+ const s = Math.floor(ms / 1000);
562
+ const m = Math.floor(s / 60);
563
+ const h = Math.floor(m / 60);
564
+ const d = Math.floor(h / 24);
565
+ if (d > 0)
566
+ return `${d}d ago`;
567
+ if (h > 0)
568
+ return `${h}h ago`;
569
+ if (m > 0)
570
+ return `${m}m ago`;
571
+ return `${s}s ago`;
572
+ }
573
+ /**
574
+ * `ashlr runs [--json]` — list past runs.
575
+ */
576
+ export async function cmdRuns(args) {
577
+ const jsonMode = args.includes('--json');
578
+ let listRuns;
579
+ try {
580
+ const mod = await importOrchestrator();
581
+ listRuns = mod.listRuns;
582
+ }
583
+ catch (err) {
584
+ process.stderr.write(red('error: ') + 'Failed to load orchestrator (M4 module not yet built): ' +
585
+ (err instanceof Error ? err.message : String(err)) + '\n');
586
+ return 1;
587
+ }
588
+ const runs = listRuns();
589
+ if (jsonMode) {
590
+ process.stdout.write(JSON.stringify(runs, null, 2) + '\n');
591
+ return 0;
592
+ }
593
+ if (runs.length === 0) {
594
+ console.log('');
595
+ console.log(` ${dim('No past runs found.')} Start one with ${bold('ashlr run "<goal>"')}.`);
596
+ console.log('');
597
+ return 0;
598
+ }
599
+ const idW = Math.max(4, ...runs.map(r => r.id.length));
600
+ const statusW = 8;
601
+ const tokW = 8;
602
+ const timeW = 8;
603
+ const goalW = 48;
604
+ console.log('');
605
+ console.log(bold(' ashlr runs') + gray(` — ${runs.length} run(s)`));
606
+ console.log('');
607
+ console.log(` ${bold(pad('ID', idW))} ${bold(pad('Status', statusW))} ` +
608
+ `${bold(pad('Tokens', tokW, 'right'))} ${bold(pad('When', timeW))} ${bold('Goal')}`);
609
+ console.log(` ${'─'.repeat(idW)} ${'─'.repeat(statusW)} ${'─'.repeat(tokW)} ${'─'.repeat(timeW)} ${'─'.repeat(goalW)}`);
610
+ for (const r of runs) {
611
+ const totalTokens = r.usage.tokensIn + r.usage.tokensOut;
612
+ const goalTrunc = r.goal.length > goalW ? r.goal.slice(0, goalW - 1) + '…' : r.goal;
613
+ const when = relativeTime(r.createdAt);
614
+ const providerStr = /ollama|lmstudio/i.test(r.provider)
615
+ ? seGreen(r.provider)
616
+ : seYellow(r.provider);
617
+ void providerStr; // not shown in list (too wide); shown in `show`
618
+ console.log(` ${pad(dim(r.id), idW)} ${pad(statusColor(r.status), statusW)} ` +
619
+ `${pad(totalTokens.toLocaleString(), tokW, 'right')} ${pad(gray(when), timeW)} ${goalTrunc}`);
620
+ }
621
+ console.log('');
622
+ console.log(dim(` Use 'ashlr run show <id>' to see details.`));
623
+ console.log('');
624
+ return 0;
625
+ }
626
+ // ---------------------------------------------------------------------------
627
+ // Help
628
+ // ---------------------------------------------------------------------------
629
+ function printRunHelp() {
630
+ console.log('');
631
+ console.log(bold(' ashlr run') + dim(' — local-first agent orchestrator'));
632
+ console.log('');
633
+ console.log(' ' + bold('Usage:'));
634
+ console.log('');
635
+ console.log(` ashlr run ${cyan('"<goal>"')} [options]`);
636
+ console.log(` ashlr run show ${cyan('<id>')}`);
637
+ console.log(` ashlr runs [--json]`);
638
+ console.log('');
639
+ console.log(' ' + bold('Options:'));
640
+ console.log('');
641
+ const opts = [
642
+ ['--budget N', `Max total tokens (in+out) before aborting (default: ${DEFAULT_MAX_TOKENS}).`],
643
+ ['--max-steps N', `Max agent steps before aborting (default: ${DEFAULT_MAX_STEPS}).`],
644
+ ['--parallel N', `Max independent tasks to run concurrently (default: ${DEFAULT_PARALLEL}).`],
645
+ ['--engine <e>', `Execution engine: builtin (default), ashlrcode, aw, or claude.`],
646
+ ['--model <name>', `Local model to use (default: smallest/fastest; or set ASHLR_MODEL).`],
647
+ ['--allow-cloud', `Allow cloud provider if no local is available (requires API key).`],
648
+ ['--no-tools', `Disable MCP tool loading (faster; for simple goals).`],
649
+ ['--no-memory', `Skip genome recall injection into sub-agent prompts.`],
650
+ ['--resume <id>', `Resume a previously aborted/incomplete run.`],
651
+ ['--json', `Emit RunState JSON on stdout; progress goes to stderr.`],
652
+ ['--stream', `Stream live progress as it happens (default: on when stderr is a TTY).`],
653
+ ['--no-stream', `Disable live streaming; only print the final summary.`],
654
+ ['--no-capture', `Skip auto-capture of this run to the genome (M16 playbook).`],
655
+ ];
656
+ const optW = Math.max(...opts.map(([o]) => o.length));
657
+ for (const [opt, desc] of opts) {
658
+ console.log(` ${cyan(pad(opt, optW))} ${desc}`);
659
+ }
660
+ console.log('');
661
+ console.log(' ' + bold('Examples:'));
662
+ console.log('');
663
+ console.log(` ${gray('# Run a quick goal (local Ollama, no tools)')}`);
664
+ console.log(` ashlr run "Summarize the three most active repos" --no-tools`);
665
+ console.log('');
666
+ console.log(` ${gray('# Full run with tight budget')}`);
667
+ console.log(` ashlr run "Audit for TODOs across dev-tools" --budget 8000 --max-steps 6`);
668
+ console.log('');
669
+ console.log(` ${gray('# Run without genome memory injection')}`);
670
+ console.log(` ashlr run "One-off task" --no-memory`);
671
+ console.log('');
672
+ console.log(` ${gray('# Resume an aborted run')}`);
673
+ console.log(` ashlr run --resume <id>`);
674
+ console.log('');
675
+ console.log(` ${gray('# List past runs')}`);
676
+ console.log(` ashlr runs`);
677
+ console.log('');
678
+ console.log(' ' + bold('Safety:'));
679
+ console.log('');
680
+ console.log(` ${dim('• LOCAL-FIRST: only Ollama / LM Studio by default.')}`);
681
+ console.log(` ${dim('• Budget is a HARD ceiling — exceeding it aborts cleanly.')}`);
682
+ console.log(` ${dim('• State persists to ~/.ashlr/runs/<id>.json (never touches repos).')}`);
683
+ console.log(` ${dim('• --no-memory disables genome context injection for this run.')}`);
684
+ console.log(` ${dim('• --no-capture disables genome auto-capture for this run.')}`);
685
+ console.log('');
686
+ }
687
+ //# sourceMappingURL=run.js.map