@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,474 @@
1
+ /**
2
+ * Config + path constants for ashlr-hub.
3
+ *
4
+ * Handles reading, writing, and defaulting the ~/.ashlr/config.json file.
5
+ * All ~ paths are expanded to the real homedir at module load time.
6
+ */
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
10
+ // ---------------------------------------------------------------------------
11
+ // Path constants (exported, resolved immediately)
12
+ // ---------------------------------------------------------------------------
13
+ const HOME = homedir();
14
+ /** Absolute path to the hub's config/index home: ~/.ashlr */
15
+ export const CONFIG_DIR = join(HOME, '.ashlr');
16
+ /** Absolute path to the config file: ~/.ashlr/config.json */
17
+ export const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
18
+ /** Absolute path to the index file: ~/.ashlr/index.json */
19
+ export const INDEX_PATH = join(CONFIG_DIR, 'index.json');
20
+ // ---------------------------------------------------------------------------
21
+ // Runtime path resolution
22
+ // ---------------------------------------------------------------------------
23
+ // The exported constants above are resolved once at module load for external
24
+ // consumers. The functions below re-resolve from homedir() at call time so a
25
+ // changed HOME (e.g. in tests, or a relocated home dir) is always honored.
26
+ // This keeps the public constants stable while making load/save correct under
27
+ // a moving HOME.
28
+ function resolveConfigDir() {
29
+ return join(homedir(), '.ashlr');
30
+ }
31
+ function resolveConfigPath() {
32
+ return join(resolveConfigDir(), 'config.json');
33
+ }
34
+ /**
35
+ * Absolute path to the M26 self-improvement / meta-learning home:
36
+ * `~/.ashlr/learn`. Re-resolved from `homedir()` at call time so tests that
37
+ * relocate HOME work. This is the ONLY directory `ashlr reflect` writes to for
38
+ * its reports/snapshots — it NEVER writes CONFIG_PATH / router policy / prompts.
39
+ * This function does NOT create the directory; the learn store creates it lazily.
40
+ */
41
+ export function learnDir() {
42
+ return join(resolveConfigDir(), 'learn');
43
+ }
44
+ /**
45
+ * Absolute path to the M27 quality / health-review home: `~/.ashlr/quality`.
46
+ * Re-resolved from `homedir()` at call time so tests that relocate HOME work.
47
+ * This is the ONLY directory `ashlr health` writes to for its HealthReport
48
+ * snapshots (trend tracking) — it NEVER writes CONFIG_PATH / router policy /
49
+ * prompts, and NEVER touches a user repo working tree. This function does NOT
50
+ * create the directory; the quality store creates it lazily.
51
+ */
52
+ export function qualityDir() {
53
+ return join(resolveConfigDir(), 'quality');
54
+ }
55
+ /**
56
+ * Absolute path to the M28 goal planning/tracking home: `~/.ashlr/goals`.
57
+ * Re-resolved from `homedir()` at call time so tests that relocate HOME work.
58
+ * This is the ONLY directory `ashlr goals` writes its planning/tracking data
59
+ * to — it NEVER writes CONFIG_PATH / router policy / prompts, and NEVER touches
60
+ * a user repo working tree. This function does NOT create the directory; the
61
+ * goals store creates it lazily. Single source of truth for the ~/.ashlr root.
62
+ */
63
+ export function goalsDir() {
64
+ return join(resolveConfigDir(), 'goals');
65
+ }
66
+ /**
67
+ * Absolute path to the M29 portfolio-digest home: `~/.ashlr/digests`.
68
+ * Re-resolved from `homedir()` at call time so tests that relocate HOME work.
69
+ * This is the ONLY directory `ashlr digest` writes to (JSON + markdown digest
70
+ * artifacts for day-over-day trend) — it NEVER writes CONFIG_PATH / router
71
+ * policy / prompts, and NEVER touches a user repo working tree. This function
72
+ * does NOT create the directory; the digest store creates it lazily. Single
73
+ * source of truth for the ~/.ashlr root.
74
+ */
75
+ export function digestsDir() {
76
+ return join(resolveConfigDir(), 'digests');
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Default tidy rules
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * Conservative, opinionated rules for tidying loose top-level Desktop files.
83
+ * Rules are applied in order — first match wins (enforced by the tidy engine).
84
+ * Only moves clearly-typed files; ambiguous or structurally-important items
85
+ * should be added to `keepers` instead.
86
+ */
87
+ const DEFAULT_TIDY_RULES = [
88
+ // ── Screenshots ──────────────────────────────────────────────────────────
89
+ {
90
+ match: 'Screenshot*',
91
+ matchType: 'glob',
92
+ dest: join(HOME, 'Desktop/Assets/Screenshots'),
93
+ description: 'macOS screenshot files captured to Desktop',
94
+ },
95
+ {
96
+ match: 'Screen Recording*',
97
+ matchType: 'glob',
98
+ dest: join(HOME, 'Desktop/Assets/Screenshots'),
99
+ description: 'macOS screen recordings captured to Desktop',
100
+ },
101
+ // ── Images ────────────────────────────────────────────────────────────────
102
+ {
103
+ match: 'png',
104
+ matchType: 'ext',
105
+ dest: join(HOME, 'Desktop/Assets'),
106
+ description: 'Loose PNG images',
107
+ },
108
+ {
109
+ match: 'jpg',
110
+ matchType: 'ext',
111
+ dest: join(HOME, 'Desktop/Assets'),
112
+ description: 'Loose JPEG images',
113
+ },
114
+ {
115
+ match: 'jpeg',
116
+ matchType: 'ext',
117
+ dest: join(HOME, 'Desktop/Assets'),
118
+ description: 'Loose JPEG images',
119
+ },
120
+ {
121
+ match: 'gif',
122
+ matchType: 'ext',
123
+ dest: join(HOME, 'Desktop/Assets'),
124
+ description: 'Loose GIF images',
125
+ },
126
+ {
127
+ match: 'webp',
128
+ matchType: 'ext',
129
+ dest: join(HOME, 'Desktop/Assets'),
130
+ description: 'Loose WebP images',
131
+ },
132
+ {
133
+ match: 'svg',
134
+ matchType: 'ext',
135
+ dest: join(HOME, 'Desktop/Assets'),
136
+ description: 'Loose SVG files',
137
+ },
138
+ {
139
+ match: 'heic',
140
+ matchType: 'ext',
141
+ dest: join(HOME, 'Desktop/Assets'),
142
+ description: 'Loose HEIC images (iPhone captures)',
143
+ },
144
+ // ── Documents — PDF ───────────────────────────────────────────────────────
145
+ {
146
+ match: '*Invoice*',
147
+ matchType: 'glob',
148
+ dest: join(HOME, 'Desktop/Business'),
149
+ description: 'Invoice PDFs and documents',
150
+ },
151
+ {
152
+ match: '*Receipt*',
153
+ matchType: 'glob',
154
+ dest: join(HOME, 'Desktop/Business'),
155
+ description: 'Receipt PDFs and documents',
156
+ },
157
+ {
158
+ match: '*Contract*',
159
+ matchType: 'glob',
160
+ dest: join(HOME, 'Desktop/Business'),
161
+ description: 'Contract documents',
162
+ },
163
+ {
164
+ match: 'pdf',
165
+ matchType: 'ext',
166
+ dest: join(HOME, 'Desktop/Business'),
167
+ description: 'Loose PDF documents (generic catch-all for PDFs not matched above)',
168
+ },
169
+ // ── Documents — Office / text ─────────────────────────────────────────────
170
+ {
171
+ match: 'docx',
172
+ matchType: 'ext',
173
+ dest: join(HOME, 'Desktop/Business'),
174
+ description: 'Loose Word documents',
175
+ },
176
+ {
177
+ match: 'doc',
178
+ matchType: 'ext',
179
+ dest: join(HOME, 'Desktop/Business'),
180
+ description: 'Loose Word documents (legacy format)',
181
+ },
182
+ {
183
+ match: 'xlsx',
184
+ matchType: 'ext',
185
+ dest: join(HOME, 'Desktop/Business'),
186
+ description: 'Loose Excel spreadsheets',
187
+ },
188
+ {
189
+ match: 'xls',
190
+ matchType: 'ext',
191
+ dest: join(HOME, 'Desktop/Business'),
192
+ description: 'Loose Excel spreadsheets (legacy format)',
193
+ },
194
+ {
195
+ match: 'pptx',
196
+ matchType: 'ext',
197
+ dest: join(HOME, 'Desktop/Business'),
198
+ description: 'Loose PowerPoint presentations',
199
+ },
200
+ {
201
+ match: 'ppt',
202
+ matchType: 'ext',
203
+ dest: join(HOME, 'Desktop/Business'),
204
+ description: 'Loose PowerPoint presentations (legacy format)',
205
+ },
206
+ {
207
+ match: 'numbers',
208
+ matchType: 'ext',
209
+ dest: join(HOME, 'Desktop/Business'),
210
+ description: 'Loose Numbers spreadsheets',
211
+ },
212
+ {
213
+ match: 'pages',
214
+ matchType: 'ext',
215
+ dest: join(HOME, 'Desktop/Business'),
216
+ description: 'Loose Pages documents',
217
+ },
218
+ {
219
+ match: 'keynote',
220
+ matchType: 'ext',
221
+ dest: join(HOME, 'Desktop/Business'),
222
+ description: 'Loose Keynote presentations',
223
+ },
224
+ // ── Notes / Markdown ──────────────────────────────────────────────────────
225
+ {
226
+ match: 'md',
227
+ matchType: 'ext',
228
+ dest: join(HOME, 'Desktop/Knowledge'),
229
+ description: 'Loose Markdown notes and documents',
230
+ },
231
+ {
232
+ match: 'txt',
233
+ matchType: 'ext',
234
+ dest: join(HOME, 'Desktop/Knowledge'),
235
+ description: 'Loose plain-text notes',
236
+ },
237
+ {
238
+ match: 'rtf',
239
+ matchType: 'ext',
240
+ dest: join(HOME, 'Desktop/Knowledge'),
241
+ description: 'Loose RTF notes',
242
+ },
243
+ // ── Archives / downloads ──────────────────────────────────────────────────
244
+ {
245
+ match: 'zip',
246
+ matchType: 'ext',
247
+ dest: join(HOME, 'Desktop/archive'),
248
+ description: 'Loose ZIP archives (downloads, exports)',
249
+ },
250
+ {
251
+ match: 'tar',
252
+ matchType: 'ext',
253
+ dest: join(HOME, 'Desktop/archive'),
254
+ description: 'Loose tar archives',
255
+ },
256
+ {
257
+ match: 'gz',
258
+ matchType: 'ext',
259
+ dest: join(HOME, 'Desktop/archive'),
260
+ description: 'Loose gzip archives',
261
+ },
262
+ {
263
+ match: 'dmg',
264
+ matchType: 'ext',
265
+ dest: join(HOME, 'Desktop/archive'),
266
+ description: 'Loose disk image installers',
267
+ },
268
+ {
269
+ match: 'pkg',
270
+ matchType: 'ext',
271
+ dest: join(HOME, 'Desktop/archive'),
272
+ description: 'Loose macOS package installers',
273
+ },
274
+ // ── Audio / video ─────────────────────────────────────────────────────────
275
+ {
276
+ match: 'mp3',
277
+ matchType: 'ext',
278
+ dest: join(HOME, 'Desktop/Assets'),
279
+ description: 'Loose audio files',
280
+ },
281
+ {
282
+ match: 'wav',
283
+ matchType: 'ext',
284
+ dest: join(HOME, 'Desktop/Assets'),
285
+ description: 'Loose WAV audio files',
286
+ },
287
+ {
288
+ match: 'mp4',
289
+ matchType: 'ext',
290
+ dest: join(HOME, 'Desktop/Assets'),
291
+ description: 'Loose MP4 video files',
292
+ },
293
+ {
294
+ match: 'mov',
295
+ matchType: 'ext',
296
+ dest: join(HOME, 'Desktop/Assets'),
297
+ description: 'Loose QuickTime video files',
298
+ },
299
+ {
300
+ match: 'mkv',
301
+ matchType: 'ext',
302
+ dest: join(HOME, 'Desktop/Assets'),
303
+ description: 'Loose MKV video files',
304
+ },
305
+ ];
306
+ // ---------------------------------------------------------------------------
307
+ // Category map (Desktop doc-folder categories; git-category entries come from
308
+ // the github/<category> subdirectory layout and are added dynamically in
309
+ // the index engine, but we seed the doc-folder ones here for tidy purposes).
310
+ // ---------------------------------------------------------------------------
311
+ const DEFAULT_CATEGORIES = {
312
+ // Git repo categories (path-based; used by classify.ts to resolve category)
313
+ 'dev-tools': join(HOME, 'Desktop/github/dev-tools'),
314
+ 'side-projects': join(HOME, 'Desktop/github/side-projects'),
315
+ 'professional-tools': join(HOME, 'Desktop/github/professional-tools'),
316
+ 'artist-encyclopedias': join(HOME, 'Desktop/github/artist-encyclopedias'),
317
+ 'client-engagements': join(HOME, 'Desktop/github/client-engagements'),
318
+ forks: join(HOME, 'Desktop/github/forks'),
319
+ ashlrai: join(HOME, 'Desktop/github/ashlrai'),
320
+ // Desktop document folders
321
+ Business: join(HOME, 'Desktop/Business'),
322
+ 'Client-Work': join(HOME, 'Desktop/Client-Work'),
323
+ 'Product-Docs': join(HOME, 'Desktop/Product-Docs'),
324
+ Knowledge: join(HOME, 'Desktop/Knowledge'),
325
+ Assets: join(HOME, 'Desktop/Assets'),
326
+ archive: join(HOME, 'Desktop/archive'),
327
+ };
328
+ // ---------------------------------------------------------------------------
329
+ // Keeper list
330
+ // These basenames / absolute paths must NEVER be moved or deleted by tidy.
331
+ // ---------------------------------------------------------------------------
332
+ const DEFAULT_KEEPERS = [
333
+ 'Rent Application.pdf',
334
+ 'ASHLRAI',
335
+ 'rde-other',
336
+ 'Keys & Recovery',
337
+ 'github',
338
+ 'Evero Notes',
339
+ 'OneDrive - James Madison University',
340
+ // Top-level symlinks that happen to mirror github/ structure — never double-count
341
+ 'tts agents',
342
+ ];
343
+ // ---------------------------------------------------------------------------
344
+ // defaultConfig()
345
+ // ---------------------------------------------------------------------------
346
+ /**
347
+ * Produce a sensible default AshlrConfig for a fresh install.
348
+ * All paths are resolved to absolute values (no ~ remaining).
349
+ */
350
+ export function defaultConfig() {
351
+ return {
352
+ version: 1,
353
+ roots: [
354
+ join(HOME, 'Desktop/github'),
355
+ join(HOME, 'Desktop'),
356
+ ],
357
+ editor: 'cursor',
358
+ staleDays: 30,
359
+ categories: DEFAULT_CATEGORIES,
360
+ tidyRules: DEFAULT_TIDY_RULES,
361
+ keepers: DEFAULT_KEEPERS,
362
+ models: {
363
+ lmstudio: 'http://localhost:1234',
364
+ ollama: 'http://localhost:11434',
365
+ providerChain: ['lmstudio', 'ollama', 'anthropic'],
366
+ },
367
+ telemetry: {},
368
+ tools: {},
369
+ // M33: plugin system defaults — DEFAULT EMPTY (enabled:[] = no plugins load).
370
+ plugins: {
371
+ enabled: [],
372
+ settings: {},
373
+ integrity: {},
374
+ },
375
+ };
376
+ }
377
+ // ---------------------------------------------------------------------------
378
+ // Deep merge helper
379
+ // ---------------------------------------------------------------------------
380
+ /**
381
+ * Recursively merge `override` on top of `base`.
382
+ * Arrays from `override` replace those in `base` entirely (no concat) —
383
+ * this lets users fully replace roots/keepers/tidyRules in their config file.
384
+ * Plain objects are merged recursively; all other values override directly.
385
+ */
386
+ function deepMerge(base, override) {
387
+ const result = { ...base };
388
+ for (const key of Object.keys(override)) {
389
+ const baseVal = base[key];
390
+ const overVal = override[key];
391
+ if (overVal !== null &&
392
+ overVal !== undefined &&
393
+ typeof overVal === 'object' &&
394
+ !Array.isArray(overVal) &&
395
+ typeof baseVal === 'object' &&
396
+ baseVal !== null &&
397
+ !Array.isArray(baseVal)) {
398
+ // Both sides are plain objects — recurse
399
+ result[key] = deepMerge(baseVal, overVal);
400
+ }
401
+ else if (overVal !== undefined) {
402
+ // Array, primitive, or null — take override's value
403
+ result[key] = overVal;
404
+ }
405
+ }
406
+ return result;
407
+ }
408
+ // ---------------------------------------------------------------------------
409
+ // loadConfig()
410
+ // ---------------------------------------------------------------------------
411
+ /**
412
+ * Load config from CONFIG_PATH.
413
+ * - If CONFIG_DIR does not exist, creates it.
414
+ * - If CONFIG_PATH does not exist, writes the default config and returns it.
415
+ * - Otherwise, reads the file, JSON-parses it, deep-merges over defaultConfig()
416
+ * (so new keys added in future versions are always present), and returns.
417
+ * - On parse error, logs a warning and falls back to the default config
418
+ * (we intentionally do NOT overwrite the user's potentially-fixable file).
419
+ */
420
+ export function loadConfig() {
421
+ const configDir = resolveConfigDir();
422
+ const configPath = resolveConfigPath();
423
+ // Ensure the config directory exists
424
+ if (!existsSync(configDir)) {
425
+ mkdirSync(configDir, { recursive: true });
426
+ }
427
+ // If the config file does not exist, bootstrap it with defaults
428
+ if (!existsSync(configPath)) {
429
+ const defaults = defaultConfig();
430
+ saveConfig(defaults);
431
+ return defaults;
432
+ }
433
+ // Read and parse the existing config file
434
+ let raw;
435
+ try {
436
+ raw = readFileSync(configPath, 'utf8');
437
+ }
438
+ catch (err) {
439
+ console.warn(`[ashlr] Warning: could not read config at ${configPath}: ${String(err)}. Using defaults.`);
440
+ return defaultConfig();
441
+ }
442
+ let parsed;
443
+ try {
444
+ parsed = JSON.parse(raw);
445
+ }
446
+ catch (err) {
447
+ console.warn(`[ashlr] Warning: config file at ${configPath} is not valid JSON: ${String(err)}. Using defaults.`);
448
+ return defaultConfig();
449
+ }
450
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
451
+ console.warn(`[ashlr] Warning: config file at ${configPath} does not contain a JSON object. Using defaults.`);
452
+ return defaultConfig();
453
+ }
454
+ // Deep-merge the user's persisted config over the defaults so newly-added
455
+ // fields always have a value even on older config files.
456
+ return deepMerge(defaultConfig(), parsed);
457
+ }
458
+ // ---------------------------------------------------------------------------
459
+ // saveConfig()
460
+ // ---------------------------------------------------------------------------
461
+ /**
462
+ * Persist `c` to CONFIG_PATH as pretty-printed JSON.
463
+ * Creates CONFIG_DIR if it does not yet exist.
464
+ */
465
+ export function saveConfig(c) {
466
+ const configDir = resolveConfigDir();
467
+ const configPath = resolveConfigPath();
468
+ if (!existsSync(configDir)) {
469
+ mkdirSync(configDir, { recursive: true });
470
+ }
471
+ const json = JSON.stringify(c, null, 2) + '\n';
472
+ writeFileSync(configPath, json, 'utf8');
473
+ }
474
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * loop.ts — The M24 daemon operator.
3
+ *
4
+ * Exports:
5
+ * - tick(cfg, opts): one operator cycle — check guards, load backlog, dispatch
6
+ * sandboxed swarms, create PENDING inbox proposals, record spend + state.
7
+ * - runDaemon(cfg, opts): loop ticks on an interval (or once); REFUSES when
8
+ * nested; marks running state; stops on kill switch / budget exhaustion.
9
+ * - stopDaemon(): set kill switch + clear running state.
10
+ *
11
+ * NON-NEGOTIABLE GUARDRAILS (enforced here, grep-provable):
12
+ * 1. PROPOSAL-ONLY: this file has NO outward-action path whatsoever. Its ONLY
13
+ * inbox output is a PENDING proposal, produced indirectly by the swarm
14
+ * runner when this file passes { propose: true } to runSwarm. A PENDING
15
+ * proposal is applied LATER only by an explicit human inbox approve.
16
+ * This file imports no apply/push/PR/deploy primitive.
17
+ * 2. ENROLLMENT-ONLY: operates exclusively on listEnrolled() repos.
18
+ * DEFAULT EMPTY => the daemon does NOTHING.
19
+ * 3. SANDBOXED: every runSwarm call sets opts.sandbox = true so all
20
+ * swarm work runs in an isolated git-worktree (M21).
21
+ * 4. BOUNDED: hard daily USD cap + per-tick item cap + concurrency cap.
22
+ * Resets per calendar day. NO unbounded loop — every iteration
23
+ * re-checks kill switch + budget.
24
+ * 5. RE-ENTRANCY: runDaemon REFUSES if ASHLR_IN_DAEMON or ASHLR_IN_SWARM
25
+ * is already set (no daemon-inside-daemon / daemon-inside-swarm fork bomb).
26
+ * Sets ASHLR_IN_DAEMON=1 on this process so child spawns inherit it.
27
+ *
28
+ * No new runtime deps; node builtins only; never throws out of public API.
29
+ */
30
+ import type { AshlrConfig, DaemonState, DaemonTick } from '../types.js';
31
+ /**
32
+ * One operator cycle. In order:
33
+ * 1. Kill-switch check.
34
+ * 2. Load + resetDayIfNeeded state; budget exhaustion check.
35
+ * 3. Enrollment check (DEFAULT EMPTY => do nothing).
36
+ * 4. Build/load backlog for enrolled repos.
37
+ * 5. Select top-K items within remaining budget.
38
+ * 6a. dryRun: describe what WOULD be worked; create NO proposals.
39
+ * 6b. else: for each selected item (bounded concurrency):
40
+ * runSwarm({ sandbox:true, propose:true }) => a PENDING inbox proposal
41
+ * is produced by the runner + tally spend.
42
+ * 7. Persist updated state; return tick record.
43
+ *
44
+ * Has NO outward-action path (no apply, no push, no PR, no deploy).
45
+ * Never throws.
46
+ */
47
+ export declare function tick(cfg: AshlrConfig, opts: {
48
+ dryRun: boolean;
49
+ }): Promise<DaemonTick>;
50
+ /**
51
+ * Start the daemon operator.
52
+ *
53
+ * REFUSES (returns unchanged state) if ASHLR_IN_DAEMON or ASHLR_IN_SWARM is
54
+ * set — prevents daemon-inside-daemon and daemon-inside-swarm fork bombs.
55
+ *
56
+ * Sets ASHLR_IN_DAEMON=1 on this process.env so all child spawns inherit it.
57
+ *
58
+ * opts.once = true => run exactly one tick then stop.
59
+ * opts.once = false => loop: tick → sleep intervalMs → tick → ... until kill
60
+ * switch is set OR daily budget is exhausted.
61
+ * NO unbounded loop — every iteration re-checks both.
62
+ *
63
+ * Never throws.
64
+ */
65
+ export declare function runDaemon(cfg: AshlrConfig, opts: {
66
+ once: boolean;
67
+ dryRun: boolean;
68
+ }): Promise<DaemonState>;
69
+ /**
70
+ * Set the kill switch (M21 ~/.ashlr/KILL) AND mark running=false, pid=null in
71
+ * persisted state. Idempotent; never throws. A running loop sees the kill
72
+ * switch on the next iteration and stops cleanly.
73
+ */
74
+ export declare function stopDaemon(): void;