@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,350 @@
1
+ /**
2
+ * core/observability/telemetry-sink.ts — M19 telemetry sink seam.
3
+ *
4
+ * Two implementations:
5
+ * LocalFileSink — default (no endpoint / no PAT). Appends spans as JSONL
6
+ * to a daily file under ~/.ashlr/telemetry/. What `ashlr
7
+ * pulse` already aggregates locally.
8
+ * OtlpHttpSink — opt-in, only when cfg.telemetry.pulse AND a PAT are
9
+ * both present. Builds an OTLP/HTTP-JSON trace and POSTs
10
+ * it to the configured endpoint. Fire-and-forget, bounded
11
+ * timeout, never throws/blocks.
12
+ *
13
+ * GUARDRAILS:
14
+ * - PRIVACY: JSONL records and span attributes are METADATA ONLY (model,
15
+ * token counts, cost, ids, provider, tier, status, duration). NEVER
16
+ * prompt/response text, tool args, file contents, or secrets.
17
+ * - PAT/SECRET SAFETY: PAT lives ONLY in the Authorization header. It is
18
+ * NEVER logged, printed, returned, placed in span attrs or `detail`, or
19
+ * committed. Source: phantom (preferred) or ASHLR_PULSE_TOKEN env var.
20
+ * - All emits are best-effort: ok:false is logged to stderr only and NEVER
21
+ * blocks or propagates out of a run/swarm.
22
+ */
23
+ import { homedir } from 'node:os';
24
+ import { join } from 'node:path';
25
+ import { mkdirSync, appendFileSync } from 'node:fs';
26
+ import { spawnSync, spawn } from 'node:child_process';
27
+ import { buildGenAiTrace } from './otlp.js';
28
+ // ---------------------------------------------------------------------------
29
+ // Constants
30
+ // ---------------------------------------------------------------------------
31
+ const PHANTOM_BIN = 'phantom';
32
+ const PHANTOM_TIMEOUT_MS = 5_000;
33
+ /**
34
+ * Fetch timeout for OTLP POST — bounded, never blocks a run. Kept short
35
+ * (this is a fire-and-forget metadata POST); a dead/slow-but-reachable
36
+ * endpoint must not add meaningful wall-clock latency to run/swarm completion.
37
+ */
38
+ const OTLP_FETCH_TIMEOUT_MS = 3_000;
39
+ /**
40
+ * Bounded budget for resolving the PAT via phantom on the emit hot path.
41
+ * Uses async spawn (NOT spawnSync) so the Node event loop is never frozen.
42
+ */
43
+ const PHANTOM_RESOLVE_TIMEOUT_MS = 3_000;
44
+ /** Secret name phantom stores for the Pulse PAT. */
45
+ const PHANTOM_PAT_KEY = 'ASHLR_PULSE_TOKEN';
46
+ // ---------------------------------------------------------------------------
47
+ // Public: localTelemetryDir
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Returns the absolute path to the local telemetry directory:
51
+ * ~/.ashlr/telemetry
52
+ *
53
+ * Re-resolves homedir() at call time so a relocated HOME in tests is honored.
54
+ */
55
+ export function localTelemetryDir() {
56
+ return join(homedir(), '.ashlr', 'telemetry');
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Public: patAvailable
60
+ // ---------------------------------------------------------------------------
61
+ /**
62
+ * Returns true when a Pulse PAT is discoverable — either via the
63
+ * ASHLR_PULSE_TOKEN environment variable or via phantom (when installed,
64
+ * initialized, and the key is present in the vault).
65
+ *
66
+ * NEVER reads, returns, or logs the PAT value — boolean only.
67
+ *
68
+ * `allowPhantomProbe` (default true) controls the blocking spawnSync phantom
69
+ * probe. The doctor / `ashlr telemetry status` callers want the full probe
70
+ * (they are NOT on a run's completion path). The emit hot path
71
+ * (getSink -> patAvailable) MUST pass `false`: the spawnSync probe freezes the
72
+ * event loop for up to ~10s (2x5s) and is redundant there — OtlpHttpSink.emit
73
+ * resolves the PAT itself via the async, bounded resolvePatAsync. With the
74
+ * probe off, patAvailable is a pure env-var check (no blocking).
75
+ */
76
+ export function patAvailable(cfg, allowPhantomProbe = true) {
77
+ // 1. Env var check — existence only, never the value.
78
+ if (process.env['ASHLR_PULSE_TOKEN'] !== undefined && process.env['ASHLR_PULSE_TOKEN'] !== '') {
79
+ return true;
80
+ }
81
+ // 2. Phantom check — only when phantom integration is enabled in cfg AND the
82
+ // caller opted into the blocking probe (never on the emit hot path).
83
+ if (!allowPhantomProbe)
84
+ return false;
85
+ if (!cfg.phantom?.enabled)
86
+ return false;
87
+ try {
88
+ // Quick binary check.
89
+ const versionResult = spawnSync(PHANTOM_BIN, ['--version'], {
90
+ encoding: 'utf8',
91
+ timeout: PHANTOM_TIMEOUT_MS,
92
+ env: { ...process.env, PHANTOM_NO_UPDATE_CHECK: '1' },
93
+ });
94
+ if (versionResult.error || versionResult.status !== 0)
95
+ return false;
96
+ // List secret names only — never values.
97
+ const listResult = spawnSync(PHANTOM_BIN, ['list', '--json'], {
98
+ encoding: 'utf8',
99
+ timeout: PHANTOM_TIMEOUT_MS,
100
+ env: { ...process.env, PHANTOM_NO_UPDATE_CHECK: '1' },
101
+ });
102
+ if (listResult.error || listResult.status !== 0)
103
+ return false;
104
+ const raw = (listResult.stdout ?? '').trim();
105
+ if (!raw)
106
+ return false;
107
+ // Parse names only — same conservative extraction as phantom.ts.
108
+ const names = extractSecretNames(raw);
109
+ return names.includes(PHANTOM_PAT_KEY);
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ // ---------------------------------------------------------------------------
116
+ // Public: getSink
117
+ // ---------------------------------------------------------------------------
118
+ /**
119
+ * Returns the appropriate TelemetrySink for the given config:
120
+ * - OtlpHttpSink when cfg.telemetry.pulse is set AND a PAT is available.
121
+ * - LocalFileSink (default, 100% local) otherwise.
122
+ *
123
+ * `allowPhantomProbe` (default true) is forwarded to patAvailable. On the
124
+ * emit hot path (orchestrator/swarm completion) callers MUST pass `false` so
125
+ * the selection never runs a blocking spawnSync phantom probe: when an
126
+ * endpoint is configured we hand off to OtlpHttpSink, which resolves the PAT
127
+ * asynchronously with a bounded timeout (and degrades to a logged
128
+ * 'PAT unavailable' no-op if none is found) — never freezing the event loop.
129
+ * The CLI (`telemetry test`/`status`) keeps the default probe.
130
+ */
131
+ export function getSink(cfg, allowPhantomProbe = true) {
132
+ if (cfg.telemetry?.pulse) {
133
+ // On the emit path (probe off): select OTLP whenever an endpoint is set and
134
+ // let OtlpHttpSink resolve the PAT async; if none, emit() is a logged no-op.
135
+ if (!allowPhantomProbe)
136
+ return new OtlpHttpSink(cfg);
137
+ // CLI path: keep the synchronous PAT availability probe for accurate routing.
138
+ if (patAvailable(cfg, true))
139
+ return new OtlpHttpSink(cfg);
140
+ }
141
+ return new LocalFileSink();
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // LocalFileSink — default, 100% local
145
+ // ---------------------------------------------------------------------------
146
+ /**
147
+ * Appends spans as JSONL to a daily file under ~/.ashlr/telemetry/.
148
+ * File name: telemetry-YYYY-MM-DD.jsonl
149
+ * Each line is a single JSON object containing one span (metadata only).
150
+ * What `ashlr pulse` already aggregates locally.
151
+ */
152
+ class LocalFileSink {
153
+ async emit(spans) {
154
+ if (spans.length === 0) {
155
+ return { sink: 'local', ok: true, detail: 'no spans' };
156
+ }
157
+ try {
158
+ const dir = localTelemetryDir();
159
+ mkdirSync(dir, { recursive: true });
160
+ const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
161
+ const filePath = join(dir, `telemetry-${date}.jsonl`);
162
+ const lines = spans.map((span) => JSON.stringify(span)).join('\n') + '\n';
163
+ appendFileSync(filePath, lines, 'utf8');
164
+ return { sink: 'local', ok: true, detail: `appended ${spans.length} span(s) to ${filePath}` };
165
+ }
166
+ catch (err) {
167
+ const detail = err instanceof Error ? err.message : String(err);
168
+ process.stderr.write(`[ashlr telemetry] LocalFileSink error: ${detail}\n`);
169
+ return { sink: 'local', ok: false, detail };
170
+ }
171
+ }
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // OtlpHttpSink — opt-in, endpoint + PAT required
175
+ // ---------------------------------------------------------------------------
176
+ /**
177
+ * Builds an OTLP/HTTP-JSON trace payload from the spans and POSTs it to
178
+ * cfg.telemetry.pulse. Uses a bounded fetch timeout (fire-and-forget).
179
+ * PAT sourced from phantom (preferred) or ASHLR_PULSE_TOKEN env — placed
180
+ * ONLY in the Authorization header, never logged or returned.
181
+ */
182
+ class OtlpHttpSink {
183
+ cfg;
184
+ constructor(cfg) {
185
+ this.cfg = cfg;
186
+ }
187
+ async emit(spans) {
188
+ const endpoint = this.cfg.telemetry?.pulse;
189
+ if (!endpoint) {
190
+ return { sink: 'otlp', ok: false, detail: 'no endpoint configured' };
191
+ }
192
+ // Retrieve PAT asynchronously — value used only in the Authorization
193
+ // header, never stored. Async + bounded so we never freeze the event loop
194
+ // (the spawnSync variant could block for up to 5s; resolvePatAsync uses
195
+ // spawn + a Promise.race timeout instead).
196
+ const pat = await resolvePatAsync(this.cfg);
197
+ if (!pat) {
198
+ return { sink: 'otlp', ok: false, detail: 'PAT unavailable' };
199
+ }
200
+ if (spans.length === 0) {
201
+ return { sink: 'otlp', ok: true, detail: 'no spans' };
202
+ }
203
+ try {
204
+ const body = JSON.stringify(buildGenAiTrace(spans));
205
+ const controller = new AbortController();
206
+ const timer = setTimeout(() => controller.abort(), OTLP_FETCH_TIMEOUT_MS);
207
+ let res;
208
+ try {
209
+ res = await fetch(endpoint, {
210
+ method: 'POST',
211
+ headers: {
212
+ 'Content-Type': 'application/json',
213
+ // PAT only in the Authorization header — never logged, never in detail.
214
+ Authorization: `Bearer ${pat}`,
215
+ },
216
+ body,
217
+ signal: controller.signal,
218
+ });
219
+ }
220
+ finally {
221
+ clearTimeout(timer);
222
+ }
223
+ if (res.ok) {
224
+ return { sink: 'otlp', ok: true, detail: `HTTP ${res.status}` };
225
+ }
226
+ const detail = `HTTP ${res.status}`;
227
+ process.stderr.write(`[ashlr telemetry] OtlpHttpSink: ${detail}\n`);
228
+ return { sink: 'otlp', ok: false, detail };
229
+ }
230
+ catch (err) {
231
+ const isAbort = err instanceof Error && err.name === 'AbortError';
232
+ const detail = isAbort ? 'request timed out' : err instanceof Error ? err.message : String(err);
233
+ process.stderr.write(`[ashlr telemetry] OtlpHttpSink error: ${detail}\n`);
234
+ return { sink: 'otlp', ok: false, detail };
235
+ }
236
+ }
237
+ }
238
+ // ---------------------------------------------------------------------------
239
+ // Private helpers
240
+ // ---------------------------------------------------------------------------
241
+ /**
242
+ * Resolve the PAT value for use ONLY in the Authorization header — ASYNC and
243
+ * bounded so it is safe on a run/swarm completion path. The previous spawnSync
244
+ * implementation froze the Node event loop for up to PHANTOM_TIMEOUT_MS; this
245
+ * uses node:child_process.spawn wrapped in a Promise.race against a short
246
+ * timeout, so a hung phantom can never block the run.
247
+ *
248
+ * Sources (in order):
249
+ * 1. ASHLR_PULSE_TOKEN env var (direct, no spawn).
250
+ * 2. phantom exec — injects vault secrets as env vars into a subprocess;
251
+ * we spawn `node -e 'process.stdout.write(process.env.ASHLR_PULSE_TOKEN||"")'`
252
+ * under phantom exec so the value flows only into the header.
253
+ *
254
+ * Resolves to the PAT string, or null when unavailable.
255
+ * NEVER logs, prints, stores, or returns via any other path. The subprocess
256
+ * stdout is PAT-bearing — it is consumed locally and must never be logged.
257
+ */
258
+ async function resolvePatAsync(cfg) {
259
+ // 1. Env var — fastest path, no subprocess.
260
+ const envPat = process.env['ASHLR_PULSE_TOKEN'];
261
+ if (envPat)
262
+ return envPat;
263
+ // 2. Phantom exec — only when integration enabled.
264
+ if (!cfg.phantom?.enabled)
265
+ return null;
266
+ return new Promise((resolve) => {
267
+ let settled = false;
268
+ const done = (value) => {
269
+ if (settled)
270
+ return;
271
+ settled = true;
272
+ clearTimeout(timer);
273
+ try {
274
+ child.kill();
275
+ }
276
+ catch { /* already exited */ }
277
+ resolve(value);
278
+ };
279
+ // Bounded budget — a hung phantom never blocks the run.
280
+ const timer = setTimeout(() => done(null), PHANTOM_RESOLVE_TIMEOUT_MS);
281
+ let child;
282
+ try {
283
+ child = spawn(PHANTOM_BIN, ['exec', '--', 'node', '-e', `process.stdout.write(process.env['${PHANTOM_PAT_KEY}']||'')`], { env: { ...process.env, PHANTOM_NO_UPDATE_CHECK: '1' }, stdio: ['ignore', 'pipe', 'ignore'] });
284
+ }
285
+ catch {
286
+ done(null);
287
+ return;
288
+ }
289
+ // out is PAT-bearing — consumed locally, never logged.
290
+ let out = '';
291
+ child.stdout?.on('data', (chunk) => { out += chunk.toString('utf8'); });
292
+ child.on('error', () => done(null));
293
+ child.on('close', (code) => {
294
+ if (code !== 0) {
295
+ done(null);
296
+ return;
297
+ }
298
+ const value = out.trim();
299
+ done(value || null);
300
+ });
301
+ });
302
+ }
303
+ /**
304
+ * Extract ONLY secret names from `phantom list --json` output.
305
+ * Conservative — returns [] on any parse failure to avoid leaking values.
306
+ * Mirrors the extraction logic in core/phantom.ts.
307
+ */
308
+ function extractSecretNames(raw) {
309
+ try {
310
+ const parsed = JSON.parse(raw);
311
+ if (Array.isArray(parsed)) {
312
+ const names = [];
313
+ for (const item of parsed) {
314
+ if (item !== null && typeof item === 'object') {
315
+ const obj = item;
316
+ if (typeof obj['name'] === 'string')
317
+ names.push(obj['name']);
318
+ else if (typeof obj['key'] === 'string')
319
+ names.push(obj['key']);
320
+ }
321
+ else if (typeof item === 'string') {
322
+ names.push(item);
323
+ }
324
+ }
325
+ return names;
326
+ }
327
+ if (parsed !== null && typeof parsed === 'object') {
328
+ const obj = parsed;
329
+ for (const key of ['secrets', 'keys', 'names']) {
330
+ if (Array.isArray(obj[key])) {
331
+ return extractSecretNames(JSON.stringify(obj[key]));
332
+ }
333
+ }
334
+ }
335
+ return [];
336
+ }
337
+ catch {
338
+ // Line-based fallback — env-var name pattern only, no values.
339
+ const ENV_VAR_RE = /^[A-Z_][A-Z0-9_]{0,127}$/;
340
+ const names = [];
341
+ for (const line of (raw ?? '').split('\n')) {
342
+ const token = line.trim().split(/\s+/)[0];
343
+ if (token && ENV_VAR_RE.test(token) && token !== 'NAME' && token !== 'KEY') {
344
+ names.push(token);
345
+ }
346
+ }
347
+ return names;
348
+ }
349
+ }
350
+ //# sourceMappingURL=telemetry-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-sink.js","sourceRoot":"","sources":["../../../src/core/observability/telemetry-sink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * usage-source.ts — local-first UsageEvent collector (M5 observability).
3
+ *
4
+ * PRIVACY GUARDRAILS: reads ONLY token counts, model id, timestamp, and the
5
+ * project path (decoded from the encoded dir name). Never reads or retains
6
+ * message content, tool args/results, prompts, or completions.
7
+ *
8
+ * PERFORMANCE: streams line-by-line; skips files whose mtime is older than
9
+ * sinceMs; tolerates malformed lines; never throws.
10
+ */
11
+ import type { UsageEvent } from "../types.js";
12
+ /** Absolute path to ~/.claude/projects (honors $HOME). */
13
+ export declare function claudeProjectsDir(): string;
14
+ /**
15
+ * Decode an encoded Claude Code project dir name back to an absolute path.
16
+ *
17
+ * Claude encodes the absolute path by replacing the leading `/` with a `-`
18
+ * and then replacing every subsequent `/` with `-`. For example:
19
+ * '-Users-you-Desktop-foo' -> '/Users/you/Desktop/foo'
20
+ *
21
+ * This is lossy for path segments that naturally contain `-`, but we do
22
+ * the best-effort reconstruction by:
23
+ * 1. Stripping the leading `-`
24
+ * 2. Re-prefixing with `/`
25
+ * 3. Replacing remaining `-` with `/`
26
+ *
27
+ * The result is a plausible absolute path suitable for display/grouping.
28
+ */
29
+ export declare function decodeProjectPath(dirName: string): string;
30
+ /**
31
+ * Collapse a real absolute path to the dash-normalized form Claude uses to
32
+ * encode project dir names: every `/` AND every `-` becomes `-`.
33
+ *
34
+ * Both the real path '/Users/x/dev-tools/ashlr-hub' and its lossy decode
35
+ * '/Users/x/dev/tools/ashlr/hub' normalize to the SAME string
36
+ * '-Users-x-dev-tools-ashlr-hub'. That makes dashNormalize a reliable join key
37
+ * between the index's REAL paths and the transcript's MANGLED decoded paths,
38
+ * which recovers correct grouping/labels for any repo whose name has a dash.
39
+ */
40
+ export declare function dashNormalize(absPath: string): string;
41
+ /**
42
+ * Resolve a (possibly mangled) decoded project path against known real paths
43
+ * from the index. Returns the matching real path when the dash-normalized
44
+ * forms agree, otherwise returns the input unchanged (best-effort decode).
45
+ *
46
+ * `realByNorm` maps dashNormalize(realPath) -> realPath and is built once by
47
+ * the caller so this stays O(1) per event.
48
+ */
49
+ export declare function reconcileProjectPath(decodedPath: string, realByNorm: Map<string, string>): string;
50
+ /**
51
+ * Collect normalized UsageEvents from all local sources with ts >= sinceMs.
52
+ *
53
+ * Sources:
54
+ * (a) ~/.claude/projects/<encoded-dir>/*.jsonl — METADATA ONLY
55
+ * (b) ~/.ashlr/runs/*.json — M4 RunState records
56
+ *
57
+ * Streams line-by-line; skips files older than sinceMs by mtime; tolerates
58
+ * malformed lines; never reads message content. Never throws.
59
+ */
60
+ export declare function collectUsageEvents(sinceMs: number): UsageEvent[];