@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,66 @@
1
+ /**
2
+ * state.ts — Daemon state persistence.
3
+ *
4
+ * Responsibilities:
5
+ * - daemonStatePath(): path to ~/.ashlr/daemon.json
6
+ * - loadDaemonState(): read + parse; NEVER throws; returns zeroed state on
7
+ * missing/corrupt file.
8
+ * - saveDaemonState(): atomic write (tmp + rename, POSIX-atomic); mkdir -p.
9
+ * - resetDayIfNeeded(): pure — if todayDate has rolled over, zero daily
10
+ * spend and update the date. Returns (possibly new) state; caller persists.
11
+ *
12
+ * No new runtime deps; node builtins only.
13
+ */
14
+ import type { DaemonState } from '../types.js';
15
+ /** Absolute path to the daemon state file. */
16
+ export declare function daemonStatePath(): string;
17
+ /**
18
+ * Read and parse daemonStatePath(). NEVER throws.
19
+ * Returns a fresh zeroed DaemonState when the file is missing or malformed.
20
+ */
21
+ export declare function loadDaemonState(): DaemonState;
22
+ /**
23
+ * Atomically write DaemonState to daemonStatePath() via tmp-file + rename
24
+ * (POSIX-atomic). Creates ~/.ashlr if needed. Never throws.
25
+ */
26
+ export declare function saveDaemonState(s: DaemonState): void;
27
+ /**
28
+ * If s.todayDate differs from today's YYYY-MM-DD, return a copy with
29
+ * todayDate set to today and todaySpentUsd reset to 0 (daily budget reset).
30
+ * itemsProcessed and ticks are preserved.
31
+ *
32
+ * Pure-ish: returns the (possibly new) state; caller is responsible for
33
+ * persisting via saveDaemonState().
34
+ */
35
+ export declare function resetDayIfNeeded(s: DaemonState): DaemonState;
36
+ /**
37
+ * READ-ONLY liveness reconcile. If `s.running === true` but the recorded `pid`
38
+ * is NOT alive — `process.kill(pid, 0)` throws `ESRCH` (no such process) — flip
39
+ * `running` to false and `pid` to null so `daemon status` reports a dead daemon
40
+ * as stopped. Otherwise return `s` unchanged.
41
+ *
42
+ * HONEST BOUND (pid reuse): this reports a dead daemon as live ONLY in the rare
43
+ * case where the OS recycled the recorded pid for an unrelated live process
44
+ * (then `process.kill(pid,0)` succeeds and we leave the state unchanged) —
45
+ * inherent to pid-0 liveness. In every other case it is truthful. It is
46
+ * conservative-toward-alive (it NEVER force-flips a genuinely running daemon
47
+ * off), and since it changes no spend/guard the residual false-positive is an
48
+ * observability nicety only, never a safety issue.
49
+ *
50
+ * OBSERVABILITY-ONLY by construction: it touches NO spend accounting
51
+ * (`todaySpentUsd` / `itemsProcessed` / `ticks` are preserved byte-for-byte),
52
+ * NO guard (kill switch / enrollment / sandbox are unaffected), and adds NO
53
+ * capability. It only makes the persisted running/pid pair truthful.
54
+ *
55
+ * Liveness rules (conservative — NEVER destroy a real running daemon's state):
56
+ * - `running !== true` or `pid` not a number => nothing to reconcile => unchanged.
57
+ * - `process.kill(pid, 0)` succeeds => process alive => unchanged.
58
+ * - throws `ESRCH` => process is GONE => flip to { running:false, pid:null }.
59
+ * - throws `EPERM` (exists but not signalable by us) => process EXISTS => alive
60
+ * => unchanged (do NOT flip).
61
+ * - any other/unexpected error => treat as alive => unchanged.
62
+ *
63
+ * Pure-ish: returns the (possibly new) state; caller persists via
64
+ * saveDaemonState(). Never throws.
65
+ */
66
+ export declare function reconcileDaemonState(s: DaemonState): DaemonState;
@@ -0,0 +1,197 @@
1
+ /**
2
+ * state.ts — Daemon state persistence.
3
+ *
4
+ * Responsibilities:
5
+ * - daemonStatePath(): path to ~/.ashlr/daemon.json
6
+ * - loadDaemonState(): read + parse; NEVER throws; returns zeroed state on
7
+ * missing/corrupt file.
8
+ * - saveDaemonState(): atomic write (tmp + rename, POSIX-atomic); mkdir -p.
9
+ * - resetDayIfNeeded(): pure — if todayDate has rolled over, zero daily
10
+ * spend and update the date. Returns (possibly new) state; caller persists.
11
+ *
12
+ * No new runtime deps; node builtins only.
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
15
+ import { homedir } from 'node:os';
16
+ import { join } from 'node:path';
17
+ // ---------------------------------------------------------------------------
18
+ // Constants
19
+ // ---------------------------------------------------------------------------
20
+ /** Maximum number of tick history entries kept in daemon.json. */
21
+ const MAX_TICKS = 100;
22
+ // ---------------------------------------------------------------------------
23
+ // Path helpers (re-resolved at call time so tests can relocate HOME)
24
+ // ---------------------------------------------------------------------------
25
+ function ashlrDir() {
26
+ return join(homedir(), '.ashlr');
27
+ }
28
+ /** Absolute path to the daemon state file. */
29
+ export function daemonStatePath() {
30
+ return join(ashlrDir(), 'daemon.json');
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // Zeroed default state
34
+ // ---------------------------------------------------------------------------
35
+ function freshState() {
36
+ return {
37
+ running: false,
38
+ pid: null,
39
+ startedAt: null,
40
+ lastTickAt: null,
41
+ todayDate: null,
42
+ todaySpentUsd: 0,
43
+ itemsProcessed: 0,
44
+ ticks: [],
45
+ };
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Load
49
+ // ---------------------------------------------------------------------------
50
+ /**
51
+ * Read and parse daemonStatePath(). NEVER throws.
52
+ * Returns a fresh zeroed DaemonState when the file is missing or malformed.
53
+ */
54
+ export function loadDaemonState() {
55
+ const p = daemonStatePath();
56
+ if (!existsSync(p))
57
+ return freshState();
58
+ try {
59
+ const raw = readFileSync(p, 'utf8');
60
+ const parsed = JSON.parse(raw);
61
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
62
+ return freshState();
63
+ }
64
+ const obj = parsed;
65
+ // Validate and coerce each field with a safe fallback.
66
+ const state = {
67
+ running: typeof obj['running'] === 'boolean' ? obj['running'] : false,
68
+ pid: typeof obj['pid'] === 'number'
69
+ ? obj['pid']
70
+ : obj['pid'] === null
71
+ ? null
72
+ : null,
73
+ startedAt: typeof obj['startedAt'] === 'string' ? obj['startedAt'] : null,
74
+ lastTickAt: typeof obj['lastTickAt'] === 'string' ? obj['lastTickAt'] : null,
75
+ todayDate: typeof obj['todayDate'] === 'string' ? obj['todayDate'] : null,
76
+ todaySpentUsd: typeof obj['todaySpentUsd'] === 'number' ? obj['todaySpentUsd'] : 0,
77
+ itemsProcessed: typeof obj['itemsProcessed'] === 'number' ? obj['itemsProcessed'] : 0,
78
+ ticks: Array.isArray(obj['ticks'])
79
+ ? obj['ticks'].filter((t) => typeof t === 'object' &&
80
+ t !== null &&
81
+ !Array.isArray(t) &&
82
+ typeof t['ts'] === 'string')
83
+ : [],
84
+ };
85
+ // Self-heal at the load chokepoint: a daemon killed -9 leaves
86
+ // running:true/pid:<dead> behind; reconcile (read-only liveness) flips it to
87
+ // a truthful stopped state so status/start/tick never see a phantom-live
88
+ // daemon. Observability-only — touches NO spend accounting, NO guard.
89
+ return reconcileDaemonState(state);
90
+ }
91
+ catch {
92
+ // Corrupt JSON or any other read error — return zeroed state.
93
+ return freshState();
94
+ }
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Save (atomic)
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Atomically write DaemonState to daemonStatePath() via tmp-file + rename
101
+ * (POSIX-atomic). Creates ~/.ashlr if needed. Never throws.
102
+ */
103
+ export function saveDaemonState(s) {
104
+ try {
105
+ const dir = ashlrDir();
106
+ if (!existsSync(dir)) {
107
+ mkdirSync(dir, { recursive: true });
108
+ }
109
+ // Bound ticks history before persisting.
110
+ const bounded = {
111
+ ...s,
112
+ ticks: s.ticks.slice(-MAX_TICKS),
113
+ };
114
+ const dest = daemonStatePath();
115
+ const tmp = dest + '.tmp';
116
+ writeFileSync(tmp, JSON.stringify(bounded, null, 2) + '\n', 'utf8');
117
+ renameSync(tmp, dest);
118
+ }
119
+ catch {
120
+ // Persistence failure must not crash the daemon — swallow silently.
121
+ }
122
+ }
123
+ // ---------------------------------------------------------------------------
124
+ // Daily budget reset
125
+ // ---------------------------------------------------------------------------
126
+ /**
127
+ * If s.todayDate differs from today's YYYY-MM-DD, return a copy with
128
+ * todayDate set to today and todaySpentUsd reset to 0 (daily budget reset).
129
+ * itemsProcessed and ticks are preserved.
130
+ *
131
+ * Pure-ish: returns the (possibly new) state; caller is responsible for
132
+ * persisting via saveDaemonState().
133
+ */
134
+ export function resetDayIfNeeded(s) {
135
+ const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
136
+ if (s.todayDate === today)
137
+ return s;
138
+ return {
139
+ ...s,
140
+ todayDate: today,
141
+ todaySpentUsd: 0,
142
+ };
143
+ }
144
+ // ---------------------------------------------------------------------------
145
+ // Stale-daemon reconciliation (H5 — OBSERVABILITY-ONLY liveness check)
146
+ // ---------------------------------------------------------------------------
147
+ /**
148
+ * READ-ONLY liveness reconcile. If `s.running === true` but the recorded `pid`
149
+ * is NOT alive — `process.kill(pid, 0)` throws `ESRCH` (no such process) — flip
150
+ * `running` to false and `pid` to null so `daemon status` reports a dead daemon
151
+ * as stopped. Otherwise return `s` unchanged.
152
+ *
153
+ * HONEST BOUND (pid reuse): this reports a dead daemon as live ONLY in the rare
154
+ * case where the OS recycled the recorded pid for an unrelated live process
155
+ * (then `process.kill(pid,0)` succeeds and we leave the state unchanged) —
156
+ * inherent to pid-0 liveness. In every other case it is truthful. It is
157
+ * conservative-toward-alive (it NEVER force-flips a genuinely running daemon
158
+ * off), and since it changes no spend/guard the residual false-positive is an
159
+ * observability nicety only, never a safety issue.
160
+ *
161
+ * OBSERVABILITY-ONLY by construction: it touches NO spend accounting
162
+ * (`todaySpentUsd` / `itemsProcessed` / `ticks` are preserved byte-for-byte),
163
+ * NO guard (kill switch / enrollment / sandbox are unaffected), and adds NO
164
+ * capability. It only makes the persisted running/pid pair truthful.
165
+ *
166
+ * Liveness rules (conservative — NEVER destroy a real running daemon's state):
167
+ * - `running !== true` or `pid` not a number => nothing to reconcile => unchanged.
168
+ * - `process.kill(pid, 0)` succeeds => process alive => unchanged.
169
+ * - throws `ESRCH` => process is GONE => flip to { running:false, pid:null }.
170
+ * - throws `EPERM` (exists but not signalable by us) => process EXISTS => alive
171
+ * => unchanged (do NOT flip).
172
+ * - any other/unexpected error => treat as alive => unchanged.
173
+ *
174
+ * Pure-ish: returns the (possibly new) state; caller persists via
175
+ * saveDaemonState(). Never throws.
176
+ */
177
+ export function reconcileDaemonState(s) {
178
+ if (s.running !== true || typeof s.pid !== 'number') {
179
+ return s;
180
+ }
181
+ try {
182
+ // Signal 0 performs error checking without actually sending a signal.
183
+ process.kill(s.pid, 0);
184
+ // No throw => the process exists and is signalable => treat as alive.
185
+ return s;
186
+ }
187
+ catch (err) {
188
+ const code = err?.code;
189
+ if (code === 'ESRCH') {
190
+ // No such process — the daemon is dead. Flip to a truthful stopped state.
191
+ return { ...s, running: false, pid: null };
192
+ }
193
+ // EPERM (exists, not ours) or any other error => conservatively alive.
194
+ return s;
195
+ }
196
+ }
197
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/daemon/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * core/dashboard.ts — M13 DashboardSnapshot aggregator.
3
+ *
4
+ * Builds a single bounded, read-only DashboardSnapshot by calling the
5
+ * existing data-source modules. Called on every TUI refresh tick (~2s) and
6
+ * by Raycast views; must be fast (<1s) and NEVER throw.
7
+ *
8
+ * MCP health strategy: discoverMcpServers() is synchronous and fast (file
9
+ * reads only). probeServer() is async and spawns child processes — far too
10
+ * slow to call on every tick. We use the discovered spec list as a
11
+ * "last-known configured" proxy: each server is reported ok:true, tools:0
12
+ * (configured but tool count unknown without probing). This keeps the
13
+ * snapshot bounded and sub-second while still surfacing which servers are
14
+ * configured.
15
+ *
16
+ * Genome strategy: we call loadGenome() directly (bounded, never-throws, no
17
+ * child process) and derive entry + distinct-project counts from it. We do
18
+ * NOT call genomeHealth() because it invokes probeEmbeddingsSync(), which
19
+ * runs execFileSync('curl', ...) with a ~2.5s timeout — a synchronous child
20
+ * spawn that would block the event loop (and thus keypress handling) on the
21
+ * ~2s refresh tick. loadGenome keeps the snapshot sub-second and non-blocking.
22
+ *
23
+ * All partial failures degrade to zeroed/empty fields — snapshot is always
24
+ * returned, never null.
25
+ */
26
+ import type { AshlrConfig, DashboardSnapshot } from './types.js';
27
+ /**
28
+ * Aggregate a DashboardSnapshot from all hub data sources.
29
+ *
30
+ * Calls: loadIndex, getToolsRegistry, buildRollup('7d'), listRuns,
31
+ * listSwarms, discoverMcpServers, loadGenome.
32
+ *
33
+ * Contract:
34
+ * - Async (callers can await without blocking the event loop for I/O).
35
+ * - NEVER throws — any failure degrades its field to zero/empty.
36
+ * - Fast: all underlying calls are synchronous file reads + no child
37
+ * process spawns (MCP probing is skipped; genome embedding probe is
38
+ * skipped). Sub-1s on typical machines.
39
+ */
40
+ export declare function buildSnapshot(cfg: AshlrConfig): Promise<DashboardSnapshot>;