@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,156 @@
1
+ /**
2
+ * cli/completions.ts — `ashlr completions zsh|bash` (M31).
3
+ *
4
+ * Emits a STATIC shell-completion script generated from the top-level command
5
+ * table. Install:
6
+ * zsh: ashlr completions zsh > ~/.zsh/completions/_ashlr (fpath dir)
7
+ * bash: ashlr completions bash > ~/.local/share/bash-completion/completions/ashlr
8
+ *
9
+ * Read-only: prints to stdout, writes nothing. Exit codes: 0 / 2 bad usage.
10
+ */
11
+ import { makeColors, isTty } from './ui.js';
12
+ /** Top-level commands (kept in sync by test/m31.cli-agent.test.ts). */
13
+ export const TOP_LEVEL_COMMANDS = [
14
+ 'index', 'go', 'status', 'ls', 'open', 'tidy', 'config', 'doctor', 'init',
15
+ 'mcp', 'run', 'runs', 'pulse', 'new', 'ship', 'recall', 'learn', 'genome',
16
+ 'update', 'spec', 'swarm', 'swarms', 'tui', 'dash', 'serve', 'models',
17
+ 'gh', 'vercel', 'wire', 'notify', 'telemetry', 'sandbox', 'audit',
18
+ 'enroll', 'backlog', 'inbox', 'daemon', 'ask', 'knowledge', 'reflect',
19
+ 'health', 'goals', 'digest', 'seams', 'verify-safety', 'preflight',
20
+ 'onboard', 'demo', 'orient', 'docs', 'completions', 'plugins', 'x', 'help',
21
+ ];
22
+ /** Subcommands per top-level command (first-position completion only). */
23
+ const SUBCOMMANDS = {
24
+ config: ['get', 'set', 'path'],
25
+ mcp: ['list', 'doctor', 'install'],
26
+ run: ['show'],
27
+ spec: ['new', 'list', 'show', 'refine'],
28
+ swarm: ['show'],
29
+ models: ['pull', 'start'],
30
+ gh: ['pr', 'issue', 'ci'],
31
+ vercel: ['ls', 'logs'],
32
+ wire: ['claude', 'codex', 'cursor', 'all'],
33
+ notify: ['test'],
34
+ telemetry: ['status', 'test'],
35
+ sandbox: ['list', 'diff', 'cleanup', 'gc'],
36
+ enroll: ['add', 'remove', 'list', 'kill'],
37
+ backlog: ['refresh'],
38
+ inbox: ['show', 'approve', 'reject'],
39
+ daemon: ['start', 'stop', 'status'],
40
+ knowledge: ['build', 'impact', 'graph'],
41
+ reflect: ['playbooks', 'propose'],
42
+ health: ['propose'],
43
+ goals: ['add', 'plan', 'advance', 'status'],
44
+ seams: ['status'],
45
+ completions: ['zsh', 'bash'],
46
+ plugins: ['init', 'list', 'info', 'enable', 'disable'],
47
+ };
48
+ function zshScript() {
49
+ const subcases = Object.entries(SUBCOMMANDS)
50
+ .map(([cmd, subs]) => ` ${cmd}) _values 'subcommand' ${subs.map((s) => `'${s}'`).join(' ')} ;;`)
51
+ .join('\n');
52
+ return `#compdef ashlr
53
+ # ashlr zsh completions — generated by \`ashlr completions zsh\`.
54
+ _ashlr() {
55
+ local -a _ashlr_cmds
56
+ _ashlr_cmds=(${TOP_LEVEL_COMMANDS.map((c) => `'${c}'`).join(' ')})
57
+ if (( CURRENT == 2 )); then
58
+ _values 'ashlr command' "\${_ashlr_cmds[@]}"
59
+ elif (( CURRENT == 3 )); then
60
+ case "\${words[2]}" in
61
+ ${subcases}
62
+ *) _files ;;
63
+ esac
64
+ else
65
+ _files
66
+ fi
67
+ }
68
+ _ashlr "$@"
69
+ `;
70
+ }
71
+ function bashScript() {
72
+ const subcases = Object.entries(SUBCOMMANDS)
73
+ .map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W "${subs.join(' ')}" -- "$cur") ) ;;`)
74
+ .join('\n');
75
+ return `# ashlr bash completions — generated by \`ashlr completions bash\`.
76
+ _ashlr_completions() {
77
+ local cur prev
78
+ cur="\${COMP_WORDS[COMP_CWORD]}"
79
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
80
+ if [ "$COMP_CWORD" -eq 1 ]; then
81
+ COMPREPLY=( $(compgen -W "${TOP_LEVEL_COMMANDS.join(' ')}" -- "$cur") )
82
+ return 0
83
+ fi
84
+ if [ "$COMP_CWORD" -eq 2 ]; then
85
+ case "\${COMP_WORDS[1]}" in
86
+ ${subcases}
87
+ *) COMPREPLY=() ;;
88
+ esac
89
+ return 0
90
+ fi
91
+ COMPREPLY=()
92
+ }
93
+ complete -F _ashlr_completions ashlr
94
+ `;
95
+ }
96
+ export async function cmdCompletions(args) {
97
+ const shell = args[0];
98
+ if (shell === 'zsh') {
99
+ process.stdout.write(zshScript());
100
+ return 0;
101
+ }
102
+ if (shell === 'bash') {
103
+ process.stdout.write(bashScript());
104
+ return 0;
105
+ }
106
+ const c = makeColors(isTty());
107
+ console.log('');
108
+ console.log(c.bold(' ashlr completions') + c.dim(' — shell completion scripts'));
109
+ console.log('');
110
+ console.log(` ${c.cyan('ashlr completions zsh')} ${c.dim('print zsh completion (_ashlr) to stdout')}`);
111
+ console.log(` ${c.cyan('ashlr completions bash')} ${c.dim('print bash completion to stdout')}`);
112
+ console.log('');
113
+ return shell === undefined || shell === '--help' || shell === '-h' || shell === 'help' ? 0 : 2;
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // "did you mean" (used by the dispatcher's unknown-command path)
117
+ // ---------------------------------------------------------------------------
118
+ /** Bounded Levenshtein distance (small strings only; zero-dep). */
119
+ function editDistance(a, b) {
120
+ const m = a.length;
121
+ const n = b.length;
122
+ if (m === 0)
123
+ return n;
124
+ if (n === 0)
125
+ return m;
126
+ let prev = Array.from({ length: n + 1 }, (_v, j) => j);
127
+ for (let i = 1; i <= m; i++) {
128
+ const cur = [i, ...new Array(n).fill(0)];
129
+ for (let j = 1; j <= n; j++) {
130
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
131
+ cur[j] = Math.min((cur[j - 1] ?? 0) + 1, (prev[j] ?? 0) + 1, (prev[j - 1] ?? 0) + cost);
132
+ }
133
+ prev = cur;
134
+ }
135
+ return prev[n] ?? 0;
136
+ }
137
+ /**
138
+ * Closest known command for a typo, or null when nothing is plausibly close
139
+ * (distance must be ≤ 2 and less than half the input length).
140
+ */
141
+ export function didYouMean(input) {
142
+ let best = null;
143
+ let bestDist = Infinity;
144
+ for (const cmd of TOP_LEVEL_COMMANDS) {
145
+ const d = editDistance(input.toLowerCase(), cmd);
146
+ if (d < bestDist) {
147
+ bestDist = d;
148
+ best = cmd;
149
+ }
150
+ }
151
+ if (best !== null && bestDist <= 2 && bestDist < Math.max(2, input.length / 2) + 1) {
152
+ return best;
153
+ }
154
+ return null;
155
+ }
156
+ //# sourceMappingURL=completions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/cli/completions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * `ashlr daemon` — the M24 autonomous operator CLI surface.
3
+ *
4
+ * The daemon pulls the highest-value backlog items for ENROLLED repos and
5
+ * dispatches SANDBOXED swarms whose output becomes PENDING PROPOSALS in the
6
+ * Approval Inbox. It is SAFE BY CONSTRUCTION: it can ONLY propose; it has NO
7
+ * path to apply / push / PR / deploy / mutate.
8
+ *
9
+ * Subcommands:
10
+ * daemon start [--once] [--dry-run] [--budget <usd>] [--interval <ms>]
11
+ * [--parallel <n>]
12
+ * Load cfg, merge flags over cfg.daemon defaults into a DaemonConfig,
13
+ * call runDaemon. --dry-run => plan only (which items WOULD be worked;
14
+ * NO swarm/proposal). REFUSES (nonzero, clear message) when
15
+ * ASHLR_IN_DAEMON / ASHLR_IN_SWARM is set (no fork bomb).
16
+ * daemon stop
17
+ * Set the kill switch + clear running state. Idempotent.
18
+ * daemon status
19
+ * Print running?, last tick, today's spend vs cap, items processed,
20
+ * pending proposals (M23 pendingCount). READ-ONLY.
21
+ *
22
+ * This file has NO outward-action path: it never applies, pushes, opens a PR,
23
+ * or deploys. Its only inbox interaction is the READ-ONLY pendingCount() (for
24
+ * status); all proposal creation happens inside the sandboxed swarm.
25
+ */
26
+ /**
27
+ * `ashlr daemon [start|stop|status] [flags]`
28
+ *
29
+ * Returns a process exit code (0 = success, non-zero = error/usage).
30
+ */
31
+ export declare function cmdDaemon(args: string[]): Promise<number>;
@@ -0,0 +1,334 @@
1
+ /**
2
+ * `ashlr daemon` — the M24 autonomous operator CLI surface.
3
+ *
4
+ * The daemon pulls the highest-value backlog items for ENROLLED repos and
5
+ * dispatches SANDBOXED swarms whose output becomes PENDING PROPOSALS in the
6
+ * Approval Inbox. It is SAFE BY CONSTRUCTION: it can ONLY propose; it has NO
7
+ * path to apply / push / PR / deploy / mutate.
8
+ *
9
+ * Subcommands:
10
+ * daemon start [--once] [--dry-run] [--budget <usd>] [--interval <ms>]
11
+ * [--parallel <n>]
12
+ * Load cfg, merge flags over cfg.daemon defaults into a DaemonConfig,
13
+ * call runDaemon. --dry-run => plan only (which items WOULD be worked;
14
+ * NO swarm/proposal). REFUSES (nonzero, clear message) when
15
+ * ASHLR_IN_DAEMON / ASHLR_IN_SWARM is set (no fork bomb).
16
+ * daemon stop
17
+ * Set the kill switch + clear running state. Idempotent.
18
+ * daemon status
19
+ * Print running?, last tick, today's spend vs cap, items processed,
20
+ * pending proposals (M23 pendingCount). READ-ONLY.
21
+ *
22
+ * This file has NO outward-action path: it never applies, pushes, opens a PR,
23
+ * or deploys. Its only inbox interaction is the READ-ONLY pendingCount() (for
24
+ * status); all proposal creation happens inside the sandboxed swarm.
25
+ */
26
+ import { makeColors } from './ui.js';
27
+ async function importLoop() {
28
+ try {
29
+ const mod = (await import('../core/daemon/loop.js'));
30
+ return { runDaemon: mod.runDaemon, stopDaemon: mod.stopDaemon };
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ async function importState() {
37
+ try {
38
+ const mod = (await import('../core/daemon/state.js'));
39
+ return { loadDaemonState: mod.loadDaemonState };
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ async function importPendingCount() {
46
+ try {
47
+ const mod = (await import('../core/inbox/store.js'));
48
+ return mod.pendingCount;
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ async function importConfig() {
55
+ try {
56
+ const mod = (await import('../core/config.js'));
57
+ return mod.loadConfig;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /** Parse a numeric flag value; returns undefined when missing/invalid. */
64
+ function parseNum(v) {
65
+ if (v === undefined)
66
+ return undefined;
67
+ const n = Number(v);
68
+ return Number.isFinite(n) && n > 0 ? n : undefined;
69
+ }
70
+ function parseStartFlags(args) {
71
+ const flags = { once: false, dryRun: false };
72
+ for (let i = 0; i < args.length; i++) {
73
+ const a = args[i];
74
+ switch (a) {
75
+ case '--once':
76
+ flags.once = true;
77
+ break;
78
+ case '--dry-run':
79
+ flags.dryRun = true;
80
+ break;
81
+ case '--budget': {
82
+ const v = parseNum(args[++i]);
83
+ if (v === undefined)
84
+ return { flags, err: '--budget requires a positive number (USD)' };
85
+ flags.budgetUsd = v;
86
+ break;
87
+ }
88
+ case '--interval': {
89
+ const v = parseNum(args[++i]);
90
+ if (v === undefined)
91
+ return { flags, err: '--interval requires a positive number (ms)' };
92
+ flags.intervalMs = v;
93
+ break;
94
+ }
95
+ case '--parallel': {
96
+ const v = parseNum(args[++i]);
97
+ if (v === undefined)
98
+ return { flags, err: '--parallel requires a positive integer' };
99
+ flags.parallel = Math.floor(v);
100
+ break;
101
+ }
102
+ default:
103
+ if (a?.startsWith('-'))
104
+ return { flags, err: `Unknown flag: ${a}` };
105
+ // ignore stray positionals
106
+ break;
107
+ }
108
+ }
109
+ return { flags };
110
+ }
111
+ /**
112
+ * Merge CLI flags over cfg.daemon into the config passed to runDaemon.
113
+ * cfg.daemon grants NO authority — it only tunes the caps (budget/interval/
114
+ * parallel). The daemon remains proposal-only by construction regardless.
115
+ */
116
+ function mergeDaemonConfig(cfg, flags) {
117
+ const existing = cfg.daemon ?? {};
118
+ const merged = { ...existing };
119
+ if (flags.budgetUsd !== undefined)
120
+ merged.dailyBudgetUsd = flags.budgetUsd;
121
+ if (flags.intervalMs !== undefined)
122
+ merged.intervalMs = flags.intervalMs;
123
+ if (flags.parallel !== undefined)
124
+ merged.parallel = flags.parallel;
125
+ return { ...cfg, daemon: merged };
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Display helpers
129
+ // ---------------------------------------------------------------------------
130
+ /** Relative age string from an ISO timestamp. */
131
+ function relAge(iso) {
132
+ if (!iso)
133
+ return 'never';
134
+ try {
135
+ const ms = Date.now() - new Date(iso).getTime();
136
+ if (ms < 60_000)
137
+ return 'just now';
138
+ if (ms < 3_600_000)
139
+ return `${Math.floor(ms / 60_000)}m ago`;
140
+ if (ms < 86_400_000)
141
+ return `${Math.floor(ms / 3_600_000)}h ago`;
142
+ return `${Math.floor(ms / 86_400_000)}d ago`;
143
+ }
144
+ catch {
145
+ return iso;
146
+ }
147
+ }
148
+ // ---------------------------------------------------------------------------
149
+ // Subcommand: start
150
+ // ---------------------------------------------------------------------------
151
+ async function cmdDaemonStart(args) {
152
+ const tty = process.stdout.isTTY === true;
153
+ const col = makeColors(tty);
154
+ // ── Re-entrancy guard (clear, nonzero refusal) ──────────────────────────
155
+ // runDaemon ALSO refuses internally; we surface a friendly message here so
156
+ // the user gets a non-silent explanation and a nonzero exit code.
157
+ if (process.env['ASHLR_IN_DAEMON'] || process.env['ASHLR_IN_SWARM']) {
158
+ const which = process.env['ASHLR_IN_DAEMON'] ? 'ASHLR_IN_DAEMON' : 'ASHLR_IN_SWARM';
159
+ console.error(col.red('error: ') +
160
+ `daemon start refused: ${which} is set — no daemon-inside-daemon / daemon-inside-swarm.`);
161
+ return 1;
162
+ }
163
+ const { flags, err } = parseStartFlags(args);
164
+ if (err) {
165
+ console.error(col.red('error: ') + err);
166
+ console.error(col.dim('Usage: ashlr daemon start [--once] [--dry-run] [--budget <usd>] [--interval <ms>] [--parallel <n>]'));
167
+ return 2;
168
+ }
169
+ const loadConfig = await importConfig();
170
+ if (!loadConfig) {
171
+ console.error(col.red('error: ') + 'daemon requires src/core/config.ts.');
172
+ return 1;
173
+ }
174
+ const loop = await importLoop();
175
+ if (!loop) {
176
+ console.error(col.red('error: ') + 'daemon requires src/core/daemon/loop.ts (M24 module not yet built).');
177
+ return 1;
178
+ }
179
+ let cfg;
180
+ try {
181
+ cfg = loadConfig();
182
+ }
183
+ catch (e) {
184
+ console.error(col.red('error: ') + 'Failed to load config: ' + (e instanceof Error ? e.message : String(e)));
185
+ return 1;
186
+ }
187
+ const merged = mergeDaemonConfig(cfg, flags);
188
+ console.log('');
189
+ console.log(col.bold(' ashlr daemon') +
190
+ col.dim(` — ${flags.dryRun ? 'dry-run plan' : 'operator'}${flags.once ? ' · single tick' : ' · loop'}`));
191
+ if (flags.budgetUsd !== undefined) {
192
+ console.log(col.dim(` daily budget cap: $${flags.budgetUsd}`));
193
+ }
194
+ console.log(col.dim(' proposal-only · sandboxed · enrollment-only'));
195
+ console.log('');
196
+ // runDaemon never throws by contract; it REFUSES on re-entrancy (handled
197
+ // above) and stops on kill switch / budget exhaustion. It ONLY produces
198
+ // PENDING inbox proposals — never applies/pushes/PRs/deploys/mutates.
199
+ const finalState = await loop.runDaemon(merged, { once: flags.once, dryRun: flags.dryRun });
200
+ // Summarize the most-recent tick (if any) for human feedback.
201
+ const lastTick = finalState.ticks[finalState.ticks.length - 1];
202
+ if (lastTick) {
203
+ const reasonColor = lastTick.reason === 'ok'
204
+ ? col.green
205
+ : lastTick.reason === 'dry-run'
206
+ ? col.cyan
207
+ : col.yellow;
208
+ console.log(' ' +
209
+ col.bold('last tick: ') +
210
+ reasonColor(lastTick.reason) +
211
+ col.dim(` · considered ${lastTick.itemsConsidered} · proposals ${lastTick.proposalsCreated} · $${lastTick.spentUsd.toFixed(4)}`));
212
+ }
213
+ else {
214
+ console.log(' ' + col.dim('no tick recorded.'));
215
+ }
216
+ console.log(' ' + col.dim(`today's spend: $${finalState.todaySpentUsd.toFixed(4)}`));
217
+ console.log(' ' + col.dim('Use `ashlr inbox` to review PENDING proposals (never auto-applied).'));
218
+ console.log('');
219
+ return 0;
220
+ }
221
+ // ---------------------------------------------------------------------------
222
+ // Subcommand: stop
223
+ // ---------------------------------------------------------------------------
224
+ async function cmdDaemonStop() {
225
+ const tty = process.stdout.isTTY === true;
226
+ const col = makeColors(tty);
227
+ const loop = await importLoop();
228
+ if (!loop) {
229
+ console.error(col.red('error: ') + 'daemon requires src/core/daemon/loop.ts (M24 module not yet built).');
230
+ return 1;
231
+ }
232
+ loop.stopDaemon();
233
+ console.log('');
234
+ console.log(col.green(' ✓ daemon stopped') + col.dim(' — kill switch set; running state cleared.'));
235
+ console.log(col.dim(' Any running loop halts on its next tick.'));
236
+ console.log(col.dim(' Re-enable with `ashlr sandbox kill --off` before starting again.'));
237
+ console.log('');
238
+ return 0;
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // Subcommand: status (READ-ONLY)
242
+ // ---------------------------------------------------------------------------
243
+ async function cmdDaemonStatus(jsonMode) {
244
+ const tty = process.stdout.isTTY === true;
245
+ const col = makeColors(tty);
246
+ const stateMod = await importState();
247
+ if (!stateMod) {
248
+ console.error(col.red('error: ') + 'daemon requires src/core/daemon/state.ts (M24 module not yet built).');
249
+ return 1;
250
+ }
251
+ const state = stateMod.loadDaemonState();
252
+ // pendingCount is READ-ONLY; degrade to 0 if the inbox store is absent.
253
+ const pendingCount = await importPendingCount();
254
+ let pending = 0;
255
+ try {
256
+ if (pendingCount)
257
+ pending = pendingCount();
258
+ }
259
+ catch {
260
+ pending = 0;
261
+ }
262
+ // Resolve the configured daily cap for display (best-effort).
263
+ let dailyCap;
264
+ const loadConfig = await importConfig();
265
+ if (loadConfig) {
266
+ try {
267
+ dailyCap = loadConfig().daemon?.dailyBudgetUsd;
268
+ }
269
+ catch {
270
+ dailyCap = undefined;
271
+ }
272
+ }
273
+ if (jsonMode) {
274
+ console.log(JSON.stringify({
275
+ running: state.running,
276
+ pid: state.pid,
277
+ startedAt: state.startedAt,
278
+ lastTickAt: state.lastTickAt,
279
+ todayDate: state.todayDate,
280
+ todaySpentUsd: state.todaySpentUsd,
281
+ dailyBudgetUsd: dailyCap ?? null,
282
+ itemsProcessed: state.itemsProcessed,
283
+ pendingProposals: pending,
284
+ }, null, 2));
285
+ return 0;
286
+ }
287
+ console.log('');
288
+ console.log(col.bold(' ashlr daemon status'));
289
+ console.log('');
290
+ console.log(' ' +
291
+ col.bold('running: ') +
292
+ (state.running ? col.green('yes') + col.dim(` (pid ${state.pid ?? '?'})`) : col.dim('no (idle)')));
293
+ console.log(' ' + col.bold('started: ') + col.dim(relAge(state.startedAt)));
294
+ console.log(' ' + col.bold('last tick: ') + col.dim(relAge(state.lastTickAt)));
295
+ const capStr = dailyCap !== undefined ? ` / $${dailyCap}` : '';
296
+ console.log(' ' + col.bold("today's spend: ") + col.dim(`$${state.todaySpentUsd.toFixed(4)}${capStr}`));
297
+ console.log(' ' + col.bold('items processed:') + ' ' + col.dim(String(state.itemsProcessed)));
298
+ console.log(' ' +
299
+ col.bold('pending props: ') +
300
+ (pending > 0 ? col.yellow(String(pending)) : col.dim('0')));
301
+ console.log('');
302
+ if (pending > 0) {
303
+ console.log(col.dim(' Review with `ashlr inbox` — proposals are NEVER auto-applied.'));
304
+ console.log('');
305
+ }
306
+ return 0;
307
+ }
308
+ // ---------------------------------------------------------------------------
309
+ // Public entry point
310
+ // ---------------------------------------------------------------------------
311
+ /**
312
+ * `ashlr daemon [start|stop|status] [flags]`
313
+ *
314
+ * Returns a process exit code (0 = success, non-zero = error/usage).
315
+ */
316
+ export async function cmdDaemon(args) {
317
+ const tty = process.stdout.isTTY === true;
318
+ const col = makeColors(tty);
319
+ const sub = args[0] ?? 'status';
320
+ const rest = args.slice(1);
321
+ switch (sub) {
322
+ case 'start':
323
+ return cmdDaemonStart(rest);
324
+ case 'stop':
325
+ return cmdDaemonStop();
326
+ case 'status':
327
+ return cmdDaemonStatus(rest.includes('--json'));
328
+ default:
329
+ console.error(col.red('error: ') + `Unknown daemon subcommand: ${sub}`);
330
+ console.error(col.dim('Usage: ashlr daemon [start|stop|status] [--once] [--dry-run] [--budget <usd>] [--interval <ms>] [--parallel <n>] [--json]'));
331
+ return 2;
332
+ }
333
+ }
334
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * src/cli/demo-sandbox.ts — H8 shared isolation module for `ashlr demo`.
3
+ *
4
+ * MILESTONE H8 "Harden & Prove" (FINAL). This module factors the
5
+ * DISPOSABLE-repo + ISOLATED-tmp-`~/.ashlr` setup/teardown out of `demo.ts`
6
+ * (and away from `test/`) so the demo applies the EXACT same isolation discipline
7
+ * the H1 testkit encodes (`test/helpers/h1-fixture.ts:makeFixture`) — but as a
8
+ * shippable CLI helper rather than a test-only one. See
9
+ * docs/contracts/CONTRACT-H8.md (BUILD ITEM 1).
10
+ *
11
+ * ───────────────────────────────────────────────────────────────────────────
12
+ * ABSOLUTE SAFETY RULES (paramount — encoded directly in these helpers):
13
+ * - HOME is relocated to a FRESH os.tmpdir() dir so every state read/write
14
+ * resolves to an ISOLATED ~/.ashlr — NEVER the real one. The real portfolio
15
+ * (~/.ashlr/enrollment.json = { repos: [] }) is NEVER touched. The prior
16
+ * HOME + re-entrancy env (ASHLR_IN_DAEMON / ASHLR_IN_SWARM) are snapshotted
17
+ * and RESTORED on dispose().
18
+ * - A sanity guard asserts homedir() resolves to the tmp HOME before the demo
19
+ * proceeds; if relocation did not take effect it RESTORES + ABORTS rather
20
+ * than risk mutating the real ~/.ashlr (mirrors makeFixture's guard).
21
+ * - The throwaway repo is a real git repo under os.tmpdir(), seeded with a
22
+ * `// TODO:` marker so the backlog scan finds work. dispose() unenrolls it,
23
+ * sweeps its sandboxes, rm -rf's the repo + the tmp HOME, and restores env.
24
+ * - dispose() is IDEMPOTENT and NEVER throws (best-effort teardown), so the
25
+ * demo's try/finally + signal handler can always clean up safely.
26
+ *
27
+ * IMPLEMENTATION NOTE: this module encodes the SAME disposable-repo + TODO-seed
28
+ * isolation discipline the H1 testkit (`test/helpers/h1-fixture.ts`) uses, but
29
+ * SELF-CONTAINED in `src/` — a shipped CLI module cannot import from `test/`
30
+ * (the build's `rootDir` is `src/`). The handful of git/seed primitives are tiny
31
+ * and use node builtins + git only, so duplicating them here (rather than
32
+ * importing a test helper) is the correct seam per docs/contracts/CONTRACT-H8.md ("factors them
33
+ * out of `test/` into a shippable module"). No new runtime dep is added.
34
+ */
35
+ /**
36
+ * A live, ISOLATED demo context: a fresh tmp HOME (so `~/.ashlr` is isolated)
37
+ * plus a single DISPOSABLE git repo seeded with a TODO so the backlog finds
38
+ * work. Obtain via {@link makeDemoContext}; always tear down via
39
+ * {@link DemoContext.dispose} (idempotent, never throws).
40
+ */
41
+ export interface DemoContext {
42
+ /** Absolute path of the isolated tmp HOME (process.env.HOME for the demo). */
43
+ readonly home: string;
44
+ /** Absolute path of the isolated ~/.ashlr under the tmp HOME. */
45
+ readonly ashlrDir: string;
46
+ /** Absolute path of the DISPOSABLE git repo (under os.tmpdir()). */
47
+ readonly repoDir: string;
48
+ /**
49
+ * Tear down: unenroll the tmp repo, sweep its sandboxes, restore HOME + the
50
+ * re-entrancy env, and (unless {@link MakeDemoContextOptions.keep}) rm -rf the
51
+ * tmp repo + tmp HOME. Idempotent; never throws. When `keep` is set, the tmp
52
+ * dir is preserved (still under os.tmpdir()) for inspection.
53
+ */
54
+ dispose(): void;
55
+ }
56
+ /** Options for {@link makeDemoContext}. */
57
+ export interface MakeDemoContextOptions {
58
+ /**
59
+ * When true (`ashlr demo --no-cleanup`), dispose() still unenrolls + restores
60
+ * env but does NOT rm -rf the tmp dir — it is kept (still under os.tmpdir())
61
+ * for inspection. Default false (auto-clean).
62
+ */
63
+ keep?: boolean;
64
+ }
65
+ /**
66
+ * Create an ISOLATED demo context: snapshot + relocate `process.env.HOME` to a
67
+ * fresh os.tmpdir() dir, clear the re-entrancy env, ASSERT homedir() now
68
+ * resolves to the tmp HOME (else restore + throw), then create a DISPOSABLE git
69
+ * repo seeded with a `// TODO:` marker.
70
+ *
71
+ * The returned context's `dispose()` performs the guaranteed auto-cleanup. The
72
+ * caller MUST invoke it in a `try/finally` (and from a SIGINT/SIGTERM handler)
73
+ * so the tmp state is always reclaimed.
74
+ *
75
+ * @throws if HOME relocation does not take effect (isolation broken) — fails
76
+ * loudly rather than risk touching the real ~/.ashlr.
77
+ */
78
+ export declare function makeDemoContext(opts?: MakeDemoContextOptions): DemoContext;