@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,181 @@
1
+ /**
2
+ * M20: Bounded runtime self-heal wrapper.
3
+ *
4
+ * Wraps a single runtime operation (MCP downstream spawn or model call) with
5
+ * bounded, classified heal logic. Reuses `withRetry` (M11) for the loop +
6
+ * backoff — does NOT reimplement backoff from scratch.
7
+ *
8
+ * GUARDRAILS:
9
+ * - BOUNDED by construction: never loops more than policy.maxRestarts
10
+ * heal-triggered retries. No infinite restart/downgrade loop.
11
+ * - model-downgrade: SMALLER LOCAL model only — never escalates to cloud,
12
+ * never increases cost.
13
+ * - rate-backoff: only when cloud is already in play (caller opted in).
14
+ * - opt-out: callers can check ASHLR_NO_HEAL at their call site and skip.
15
+ * - Rethrows last error on exhaustion or non-recoverable failure.
16
+ * - Never throws from the heal machinery itself (only from fn exhaustion).
17
+ *
18
+ * No new runtime deps. ESM/NodeNext: all sibling imports use the .js extension.
19
+ */
20
+ import { withRetry } from './retry.js';
21
+ // ---------------------------------------------------------------------------
22
+ // Error classification
23
+ // ---------------------------------------------------------------------------
24
+ /** True for errors that look like an MCP downstream crash or spawn failure. */
25
+ function isMcpRestartable(err) {
26
+ if (!(err instanceof Error))
27
+ return false;
28
+ const msg = err.message.toLowerCase();
29
+ return (msg.includes('spawn') ||
30
+ msg.includes('econnrefused') ||
31
+ msg.includes('econnreset') ||
32
+ msg.includes('socket hang up') ||
33
+ msg.includes('connect failed') ||
34
+ msg.includes('downstream') ||
35
+ msg.includes('mcp') ||
36
+ // process exit codes surfaced as error messages
37
+ msg.includes('exited with code') ||
38
+ msg.includes('process exited'));
39
+ }
40
+ /** True for errors that look like a local model OOM or model-layer failure. */
41
+ function isModelError(err) {
42
+ if (!(err instanceof Error))
43
+ return false;
44
+ const msg = err.message.toLowerCase();
45
+ return (msg.includes('oom') ||
46
+ msg.includes('out of memory') ||
47
+ msg.includes('cuda out of memory') ||
48
+ msg.includes('model error') ||
49
+ msg.includes('model failed') ||
50
+ msg.includes('context length') ||
51
+ msg.includes('context window') ||
52
+ // ollama / lm-studio error patterns
53
+ msg.includes('model not loaded') ||
54
+ msg.includes('llm error') ||
55
+ msg.includes('inference error'));
56
+ }
57
+ /** True for errors that look like a cloud rate-limit or quota exceeded. */
58
+ function isRateLimit(err) {
59
+ if (!(err instanceof Error))
60
+ return false;
61
+ const msg = err.message.toLowerCase();
62
+ return (msg.includes('rate limit') ||
63
+ msg.includes('rate_limit') ||
64
+ msg.includes('429') ||
65
+ msg.includes('too many requests') ||
66
+ msg.includes('quota exceeded') ||
67
+ msg.includes('overloaded') ||
68
+ msg.includes('throttl'));
69
+ }
70
+ // ---------------------------------------------------------------------------
71
+ // Heal-event classification
72
+ // ---------------------------------------------------------------------------
73
+ /**
74
+ * Classify the error into a HealEvent kind, or return null when the error is
75
+ * not recoverable by any heal strategy.
76
+ *
77
+ * Priority: mcp-restart > model-downgrade > rate-backoff.
78
+ * `allowDowngrade` gates model-downgrade. `allowCloud` gates rate-backoff.
79
+ */
80
+ function classifyHealEvent(err, attempt, policy, allowCloud) {
81
+ if (isMcpRestartable(err)) {
82
+ return {
83
+ kind: 'mcp-restart',
84
+ detail: `MCP downstream error on attempt ${attempt}: ${errorMessage(err)}`,
85
+ attempt,
86
+ };
87
+ }
88
+ if (isModelError(err) && policy.allowDowngrade) {
89
+ return {
90
+ kind: 'model-downgrade',
91
+ detail: `Local model error on attempt ${attempt} — downgrading to smaller local model: ${errorMessage(err)}`,
92
+ attempt,
93
+ };
94
+ }
95
+ if (isRateLimit(err) && allowCloud) {
96
+ return {
97
+ kind: 'rate-backoff',
98
+ detail: `Cloud rate-limit on attempt ${attempt} — backing off: ${errorMessage(err)}`,
99
+ attempt,
100
+ };
101
+ }
102
+ return null;
103
+ }
104
+ /** Extract a safe, concise message from an unknown thrown value. */
105
+ function errorMessage(err) {
106
+ if (err instanceof Error)
107
+ return err.message;
108
+ return String(err);
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // Public API
112
+ // ---------------------------------------------------------------------------
113
+ /**
114
+ * Conservative bounded default: 2 heal-triggered retries, downgrade allowed.
115
+ * Callers may override; this is always a safe starting point.
116
+ */
117
+ export function defaultHealPolicy() {
118
+ return { maxRestarts: 2, allowDowngrade: true };
119
+ }
120
+ /**
121
+ * Bounded self-heal wrapper for a runtime operation `fn`.
122
+ *
123
+ * `fn` receives the 1-based attempt number so the caller can vary its
124
+ * behaviour across attempts (e.g. pick a smaller model on attempt > 1 when a
125
+ * 'model-downgrade' heal event has been emitted).
126
+ *
127
+ * `policy.maxRestarts` is the hard cap on heal-triggered retries — the total
128
+ * number of fn invocations is at most `policy.maxRestarts + 1`.
129
+ *
130
+ * `onHeal` is called synchronously before each retry with the classified event.
131
+ * It MUST NOT throw; any throw is silently swallowed to preserve retry flow.
132
+ *
133
+ * `allowCloud` (default false) gates 'rate-backoff' — pass true only when the
134
+ * caller has already enabled cloud routing; withHeal never enables cloud on its
135
+ * own.
136
+ *
137
+ * Rethrows the last error when:
138
+ * - all retries are exhausted, OR
139
+ * - the error is not a recognised heal case (non-retryable).
140
+ *
141
+ * Backed by `withRetry` (M11) for deterministic bounded exponential backoff:
142
+ * attempt 1 failure → retry immediately (0 ms);
143
+ * attempt 2 failure → 500 ms;
144
+ * attempt 3 failure → 1 000 ms; … capped at 30 s.
145
+ */
146
+ export async function withHeal(fn, policy, onHeal, allowCloud = false) {
147
+ // total attempts = 1 initial + maxRestarts heal retries
148
+ const maxAttempts = Math.max(1, policy.maxRestarts + 1);
149
+ // Bounded by attempt count, not wall-clock. baseDelayMs:0 keeps the withRetry
150
+ // backoff formula intact (baseDelayMs * 2^(attempt-1) is always 0) while
151
+ // avoiding real-time sleeps inside the runtime heal loop — the bound that
152
+ // matters here is maxRestarts, not a multi-second backoff. Real backoff for
153
+ // cloud rate-limits is owned by the downstream caller's own retry policy.
154
+ const retryPolicy = {
155
+ maxAttempts,
156
+ baseDelayMs: 0,
157
+ };
158
+ // withRetry's isRetryable callback does not receive the attempt number, so we
159
+ // capture the 1-based attempt fn was last invoked with. That is the attempt
160
+ // that just failed — exactly what the emitted HealEvent must report.
161
+ let currentAttempt = 0;
162
+ return withRetry(async (attempt) => {
163
+ currentAttempt = attempt;
164
+ return fn(attempt);
165
+ }, retryPolicy, (err) => {
166
+ // isRetryable: emit the heal event only for recoverable errors. The
167
+ // attempt that just failed is `currentAttempt` (1-based).
168
+ const event = classifyHealEvent(err, currentAttempt, policy, allowCloud);
169
+ if (event === null)
170
+ return false;
171
+ // Emit the heal event — suppress any throw from the callback
172
+ try {
173
+ onHeal(event);
174
+ }
175
+ catch {
176
+ // intentionally swallowed
177
+ }
178
+ return true;
179
+ });
180
+ }
181
+ //# sourceMappingURL=self-heal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-heal.js","sourceRoot":"","sources":["../../../src/core/run/self-heal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * M11: streaming.ts — StreamSink type + nullSink / makeCliSink factories.
3
+ *
4
+ * A StreamSink receives live RunStreamEvents from the agent loop and renders
5
+ * them to the terminal. The sink contract:
6
+ * - NEVER throws to the caller (all errors caught internally).
7
+ * - NEVER prints secret values (events carry metadata/text only).
8
+ * - model-delta events render incrementally (process.stdout/stderr.write,
9
+ * no trailing newline) so the token stream looks live.
10
+ * - Lifecycle events (task-start, task-done, retry, verify, tool-call, log)
11
+ * render as full labeled lines with glyphs + color.
12
+ * - When opts.json === true the human stream goes to STDERR so stdout stays
13
+ * clean machine JSON.
14
+ */
15
+ import type { RunStreamEvent } from '../types.js';
16
+ /** A sink that receives live run events. Never throws to the caller. */
17
+ export type StreamSink = (e: RunStreamEvent) => void;
18
+ /** A no-op sink — used when streaming is disabled or in unit tests. */
19
+ export declare function nullSink(): StreamSink;
20
+ /**
21
+ * Build a CLI sink that renders a live, readable stream.
22
+ *
23
+ * - opts.json === true → human lines go to STDERR (stdout stays clean JSON).
24
+ * - opts.json === false → lines go to STDERR when isTTY, else STDOUT.
25
+ *
26
+ * model-delta events are written inline (no newline) so the token stream looks
27
+ * continuous. All other event kinds start on their own labeled line.
28
+ */
29
+ export declare function makeCliSink(opts: {
30
+ json: boolean;
31
+ }): StreamSink;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * M11: streaming.ts — StreamSink type + nullSink / makeCliSink factories.
3
+ *
4
+ * A StreamSink receives live RunStreamEvents from the agent loop and renders
5
+ * them to the terminal. The sink contract:
6
+ * - NEVER throws to the caller (all errors caught internally).
7
+ * - NEVER prints secret values (events carry metadata/text only).
8
+ * - model-delta events render incrementally (process.stdout/stderr.write,
9
+ * no trailing newline) so the token stream looks live.
10
+ * - Lifecycle events (task-start, task-done, retry, verify, tool-call, log)
11
+ * render as full labeled lines with glyphs + color.
12
+ * - When opts.json === true the human stream goes to STDERR so stdout stays
13
+ * clean machine JSON.
14
+ */
15
+ import { makeColors } from '../../cli/ui.js';
16
+ /** A no-op sink — used when streaming is disabled or in unit tests. */
17
+ export function nullSink() {
18
+ return (_e) => { };
19
+ }
20
+ /**
21
+ * Build a CLI sink that renders a live, readable stream.
22
+ *
23
+ * - opts.json === true → human lines go to STDERR (stdout stays clean JSON).
24
+ * - opts.json === false → lines go to STDERR when isTTY, else STDOUT.
25
+ *
26
+ * model-delta events are written inline (no newline) so the token stream looks
27
+ * continuous. All other event kinds start on their own labeled line.
28
+ */
29
+ export function makeCliSink(opts) {
30
+ // Choose the output stream: always STDERR when json mode so stdout is clean.
31
+ const out = opts.json ? process.stderr : process.stderr;
32
+ const isTty = out.isTTY === true;
33
+ const col = makeColors(isTty);
34
+ // Track whether we're mid-line on a model-delta run (so we know when to
35
+ // emit a leading newline before a lifecycle label).
36
+ let midDelta = false;
37
+ function write(s) {
38
+ try {
39
+ out.write(s);
40
+ }
41
+ catch { /* never throw */ }
42
+ }
43
+ function writeln(s) {
44
+ // If we were streaming model deltas inline, break to a new line first.
45
+ if (midDelta) {
46
+ write('\n');
47
+ midDelta = false;
48
+ }
49
+ write(s + '\n');
50
+ }
51
+ function taskTag(taskId) {
52
+ return taskId ? col.gray(`[${taskId}] `) : '';
53
+ }
54
+ return function sink(e) {
55
+ try {
56
+ switch (e.kind) {
57
+ case 'task-start': {
58
+ const tag = taskTag(e.taskId);
59
+ writeln(`${col.cyan('▶')} ${tag}${col.bold(e.text ?? 'task starting')}`);
60
+ break;
61
+ }
62
+ case 'model-delta': {
63
+ // Inline write — no newline. May be empty string; skip.
64
+ const chunk = e.text ?? '';
65
+ if (chunk.length > 0) {
66
+ write(chunk);
67
+ midDelta = true;
68
+ }
69
+ break;
70
+ }
71
+ case 'tool-call': {
72
+ const tag = taskTag(e.taskId);
73
+ const name = e.text ?? (typeof e.data === 'object' && e.data !== null
74
+ ? String(e.data['name'] ?? 'tool')
75
+ : 'tool');
76
+ writeln(`${col.magenta('⚙')} ${tag}${col.dim('tool:')} ${col.magenta(name)}`);
77
+ break;
78
+ }
79
+ case 'task-done': {
80
+ const tag = taskTag(e.taskId);
81
+ writeln(`${col.green('✓')} ${tag}${col.bold(e.text ?? 'done')}`);
82
+ break;
83
+ }
84
+ case 'retry': {
85
+ const tag = taskTag(e.taskId);
86
+ writeln(`${col.yellow('↺')} ${tag}${col.yellow(e.text ?? 'retrying')}`);
87
+ break;
88
+ }
89
+ case 'verify': {
90
+ const tag = taskTag(e.taskId);
91
+ // data may be a VerifyVerdict: { ok, reason, method }
92
+ const verdict = (typeof e.data === 'object' && e.data !== null)
93
+ ? e.data
94
+ : null;
95
+ const ok = verdict?.ok ?? true;
96
+ const reason = verdict?.reason ?? e.text ?? '';
97
+ const method = verdict?.method ? col.dim(` (${verdict.method})`) : '';
98
+ if (ok) {
99
+ writeln(`${col.green('✔')} ${tag}${col.green('verify ok')}${method}${reason ? ': ' + reason : ''}`);
100
+ }
101
+ else {
102
+ writeln(`${col.yellow('✘')} ${tag}${col.yellow('verify fail')}${method}${reason ? ': ' + reason : ''}`);
103
+ }
104
+ break;
105
+ }
106
+ case 'log': {
107
+ const tag = taskTag(e.taskId);
108
+ writeln(`${col.gray('·')} ${tag}${col.dim(e.text ?? '')}`);
109
+ break;
110
+ }
111
+ default: {
112
+ // Unknown future event kinds: silently ignore to stay forward-compatible.
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ catch {
118
+ // Contract: never throw to caller regardless of render errors.
119
+ }
120
+ };
121
+ }
122
+ //# sourceMappingURL=streaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../../src/core/run/streaming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Task result verification for `ashlr run`.
3
+ *
4
+ * Two-stage: heuristic-first (cheap, synchronous), then an optional single
5
+ * cheap model call only when the heuristic is inconclusive AND budget remains.
6
+ *
7
+ * CONTRACT guarantees:
8
+ * - Never throws.
9
+ * - Never exceeds the global budget (checks overBudget before any model call).
10
+ * - Mutates `usage` in-place (same pattern as agent-loop.ts) to account for
11
+ * the optional model check.
12
+ */
13
+ import type { RunTask, ProviderClient, RunBudget, RunUsage, VerifyVerdict } from '../types.js';
14
+ /**
15
+ * Judge whether `task.result` plausibly satisfies `task.goal`.
16
+ *
17
+ * 1. Heuristic first (cheap, sync): empty / error-sentinel / keyword overlap.
18
+ * If confident → return immediately.
19
+ * 2. Optional model check only when:
20
+ * - heuristic was inconclusive, AND
21
+ * - budget has not been exceeded (overBudget check before the call), AND
22
+ * - client is available.
23
+ * Mutates `usage` to account for the model call.
24
+ * On any model error or budget exhaustion → falls back to a heuristic verdict.
25
+ *
26
+ * Never throws.
27
+ */
28
+ export declare function verifyTask(task: RunTask, client: ProviderClient, budget: RunBudget, usage: RunUsage, opts?: {
29
+ model?: boolean;
30
+ }): Promise<VerifyVerdict>;
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Task result verification for `ashlr run`.
3
+ *
4
+ * Two-stage: heuristic-first (cheap, synchronous), then an optional single
5
+ * cheap model call only when the heuristic is inconclusive AND budget remains.
6
+ *
7
+ * CONTRACT guarantees:
8
+ * - Never throws.
9
+ * - Never exceeds the global budget (checks overBudget before any model call).
10
+ * - Mutates `usage` in-place (same pattern as agent-loop.ts) to account for
11
+ * the optional model check.
12
+ */
13
+ import { overBudget, addUsage } from './budget.js';
14
+ // ---------------------------------------------------------------------------
15
+ // Internal helpers
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Error sentinels that strongly suggest the result is a failure / error message
19
+ * rather than a meaningful answer.
20
+ */
21
+ const ERROR_SENTINELS = [
22
+ 'error:',
23
+ 'traceback',
24
+ 'exception:',
25
+ 'syntaxerror',
26
+ 'typeerror',
27
+ 'referenceerror',
28
+ 'uncaught ',
29
+ 'fatal:',
30
+ 'command not found',
31
+ 'permission denied',
32
+ 'enoent',
33
+ 'eacces',
34
+ 'task failed',
35
+ 'aborted',
36
+ 'budget exceeded',
37
+ ];
38
+ /**
39
+ * Heuristic verdict.
40
+ *
41
+ * Returns { ok: false, reason, method:'heuristic' } when it is CONFIDENT the
42
+ * result is bad, or { ok: true, reason, method:'heuristic' } when heuristic
43
+ * is confident the result is good enough.
44
+ *
45
+ * Returns null when the heuristic is inconclusive (caller may attempt model check).
46
+ */
47
+ function heuristicVerify(task) {
48
+ const result = task.result ?? '';
49
+ const goal = task.goal;
50
+ // 1. Empty result → confident fail.
51
+ if (result.trim().length === 0) {
52
+ return {
53
+ ok: false,
54
+ reason: 'Result is empty.',
55
+ method: 'heuristic',
56
+ };
57
+ }
58
+ // 2. Error sentinel match → confident fail.
59
+ const lower = result.toLowerCase();
60
+ for (const sentinel of ERROR_SENTINELS) {
61
+ if (lower.includes(sentinel)) {
62
+ return {
63
+ ok: false,
64
+ reason: `Result contains error marker "${sentinel}".`,
65
+ method: 'heuristic',
66
+ };
67
+ }
68
+ }
69
+ // 3. On-topic keyword overlap with the goal.
70
+ // Extract meaningful words from the goal (>= 4 chars, alpha-only).
71
+ const goalWords = goal
72
+ .toLowerCase()
73
+ .split(/\W+/)
74
+ .filter((w) => w.length >= 4);
75
+ if (goalWords.length > 0) {
76
+ const matchCount = goalWords.filter((w) => lower.includes(w)).length;
77
+ const overlapRatio = matchCount / goalWords.length;
78
+ // High overlap → confident pass.
79
+ if (overlapRatio >= 0.5) {
80
+ return {
81
+ ok: true,
82
+ reason: `Result appears on-topic (${matchCount}/${goalWords.length} goal keywords matched).`,
83
+ method: 'heuristic',
84
+ };
85
+ }
86
+ // Very low overlap on a goal with many words → confident fail.
87
+ if (goalWords.length >= 3 && overlapRatio === 0) {
88
+ return {
89
+ ok: false,
90
+ reason: 'Result shares no keywords with the goal.',
91
+ method: 'heuristic',
92
+ };
93
+ }
94
+ }
95
+ // 4. Result is non-empty and no errors → weakly pass (inconclusive, but lean ok).
96
+ // Return null to signal the caller should do a model check if budget allows.
97
+ return null;
98
+ }
99
+ /**
100
+ * Build the cheap yes/no model prompt asking whether the result satisfies the goal.
101
+ */
102
+ function buildVerifyMessages(task) {
103
+ return [
104
+ {
105
+ role: 'system',
106
+ content: 'You are a strict but concise evaluator. Answer only "yes" or "no" followed by a one-line reason (≤ 20 words).',
107
+ },
108
+ {
109
+ role: 'user',
110
+ content: `Does this result plausibly satisfy the goal?\n\n` +
111
+ `Goal: ${task.goal}\n\n` +
112
+ `Result (first 500 chars): ${(task.result ?? '').slice(0, 500)}\n\n` +
113
+ `Answer "yes" or "no" and one short reason.`,
114
+ },
115
+ ];
116
+ }
117
+ /**
118
+ * Parse the model's yes/no response into a VerifyVerdict.
119
+ */
120
+ function parseModelVerdict(raw) {
121
+ const text = raw.trim().toLowerCase();
122
+ const ok = text.startsWith('yes');
123
+ // Extract the reason: everything after the first word/punctuation.
124
+ const reasonMatch = raw.trim().match(/^(?:yes|no)[.,:\s]*(.*)/i);
125
+ const reason = reasonMatch?.[1]?.trim() || raw.trim();
126
+ return {
127
+ ok,
128
+ reason: reason || (ok ? 'Model judged result satisfactory.' : 'Model judged result unsatisfactory.'),
129
+ method: 'model',
130
+ };
131
+ }
132
+ // ---------------------------------------------------------------------------
133
+ // Public API
134
+ // ---------------------------------------------------------------------------
135
+ /**
136
+ * Judge whether `task.result` plausibly satisfies `task.goal`.
137
+ *
138
+ * 1. Heuristic first (cheap, sync): empty / error-sentinel / keyword overlap.
139
+ * If confident → return immediately.
140
+ * 2. Optional model check only when:
141
+ * - heuristic was inconclusive, AND
142
+ * - budget has not been exceeded (overBudget check before the call), AND
143
+ * - client is available.
144
+ * Mutates `usage` to account for the model call.
145
+ * On any model error or budget exhaustion → falls back to a heuristic verdict.
146
+ *
147
+ * Never throws.
148
+ */
149
+ export async function verifyTask(task, client, budget, usage, opts) {
150
+ // Stage 1: heuristic.
151
+ const heuristic = heuristicVerify(task);
152
+ if (heuristic !== null) {
153
+ return heuristic;
154
+ }
155
+ // The optional model check is opt-in. When disabled (the default for the
156
+ // orchestrator's per-task verify, which keeps M4 deterministic accounting
157
+ // intact) the inconclusive heuristic resolves to a lenient pass WITHOUT any
158
+ // model call or usage mutation. verifyTask's own callers (and tests) may
159
+ // enable it explicitly via { model: true }.
160
+ if (opts?.model !== true) {
161
+ return {
162
+ ok: true,
163
+ reason: 'Heuristic pass (non-empty result with no error markers; model check disabled).',
164
+ method: 'heuristic',
165
+ };
166
+ }
167
+ // Heuristic inconclusive — check budget before a model call.
168
+ if (overBudget(usage, budget)) {
169
+ // Budget exhausted: fall back to a lenient heuristic pass (non-empty, no errors).
170
+ return {
171
+ ok: true,
172
+ reason: 'Heuristic pass (budget exhausted; model check skipped).',
173
+ method: 'heuristic',
174
+ };
175
+ }
176
+ // Stage 2: cheap single model call.
177
+ try {
178
+ const messages = buildVerifyMessages(task);
179
+ const result = await client.chat(messages, /* tools */ undefined);
180
+ // Account for the tokens used by the verification call.
181
+ const delta = {
182
+ tokensIn: result.usage.tokensIn,
183
+ tokensOut: result.usage.tokensOut,
184
+ steps: 1,
185
+ estCostUsd: 0, // local providers → 0
186
+ };
187
+ const merged = addUsage(usage, delta);
188
+ // Mutate the caller's usage object in-place (same pattern as agent-loop.ts).
189
+ usage.tokensIn = merged.tokensIn;
190
+ usage.tokensOut = merged.tokensOut;
191
+ usage.steps = merged.steps;
192
+ usage.estCostUsd = merged.estCostUsd;
193
+ return parseModelVerdict(result.content);
194
+ }
195
+ catch {
196
+ // Model check failed — fall back to a lenient heuristic pass.
197
+ return {
198
+ ok: true,
199
+ reason: 'Heuristic pass (model check failed; non-empty result with no error markers).',
200
+ method: 'heuristic',
201
+ };
202
+ }
203
+ }
204
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/core/run/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * M21: Append-only audit trail for autonomous/sandbox actions.
3
+ *
4
+ * Writes to ~/.ashlr/audit/<YYYY-MM-DD>.jsonl — one JSON object per line.
5
+ * Rules:
6
+ * - Append-only: never truncate, never rewrite, never delete a prior line.
7
+ * - Never write secrets: summary is metadata only; secret-shaped tokens are
8
+ * stripped defensively before persisting.
9
+ * - audit() never throws; readAudit() skips malformed lines, never throws.
10
+ */
11
+ import type { AuditEntry } from '../types.js';
12
+ /**
13
+ * Returns the absolute path to the audit directory: ~/.ashlr/audit.
14
+ * Created lazily by audit() — this function itself does NOT create it.
15
+ */
16
+ export declare function auditDir(): string;
17
+ /**
18
+ * Append one audit entry to today's JSONL file under ~/.ashlr/audit/.
19
+ * Sets `ts` to the current ISO timestamp; the caller supplies everything else.
20
+ *
21
+ * Append-only: never truncates, never rewrites existing lines.
22
+ * Never throws — errors are swallowed silently to keep callers unblocked.
23
+ */
24
+ export declare function audit(entry: Omit<AuditEntry, 'ts'>): void;
25
+ /**
26
+ * Read audit entries across all date files, newest-first.
27
+ * `limit` caps the number returned (undefined or 0 => return all).
28
+ *
29
+ * Malformed JSONL lines are silently skipped; never throws.
30
+ */
31
+ export declare function readAudit(limit?: number): AuditEntry[];