@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,311 @@
1
+ /**
2
+ * rollup.ts — build ActivityRollup from local usage events + git commit counts.
3
+ *
4
+ * Privacy: delegates to collectUsageEvents which reads METADATA ONLY.
5
+ * Performance: skips files outside the window (mtime filtering in usage-source),
6
+ * git log --since is bounded per-repo, never throws globally.
7
+ */
8
+ import { execFileSync } from 'node:child_process';
9
+ import { existsSync } from 'node:fs';
10
+ import { basename } from 'node:path';
11
+ import { collectUsageEvents, dashNormalize } from './usage-source.js';
12
+ import { evalBudget } from './budget-alert.js';
13
+ import { estCostUsd } from '../run/budget.js';
14
+ import { loadIndex } from '../index-engine.js';
15
+ // ---------------------------------------------------------------------------
16
+ // windowToMs
17
+ // ---------------------------------------------------------------------------
18
+ /**
19
+ * Convert a window label to milliseconds.
20
+ * Unknown labels fall back to 7d.
21
+ */
22
+ export function windowToMs(window) {
23
+ switch (window) {
24
+ case '1d': return 86_400_000;
25
+ case '7d': return 7 * 86_400_000;
26
+ case '30d': return 30 * 86_400_000;
27
+ default: return 7 * 86_400_000;
28
+ }
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Git commit counting (best-effort, never throws)
32
+ // ---------------------------------------------------------------------------
33
+ const GIT_TIMEOUT = 5_000;
34
+ /**
35
+ * Count commits in `repoPath` with author date >= sinceMs.
36
+ * Returns 0 on any error (git unavailable, not a repo, timeout, etc.).
37
+ */
38
+ function countCommitsSince(repoPath, sinceMs) {
39
+ try {
40
+ if (!existsSync(repoPath))
41
+ return 0;
42
+ const since = new Date(sinceMs).toISOString();
43
+ const out = execFileSync('git', ['log', '--oneline', `--after=${since}`], { cwd: repoPath, timeout: GIT_TIMEOUT, stdio: 'pipe', encoding: 'utf8' });
44
+ return out.trim() === '' ? 0 : out.trim().split('\n').length;
45
+ }
46
+ catch {
47
+ return 0;
48
+ }
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Cost estimation — map model id to a provider key for estCostUsd()
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Derive a provider key from a model id so estCostUsd() can match it.
55
+ *
56
+ * Examples:
57
+ * 'claude-3-5-sonnet-20241022' -> 'claude'
58
+ * 'gpt-4o' -> 'gpt'
59
+ * 'gemini-1.5-pro' -> 'gemini'
60
+ * 'ollama/llama3' -> 'ollama'
61
+ * unknown -> model id as-is (budget fallback applies)
62
+ */
63
+ export function modelToProviderKey(model) {
64
+ const m = model.toLowerCase();
65
+ if (m.startsWith('claude'))
66
+ return 'claude';
67
+ if (m.startsWith('gpt'))
68
+ return 'gpt';
69
+ if (m.startsWith('gemini'))
70
+ return 'gemini';
71
+ if (m.startsWith('mistral'))
72
+ return 'mistral';
73
+ if (m.startsWith('cohere'))
74
+ return 'cohere';
75
+ if (m.includes('ollama'))
76
+ return 'ollama';
77
+ if (m.includes('lmstudio'))
78
+ return 'lmstudio';
79
+ // Pass through: estCostUsd will fallback to conservative $3/$15
80
+ return model;
81
+ }
82
+ /**
83
+ * Local (zero-cost) provider keys. A model whose `modelToProviderKey` lands in
84
+ * this set is served by a LOCAL backend and costs $0. Shared with forecast.ts so
85
+ * the local/cloud split stays consistent across rollup and savings computation.
86
+ */
87
+ export const LOCAL_PROVIDER_KEYS = new Set(['ollama', 'lmstudio']);
88
+ /** True when `model` is served by a local provider (cost $0). */
89
+ export function isLocalProviderModel(model) {
90
+ return LOCAL_PROVIDER_KEYS.has(modelToProviderKey(model));
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // buildRollup
94
+ // ---------------------------------------------------------------------------
95
+ export function buildRollup(window, cfg, opts) {
96
+ const now = Date.now();
97
+ const sinceMs = now - windowToMs(window);
98
+ const sinceIso = new Date(sinceMs).toISOString();
99
+ // ── Collect usage events ─────────────────────────────────────────────────
100
+ let events = [];
101
+ try {
102
+ events = collectUsageEvents(sinceMs);
103
+ }
104
+ catch {
105
+ // partial data ok
106
+ }
107
+ // ── Load the index ONCE ───────────────────────────────────────────────────
108
+ // Reused for (a) reconciling mangled transcript paths to real repo paths and
109
+ // (b) git commit counting — avoids the previous double loadIndex().
110
+ let index = null;
111
+ try {
112
+ index = loadIndex();
113
+ }
114
+ catch {
115
+ // missing index is fine — degrade to best-effort decode + no commits
116
+ }
117
+ // Build a lookup from the dash-normalized form of each indexed repo path to
118
+ // its REAL path. Transcript events carry a LOSSY decode (every '-' became
119
+ // '/'), but dashNormalize collapses both the real and the lossy form to the
120
+ // same key, so we can recover the correct real path for dashed repo names.
121
+ const realByNorm = new Map();
122
+ if (index) {
123
+ for (const item of index.items) {
124
+ if (item.kind !== 'repo')
125
+ continue;
126
+ realByNorm.set(dashNormalize(item.path), item.path);
127
+ }
128
+ }
129
+ // Reconcile each event's (possibly mangled) project path to the real index
130
+ // path so token activity joins the git-commit activity on the SAME key and
131
+ // by-project labels/--project matching work for dashed repos. Falls back to
132
+ // the original decode when there is no index match.
133
+ if (realByNorm.size > 0) {
134
+ for (const ev of events) {
135
+ if (!ev.project)
136
+ continue;
137
+ const real = realByNorm.get(dashNormalize(ev.project));
138
+ if (real)
139
+ ev.project = real;
140
+ }
141
+ }
142
+ // ── Optional project filter ──────────────────────────────────────────────
143
+ const projectFilter = opts?.project?.trim();
144
+ if (projectFilter) {
145
+ events = events.filter((e) => {
146
+ if (!e.project)
147
+ return false;
148
+ return (e.project === projectFilter ||
149
+ basename(e.project) === projectFilter ||
150
+ e.project.includes(projectFilter));
151
+ });
152
+ }
153
+ // ── Aggregation maps ─────────────────────────────────────────────────────
154
+ // project key -> ProjectActivity accumulator
155
+ const projectMap = new Map();
156
+ // YYYY-MM-DD -> DailyUsage accumulator
157
+ const dayMap = new Map();
158
+ // model id -> ModelUsage accumulator
159
+ const modelMap = new Map();
160
+ // Grand totals
161
+ let totalTokensIn = 0;
162
+ let totalTokensOut = 0;
163
+ let totalCost = 0;
164
+ // Track distinct session files globally for totals.sessions
165
+ const allSessions = new Set();
166
+ for (const ev of events) {
167
+ const cost = estCostUsd(modelToProviderKey(ev.model), ev.tokensIn, ev.tokensOut);
168
+ // Grand totals
169
+ totalTokensIn += ev.tokensIn;
170
+ totalTokensOut += ev.tokensOut;
171
+ totalCost += cost;
172
+ // Session key: for 'claude' events the session file is implicit per-event
173
+ // grouping; we use (project + day) as a session proxy when we don't have
174
+ // the actual filename, but usage-source may embed it in model/ts combos.
175
+ // For simplicity, use a session key = project + ISO-day to count sessions.
176
+ const day = ev.ts.slice(0, 10); // YYYY-MM-DD
177
+ const sessionKey = `${ev.project ?? '__none__'}::${day}`;
178
+ allSessions.add(sessionKey);
179
+ // ── Per-project ────────────────────────────────────────────────────────
180
+ const proj = ev.project ?? '__unknown__';
181
+ if (!projectMap.has(proj)) {
182
+ projectMap.set(proj, { sessions: new Set(), tokensIn: 0, tokensOut: 0, estCostUsd: 0, lastActive: null });
183
+ }
184
+ const pa = projectMap.get(proj);
185
+ pa.sessions.add(sessionKey);
186
+ pa.tokensIn += ev.tokensIn;
187
+ pa.tokensOut += ev.tokensOut;
188
+ pa.estCostUsd += cost;
189
+ if (pa.lastActive === null || ev.ts > pa.lastActive) {
190
+ pa.lastActive = ev.ts;
191
+ }
192
+ // ── Per-day ────────────────────────────────────────────────────────────
193
+ if (!dayMap.has(day)) {
194
+ dayMap.set(day, { tokensIn: 0, tokensOut: 0, estCostUsd: 0, sessions: new Set() });
195
+ }
196
+ const du = dayMap.get(day);
197
+ du.tokensIn += ev.tokensIn;
198
+ du.tokensOut += ev.tokensOut;
199
+ du.estCostUsd += cost;
200
+ du.sessions.add(sessionKey);
201
+ // ── Per-model ──────────────────────────────────────────────────────────
202
+ const modelKey = ev.model || 'unknown';
203
+ if (!modelMap.has(modelKey)) {
204
+ modelMap.set(modelKey, { tokensIn: 0, tokensOut: 0, estCostUsd: 0, calls: 0 });
205
+ }
206
+ const mu = modelMap.get(modelKey);
207
+ mu.tokensIn += ev.tokensIn;
208
+ mu.tokensOut += ev.tokensOut;
209
+ mu.estCostUsd += cost;
210
+ mu.calls++;
211
+ }
212
+ // ── Git commit counts (single pass) ──────────────────────────────────────
213
+ // For each indexed repo matching the (optional) project filter, count commits
214
+ // within the window EXACTLY ONCE. Derive totalCommits by summing the map, and
215
+ // seed commit-only project buckets in the same pass. Reuses the index loaded
216
+ // above — no second loadIndex(), no second countCommitsSince() per repo.
217
+ const commitsByProject = new Map();
218
+ let totalCommits = 0;
219
+ if (index) {
220
+ for (const item of index.items) {
221
+ if (item.kind !== 'repo')
222
+ continue;
223
+ // Apply project filter to repos
224
+ if (projectFilter) {
225
+ const matches = item.path === projectFilter ||
226
+ item.name === projectFilter ||
227
+ item.path.includes(projectFilter);
228
+ if (!matches)
229
+ continue;
230
+ }
231
+ const repoCommits = countCommitsSince(item.path, sinceMs);
232
+ if (repoCommits <= 0)
233
+ continue;
234
+ commitsByProject.set(item.path, repoCommits);
235
+ totalCommits += repoCommits;
236
+ // Seed a minimal project entry for commit-only repos (no token events),
237
+ // carrying lastActive from the repo's last commit. Token-active repos
238
+ // already have an entry keyed on the reconciled real path.
239
+ if (!projectMap.has(item.path)) {
240
+ projectMap.set(item.path, {
241
+ sessions: new Set(),
242
+ tokensIn: 0,
243
+ tokensOut: 0,
244
+ estCostUsd: 0,
245
+ lastActive: item.git?.lastCommit ?? null,
246
+ });
247
+ }
248
+ }
249
+ }
250
+ // ── Freeze byProject ─────────────────────────────────────────────────────
251
+ const byProject = [];
252
+ for (const [proj, pa] of projectMap.entries()) {
253
+ byProject.push({
254
+ project: proj,
255
+ sessions: pa.sessions.size,
256
+ commits: commitsByProject.get(proj) ?? 0,
257
+ tokensIn: pa.tokensIn,
258
+ tokensOut: pa.tokensOut,
259
+ estCostUsd: pa.estCostUsd,
260
+ lastActive: pa.lastActive,
261
+ });
262
+ }
263
+ // Sort by cost desc, then tokens desc
264
+ byProject.sort((a, b) => b.estCostUsd !== a.estCostUsd
265
+ ? b.estCostUsd - a.estCostUsd
266
+ : (b.tokensIn + b.tokensOut) - (a.tokensIn + a.tokensOut));
267
+ // ── Freeze byDay (ascending) ──────────────────────────────────────────────
268
+ const byDay = [];
269
+ for (const [day, du] of dayMap.entries()) {
270
+ byDay.push({
271
+ day,
272
+ tokensIn: du.tokensIn,
273
+ tokensOut: du.tokensOut,
274
+ estCostUsd: du.estCostUsd,
275
+ sessions: du.sessions.size,
276
+ });
277
+ }
278
+ byDay.sort((a, b) => a.day.localeCompare(b.day));
279
+ // ── Freeze byModel (desc by cost) ────────────────────────────────────────
280
+ const byModel = [];
281
+ for (const [model, mu] of modelMap.entries()) {
282
+ byModel.push({
283
+ model,
284
+ tokensIn: mu.tokensIn,
285
+ tokensOut: mu.tokensOut,
286
+ estCostUsd: mu.estCostUsd,
287
+ calls: mu.calls,
288
+ });
289
+ }
290
+ byModel.sort((a, b) => b.estCostUsd !== a.estCostUsd
291
+ ? b.estCostUsd - a.estCostUsd
292
+ : (b.tokensIn + b.tokensOut) - (a.tokensIn + a.tokensOut));
293
+ // ── Budget alert ──────────────────────────────────────────────────────────
294
+ const budget = evalBudget({ spentUsd: totalCost, spentTokens: totalTokensIn + totalTokensOut }, cfg, window);
295
+ return {
296
+ window,
297
+ since: sinceIso,
298
+ totals: {
299
+ tokensIn: totalTokensIn,
300
+ tokensOut: totalTokensOut,
301
+ estCostUsd: totalCost,
302
+ sessions: allSessions.size,
303
+ commits: totalCommits,
304
+ },
305
+ byProject,
306
+ byDay,
307
+ byModel,
308
+ budget,
309
+ };
310
+ }
311
+ //# sourceMappingURL=rollup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollup.js","sourceRoot":"","sources":["../../../src/core/observability/rollup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
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 type { AshlrConfig, GenAiSpan, TelemetryEmitResult } from '../types.js';
24
+ /**
25
+ * Returns the absolute path to the local telemetry directory:
26
+ * ~/.ashlr/telemetry
27
+ *
28
+ * Re-resolves homedir() at call time so a relocated HOME in tests is honored.
29
+ */
30
+ export declare function localTelemetryDir(): string;
31
+ /**
32
+ * Returns true when a Pulse PAT is discoverable — either via the
33
+ * ASHLR_PULSE_TOKEN environment variable or via phantom (when installed,
34
+ * initialized, and the key is present in the vault).
35
+ *
36
+ * NEVER reads, returns, or logs the PAT value — boolean only.
37
+ *
38
+ * `allowPhantomProbe` (default true) controls the blocking spawnSync phantom
39
+ * probe. The doctor / `ashlr telemetry status` callers want the full probe
40
+ * (they are NOT on a run's completion path). The emit hot path
41
+ * (getSink -> patAvailable) MUST pass `false`: the spawnSync probe freezes the
42
+ * event loop for up to ~10s (2x5s) and is redundant there — OtlpHttpSink.emit
43
+ * resolves the PAT itself via the async, bounded resolvePatAsync. With the
44
+ * probe off, patAvailable is a pure env-var check (no blocking).
45
+ */
46
+ export declare function patAvailable(cfg: AshlrConfig, allowPhantomProbe?: boolean): boolean;
47
+ export interface TelemetrySink {
48
+ emit(spans: GenAiSpan[]): Promise<TelemetryEmitResult>;
49
+ }
50
+ /**
51
+ * Returns the appropriate TelemetrySink for the given config:
52
+ * - OtlpHttpSink when cfg.telemetry.pulse is set AND a PAT is available.
53
+ * - LocalFileSink (default, 100% local) otherwise.
54
+ *
55
+ * `allowPhantomProbe` (default true) is forwarded to patAvailable. On the
56
+ * emit hot path (orchestrator/swarm completion) callers MUST pass `false` so
57
+ * the selection never runs a blocking spawnSync phantom probe: when an
58
+ * endpoint is configured we hand off to OtlpHttpSink, which resolves the PAT
59
+ * asynchronously with a bounded timeout (and degrades to a logged
60
+ * 'PAT unavailable' no-op if none is found) — never freezing the event loop.
61
+ * The CLI (`telemetry test`/`status`) keeps the default probe.
62
+ */
63
+ export declare function getSink(cfg: AshlrConfig, allowPhantomProbe?: boolean): TelemetrySink;