@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 @@
1
+ {"version":3,"file":"forecast.js","sourceRoot":"","sources":["../../../src/core/observability/forecast.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE5E,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,mFAAmF;AACnF,8EAA8E;AAC9E,8EAA8E;AAE9E,mFAAmF;AACnF,MAAM,kBAAkB,GAAI,GAAG,CAAC;AAChC,oFAAoF;AACpF,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC;;;;;;;;;GASG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,SAAiB;IACvD,IAAI,QAAQ,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,kBAAkB;QACzC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,mBAAmB,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,GAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAExC,yDAAyD;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEvD,2EAA2E;QAC3E,wEAAwE;QACxE,0EAA0E;QAC1E,mEAAmE;QACnE,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,eAAe,IAAI,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAE/C,2EAA2E;QAC3E,mDAAmD;QACnD,iDAAiD;QACjD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,uBAAuB;QAC3E,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;QAExD,OAAO;YACL,MAAM;YACN,QAAQ;YACR,eAAe;YACf,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,OAAO;YACL,MAAM;YACN,QAAQ,EAAE,CAAC;YACX,eAAe,EAAE,CAAC;YAClB,mBAAmB,EAAE,CAAC;SACvB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * governance.ts — spend-governance evaluation for a configured budget window.
3
+ *
4
+ * M19: evalGovernance compares actual spend (from buildForecast/buildRollup)
5
+ * against the configured budget cap and returns an advisory GovernanceStatus.
6
+ *
7
+ * Design rules:
8
+ * - ADVISORY ONLY: this function is pure-ish — it never blocks, throws, or
9
+ * mutates any state. Callers decide how to act on the verdict.
10
+ * - METADATA ONLY: no prompts, completions, tool args, file contents, or
11
+ * secrets are ever read or emitted here.
12
+ * - NEVER THROWS: all errors are caught; falls back to ok/null-cap verdict.
13
+ */
14
+ import type { AshlrConfig, GovernanceStatus } from '../types.js';
15
+ /**
16
+ * Evaluate the spend-governance verdict for the current budget window.
17
+ *
18
+ * - When no `cfg.telemetry.budgetUsd` is configured: returns level 'ok' with
19
+ * capUsd null and a message indicating no cap is set.
20
+ * - When a cap is set: uses buildForecast (preferred, also uses buildRollup
21
+ * internally) for '7d' and '30d' windows, and falls back to buildRollup
22
+ * directly for the '1d' window (buildForecast does not support '1d').
23
+ * - Levels: 'over' when spentUsd >= cap, 'warn' when >= 80% of cap, else 'ok'.
24
+ *
25
+ * Pure-ish: reads local JSONL usage data but never modifies state, never
26
+ * throws, and never surfaces PAT or secret values.
27
+ */
28
+ export declare function evalGovernance(cfg: AshlrConfig): GovernanceStatus;
@@ -0,0 +1,101 @@
1
+ /**
2
+ * governance.ts — spend-governance evaluation for a configured budget window.
3
+ *
4
+ * M19: evalGovernance compares actual spend (from buildForecast/buildRollup)
5
+ * against the configured budget cap and returns an advisory GovernanceStatus.
6
+ *
7
+ * Design rules:
8
+ * - ADVISORY ONLY: this function is pure-ish — it never blocks, throws, or
9
+ * mutates any state. Callers decide how to act on the verdict.
10
+ * - METADATA ONLY: no prompts, completions, tool args, file contents, or
11
+ * secrets are ever read or emitted here.
12
+ * - NEVER THROWS: all errors are caught; falls back to ok/null-cap verdict.
13
+ */
14
+ import { buildForecast } from './forecast.js';
15
+ import { buildRollup } from './rollup.js';
16
+ // ---------------------------------------------------------------------------
17
+ // Governance thresholds
18
+ // ---------------------------------------------------------------------------
19
+ /** Fraction of cap at which the level escalates from 'ok' to 'warn'. */
20
+ const WARN_THRESHOLD = 0.8;
21
+ // ---------------------------------------------------------------------------
22
+ // evalGovernance
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Evaluate the spend-governance verdict for the current budget window.
26
+ *
27
+ * - When no `cfg.telemetry.budgetUsd` is configured: returns level 'ok' with
28
+ * capUsd null and a message indicating no cap is set.
29
+ * - When a cap is set: uses buildForecast (preferred, also uses buildRollup
30
+ * internally) for '7d' and '30d' windows, and falls back to buildRollup
31
+ * directly for the '1d' window (buildForecast does not support '1d').
32
+ * - Levels: 'over' when spentUsd >= cap, 'warn' when >= 80% of cap, else 'ok'.
33
+ *
34
+ * Pure-ish: reads local JSONL usage data but never modifies state, never
35
+ * throws, and never surfaces PAT or secret values.
36
+ */
37
+ export function evalGovernance(cfg) {
38
+ try {
39
+ const cap = cfg.telemetry?.budgetUsd;
40
+ // No cap configured — governance has nothing to enforce.
41
+ if (cap === undefined || cap === null) {
42
+ return {
43
+ level: 'ok',
44
+ spentUsd: 0,
45
+ capUsd: null,
46
+ window: cfg.telemetry?.budgetWindow ?? '7d',
47
+ message: 'No spend cap set.',
48
+ };
49
+ }
50
+ const rawWindow = cfg.telemetry?.budgetWindow ?? '7d';
51
+ // Obtain actual spend for the window. buildForecast supports '7d'|'30d';
52
+ // for '1d' we fall back to buildRollup directly (same underlying source).
53
+ let spentUsd = 0;
54
+ if (rawWindow === '1d') {
55
+ const rollup = buildRollup('1d', cfg);
56
+ spentUsd = Math.max(0, rollup.totals.estCostUsd);
57
+ }
58
+ else {
59
+ // rawWindow is now '7d' | '30d' — safe cast (type guard above handles '1d').
60
+ const forecastWindow = rawWindow;
61
+ const forecast = buildForecast(forecastWindow, cfg);
62
+ spentUsd = Math.max(0, forecast.spentUsd);
63
+ }
64
+ const capUsd = Math.max(0, cap);
65
+ const ratio = capUsd > 0 ? spentUsd / capUsd : (spentUsd > 0 ? Infinity : 0);
66
+ let level;
67
+ let message;
68
+ if (ratio >= 1) {
69
+ level = 'over';
70
+ message =
71
+ `Spend $${spentUsd.toFixed(4)} has exceeded the ${rawWindow} cap ` +
72
+ `of $${capUsd.toFixed(2)}. Use --over-budget to proceed when govAction is 'block'.`;
73
+ }
74
+ else if (ratio >= WARN_THRESHOLD) {
75
+ level = 'warn';
76
+ const pct = (ratio * 100).toFixed(1);
77
+ message =
78
+ `Spend $${spentUsd.toFixed(4)} is at ${pct}% of the ${rawWindow} cap ` +
79
+ `of $${capUsd.toFixed(2)}.`;
80
+ }
81
+ else {
82
+ level = 'ok';
83
+ const pct = capUsd > 0 ? (ratio * 100).toFixed(1) : '0.0';
84
+ message =
85
+ `Spend $${spentUsd.toFixed(4)} is within the ${rawWindow} cap ` +
86
+ `of $${capUsd.toFixed(2)} (${pct}% used).`;
87
+ }
88
+ return { level, spentUsd, capUsd, window: rawWindow, message };
89
+ }
90
+ catch {
91
+ // Best-effort fallback — governance must never throw or block a run.
92
+ return {
93
+ level: 'ok',
94
+ spentUsd: 0,
95
+ capUsd: null,
96
+ window: cfg.telemetry?.budgetWindow ?? '7d',
97
+ message: 'Governance evaluation unavailable (internal error).',
98
+ };
99
+ }
100
+ }
101
+ //# sourceMappingURL=governance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance.js","sourceRoot":"","sources":["../../../src/core/observability/governance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,GAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;QAErC,yDAAyD;QACzD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtC,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,IAAI,IAAI;gBAC3C,OAAO,EAAE,mBAAmB;aAC7B,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,YAAY,IAAI,IAAI,CAAC;QAEtD,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACtC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,cAAc,GAAG,SAAyB,CAAC;YACjD,MAAM,QAAQ,GAAG,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACpD,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7E,IAAI,KAAgC,CAAC;QACrC,IAAI,OAAe,CAAC;QAEpB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,GAAG,MAAM,CAAC;YACf,OAAO;gBACL,UAAU,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,SAAS,OAAO;oBAClE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,2DAA2D,CAAC;QACxF,CAAC;aAAM,IAAI,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,KAAK,GAAG,MAAM,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO;gBACL,UAAU,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,GAAG,YAAY,SAAS,OAAO;oBACtE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAI,CAAC;YACb,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC1D,OAAO;gBACL,UAAU,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,SAAS,OAAO;oBAC/D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC;QAC/C,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,OAAO;YACL,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,IAAI,IAAI;YAC3C,OAAO,EAAE,qDAAqD;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * core/observability/otlp.ts — M19 OTLP/HTTP-JSON trace builder.
3
+ *
4
+ * Pure, dependency-free helpers that turn a completed run/swarm into:
5
+ * - GenAiSpan[] (spansFromRun / spansFromSwarm) — METADATA ONLY
6
+ * - an OTLP/HTTP-JSON trace payload (buildGenAiTrace) following the
7
+ * resourceSpans -> scopeSpans -> spans nesting, with GenAI
8
+ * semantic-convention attributes.
9
+ *
10
+ * PRIVACY INVARIANT (enforced here, asserted by m19.otlp.test.ts):
11
+ * Span attributes carry ONLY metadata — model id, token counts, cost, ids,
12
+ * provider, tier, status, duration. NEVER prompt/response text, sub-goal
13
+ * text, tool args, file contents, project paths, or secrets. The span
14
+ * `name` is the task id (a stable metadata identifier), never the goal.
15
+ *
16
+ * This module is imported statically by telemetry-sink.ts (buildGenAiTrace)
17
+ * and dynamically by orchestrator.ts / swarm/runner.ts (spansFromRun /
18
+ * spansFromSwarm). It must stay free of side effects and runtime deps.
19
+ */
20
+ import type { GenAiSpan, RunState, SwarmRun } from '../types.js';
21
+ type OtlpValue = {
22
+ stringValue: string;
23
+ } | {
24
+ intValue: string;
25
+ } | {
26
+ doubleValue: number;
27
+ };
28
+ interface OtlpAttribute {
29
+ key: string;
30
+ value: OtlpValue;
31
+ }
32
+ interface OtlpSpan {
33
+ /** 32 lowercase hex chars (16 random bytes). Required by the OTLP data model. */
34
+ traceId: string;
35
+ /** 16 lowercase hex chars (8 random bytes). Required by the OTLP data model. */
36
+ spanId: string;
37
+ /** OTLP span kind. 1=INTERNAL — GenAI calls are internal work units. */
38
+ kind: number;
39
+ name: string;
40
+ /** Decimal string of unix-nanoseconds. */
41
+ startTimeUnixNano: string;
42
+ endTimeUnixNano: string;
43
+ /** OTLP status object. code 0=unset, 1=ok(unused), 2=error. */
44
+ status: {
45
+ code: number;
46
+ };
47
+ attributes: OtlpAttribute[];
48
+ }
49
+ interface OtlpScopeSpans {
50
+ scope: {
51
+ name: string;
52
+ version: string;
53
+ };
54
+ spans: OtlpSpan[];
55
+ }
56
+ interface OtlpResourceSpans {
57
+ resource: {
58
+ attributes: OtlpAttribute[];
59
+ };
60
+ scopeSpans: OtlpScopeSpans[];
61
+ }
62
+ export interface OtlpTrace {
63
+ resourceSpans: OtlpResourceSpans[];
64
+ }
65
+ /**
66
+ * Build a valid OTLP/HTTP-JSON trace from GenAiSpan metadata.
67
+ *
68
+ * Shape: { resourceSpans: [ { resource, scopeSpans: [ { scope, spans } ] } ] }.
69
+ * Every span carries GenAI semantic-convention attributes plus ashlr.* ids.
70
+ * Handles an empty `spans` array gracefully (one resourceSpans entry with an
71
+ * empty spans list). METADATA ONLY — never content.
72
+ */
73
+ export declare function buildGenAiTrace(spans: GenAiSpan[]): OtlpTrace;
74
+ /**
75
+ * Derive one GenAiSpan per RunTask that has usage. Pure — does not mutate the
76
+ * run. Span name is the task id (metadata), NEVER the sub-goal text. No
77
+ * result/goal text is read into the span. Timestamps fall back to the run's
78
+ * createdAt/updatedAt window (per-task timestamps are not tracked).
79
+ */
80
+ export declare function spansFromRun(run: RunState): GenAiSpan[];
81
+ /**
82
+ * Derive one GenAiSpan per SwarmTaskRun that has usage. Pure — does not mutate
83
+ * the swarm. Span name is the task id (metadata), NEVER goal/result/project
84
+ * text. SwarmRun has no per-run provider, so provider/model/tier use neutral
85
+ * metadata defaults. Timestamps fall back to the swarm's createdAt/updatedAt.
86
+ */
87
+ export declare function spansFromSwarm(swarm: SwarmRun): GenAiSpan[];
88
+ export {};
@@ -0,0 +1,217 @@
1
+ /**
2
+ * core/observability/otlp.ts — M19 OTLP/HTTP-JSON trace builder.
3
+ *
4
+ * Pure, dependency-free helpers that turn a completed run/swarm into:
5
+ * - GenAiSpan[] (spansFromRun / spansFromSwarm) — METADATA ONLY
6
+ * - an OTLP/HTTP-JSON trace payload (buildGenAiTrace) following the
7
+ * resourceSpans -> scopeSpans -> spans nesting, with GenAI
8
+ * semantic-convention attributes.
9
+ *
10
+ * PRIVACY INVARIANT (enforced here, asserted by m19.otlp.test.ts):
11
+ * Span attributes carry ONLY metadata — model id, token counts, cost, ids,
12
+ * provider, tier, status, duration. NEVER prompt/response text, sub-goal
13
+ * text, tool args, file contents, project paths, or secrets. The span
14
+ * `name` is the task id (a stable metadata identifier), never the goal.
15
+ *
16
+ * This module is imported statically by telemetry-sink.ts (buildGenAiTrace)
17
+ * and dynamically by orchestrator.ts / swarm/runner.ts (spansFromRun /
18
+ * spansFromSwarm). It must stay free of side effects and runtime deps.
19
+ */
20
+ import { randomBytes } from 'node:crypto';
21
+ // ---------------------------------------------------------------------------
22
+ // Constants
23
+ // ---------------------------------------------------------------------------
24
+ /** Instrumentation scope advertised in scopeSpans[].scope. */
25
+ const SCOPE_NAME = 'ashlr-hub';
26
+ const SCOPE_VERSION = '0.1.0';
27
+ /** Nanoseconds per millisecond (OTLP timestamps are unix-nanoseconds). */
28
+ const NS_PER_MS = 1000000n;
29
+ // ---------------------------------------------------------------------------
30
+ // Internal attribute helpers
31
+ // ---------------------------------------------------------------------------
32
+ function strAttr(key, value) {
33
+ return { key, value: { stringValue: value } };
34
+ }
35
+ /** Integer attribute — OTLP intValue is a decimal string per the JSON mapping. */
36
+ function intAttr(key, value) {
37
+ const n = Number.isFinite(value) ? Math.trunc(value) : 0;
38
+ return { key, value: { intValue: String(n) } };
39
+ }
40
+ function doubleAttr(key, value) {
41
+ return { key, value: { doubleValue: Number.isFinite(value) ? value : 0 } };
42
+ }
43
+ /**
44
+ * Convert an ISO timestamp to a unix-nanosecond decimal string. Invalid or
45
+ * missing timestamps fall back to 0 so the builder never throws.
46
+ */
47
+ function isoToUnixNano(iso) {
48
+ const ms = Date.parse(iso);
49
+ if (Number.isNaN(ms))
50
+ return '0';
51
+ return (BigInt(ms) * NS_PER_MS).toString();
52
+ }
53
+ /** Map a terminal status string to an OTLP status code (2=error else unset). */
54
+ function statusCode(status) {
55
+ return status === 'failed' || status === 'aborted' ? 2 : 0;
56
+ }
57
+ /** OTLP SpanKind.INTERNAL — these are internal work units, not RPC client spans. */
58
+ const SPAN_KIND_INTERNAL = 1;
59
+ /** Random 16-byte trace id as 32 lowercase hex chars (OTLP-required identifier). */
60
+ function newTraceId() {
61
+ return randomBytes(16).toString('hex');
62
+ }
63
+ /** Random 8-byte span id as 16 lowercase hex chars (OTLP-required identifier). */
64
+ function newSpanId() {
65
+ return randomBytes(8).toString('hex');
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // Public: buildGenAiTrace
69
+ // ---------------------------------------------------------------------------
70
+ /**
71
+ * Build a valid OTLP/HTTP-JSON trace from GenAiSpan metadata.
72
+ *
73
+ * Shape: { resourceSpans: [ { resource, scopeSpans: [ { scope, spans } ] } ] }.
74
+ * Every span carries GenAI semantic-convention attributes plus ashlr.* ids.
75
+ * Handles an empty `spans` array gracefully (one resourceSpans entry with an
76
+ * empty spans list). METADATA ONLY — never content.
77
+ */
78
+ export function buildGenAiTrace(spans) {
79
+ // One trace id per emitted batch; per-span ids below. Random bytes carry no
80
+ // content — still METADATA ONLY. Required by the OTLP data model and by
81
+ // backends (Tempo/Jaeger/Honeycomb) that drop zero/empty-id spans.
82
+ const traceId = newTraceId();
83
+ const otlpSpans = spans.map((s) => {
84
+ const start = isoToUnixNano(s.startTs);
85
+ let end = isoToUnixNano(s.endTs);
86
+ // Guarantee end >= start even if timestamps are equal/inverted.
87
+ if (BigInt(end) < BigInt(start))
88
+ end = start;
89
+ return {
90
+ traceId,
91
+ spanId: newSpanId(),
92
+ kind: SPAN_KIND_INTERNAL,
93
+ // name is the task id (metadata identifier) — never goal/result text.
94
+ name: s.name,
95
+ startTimeUnixNano: start,
96
+ endTimeUnixNano: end,
97
+ status: { code: statusCode(s.status) },
98
+ attributes: [
99
+ strAttr('gen_ai.system', s.provider),
100
+ strAttr('gen_ai.request.model', s.model),
101
+ intAttr('gen_ai.usage.input_tokens', s.tokensIn),
102
+ intAttr('gen_ai.usage.output_tokens', s.tokensOut),
103
+ doubleAttr('gen_ai.usage.cost_usd', s.estCostUsd),
104
+ strAttr('ashlr.run.id', s.runId),
105
+ strAttr('ashlr.provider', s.provider),
106
+ strAttr('ashlr.tier', s.tier),
107
+ strAttr('ashlr.status', s.status),
108
+ ],
109
+ };
110
+ });
111
+ return {
112
+ resourceSpans: [
113
+ {
114
+ resource: {
115
+ attributes: [
116
+ strAttr('service.name', SCOPE_NAME),
117
+ strAttr('telemetry.sdk.name', SCOPE_NAME),
118
+ strAttr('telemetry.sdk.language', 'nodejs'),
119
+ ],
120
+ },
121
+ scopeSpans: [
122
+ {
123
+ scope: { name: SCOPE_NAME, version: SCOPE_VERSION },
124
+ spans: otlpSpans,
125
+ },
126
+ ],
127
+ },
128
+ ],
129
+ };
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // Provider/model/tier derivation (metadata only)
133
+ // ---------------------------------------------------------------------------
134
+ const CLOUD_PROVIDERS = new Set(['anthropic', 'openai', 'google', 'bedrock', 'azure']);
135
+ /** Cloud vs local tier, inferred from the provider id (metadata only). */
136
+ function tierForProvider(provider) {
137
+ return CLOUD_PROVIDERS.has(provider.toLowerCase()) ? 'cloud' : 'local';
138
+ }
139
+ /**
140
+ * A coarse model label derived from the provider — we never expose the actual
141
+ * routed model name when it isn't tracked per-task, only a metadata stand-in.
142
+ * The provider itself is metadata and safe to surface.
143
+ */
144
+ function modelForProvider(provider) {
145
+ return provider || 'unknown';
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // Public: spansFromRun
149
+ // ---------------------------------------------------------------------------
150
+ /**
151
+ * Derive one GenAiSpan per RunTask that has usage. Pure — does not mutate the
152
+ * run. Span name is the task id (metadata), NEVER the sub-goal text. No
153
+ * result/goal text is read into the span. Timestamps fall back to the run's
154
+ * createdAt/updatedAt window (per-task timestamps are not tracked).
155
+ */
156
+ export function spansFromRun(run) {
157
+ const provider = run.provider || 'unknown';
158
+ const model = modelForProvider(provider);
159
+ const tier = tierForProvider(provider);
160
+ const startTs = run.createdAt;
161
+ const endTs = run.updatedAt;
162
+ const spans = [];
163
+ for (const task of run.tasks) {
164
+ if (!task.usage)
165
+ continue;
166
+ spans.push({
167
+ name: task.id, // metadata id, NOT task.goal
168
+ runId: run.id,
169
+ model,
170
+ provider,
171
+ tier,
172
+ tokensIn: task.usage.tokensIn,
173
+ tokensOut: task.usage.tokensOut,
174
+ estCostUsd: task.usage.estCostUsd,
175
+ status: task.status,
176
+ startTs,
177
+ endTs,
178
+ });
179
+ }
180
+ return spans;
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // Public: spansFromSwarm
184
+ // ---------------------------------------------------------------------------
185
+ /**
186
+ * Derive one GenAiSpan per SwarmTaskRun that has usage. Pure — does not mutate
187
+ * the swarm. Span name is the task id (metadata), NEVER goal/result/project
188
+ * text. SwarmRun has no per-run provider, so provider/model/tier use neutral
189
+ * metadata defaults. Timestamps fall back to the swarm's createdAt/updatedAt.
190
+ */
191
+ export function spansFromSwarm(swarm) {
192
+ const provider = 'ashlr-swarm';
193
+ const model = 'swarm';
194
+ const tier = 'local';
195
+ const startTs = swarm.createdAt;
196
+ const endTs = swarm.updatedAt;
197
+ const spans = [];
198
+ for (const task of swarm.tasks) {
199
+ if (!task.usage)
200
+ continue;
201
+ spans.push({
202
+ name: task.id, // metadata id, NOT goal/result/project
203
+ runId: swarm.id,
204
+ model,
205
+ provider,
206
+ tier,
207
+ tokensIn: task.usage.tokensIn,
208
+ tokensOut: task.usage.tokensOut,
209
+ estCostUsd: task.usage.estCostUsd,
210
+ status: task.status,
211
+ startTs,
212
+ endTs,
213
+ });
214
+ }
215
+ return spans;
216
+ }
217
+ //# sourceMappingURL=otlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../../src/core/observability/otlp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
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 type { AshlrConfig, ActivityRollup } from '../types.js';
9
+ /**
10
+ * Convert a window label to milliseconds.
11
+ * Unknown labels fall back to 7d.
12
+ */
13
+ export declare function windowToMs(window: string): number;
14
+ /**
15
+ * Derive a provider key from a model id so estCostUsd() can match it.
16
+ *
17
+ * Examples:
18
+ * 'claude-3-5-sonnet-20241022' -> 'claude'
19
+ * 'gpt-4o' -> 'gpt'
20
+ * 'gemini-1.5-pro' -> 'gemini'
21
+ * 'ollama/llama3' -> 'ollama'
22
+ * unknown -> model id as-is (budget fallback applies)
23
+ */
24
+ export declare function modelToProviderKey(model: string): string;
25
+ /**
26
+ * Local (zero-cost) provider keys. A model whose `modelToProviderKey` lands in
27
+ * this set is served by a LOCAL backend and costs $0. Shared with forecast.ts so
28
+ * the local/cloud split stays consistent across rollup and savings computation.
29
+ */
30
+ export declare const LOCAL_PROVIDER_KEYS: ReadonlySet<string>;
31
+ /** True when `model` is served by a local provider (cost $0). */
32
+ export declare function isLocalProviderModel(model: string): boolean;
33
+ export declare function buildRollup(window: '1d' | '7d' | '30d', cfg: AshlrConfig, opts?: {
34
+ project?: string;
35
+ }): ActivityRollup;