@loompad/cli 0.1.0 → 1.1.1

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 (687) hide show
  1. package/ARCHITECTURE.md +96 -11
  2. package/CHANGELOG.md +1042 -0
  3. package/README.md +1473 -44
  4. package/THIRD_PARTY_NOTICES.md +275 -0
  5. package/dist/adapters/antigravity-cli.d.ts +62 -0
  6. package/dist/adapters/antigravity-cli.js +258 -0
  7. package/dist/adapters/antigravity-cli.js.map +1 -0
  8. package/dist/adapters/base.d.ts +61 -9
  9. package/dist/adapters/base.js +266 -15
  10. package/dist/adapters/base.js.map +1 -1
  11. package/dist/adapters/bridges/antigravity.d.ts +9 -12
  12. package/dist/adapters/bridges/antigravity.js +9 -12
  13. package/dist/adapters/bridges/antigravity.js.map +1 -1
  14. package/dist/adapters/echo.d.ts +1 -0
  15. package/dist/adapters/echo.js +59 -3
  16. package/dist/adapters/echo.js.map +1 -1
  17. package/dist/adapters/grok.d.ts +7 -0
  18. package/dist/adapters/grok.js +20 -10
  19. package/dist/adapters/grok.js.map +1 -1
  20. package/dist/adapters/index.d.ts +5 -1
  21. package/dist/adapters/index.js +53 -7
  22. package/dist/adapters/index.js.map +1 -1
  23. package/dist/adapters/model.d.ts +137 -0
  24. package/dist/adapters/model.js +527 -0
  25. package/dist/adapters/model.js.map +1 -0
  26. package/dist/adapters/opencode.d.ts +101 -1
  27. package/dist/adapters/opencode.js +874 -98
  28. package/dist/adapters/opencode.js.map +1 -1
  29. package/dist/cli/doctor.d.ts +32 -0
  30. package/dist/cli/doctor.js +89 -4
  31. package/dist/cli/doctor.js.map +1 -1
  32. package/dist/cli/index.js +2651 -87
  33. package/dist/cli/index.js.map +1 -1
  34. package/dist/cli/tui-model.js +3 -1
  35. package/dist/cli/tui-model.js.map +1 -1
  36. package/dist/cli/tui.js +44 -1
  37. package/dist/cli/tui.js.map +1 -1
  38. package/dist/cli/ui.d.ts +2 -0
  39. package/dist/cli/ui.js +13 -0
  40. package/dist/cli/ui.js.map +1 -1
  41. package/dist/core/ades.d.ts +32 -16
  42. package/dist/core/ades.js +57 -20
  43. package/dist/core/ades.js.map +1 -1
  44. package/dist/core/agent-state.d.ts +14 -0
  45. package/dist/core/agent-state.js +32 -0
  46. package/dist/core/agent-state.js.map +1 -0
  47. package/dist/core/approvals.d.ts +33 -0
  48. package/dist/core/approvals.js +29 -0
  49. package/dist/core/approvals.js.map +1 -0
  50. package/dist/core/backup.d.ts +19 -0
  51. package/dist/core/backup.js +86 -0
  52. package/dist/core/backup.js.map +1 -0
  53. package/dist/core/baton.d.ts +2 -2
  54. package/dist/core/baton.js.map +1 -1
  55. package/dist/core/brain-extract.d.ts +17 -0
  56. package/dist/core/brain-extract.js +28 -2
  57. package/dist/core/brain-extract.js.map +1 -1
  58. package/dist/core/brain-index.d.ts +71 -0
  59. package/dist/core/brain-index.js +204 -5
  60. package/dist/core/brain-index.js.map +1 -1
  61. package/dist/core/brain.d.ts +58 -2
  62. package/dist/core/brain.js +79 -1
  63. package/dist/core/brain.js.map +1 -1
  64. package/dist/core/chat-import.d.ts +71 -0
  65. package/dist/core/chat-import.js +419 -0
  66. package/dist/core/chat-import.js.map +1 -0
  67. package/dist/core/checkpoint.d.ts +107 -0
  68. package/dist/core/checkpoint.js +259 -0
  69. package/dist/core/checkpoint.js.map +1 -0
  70. package/dist/core/claude-cli.js +1 -1
  71. package/dist/core/claude-cli.js.map +1 -1
  72. package/dist/core/continuity/artifacts.d.ts +14 -0
  73. package/dist/core/continuity/artifacts.js +118 -0
  74. package/dist/core/continuity/artifacts.js.map +1 -0
  75. package/dist/core/continuity/capabilities.d.ts +65 -0
  76. package/dist/core/continuity/capabilities.js +129 -0
  77. package/dist/core/continuity/capabilities.js.map +1 -0
  78. package/dist/core/continuity/contracts.d.ts +352 -0
  79. package/dist/core/continuity/contracts.js +117 -0
  80. package/dist/core/continuity/contracts.js.map +1 -0
  81. package/dist/core/continuity/engine.d.ts +55 -0
  82. package/dist/core/continuity/engine.js +504 -0
  83. package/dist/core/continuity/engine.js.map +1 -0
  84. package/dist/core/continuity/store.d.ts +73 -0
  85. package/dist/core/continuity/store.js +438 -0
  86. package/dist/core/continuity/store.js.map +1 -0
  87. package/dist/core/conversations.d.ts +19 -0
  88. package/dist/core/conversations.js +87 -0
  89. package/dist/core/conversations.js.map +1 -0
  90. package/dist/core/crew-coordination.d.ts +6 -0
  91. package/dist/core/crew-coordination.js +24 -0
  92. package/dist/core/crew-coordination.js.map +1 -0
  93. package/dist/core/crew-policy.d.ts +18 -0
  94. package/dist/core/crew-policy.js +40 -0
  95. package/dist/core/crew-policy.js.map +1 -0
  96. package/dist/core/crew-protocol.d.ts +64 -0
  97. package/dist/core/crew-protocol.js +146 -0
  98. package/dist/core/crew-protocol.js.map +1 -0
  99. package/dist/core/crew-requests.d.ts +14 -0
  100. package/dist/core/crew-requests.js +22 -0
  101. package/dist/core/crew-requests.js.map +1 -0
  102. package/dist/core/crew.d.ts +395 -0
  103. package/dist/core/crew.js +1857 -0
  104. package/dist/core/crew.js.map +1 -0
  105. package/dist/core/digest.d.ts +40 -0
  106. package/dist/core/digest.js +94 -0
  107. package/dist/core/digest.js.map +1 -0
  108. package/dist/core/distill.js +3 -5
  109. package/dist/core/distill.js.map +1 -1
  110. package/dist/core/eventlog.d.ts +27 -25
  111. package/dist/core/eventlog.js +97 -150
  112. package/dist/core/eventlog.js.map +1 -1
  113. package/dist/core/events/contracts.d.ts +51 -0
  114. package/dist/core/events/contracts.js +2 -0
  115. package/dist/core/events/contracts.js.map +1 -0
  116. package/dist/core/events/jsonl-store.d.ts +23 -0
  117. package/dist/core/events/jsonl-store.js +90 -0
  118. package/dist/core/events/jsonl-store.js.map +1 -0
  119. package/dist/core/events/sqlite-store.d.ts +37 -0
  120. package/dist/core/events/sqlite-store.js +215 -0
  121. package/dist/core/events/sqlite-store.js.map +1 -0
  122. package/dist/core/forecast.d.ts +44 -0
  123. package/dist/core/forecast.js +46 -0
  124. package/dist/core/forecast.js.map +1 -0
  125. package/dist/core/free-pool.d.ts +65 -0
  126. package/dist/core/free-pool.js +171 -0
  127. package/dist/core/free-pool.js.map +1 -0
  128. package/dist/core/git.d.ts +30 -0
  129. package/dist/core/git.js +50 -2
  130. package/dist/core/git.js.map +1 -1
  131. package/dist/core/github-events.d.ts +53 -0
  132. package/dist/core/github-events.js +227 -0
  133. package/dist/core/github-events.js.map +1 -0
  134. package/dist/core/goal-lanes.d.ts +53 -0
  135. package/dist/core/goal-lanes.js +99 -0
  136. package/dist/core/goal-lanes.js.map +1 -0
  137. package/dist/core/hosted.d.ts +27 -0
  138. package/dist/core/hosted.js +50 -0
  139. package/dist/core/hosted.js.map +1 -0
  140. package/dist/core/http-server.d.ts +5 -0
  141. package/dist/core/http-server.js +8 -0
  142. package/dist/core/http-server.js.map +1 -0
  143. package/dist/core/invite-link.d.ts +31 -0
  144. package/dist/core/invite-link.js +45 -0
  145. package/dist/core/invite-link.js.map +1 -0
  146. package/dist/core/loops.d.ts +37 -0
  147. package/dist/core/loops.js +81 -0
  148. package/dist/core/loops.js.map +1 -0
  149. package/dist/core/mcp-catalog.d.ts +182 -0
  150. package/dist/core/mcp-catalog.js +431 -0
  151. package/dist/core/mcp-catalog.js.map +1 -0
  152. package/dist/core/mcp.d.ts +87 -0
  153. package/dist/core/mcp.js +181 -0
  154. package/dist/core/mcp.js.map +1 -0
  155. package/dist/core/memory.d.ts +1 -0
  156. package/dist/core/memory.js +5 -2
  157. package/dist/core/memory.js.map +1 -1
  158. package/dist/core/model-tools.d.ts +97 -0
  159. package/dist/core/model-tools.js +388 -0
  160. package/dist/core/model-tools.js.map +1 -0
  161. package/dist/core/notify.js +19 -1
  162. package/dist/core/notify.js.map +1 -1
  163. package/dist/core/orchestra.d.ts +635 -0
  164. package/dist/core/orchestra.js +2120 -0
  165. package/dist/core/orchestra.js.map +1 -0
  166. package/dist/core/permissions.d.ts +56 -0
  167. package/dist/core/permissions.js +122 -0
  168. package/dist/core/permissions.js.map +1 -0
  169. package/dist/core/preview-proxy.d.ts +70 -0
  170. package/dist/core/preview-proxy.js +563 -0
  171. package/dist/core/preview-proxy.js.map +1 -0
  172. package/dist/core/preview-shot.d.ts +46 -0
  173. package/dist/core/preview-shot.js +109 -0
  174. package/dist/core/preview-shot.js.map +1 -0
  175. package/dist/core/process.d.ts +36 -0
  176. package/dist/core/process.js +168 -0
  177. package/dist/core/process.js.map +1 -0
  178. package/dist/core/prompt-queue.d.ts +136 -0
  179. package/dist/core/prompt-queue.js +269 -0
  180. package/dist/core/prompt-queue.js.map +1 -0
  181. package/dist/core/prompts.d.ts +53 -0
  182. package/dist/core/prompts.js +127 -0
  183. package/dist/core/prompts.js.map +1 -0
  184. package/dist/core/proof.d.ts +82 -0
  185. package/dist/core/proof.js +216 -0
  186. package/dist/core/proof.js.map +1 -0
  187. package/dist/core/provider-text.d.ts +23 -0
  188. package/dist/core/provider-text.js +66 -0
  189. package/dist/core/provider-text.js.map +1 -0
  190. package/dist/core/providers.d.ts +152 -0
  191. package/dist/core/providers.js +343 -0
  192. package/dist/core/providers.js.map +1 -0
  193. package/dist/core/quota.d.ts +33 -0
  194. package/dist/core/quota.js +74 -0
  195. package/dist/core/quota.js.map +1 -0
  196. package/dist/core/recipes.d.ts +50 -0
  197. package/dist/core/recipes.js +99 -0
  198. package/dist/core/recipes.js.map +1 -0
  199. package/dist/core/registry.d.ts +54 -0
  200. package/dist/core/registry.js +62 -5
  201. package/dist/core/registry.js.map +1 -1
  202. package/dist/core/relay-client.d.ts +67 -0
  203. package/dist/core/relay-client.js +184 -0
  204. package/dist/core/relay-client.js.map +1 -0
  205. package/dist/core/relay-protocol.d.ts +140 -0
  206. package/dist/core/relay-protocol.js +189 -0
  207. package/dist/core/relay-protocol.js.map +1 -0
  208. package/dist/core/replay.d.ts +18 -0
  209. package/dist/core/replay.js +191 -0
  210. package/dist/core/replay.js.map +1 -0
  211. package/dist/core/review-triage.d.ts +41 -0
  212. package/dist/core/review-triage.js +124 -0
  213. package/dist/core/review-triage.js.map +1 -0
  214. package/dist/core/router.js +2 -2
  215. package/dist/core/router.js.map +1 -1
  216. package/dist/core/routes.d.ts +39 -3
  217. package/dist/core/routes.js +137 -4
  218. package/dist/core/routes.js.map +1 -1
  219. package/dist/core/run-command.d.ts +14 -0
  220. package/dist/core/run-command.js +45 -0
  221. package/dist/core/run-command.js.map +1 -0
  222. package/dist/core/runner-setup.d.ts +36 -0
  223. package/dist/core/runner-setup.js +114 -0
  224. package/dist/core/runner-setup.js.map +1 -0
  225. package/dist/core/search.js +0 -0
  226. package/dist/core/search.js.map +1 -1
  227. package/dist/core/semantic.d.ts +92 -0
  228. package/dist/core/semantic.js +227 -0
  229. package/dist/core/semantic.js.map +1 -0
  230. package/dist/core/servers.d.ts +115 -0
  231. package/dist/core/servers.js +305 -0
  232. package/dist/core/servers.js.map +1 -0
  233. package/dist/core/setup.js +64 -6
  234. package/dist/core/setup.js.map +1 -1
  235. package/dist/core/shield.d.ts +17 -0
  236. package/dist/core/shield.js +81 -0
  237. package/dist/core/shield.js.map +1 -0
  238. package/dist/core/shift.d.ts +69 -0
  239. package/dist/core/shift.js +120 -0
  240. package/dist/core/shift.js.map +1 -0
  241. package/dist/core/skill-install.d.ts +125 -0
  242. package/dist/core/skill-install.js +328 -0
  243. package/dist/core/skill-install.js.map +1 -0
  244. package/dist/core/skills.d.ts +116 -0
  245. package/dist/core/skills.js +223 -0
  246. package/dist/core/skills.js.map +1 -0
  247. package/dist/core/step-conditions.d.ts +65 -0
  248. package/dist/core/step-conditions.js +102 -0
  249. package/dist/core/step-conditions.js.map +1 -0
  250. package/dist/core/subagents.d.ts +45 -0
  251. package/dist/core/subagents.js +90 -0
  252. package/dist/core/subagents.js.map +1 -0
  253. package/dist/core/team-canon.d.ts +42 -0
  254. package/dist/core/team-canon.js +121 -0
  255. package/dist/core/team-canon.js.map +1 -0
  256. package/dist/core/team-crypto.d.ts +97 -0
  257. package/dist/core/team-crypto.js +175 -0
  258. package/dist/core/team-crypto.js.map +1 -0
  259. package/dist/core/team-hub.d.ts +514 -0
  260. package/dist/core/team-hub.js +964 -0
  261. package/dist/core/team-hub.js.map +1 -0
  262. package/dist/core/team-landing.d.ts +239 -0
  263. package/dist/core/team-landing.js +504 -0
  264. package/dist/core/team-landing.js.map +1 -0
  265. package/dist/core/team-leases.d.ts +44 -0
  266. package/dist/core/team-leases.js +145 -0
  267. package/dist/core/team-leases.js.map +1 -0
  268. package/dist/core/team-memory.d.ts +42 -0
  269. package/dist/core/team-memory.js +84 -0
  270. package/dist/core/team-memory.js.map +1 -0
  271. package/dist/core/team-policy.d.ts +85 -0
  272. package/dist/core/team-policy.js +191 -0
  273. package/dist/core/team-policy.js.map +1 -0
  274. package/dist/core/thread-md.d.ts +6 -0
  275. package/dist/core/thread-md.js +42 -0
  276. package/dist/core/thread-md.js.map +1 -0
  277. package/dist/core/turn-stats.d.ts +61 -0
  278. package/dist/core/turn-stats.js +124 -0
  279. package/dist/core/turn-stats.js.map +1 -0
  280. package/dist/core/updater.d.ts +73 -0
  281. package/dist/core/updater.js +153 -0
  282. package/dist/core/updater.js.map +1 -0
  283. package/dist/core/usage.d.ts +75 -0
  284. package/dist/core/usage.js +163 -0
  285. package/dist/core/usage.js.map +1 -0
  286. package/dist/core/windows-jobs.d.ts +15 -0
  287. package/dist/core/windows-jobs.js +170 -0
  288. package/dist/core/windows-jobs.js.map +1 -0
  289. package/dist/core/worktree-merge.d.ts +57 -0
  290. package/dist/core/worktree-merge.js +123 -0
  291. package/dist/core/worktree-merge.js.map +1 -0
  292. package/dist/core/worktree.d.ts +5 -0
  293. package/dist/core/worktree.js +45 -5
  294. package/dist/core/worktree.js.map +1 -1
  295. package/dist/core/worktrees.d.ts +6 -0
  296. package/dist/core/worktrees.js +21 -0
  297. package/dist/core/worktrees.js.map +1 -0
  298. package/dist/daemon/app-page.d.ts +0 -17
  299. package/dist/daemon/app-page.js +10 -6346
  300. package/dist/daemon/app-page.js.map +1 -1
  301. package/dist/daemon/auth.d.ts +24 -3
  302. package/dist/daemon/auth.js +66 -7
  303. package/dist/daemon/auth.js.map +1 -1
  304. package/dist/daemon/board.d.ts +7 -0
  305. package/dist/daemon/board.js +12 -1
  306. package/dist/daemon/board.js.map +1 -1
  307. package/dist/daemon/brand-icons.d.ts +6 -1
  308. package/dist/daemon/brand-icons.js +11 -3
  309. package/dist/daemon/brand-icons.js.map +1 -1
  310. package/dist/daemon/client.d.ts +665 -1
  311. package/dist/daemon/client.js +381 -3
  312. package/dist/daemon/client.js.map +1 -1
  313. package/dist/daemon/delivery.d.ts +34 -0
  314. package/dist/daemon/delivery.js +63 -0
  315. package/dist/daemon/delivery.js.map +1 -0
  316. package/dist/daemon/deploys.d.ts +62 -0
  317. package/dist/daemon/deploys.js +159 -0
  318. package/dist/daemon/deploys.js.map +1 -0
  319. package/dist/daemon/landing.d.ts +192 -0
  320. package/dist/daemon/landing.js +992 -0
  321. package/dist/daemon/landing.js.map +1 -0
  322. package/dist/daemon/onboard.d.ts +150 -0
  323. package/dist/daemon/onboard.js +390 -0
  324. package/dist/daemon/onboard.js.map +1 -0
  325. package/dist/daemon/proof.d.ts +70 -0
  326. package/dist/daemon/proof.js +172 -0
  327. package/dist/daemon/proof.js.map +1 -0
  328. package/dist/daemon/push.d.ts +19 -1
  329. package/dist/daemon/push.js +90 -3
  330. package/dist/daemon/push.js.map +1 -1
  331. package/dist/daemon/relay.d.ts +82 -0
  332. package/dist/daemon/relay.js +351 -0
  333. package/dist/daemon/relay.js.map +1 -0
  334. package/dist/daemon/routes/agent-discovery.d.ts +4 -0
  335. package/dist/daemon/routes/agent-discovery.js +29 -0
  336. package/dist/daemon/routes/agent-discovery.js.map +1 -0
  337. package/dist/daemon/routes/agent-settings.d.ts +4 -0
  338. package/dist/daemon/routes/agent-settings.js +94 -0
  339. package/dist/daemon/routes/agent-settings.js.map +1 -0
  340. package/dist/daemon/routes/agents.d.ts +4 -0
  341. package/dist/daemon/routes/agents.js +105 -0
  342. package/dist/daemon/routes/agents.js.map +1 -0
  343. package/dist/daemon/routes/alerts.d.ts +4 -0
  344. package/dist/daemon/routes/alerts.js +137 -0
  345. package/dist/daemon/routes/alerts.js.map +1 -0
  346. package/dist/daemon/routes/approvals.d.ts +4 -0
  347. package/dist/daemon/routes/approvals.js +40 -0
  348. package/dist/daemon/routes/approvals.js.map +1 -0
  349. package/dist/daemon/routes/assets.d.ts +3 -0
  350. package/dist/daemon/routes/assets.js +64 -0
  351. package/dist/daemon/routes/assets.js.map +1 -0
  352. package/dist/daemon/routes/board.d.ts +4 -0
  353. package/dist/daemon/routes/board.js +147 -0
  354. package/dist/daemon/routes/board.js.map +1 -0
  355. package/dist/daemon/routes/brain.d.ts +4 -0
  356. package/dist/daemon/routes/brain.js +270 -0
  357. package/dist/daemon/routes/brain.js.map +1 -0
  358. package/dist/daemon/routes/chats.d.ts +4 -0
  359. package/dist/daemon/routes/chats.js +249 -0
  360. package/dist/daemon/routes/chats.js.map +1 -0
  361. package/dist/daemon/routes/clients.d.ts +4 -0
  362. package/dist/daemon/routes/clients.js +49 -0
  363. package/dist/daemon/routes/clients.js.map +1 -0
  364. package/dist/daemon/routes/cloud.d.ts +4 -0
  365. package/dist/daemon/routes/cloud.js +46 -0
  366. package/dist/daemon/routes/cloud.js.map +1 -0
  367. package/dist/daemon/routes/config.d.ts +4 -0
  368. package/dist/daemon/routes/config.js +35 -0
  369. package/dist/daemon/routes/config.js.map +1 -0
  370. package/dist/daemon/routes/context.d.ts +51 -0
  371. package/dist/daemon/routes/context.js +2 -0
  372. package/dist/daemon/routes/context.js.map +1 -0
  373. package/dist/daemon/routes/crews.d.ts +4 -0
  374. package/dist/daemon/routes/crews.js +149 -0
  375. package/dist/daemon/routes/crews.js.map +1 -0
  376. package/dist/daemon/routes/files.d.ts +3 -0
  377. package/dist/daemon/routes/files.js +253 -0
  378. package/dist/daemon/routes/files.js.map +1 -0
  379. package/dist/daemon/routes/git.d.ts +4 -0
  380. package/dist/daemon/routes/git.js +96 -0
  381. package/dist/daemon/routes/git.js.map +1 -0
  382. package/dist/daemon/routes/history.d.ts +4 -0
  383. package/dist/daemon/routes/history.js +101 -0
  384. package/dist/daemon/routes/history.js.map +1 -0
  385. package/dist/daemon/routes/integrations-project.d.ts +3 -0
  386. package/dist/daemon/routes/integrations-project.js +103 -0
  387. package/dist/daemon/routes/integrations-project.js.map +1 -0
  388. package/dist/daemon/routes/integrations.d.ts +3 -0
  389. package/dist/daemon/routes/integrations.js +111 -0
  390. package/dist/daemon/routes/integrations.js.map +1 -0
  391. package/dist/daemon/routes/logs.d.ts +3 -0
  392. package/dist/daemon/routes/logs.js +40 -0
  393. package/dist/daemon/routes/logs.js.map +1 -0
  394. package/dist/daemon/routes/messages.d.ts +4 -0
  395. package/dist/daemon/routes/messages.js +60 -0
  396. package/dist/daemon/routes/messages.js.map +1 -0
  397. package/dist/daemon/routes/observability.d.ts +4 -0
  398. package/dist/daemon/routes/observability.js +247 -0
  399. package/dist/daemon/routes/observability.js.map +1 -0
  400. package/dist/daemon/routes/onboard.d.ts +12 -0
  401. package/dist/daemon/routes/onboard.js +67 -0
  402. package/dist/daemon/routes/onboard.js.map +1 -0
  403. package/dist/daemon/routes/orchestra.d.ts +4 -0
  404. package/dist/daemon/routes/orchestra.js +110 -0
  405. package/dist/daemon/routes/orchestra.js.map +1 -0
  406. package/dist/daemon/routes/pairing.d.ts +4 -0
  407. package/dist/daemon/routes/pairing.js +155 -0
  408. package/dist/daemon/routes/pairing.js.map +1 -0
  409. package/dist/daemon/routes/preview.d.ts +24 -0
  410. package/dist/daemon/routes/preview.js +122 -0
  411. package/dist/daemon/routes/preview.js.map +1 -0
  412. package/dist/daemon/routes/project-actions.d.ts +4 -0
  413. package/dist/daemon/routes/project-actions.js +53 -0
  414. package/dist/daemon/routes/project-actions.js.map +1 -0
  415. package/dist/daemon/routes/project-team.d.ts +4 -0
  416. package/dist/daemon/routes/project-team.js +201 -0
  417. package/dist/daemon/routes/project-team.js.map +1 -0
  418. package/dist/daemon/routes/projects.d.ts +14 -0
  419. package/dist/daemon/routes/projects.js +138 -0
  420. package/dist/daemon/routes/projects.js.map +1 -0
  421. package/dist/daemon/routes/prompts.d.ts +4 -0
  422. package/dist/daemon/routes/prompts.js +44 -0
  423. package/dist/daemon/routes/prompts.js.map +1 -0
  424. package/dist/daemon/routes/proof.d.ts +4 -0
  425. package/dist/daemon/routes/proof.js +22 -0
  426. package/dist/daemon/routes/proof.js.map +1 -0
  427. package/dist/daemon/routes/providers.d.ts +3 -0
  428. package/dist/daemon/routes/providers.js +60 -0
  429. package/dist/daemon/routes/providers.js.map +1 -0
  430. package/dist/daemon/routes/public.d.ts +4 -0
  431. package/dist/daemon/routes/public.js +64 -0
  432. package/dist/daemon/routes/public.js.map +1 -0
  433. package/dist/daemon/routes/queue.d.ts +4 -0
  434. package/dist/daemon/routes/queue.js +140 -0
  435. package/dist/daemon/routes/queue.js.map +1 -0
  436. package/dist/daemon/routes/routing.d.ts +4 -0
  437. package/dist/daemon/routes/routing.js +61 -0
  438. package/dist/daemon/routes/routing.js.map +1 -0
  439. package/dist/daemon/routes/runtime-handler.d.ts +2 -0
  440. package/dist/daemon/routes/runtime-handler.js +63 -0
  441. package/dist/daemon/routes/runtime-handler.js.map +1 -0
  442. package/dist/daemon/routes/search.d.ts +4 -0
  443. package/dist/daemon/routes/search.js +17 -0
  444. package/dist/daemon/routes/search.js.map +1 -0
  445. package/dist/daemon/routes/servers.d.ts +4 -0
  446. package/dist/daemon/routes/servers.js +133 -0
  447. package/dist/daemon/routes/servers.js.map +1 -0
  448. package/dist/daemon/routes/setup.d.ts +3 -0
  449. package/dist/daemon/routes/setup.js +50 -0
  450. package/dist/daemon/routes/setup.js.map +1 -0
  451. package/dist/daemon/routes/shift.d.ts +4 -0
  452. package/dist/daemon/routes/shift.js +30 -0
  453. package/dist/daemon/routes/shift.js.map +1 -0
  454. package/dist/daemon/routes/specs.d.ts +4 -0
  455. package/dist/daemon/routes/specs.js +57 -0
  456. package/dist/daemon/routes/specs.js.map +1 -0
  457. package/dist/daemon/routes/task-delivery.d.ts +4 -0
  458. package/dist/daemon/routes/task-delivery.js +38 -0
  459. package/dist/daemon/routes/task-delivery.js.map +1 -0
  460. package/dist/daemon/routes/team.d.ts +4 -0
  461. package/dist/daemon/routes/team.js +193 -0
  462. package/dist/daemon/routes/team.js.map +1 -0
  463. package/dist/daemon/routes/terminals.d.ts +4 -0
  464. package/dist/daemon/routes/terminals.js +87 -0
  465. package/dist/daemon/routes/terminals.js.map +1 -0
  466. package/dist/daemon/routes/tools.d.ts +4 -0
  467. package/dist/daemon/routes/tools.js +180 -0
  468. package/dist/daemon/routes/tools.js.map +1 -0
  469. package/dist/daemon/routes/updates.d.ts +4 -0
  470. package/dist/daemon/routes/updates.js +89 -0
  471. package/dist/daemon/routes/updates.js.map +1 -0
  472. package/dist/daemon/routes/voice.d.ts +4 -0
  473. package/dist/daemon/routes/voice.js +53 -0
  474. package/dist/daemon/routes/voice.js.map +1 -0
  475. package/dist/daemon/runner.d.ts +186 -0
  476. package/dist/daemon/runner.js +612 -0
  477. package/dist/daemon/runner.js.map +1 -0
  478. package/dist/daemon/runtime/accounting.d.ts +130 -0
  479. package/dist/daemon/runtime/accounting.js +303 -0
  480. package/dist/daemon/runtime/accounting.js.map +1 -0
  481. package/dist/daemon/runtime/agents.d.ts +16 -0
  482. package/dist/daemon/runtime/agents.js +71 -0
  483. package/dist/daemon/runtime/agents.js.map +1 -0
  484. package/dist/daemon/runtime/briefings.d.ts +134 -0
  485. package/dist/daemon/runtime/briefings.js +329 -0
  486. package/dist/daemon/runtime/briefings.js.map +1 -0
  487. package/dist/daemon/runtime/native-usage.d.ts +21 -0
  488. package/dist/daemon/runtime/native-usage.js +71 -0
  489. package/dist/daemon/runtime/native-usage.js.map +1 -0
  490. package/dist/daemon/runtime/queue.d.ts +94 -0
  491. package/dist/daemon/runtime/queue.js +222 -0
  492. package/dist/daemon/runtime/queue.js.map +1 -0
  493. package/dist/daemon/runtime/relay.d.ts +93 -0
  494. package/dist/daemon/runtime/relay.js +240 -0
  495. package/dist/daemon/runtime/relay.js.map +1 -0
  496. package/dist/daemon/runtime/turns.d.ts +202 -0
  497. package/dist/daemon/runtime/turns.js +663 -0
  498. package/dist/daemon/runtime/turns.js.map +1 -0
  499. package/dist/daemon/runtime-support.d.ts +76 -0
  500. package/dist/daemon/runtime-support.js +134 -0
  501. package/dist/daemon/runtime-support.js.map +1 -0
  502. package/dist/daemon/runtime.d.ts +739 -70
  503. package/dist/daemon/runtime.js +2751 -470
  504. package/dist/daemon/runtime.js.map +1 -1
  505. package/dist/daemon/server.d.ts +82 -55
  506. package/dist/daemon/server.js +674 -1435
  507. package/dist/daemon/server.js.map +1 -1
  508. package/dist/daemon/shift.d.ts +70 -0
  509. package/dist/daemon/shift.js +170 -0
  510. package/dist/daemon/shift.js.map +1 -0
  511. package/dist/daemon/specs.d.ts +92 -0
  512. package/dist/daemon/specs.js +285 -0
  513. package/dist/daemon/specs.js.map +1 -0
  514. package/dist/daemon/system.d.ts +208 -0
  515. package/dist/daemon/system.js +557 -0
  516. package/dist/daemon/system.js.map +1 -0
  517. package/dist/daemon/tasks.js +1 -1
  518. package/dist/daemon/team-brain.d.ts +136 -0
  519. package/dist/daemon/team-brain.js +659 -0
  520. package/dist/daemon/team-brain.js.map +1 -0
  521. package/dist/daemon/team-coordinator.d.ts +78 -0
  522. package/dist/daemon/team-coordinator.js +408 -0
  523. package/dist/daemon/team-coordinator.js.map +1 -0
  524. package/dist/daemon/team.d.ts +339 -0
  525. package/dist/daemon/team.js +1433 -0
  526. package/dist/daemon/team.js.map +1 -0
  527. package/dist/daemon/terminals.d.ts +22 -3
  528. package/dist/daemon/terminals.js +236 -16
  529. package/dist/daemon/terminals.js.map +1 -1
  530. package/dist/hub/client.d.ts +120 -0
  531. package/dist/hub/client.js +228 -0
  532. package/dist/hub/client.js.map +1 -0
  533. package/dist/hub/server.d.ts +32 -0
  534. package/dist/hub/server.js +180 -0
  535. package/dist/hub/server.js.map +1 -0
  536. package/dist/hub/supabase-client.d.ts +220 -0
  537. package/dist/hub/supabase-client.js +843 -0
  538. package/dist/hub/supabase-client.js.map +1 -0
  539. package/dist/observability/ask.d.ts +91 -0
  540. package/dist/observability/ask.js +179 -0
  541. package/dist/observability/ask.js.map +1 -0
  542. package/dist/observability/clickhouse.d.ts +33 -0
  543. package/dist/observability/clickhouse.js +48 -0
  544. package/dist/observability/clickhouse.js.map +1 -0
  545. package/dist/observability/decisions.d.ts +176 -0
  546. package/dist/observability/decisions.js +377 -0
  547. package/dist/observability/decisions.js.map +1 -0
  548. package/dist/observability/index.d.ts +89 -0
  549. package/dist/observability/index.js +348 -0
  550. package/dist/observability/index.js.map +1 -0
  551. package/dist/observability/insights.d.ts +151 -0
  552. package/dist/observability/insights.js +319 -0
  553. package/dist/observability/insights.js.map +1 -0
  554. package/dist/observability/logs-query.d.ts +82 -0
  555. package/dist/observability/logs-query.js +102 -0
  556. package/dist/observability/logs-query.js.map +1 -0
  557. package/dist/observability/logs.d.ts +72 -0
  558. package/dist/observability/logs.js +295 -0
  559. package/dist/observability/logs.js.map +1 -0
  560. package/dist/observability/metrics.d.ts +86 -0
  561. package/dist/observability/metrics.js +303 -0
  562. package/dist/observability/metrics.js.map +1 -0
  563. package/dist/observability/otlp.d.ts +127 -0
  564. package/dist/observability/otlp.js +242 -0
  565. package/dist/observability/otlp.js.map +1 -0
  566. package/dist/observability/snapshots.d.ts +43 -0
  567. package/dist/observability/snapshots.js +129 -0
  568. package/dist/observability/snapshots.js.map +1 -0
  569. package/dist/observability/triage.d.ts +49 -0
  570. package/dist/observability/triage.js +284 -0
  571. package/dist/observability/triage.js.map +1 -0
  572. package/dist/providers/adapter.d.ts +50 -0
  573. package/dist/providers/adapter.js +38 -0
  574. package/dist/providers/adapter.js.map +1 -0
  575. package/dist/providers/agent.d.ts +110 -0
  576. package/dist/providers/agent.js +487 -0
  577. package/dist/providers/agent.js.map +1 -0
  578. package/dist/providers/approvals.d.ts +24 -0
  579. package/dist/providers/approvals.js +78 -0
  580. package/dist/providers/approvals.js.map +1 -0
  581. package/dist/providers/attachments.d.ts +20 -0
  582. package/dist/providers/attachments.js +51 -0
  583. package/dist/providers/attachments.js.map +1 -0
  584. package/dist/providers/claude/adapter.d.ts +99 -0
  585. package/dist/providers/claude/adapter.js +790 -0
  586. package/dist/providers/claude/adapter.js.map +1 -0
  587. package/dist/providers/codex/adapter.d.ts +113 -0
  588. package/dist/providers/codex/adapter.js +881 -0
  589. package/dist/providers/codex/adapter.js.map +1 -0
  590. package/dist/providers/codex/instructions.d.ts +11 -0
  591. package/dist/providers/codex/instructions.js +154 -0
  592. package/dist/providers/codex/instructions.js.map +1 -0
  593. package/dist/providers/codex/rpc.d.ts +36 -0
  594. package/dist/providers/codex/rpc.js +104 -0
  595. package/dist/providers/codex/rpc.js.map +1 -0
  596. package/dist/providers/contracts.d.ts +339 -0
  597. package/dist/providers/contracts.js +19 -0
  598. package/dist/providers/contracts.js.map +1 -0
  599. package/dist/providers/directory.d.ts +70 -0
  600. package/dist/providers/directory.js +95 -0
  601. package/dist/providers/directory.js.map +1 -0
  602. package/dist/providers/errors.d.ts +47 -0
  603. package/dist/providers/errors.js +24 -0
  604. package/dist/providers/errors.js.map +1 -0
  605. package/dist/providers/index.d.ts +18 -0
  606. package/dist/providers/index.js +19 -0
  607. package/dist/providers/index.js.map +1 -0
  608. package/dist/providers/ingestion.d.ts +80 -0
  609. package/dist/providers/ingestion.js +330 -0
  610. package/dist/providers/ingestion.js.map +1 -0
  611. package/dist/providers/live.d.ts +22 -0
  612. package/dist/providers/live.js +56 -0
  613. package/dist/providers/live.js.map +1 -0
  614. package/dist/providers/process.d.ts +29 -0
  615. package/dist/providers/process.js +71 -0
  616. package/dist/providers/process.js.map +1 -0
  617. package/dist/providers/reaper.d.ts +33 -0
  618. package/dist/providers/reaper.js +65 -0
  619. package/dist/providers/reaper.js.map +1 -0
  620. package/dist/providers/service.d.ts +87 -0
  621. package/dist/providers/service.js +256 -0
  622. package/dist/providers/service.js.map +1 -0
  623. package/dist/sdk.d.ts +1 -1
  624. package/dist/sdk.js +1 -1
  625. package/dist/sdk.js.map +1 -1
  626. package/dist/types.d.ts +385 -6
  627. package/dist/types.js +1 -0
  628. package/dist/types.js.map +1 -1
  629. package/dist/version.d.ts +7 -0
  630. package/dist/version.js +16 -0
  631. package/dist/version.js.map +1 -0
  632. package/dist/web/app.css +4643 -0
  633. package/dist/web/app.js +22640 -0
  634. package/dist/web/app.js.map +7 -0
  635. package/dist/web/shell.html +39 -0
  636. package/docs/README.md +21 -0
  637. package/docs/SETUP.md +10 -0
  638. package/docs/adapters.md +21 -8
  639. package/docs/brain-continuity.md +186 -0
  640. package/docs/cloud.md +108 -0
  641. package/docs/crews.md +62 -0
  642. package/docs/design-system.md +31 -2
  643. package/docs/integration-notes.md +128 -20
  644. package/docs/loompad.md +105 -0
  645. package/docs/observability.md +220 -0
  646. package/docs/play-store.md +123 -0
  647. package/docs/proposals/agent-teams.md +249 -0
  648. package/docs/proposals/brain-continuity-implementation.md +468 -0
  649. package/docs/proposals/brain-session-continuity.md +623 -0
  650. package/docs/proposals/t3code-port.md +81 -0
  651. package/docs/proposals/t3code-reference.md +95 -0
  652. package/docs/refactoring/AGENT-TEAMS-PROGRESS.md +88 -0
  653. package/docs/refactoring/BOUNDARIES.md +120 -0
  654. package/docs/refactoring/BRAIN-AUDIT.md +176 -0
  655. package/docs/refactoring/BRAIN-NOTES.md +390 -0
  656. package/docs/refactoring/BRAIN-TODO.md +214 -0
  657. package/docs/refactoring/NOTES.md +129 -0
  658. package/docs/refactoring/T3-PORT-NOTES.md +165 -0
  659. package/docs/refactoring/T3-PORT-TODO.md +123 -0
  660. package/docs/refactoring/TODO.md +46 -0
  661. package/docs/refactoring/brain-benchmark-2026-09-28.json +48 -0
  662. package/docs/refactoring/brain-benchmark-audit-2026-09-28.json +48 -0
  663. package/docs/release-notes/v0.2.0.md +35 -0
  664. package/docs/release-notes/v0.2.1.md +59 -0
  665. package/docs/release-notes/v0.2.3.md +77 -0
  666. package/docs/release-notes/v0.2.4.md +128 -0
  667. package/docs/release-notes/v0.2.5.md +153 -0
  668. package/docs/release-notes/v0.2.6.md +62 -0
  669. package/docs/release-notes/v1.0.0.md +120 -0
  670. package/docs/release-notes/v1.0.1.md +77 -0
  671. package/docs/release-notes/v1.1.0.md +71 -0
  672. package/docs/release-notes/v1.1.1.md +38 -0
  673. package/docs/teams-architecture.md +697 -0
  674. package/docs/teams.md +171 -0
  675. package/docs/windows.md +85 -0
  676. package/package.json +22 -9
  677. package/dist/adapters/claude-code.d.ts +0 -26
  678. package/dist/adapters/claude-code.js +0 -209
  679. package/dist/adapters/claude-code.js.map +0 -1
  680. package/dist/adapters/codex.d.ts +0 -51
  681. package/dist/adapters/codex.js +0 -291
  682. package/dist/adapters/codex.js.map +0 -1
  683. package/docs/img/board-linear.png +0 -0
  684. package/docs/img/board-projects.png +0 -0
  685. package/docs/img/brain.png +0 -0
  686. package/docs/img/settings.png +0 -0
  687. package/docs/img/workspace.png +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../../src/observability/otlp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Time-Travel Replay — reconstruct the fleet's exact state at any point by
3
+ * folding the event log up to that moment. Snapshots aren't stored; they're
4
+ * rebuilt on demand (a fold, like the brain). Scrub to a frame and you see who
5
+ * held the baton, each agent's turns/cost, the decisions made so far, the brain's
6
+ * top facts, and the thread — all as of that instant.
7
+ */
8
+ import type { LoomEvent } from "../types.js";
9
+ export type AgentSnapState = {
10
+ turnsCompleted: number;
11
+ tokensUsed: number;
12
+ costUsd: number;
13
+ lastAction: string;
14
+ status: "idle" | "active" | "waiting" | "errored";
15
+ };
16
+ export interface TimeSnapshot {
17
+ timestampMs: number;
18
+ turnIndex: number;
19
+ eventIndex: number;
20
+ batonHolder: string;
21
+ decisionsAtPoint: string[];
22
+ agentStates: Record<string, AgentSnapState>;
23
+ memorySnapshot: {
24
+ decisionsCount: number;
25
+ keyFacts: string[];
26
+ };
27
+ threadLength: number;
28
+ lastMessage: {
29
+ agentId: string;
30
+ text: string;
31
+ timestamp: number;
32
+ } | null;
33
+ /** Files that were untracked ("??") when a turn touched them — i.e. new. */
34
+ filesCreatedSoFar: number;
35
+ filesModifiedSoFar: number;
36
+ triggerEvent: {
37
+ type: string;
38
+ agentId: string;
39
+ description: string;
40
+ };
41
+ }
42
+ /** Fold the event log into a list of scrubatble snapshots. Pure. */
43
+ export declare function buildSnapshots(events: LoomEvent[]): TimeSnapshot[];
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Time-Travel Replay — reconstruct the fleet's exact state at any point by
3
+ * folding the event log up to that moment. Snapshots aren't stored; they're
4
+ * rebuilt on demand (a fold, like the brain). Scrub to a frame and you see who
5
+ * held the baton, each agent's turns/cost, the decisions made so far, the brain's
6
+ * top facts, and the thread — all as of that instant.
7
+ */
8
+ const SNAPSHOT_KINDS = new Set(["run_complete", "handoff", "error", "route_completed", "route_failed", "route_started"]);
9
+ const isDecisionStatus = (e) => e.kind === "status" && e.payload.state === "agent_decision";
10
+ const isHealStatus = (e) => e.kind === "status" && ["alert_intervention", "alert_recovery"].includes(String(e.payload.state));
11
+ function describeEvent(e) {
12
+ const p = e.payload;
13
+ const agent = e.agentId ?? String(p.agentId ?? "system");
14
+ switch (e.kind) {
15
+ case "run_complete": return `${agent} completed turn`;
16
+ case "handoff": return p.from ? `baton · ${String(p.from)} → ${String(p.to ?? "—")}` : `baton · ${String(p.to ?? "agent")} takes it first`;
17
+ case "error": return `${agent} errored: ${String(p.message ?? "").slice(0, 60)}`;
18
+ case "route_started": return "route started";
19
+ case "route_completed": return "route completed";
20
+ case "route_failed": return `route failed: ${String(p.error ?? p.reason ?? "")}`;
21
+ case "status":
22
+ if (isDecisionStatus(e))
23
+ return `${agent} decided: ${String(p.title ?? "")}`;
24
+ if (p.state === "alert_intervention")
25
+ return `⚡ Alert → baton off ${agent}`;
26
+ if (p.state === "alert_recovery")
27
+ return `✓ Recovery → ${agent}`;
28
+ return String(p.state ?? "status");
29
+ default: return e.kind;
30
+ }
31
+ }
32
+ /** Fold the event log into a list of scrubatble snapshots. Pure. */
33
+ export function buildSnapshots(events) {
34
+ const snapshots = [];
35
+ let batonHolder = null;
36
+ const agentStates = {};
37
+ const decisionIds = [];
38
+ let threadLength = 0;
39
+ let lastMessage = null;
40
+ let filesCreated = 0;
41
+ let filesModified = 0;
42
+ let memoryFacts = [];
43
+ const ensure = (id) => (agentStates[id] ??= { turnsCompleted: 0, tokensUsed: 0, costUsd: 0, lastAction: "", status: "idle" });
44
+ for (let i = 0; i < events.length; i++) {
45
+ const e = events[i];
46
+ const p = e.payload;
47
+ switch (e.kind) {
48
+ case "handoff": {
49
+ const to = String(p.to ?? p.agent ?? "");
50
+ if (to) {
51
+ batonHolder = to;
52
+ ensure(to).status = "active";
53
+ }
54
+ break;
55
+ }
56
+ case "run_complete": {
57
+ const id = e.agentId ?? String(p.agentId ?? "");
58
+ if (id) {
59
+ const a = ensure(id);
60
+ a.turnsCompleted += 1;
61
+ a.tokensUsed += Number(p.inputTokens ?? 0) + Number(p.outputTokens ?? 0);
62
+ a.costUsd += Number(p.costUsd ?? 0);
63
+ a.lastAction = `Completed turn ${a.turnsCompleted}`;
64
+ a.status = "idle";
65
+ }
66
+ break;
67
+ }
68
+ case "turn_diff": {
69
+ // A turn_diff carries ChangedFile[] — a porcelain XY status and a path.
70
+ // "??" is git's code for a file that wasn't tracked before this turn,
71
+ // which is the only thing in the log that means "created". Counting it
72
+ // is what makes `filesCreatedSoFar` a real number: it was initialised to
73
+ // 0, never incremented, and shipped through the API as a count of
74
+ // created files that was structurally always zero.
75
+ const files = Array.isArray(p.files) ? p.files : [];
76
+ filesModified += files.length; // Loom attributes tree changes per turn
77
+ for (const f of files) {
78
+ if (typeof f !== "string" && String(f?.status ?? "").trim() === "??")
79
+ filesCreated += 1;
80
+ }
81
+ break;
82
+ }
83
+ case "message": {
84
+ threadLength += 1;
85
+ lastMessage = { agentId: e.agentId ?? "user", text: String(p.text ?? "").slice(0, 200), timestamp: e.ts };
86
+ break;
87
+ }
88
+ case "memory_add":
89
+ case "memory_import": {
90
+ const fact = String(p.text ?? p.file ?? p.kind ?? "").slice(0, 80);
91
+ if (fact)
92
+ memoryFacts = [fact, ...memoryFacts].slice(0, 3);
93
+ break;
94
+ }
95
+ case "error": {
96
+ if (e.agentId) {
97
+ const a = ensure(e.agentId);
98
+ a.status = "errored";
99
+ a.lastAction = `Error: ${String(p.message ?? "unknown").slice(0, 50)}`;
100
+ }
101
+ break;
102
+ }
103
+ case "status": {
104
+ if (isDecisionStatus(e) && p.decisionId)
105
+ decisionIds.push(String(p.decisionId));
106
+ break;
107
+ }
108
+ }
109
+ const snapWorthy = SNAPSHOT_KINDS.has(e.kind) || isDecisionStatus(e) || isHealStatus(e);
110
+ if (!snapWorthy)
111
+ continue;
112
+ snapshots.push({
113
+ timestampMs: e.ts,
114
+ turnIndex: Object.values(agentStates).reduce((s, a) => s + a.turnsCompleted, 0),
115
+ eventIndex: i,
116
+ batonHolder: batonHolder ?? "none",
117
+ decisionsAtPoint: [...decisionIds],
118
+ agentStates: JSON.parse(JSON.stringify(agentStates)),
119
+ memorySnapshot: { decisionsCount: decisionIds.length, keyFacts: [...memoryFacts] },
120
+ threadLength,
121
+ lastMessage,
122
+ filesCreatedSoFar: filesCreated,
123
+ filesModifiedSoFar: filesModified,
124
+ triggerEvent: { type: isDecisionStatus(e) ? "decision" : e.kind, agentId: e.agentId ?? String(p.agentId ?? "system"), description: describeEvent(e) },
125
+ });
126
+ }
127
+ return snapshots;
128
+ }
129
+ //# sourceMappingURL=snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/observability/snapshots.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4BH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;AACzH,MAAM,gBAAgB,GAAG,CAAC,CAAY,EAAW,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAK,CAAC,CAAC,OAAmC,CAAC,KAAK,KAAK,gBAAgB,CAAC;AAC7I,MAAM,YAAY,GAAG,CAAC,CAAY,EAAW,EAAE,CAC7C,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAE,CAAC,CAAC,OAAmC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjI,SAAS,aAAa,CAAC,CAAY;IACjC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC;IACzD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,cAAc,CAAC,CAAC,OAAO,GAAG,KAAK,iBAAiB,CAAC;QACtD,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,iBAAiB,CAAC;QAC3I,KAAK,OAAO,CAAC,CAAC,OAAO,GAAG,KAAK,aAAa,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACjF,KAAK,eAAe,CAAC,CAAC,OAAO,eAAe,CAAC;QAC7C,KAAK,iBAAiB,CAAC,CAAC,OAAO,iBAAiB,CAAC;QACjD,KAAK,cAAc,CAAC,CAAC,OAAO,iBAAiB,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACjF,KAAK,QAAQ;YACX,IAAI,gBAAgB,CAAC,CAAC,CAAC;gBAAE,OAAO,GAAG,KAAK,aAAa,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,CAAC,KAAK,KAAK,oBAAoB;gBAAE,OAAO,uBAAuB,KAAK,EAAE,CAAC;YAC5E,IAAI,CAAC,CAAC,KAAK,KAAK,gBAAgB;gBAAE,OAAO,gBAAgB,KAAK,EAAE,CAAC;YACjE,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,MAAM,WAAW,GAAmC,EAAE,CAAC;IACvD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAgC,IAAI,CAAC;IACpD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,WAAW,GAAa,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,CAAC,EAAU,EAAkB,EAAE,CAC5C,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;QAE/C,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACzC,IAAI,EAAE,EAAE,CAAC;oBAAC,WAAW,GAAG,EAAE,CAAC;oBAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC;gBAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBAChD,IAAI,EAAE,EAAE,CAAC;oBACP,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;oBACrB,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC;oBACtB,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;oBACzE,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;oBACpC,CAAC,CAAC,UAAU,GAAG,kBAAkB,CAAC,CAAC,cAAc,EAAE,CAAC;oBACpD,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;gBACpB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,wEAAwE;gBACxE,sEAAsE;gBACtE,uEAAuE;gBACvE,yEAAyE;gBACzE,kEAAkE;gBAClE,mDAAmD;gBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,KAA6C,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7F,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,wCAAwC;gBACvE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI;wBAAE,YAAY,IAAI,CAAC,CAAC;gBAC1F,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,YAAY,IAAI,CAAC,CAAC;gBAClB,WAAW,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1G,MAAM;YACR,CAAC;YACD,KAAK,YAAY,CAAC;YAClB,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnE,IAAI,IAAI;oBAAE,WAAW,GAAG,CAAC,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;oBAAC,CAAC,CAAC,UAAU,GAAG,UAAU,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAAC,CAAC;gBAC7I,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU;oBAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;gBAChF,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,SAAS,CAAC,IAAI,CAAC;YACb,WAAW,EAAE,CAAC,CAAC,EAAE;YACjB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YAC/E,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,WAAW,IAAI,MAAM;YAClC,gBAAgB,EAAE,CAAC,GAAG,WAAW,CAAC;YAClC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAmC;YACtF,cAAc,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,WAAW,CAAC,EAAE;YAClF,YAAY;YACZ,WAAW;YACX,iBAAiB,EAAE,YAAY;YAC/B,kBAAkB,EAAE,aAAa;YACjC,YAAY,EAAE,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE;SACtJ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Agent self-triage — "why did I fail?"
3
+ *
4
+ * Agent-native observability: an agent (or you, on its behalf) reads its OWN
5
+ * OpenTelemetry traces back out of the telemetry backend and gets a root cause.
6
+ * We query the agent's recent spans from ClickHouse (the backend's store),
7
+ * derive a deterministic root cause + fix from them, and — when Claude is
8
+ * reachable (an Anthropic key, or the `claude` CLI you're already signed into) —
9
+ * have Claude phrase it. The local event log is a fallback source so triage
10
+ * still works if the backend is down.
11
+ */
12
+ import type { LoomEvent } from "../types.js";
13
+ /**
14
+ * The `claude` CLI in print mode emits either JSON (`--output-format json`,
15
+ * whose `.result` is the text) or, on older CLIs, the raw text itself. Pull the
16
+ * completion out of whichever we got; return null for an empty/again-parseable
17
+ * result so triage falls back to the deterministic root cause.
18
+ */
19
+ export declare function parseCliOutput(raw: string): string | null;
20
+ export type TriageSpan = {
21
+ ts: number;
22
+ name: string;
23
+ ms: number;
24
+ code: number;
25
+ msg: string;
26
+ kind: string;
27
+ cost: number;
28
+ tin: number;
29
+ tout: number;
30
+ };
31
+ export type TriageResult = {
32
+ agent: string;
33
+ spanCount: number;
34
+ errorCount: number;
35
+ evidence: TriageSpan[];
36
+ rootCause: string;
37
+ suggestedFix: string;
38
+ source: "llm" | "heuristic" | "no-data";
39
+ from: "backend" | "local-log" | "none";
40
+ };
41
+ /** Concatenate the text blocks of an Anthropic /v1/messages response. */
42
+ export declare function parseAnthropicText(json: unknown): string | null;
43
+ /** The triage prompt — the agent's spans, newest first, and what to answer. */
44
+ export declare function triagePrompt(agent: string, spans: TriageSpan[]): string;
45
+ /**
46
+ * Triage one agent. `fallbackEvents` (the local log) is used only when the
47
+ * backend has nothing, so triage always returns something useful.
48
+ */
49
+ export declare function triageAgent(agent: string, fallbackEvents?: LoomEvent[]): Promise<TriageResult>;
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Agent self-triage — "why did I fail?"
3
+ *
4
+ * Agent-native observability: an agent (or you, on its behalf) reads its OWN
5
+ * OpenTelemetry traces back out of the telemetry backend and gets a root cause.
6
+ * We query the agent's recent spans from ClickHouse (the backend's store),
7
+ * derive a deterministic root cause + fix from them, and — when Claude is
8
+ * reachable (an Anthropic key, or the `claude` CLI you're already signed into) —
9
+ * have Claude phrase it. The local event log is a fallback source so triage
10
+ * still works if the backend is down.
11
+ */
12
+ import { spawn } from "../core/process.js";
13
+ import os from "node:os";
14
+ import { SERVICE_NAME, SPAN_TABLE, chLiteral, chQuery } from "./clickhouse.js";
15
+ /**
16
+ * The `claude` CLI in print mode emits either JSON (`--output-format json`,
17
+ * whose `.result` is the text) or, on older CLIs, the raw text itself. Pull the
18
+ * completion out of whichever we got; return null for an empty/again-parseable
19
+ * result so triage falls back to the deterministic root cause.
20
+ */
21
+ export function parseCliOutput(raw) {
22
+ const text = (raw || "").trim();
23
+ if (!text)
24
+ return null;
25
+ try {
26
+ const j = JSON.parse(text);
27
+ if (j.is_error)
28
+ return null;
29
+ const r = typeof j.result === "string" ? j.result.trim() : "";
30
+ return r || null;
31
+ }
32
+ catch {
33
+ return text; // not JSON — treat as plain text
34
+ }
35
+ }
36
+ /**
37
+ * A copy of the environment with Claude Code's nesting markers removed. When the
38
+ * daemon is launched from inside a Claude Code session (or CI), the child
39
+ * `claude` would otherwise inherit a child-session OAuth token that returns
40
+ * empty completions. Stripping these is a no-op in a normal terminal.
41
+ */
42
+ function cliEnv() {
43
+ const env = {};
44
+ for (const [k, v] of Object.entries(process.env)) {
45
+ if (k === "CLAUDECODE" || /^CLAUDE_CODE/i.test(k))
46
+ continue;
47
+ env[k] = v;
48
+ }
49
+ return env;
50
+ }
51
+ function safeId(id) {
52
+ return id.replace(/[^\w.\-:]/g, "");
53
+ }
54
+ /**
55
+ * Pull the agent's own spans (its turns + the handoffs it's part of) from the
56
+ * telemetry backend.
57
+ */
58
+ async function fetchAgentSpans(agent, limit = 40) {
59
+ const a = safeId(agent);
60
+ const sql = `
61
+ SELECT toUnixTimestamp64Milli(timestamp) AS ts, name,
62
+ round(duration_nano / 1e6) AS ms, status_code AS code, status_message AS msg,
63
+ attributes_string['loom.event.kind'] AS kind,
64
+ attributes_number['gen_ai.usage.cost_usd'] AS cost,
65
+ toUInt32(attributes_number['gen_ai.usage.input_tokens']) AS tin,
66
+ toUInt32(attributes_number['gen_ai.usage.output_tokens']) AS tout
67
+ FROM ${SPAN_TABLE}
68
+ WHERE \`resource_string_service$$name\` = '${chLiteral(SERVICE_NAME)}'
69
+ AND (attributes_string['gen_ai.agent.id'] = '${a}'
70
+ OR attributes_string['loom.handoff.to'] = '${a}'
71
+ OR attributes_string['loom.handoff.from'] = '${a}')
72
+ ORDER BY timestamp DESC
73
+ LIMIT ${Math.min(120, limit)}`;
74
+ const rows = await chQuery(sql);
75
+ return rows.map((r) => ({
76
+ ts: Number(r.ts),
77
+ name: String(r.name),
78
+ ms: Number(r.ms),
79
+ code: Number(r.code),
80
+ msg: String(r.msg ?? ""),
81
+ kind: String(r.kind ?? ""),
82
+ cost: Number(r.cost ?? 0),
83
+ tin: Number(r.tin ?? 0),
84
+ tout: Number(r.tout ?? 0),
85
+ }));
86
+ }
87
+ /**
88
+ * Fallback: derive trace-shaped rows from the local event log (same data the
89
+ * backend gets).
90
+ */
91
+ function spansFromLog(agent, events) {
92
+ const out = [];
93
+ for (const e of events) {
94
+ const p = e.payload ?? {};
95
+ const mine = e.agentId === agent || p.to === agent || p.from === agent || p.agent === agent;
96
+ if (!mine)
97
+ continue;
98
+ if (e.kind === "run_complete") {
99
+ // The turn's real cost, the same field the backend path reads into `cost`
100
+ // and the same one insightSpansFromLog takes. This was a literal 0: every
101
+ // fallback turn came back free, which is a number nobody measured sitting
102
+ // in the column where a measured one goes. Nothing renders triage evidence
103
+ // costs today — but a fabricated zero is only ever one render away from
104
+ // being believed, and the log has the answer right here.
105
+ out.push({ ts: e.ts, name: "gen_ai.agent.turn", ms: Number(p.durationMs ?? 0), code: p.error ? 2 : 1,
106
+ msg: String(p.error ?? ""), kind: e.kind, cost: Number(p.costUsd ?? 0), tin: Number(p.inputTokens ?? 0), tout: Number(p.outputTokens ?? 0) });
107
+ }
108
+ else if (e.kind === "error") {
109
+ out.push({ ts: e.ts, name: "loom.error", ms: 0, code: 2, msg: String(p.message ?? "error"), kind: e.kind, cost: 0, tin: 0, tout: 0 });
110
+ }
111
+ else if (e.kind === "route_failed") {
112
+ out.push({ ts: e.ts, name: "loom.route.failed", ms: 0, code: 2, msg: String(p.error ?? p.reason ?? "route failed"), kind: e.kind, cost: 0, tin: 0, tout: 0 });
113
+ }
114
+ else if (e.kind === "handoff") {
115
+ out.push({ ts: e.ts, name: "loom.baton.handoff", ms: 0, code: 1, msg: `${p.from ?? "?"} -> ${p.to ?? "?"}`, kind: e.kind, cost: 0, tin: 0, tout: 0 });
116
+ }
117
+ else if (e.kind === "needs_input") {
118
+ out.push({ ts: e.ts, name: "loom.needs_input", ms: 0, code: 1, msg: String(p.question ?? "needs input"), kind: e.kind, cost: 0, tin: 0, tout: 0 });
119
+ }
120
+ }
121
+ return out.sort((a, b) => b.ts - a.ts).slice(0, 40);
122
+ }
123
+ const isError = (s) => s.code === 2 || s.name === "loom.error" || s.name === "loom.route.failed";
124
+ function humanAgo(ms) {
125
+ const s = Math.max(0, Math.round((Date.now() - ms) / 1000));
126
+ if (s < 60)
127
+ return `${s}s ago`;
128
+ if (s < 3600)
129
+ return `${Math.round(s / 60)}m ago`;
130
+ if (s < 86400)
131
+ return `${Math.round(s / 3600)}h ago`;
132
+ return `${Math.round(s / 86400)}d ago`;
133
+ }
134
+ /** Deterministic root cause from the spans — reliable, no model required. */
135
+ function heuristic(agent, spans) {
136
+ const errors = spans.filter(isError);
137
+ const turns = spans.filter((s) => s.name === "gen_ai.agent.turn");
138
+ if (!spans.length) {
139
+ return { rootCause: `No traces for ${agent} yet.`, suggestedFix: "Run a turn so it emits telemetry, then triage again." };
140
+ }
141
+ if (!errors.length) {
142
+ const slow = [...turns].sort((a, b) => b.ms - a.ms)[0];
143
+ return {
144
+ rootCause: `${agent} looks healthy — ${turns.length} turn(s), no error spans in its last ${spans.length} events${slow ? `, slowest turn ${slow.ms}ms` : ""}.`,
145
+ suggestedFix: "Nothing to fix; the agent completed its turns cleanly.",
146
+ };
147
+ }
148
+ const last = errors[0];
149
+ const ago = humanAgo(last.ts);
150
+ const where = last.name === "loom.route.failed" ? "a route step" : last.name === "loom.error" ? "the agent itself" : `a ${last.name}`;
151
+ // upstream: the handoff that last passed the baton INTO this agent
152
+ const upstream = spans.find((s) => s.name === "loom.baton.handoff" && s.msg.endsWith(`-> ${agent}`));
153
+ const upTxt = upstream ? ` Upstream: the baton reached it via ${upstream.msg.replace(" -> ", " → ")}.` : "";
154
+ const rootCause = `${agent} hit ${errors.length} error(s); the most recent (${ago}) was on ${where}: "${(last.msg || "unknown").slice(0, 220)}".${upTxt}`;
155
+ const m = last.msg.toLowerCase();
156
+ let fix = "Open the failing span in the telemetry backend for the full context, then retry the turn.";
157
+ if (/exited|crash|serve exited|killed|sigterm|sigkill|process/.test(m))
158
+ fix = "The agent process crashed — restart the agent (or its CLI/daemon) and re-hand the baton.";
159
+ else if (/timeout|timed out|deadline/.test(m))
160
+ fix = "A call timed out — raise the tool/turn timeout or check the upstream service, then re-hand the baton.";
161
+ else if (/permission|denied|unauthor|not signed|401|403/.test(m))
162
+ fix = "Auth/permission failure — re-sign-in the agent's CLI (or refresh its API key) and retry.";
163
+ else if (/json|parse|malformed|unexpected token|bad request/.test(m))
164
+ fix = "Malformed input, likely from the upstream handoff — validate the briefing/JSON before passing the baton.";
165
+ else if (/rate|429|quota|limit/.test(m))
166
+ fix = "Rate-limited — back off and retry, or route the turn to a fallback agent.";
167
+ else if (/model .* (not )?support|no public api/.test(m))
168
+ fix = "The model/endpoint isn't supported — switch the agent's model in .loom/config.json.";
169
+ return { rootCause, suggestedFix: fix };
170
+ }
171
+ /** The triage model, overridable so an operator isn't pinned to one release. */
172
+ const TRIAGE_MODEL = process.env.LOOM_TRIAGE_MODEL || "claude-haiku-4-5-20251001";
173
+ /** Concatenate the text blocks of an Anthropic /v1/messages response. */
174
+ export function parseAnthropicText(json) {
175
+ const j = json;
176
+ const text = (j?.content ?? []).map((c) => (typeof c.text === "string" ? c.text : "")).join("").trim();
177
+ return text || null;
178
+ }
179
+ /** The triage prompt — the agent's spans, newest first, and what to answer. */
180
+ export function triagePrompt(agent, spans) {
181
+ const lines = spans
182
+ .slice(0, 30)
183
+ .map((s) => `${new Date(s.ts).toISOString()} ${s.name} ${s.ms}ms status=${s.code}${s.msg ? ` "${s.msg.slice(0, 160)}"` : ""}`)
184
+ .join("\n");
185
+ return (`You are triaging a coding agent named "${agent}" from its OpenTelemetry traces (newest first):\n\n${lines}\n\n` +
186
+ `In 2-3 sentences: the root cause of any failure, the specific span/turn, any upstream handoff, and one concrete fix. If healthy, say so plainly.`);
187
+ }
188
+ /**
189
+ * Ask Claude to phrase the root cause. Two independent paths so LLM prose works
190
+ * in ANY environment: the Anthropic API (an ANTHROPIC_API_KEY, works headless /
191
+ * in CI / behind a server) first, then the signed-in `claude` CLI. Either one
192
+ * returning text wins; null (→ deterministic heuristic) only if both are absent.
193
+ */
194
+ async function llmPhrase(agent, spans) {
195
+ // Deterministic escape hatch (tests, or an operator who wants heuristic only).
196
+ if (process.env.LOOM_TRIAGE_NO_LLM === "1")
197
+ return null;
198
+ const prompt = triagePrompt(agent, spans);
199
+ const key = process.env.ANTHROPIC_API_KEY;
200
+ if (key && typeof globalThis.fetch === "function") {
201
+ try {
202
+ const res = await fetch("https://api.anthropic.com/v1/messages", {
203
+ method: "POST",
204
+ headers: { "content-type": "application/json", "x-api-key": key, "anthropic-version": "2023-06-01" },
205
+ body: JSON.stringify({ model: TRIAGE_MODEL, max_tokens: 320, messages: [{ role: "user", content: prompt }] }),
206
+ });
207
+ if (res.ok) {
208
+ const text = parseAnthropicText(await res.json());
209
+ if (text)
210
+ return text;
211
+ }
212
+ }
213
+ catch {
214
+ /* fall through to CLI */
215
+ }
216
+ }
217
+ return await claudeCli(prompt);
218
+ }
219
+ /**
220
+ * Best-effort: run the prompt through the signed-in `claude` CLI in print mode.
221
+ * We ask for JSON so we can read `.result` reliably, run in a neutral cwd (no
222
+ * project trust dialog, no giant CLAUDE.md pulled into context), and strip the
223
+ * Claude Code nesting vars so a daemon started from inside a session still gets
224
+ * a real completion. Falls back to null (→ heuristic) on timeout/empty.
225
+ */
226
+ function claudeCli(prompt) {
227
+ return new Promise((resolve) => {
228
+ let child;
229
+ try {
230
+ child = spawn("claude", ["-p", prompt, "--output-format", "json"], {
231
+ stdio: ["ignore", "pipe", "ignore"],
232
+ cwd: os.tmpdir(),
233
+ env: cliEnv(),
234
+ });
235
+ }
236
+ catch {
237
+ resolve(null);
238
+ return;
239
+ }
240
+ let out = "";
241
+ const kill = setTimeout(() => { try {
242
+ child.kill();
243
+ }
244
+ catch { /* ignore */ } resolve(null); }, 30_000);
245
+ child.stdout?.on("data", (d) => (out += d.toString()));
246
+ child.on("error", () => { clearTimeout(kill); resolve(null); });
247
+ child.on("close", () => { clearTimeout(kill); resolve(parseCliOutput(out)); });
248
+ });
249
+ }
250
+ /**
251
+ * Triage one agent. `fallbackEvents` (the local log) is used only when the
252
+ * backend has nothing, so triage always returns something useful.
253
+ */
254
+ export async function triageAgent(agent, fallbackEvents = []) {
255
+ let spans = [];
256
+ let from = "none";
257
+ try {
258
+ spans = await fetchAgentSpans(agent);
259
+ if (spans.length)
260
+ from = "backend";
261
+ }
262
+ catch {
263
+ /* the backend's ClickHouse unreachable — fall back to the local log */
264
+ }
265
+ if (!spans.length && fallbackEvents.length) {
266
+ spans = spansFromLog(agent, fallbackEvents);
267
+ if (spans.length)
268
+ from = "local-log";
269
+ }
270
+ const errorCount = spans.filter(isError).length;
271
+ const base = heuristic(agent, spans);
272
+ const llm = spans.length ? await llmPhrase(agent, spans) : null;
273
+ return {
274
+ agent,
275
+ spanCount: spans.length,
276
+ errorCount,
277
+ evidence: spans.slice(0, 12),
278
+ rootCause: llm ?? base.rootCause,
279
+ suggestedFix: base.suggestedFix,
280
+ source: llm ? "llm" : spans.length ? "heuristic" : "no-data",
281
+ from,
282
+ };
283
+ }
284
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/observability/triage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The provider adapter contract. An adapter owns one provider's protocol and
3
+ * its live sessions; everything above it (ProviderService, ingestion, Brain,
4
+ * clients) sees only these operations and the canonical runtime events.
5
+ *
6
+ * Ported from t3code's provider/Services/ProviderAdapter.ts (MIT, © T3 Tools
7
+ * Inc.) as a plain async interface. One difference: t3code keys sessions by
8
+ * thread alone, because a thread never changes driver. Loom switches provider
9
+ * within a chat, so each adapter instance serves one Loom agent and keys its
10
+ * sessions by chat; the service routes (chat, agent) to the right adapter.
11
+ */
12
+ import type { AdapterCapabilities, ApprovalDecision, InstanceId, ProviderKind, ProviderRuntimeEvent, ProviderSession, RequestId, SendTurnInput, SessionStartInput, ThreadId, ThreadSnapshot, TurnId, TurnStartResult, UserInputAnswers } from "./contracts.js";
13
+ export type RuntimeEventListener = (event: ProviderRuntimeEvent) => void;
14
+ export interface ProviderAdapter {
15
+ readonly provider: ProviderKind;
16
+ /** The Loom agent this adapter serves. */
17
+ readonly instanceId: InstanceId;
18
+ readonly capabilities: AdapterCapabilities;
19
+ /** Start a session, or resume one from `resumeCursor`. Resolves once the session is ready. */
20
+ startSession(input: SessionStartInput): Promise<ProviderSession>;
21
+ /** Start a turn on a live session. Resolves once the provider has accepted it. */
22
+ sendTurn(input: SendTurnInput): Promise<TurnStartResult>;
23
+ /** Interrupt the active turn (or `turnId`). Resolves once the provider has acknowledged. */
24
+ interruptTurn(threadId: ThreadId, turnId?: TurnId): Promise<void>;
25
+ respondToRequest(threadId: ThreadId, requestId: RequestId, decision: ApprovalDecision): Promise<void>;
26
+ respondToUserInput(threadId: ThreadId, requestId: RequestId, answers: UserInputAnswers): Promise<void>;
27
+ /** Start a compaction; completion arrives as `thread.state.changed: compacted`. */
28
+ compact?(threadId: ThreadId): Promise<void>;
29
+ readThread?(threadId: ThreadId): Promise<ThreadSnapshot>;
30
+ rollbackThread?(threadId: ThreadId, numTurns: number): Promise<ThreadSnapshot>;
31
+ /** Stop one session and wait for its process to be gone. */
32
+ stopSession(threadId: ThreadId): Promise<void>;
33
+ stopAll(): Promise<void>;
34
+ listSessions(): ProviderSession[];
35
+ hasSession(threadId: ThreadId): boolean;
36
+ /** Subscribe to this adapter's canonical events. Returns an unsubscribe. */
37
+ onEvent(listener: RuntimeEventListener): () => void;
38
+ }
39
+ /**
40
+ * A synchronous fan-out for runtime events. A throwing listener is isolated so
41
+ * one bad subscriber cannot stop the others from seeing the stream.
42
+ */
43
+ export declare class EventHub<T> {
44
+ private readonly onListenerError;
45
+ private readonly listeners;
46
+ constructor(onListenerError?: (error: unknown) => void);
47
+ subscribe(listener: (event: T) => void): () => void;
48
+ publish(event: T): void;
49
+ get size(): number;
50
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The provider adapter contract. An adapter owns one provider's protocol and
3
+ * its live sessions; everything above it (ProviderService, ingestion, Brain,
4
+ * clients) sees only these operations and the canonical runtime events.
5
+ *
6
+ * Ported from t3code's provider/Services/ProviderAdapter.ts (MIT, © T3 Tools
7
+ * Inc.) as a plain async interface. One difference: t3code keys sessions by
8
+ * thread alone, because a thread never changes driver. Loom switches provider
9
+ * within a chat, so each adapter instance serves one Loom agent and keys its
10
+ * sessions by chat; the service routes (chat, agent) to the right adapter.
11
+ */
12
+ /**
13
+ * A synchronous fan-out for runtime events. A throwing listener is isolated so
14
+ * one bad subscriber cannot stop the others from seeing the stream.
15
+ */
16
+ export class EventHub {
17
+ onListenerError;
18
+ listeners = new Set();
19
+ constructor(onListenerError = () => { }) {
20
+ this.onListenerError = onListenerError;
21
+ }
22
+ subscribe(listener) {
23
+ this.listeners.add(listener);
24
+ return () => { this.listeners.delete(listener); };
25
+ }
26
+ publish(event) {
27
+ for (const listener of [...this.listeners]) {
28
+ try {
29
+ listener(event);
30
+ }
31
+ catch (error) {
32
+ this.onListenerError(error);
33
+ }
34
+ }
35
+ }
36
+ get size() { return this.listeners.size; }
37
+ }
38
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/providers/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoCH;;;GAGG;AACH,MAAM,OAAO,QAAQ;IAEU;IADZ,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3D,YAA6B,kBAA4C,GAAG,EAAE,GAAE,CAAC;QAApD,oBAAe,GAAf,eAAe,CAAqC;IAAG,CAAC;IAErF,SAAS,CAAC,QAA4B;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,KAAQ;QACd,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC;gBAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;CACnD"}