@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,215 @@
1
+ import { MAIN_CHAT } from "../../types.js";
2
+ import { ContinuityStore } from "../continuity/store.js";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { randomUUID } from "node:crypto";
6
+ import { isDeepStrictEqual } from "node:util";
7
+ import { ContinuityError, digest } from "../continuity/contracts.js";
8
+ export class SqliteStore {
9
+ db;
10
+ continuity;
11
+ file;
12
+ constructor(sqlite, file) {
13
+ this.file = file;
14
+ this.db = new sqlite.DatabaseSync(file);
15
+ this.db.exec(`
16
+ CREATE TABLE IF NOT EXISTS events (
17
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18
+ ts INTEGER NOT NULL,
19
+ kind TEXT NOT NULL,
20
+ agent_id TEXT,
21
+ chat TEXT,
22
+ payload TEXT NOT NULL
23
+ );
24
+ CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind, id);
25
+ `);
26
+ // Migrate BEFORE indexing chat. A log written before chats existed already
27
+ // has an `events` table, so CREATE TABLE IF NOT EXISTS is a no-op and the
28
+ // column is still missing — indexing it here would throw "no such column"
29
+ // and take the whole log down with it. Add the column, then index.
30
+ // The log is append-only and those events are history: a NULL chat reads
31
+ // as the main conversation rather than being rewritten.
32
+ const cols = this.db.prepare("PRAGMA table_info(events)").all();
33
+ if (!cols.some((c) => c.name === "chat")) {
34
+ this.db.exec("ALTER TABLE events ADD COLUMN chat TEXT");
35
+ }
36
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_events_chat ON events(chat, id)");
37
+ // time windows over one kind: today's spend, the cost/usage charts
38
+ this.db.exec("CREATE INDEX IF NOT EXISTS idx_events_kind_ts ON events(kind, ts)");
39
+ this.continuity = new ContinuityStore(this.db, file);
40
+ }
41
+ /** Explicit offline migration. Conflicting IDs or malformed records abort the
42
+ * entire import; original files and IDs stay intact. Never silently renumber. */
43
+ importJsonl(file) {
44
+ const ownerTable = this.db.prepare("SELECT name FROM sqlite_master WHERE name='continuity_meta'").get();
45
+ if (ownerTable && this.db.prepare("SELECT value FROM continuity_meta WHERE key='owner'").get())
46
+ throw new ContinuityError("conflict", "close the Brain project owner before importing legacy history");
47
+ const events = this.readJsonl(file), hash = digest(fs.readFileSync(file, "utf8"));
48
+ const backup = `${file}.before-brain-v1.${randomUUID()}`;
49
+ fs.copyFileSync(file, backup, fs.constants.COPYFILE_EXCL);
50
+ const dbBackup = `${path.join(path.dirname(file), "log.db")}.before-jsonl.${randomUUID()}.db`;
51
+ this.db.prepare("VACUUM INTO ?").run(dbBackup);
52
+ let imported = 0, known = 0;
53
+ this.db.exec("BEGIN IMMEDIATE");
54
+ try {
55
+ this.db.exec("CREATE TABLE IF NOT EXISTS continuity_imports (hash TEXT PRIMARY KEY, source TEXT NOT NULL, count INTEGER NOT NULL, backup TEXT NOT NULL)");
56
+ for (const event of events) {
57
+ const prior = this.eventById(event.id);
58
+ if (prior) {
59
+ if (!isDeepStrictEqual(prior, event))
60
+ throw new ContinuityError("conflict", `legacy event ID ${event.id} conflicts with SQLite; reconcile the two backups before import`);
61
+ known++;
62
+ continue;
63
+ }
64
+ this.db.prepare("INSERT INTO events(id,ts,kind,agent_id,chat,payload) VALUES (?,?,?,?,?,?)")
65
+ .run(event.id, event.ts, event.kind, event.agentId ?? null, event.chat ?? null, JSON.stringify(event.payload));
66
+ imported++;
67
+ }
68
+ this.db.prepare("INSERT OR IGNORE INTO continuity_imports VALUES (?,?,?,?)").run(hash, path.basename(file), events.length, path.basename(backup));
69
+ this.db.exec("COMMIT");
70
+ }
71
+ catch (error) {
72
+ this.db.exec("ROLLBACK");
73
+ throw error;
74
+ }
75
+ return { imported, known, backup };
76
+ }
77
+ verifyJsonl(file) {
78
+ if (!fs.existsSync(file) || !fs.statSync(file).size)
79
+ return;
80
+ for (const event of this.readJsonl(file))
81
+ if (!isDeepStrictEqual(event, this.eventById(event.id)))
82
+ throw new ContinuityError("conflict", "SQLite and JSONL contain distinct histories; stop the daemon and run loom brain:migrate before continuing");
83
+ }
84
+ eventById(id) {
85
+ const row = this.db.prepare("SELECT * FROM events WHERE id=?").get(id);
86
+ return row ? { id: row.id, ts: row.ts, kind: row.kind, ...(row.agent_id ? { agentId: row.agent_id } : {}),
87
+ ...(row.chat ? { chat: row.chat } : {}), payload: JSON.parse(row.payload) } : undefined;
88
+ }
89
+ readJsonl(file) {
90
+ if (fs.statSync(file).size > 100_000_000)
91
+ throw new ContinuityError("overflow", "legacy import exceeds the 100 MB offline import limit");
92
+ let last = 0;
93
+ return fs.readFileSync(file, "utf8").split("\n").filter(line => line.trim()).map(line => {
94
+ let event;
95
+ try {
96
+ event = JSON.parse(line);
97
+ }
98
+ catch {
99
+ throw new ContinuityError("invalid", "malformed JSONL record; repair a copy before migration (original left intact)");
100
+ }
101
+ if (!Number.isSafeInteger(event.id) || event.id <= last || !Number.isSafeInteger(event.ts) ||
102
+ typeof event.kind !== "string" || !event.payload || typeof event.payload !== "object" || Array.isArray(event.payload) ||
103
+ (event.chat !== undefined && typeof event.chat !== "string") || (event.agentId !== undefined && typeof event.agentId !== "string"))
104
+ throw new ContinuityError("invalid", "invalid or duplicate/out-of-order legacy event");
105
+ last = event.id;
106
+ return { id: event.id, ts: event.ts, kind: event.kind, ...(event.agentId ? { agentId: event.agentId } : {}), ...(event.chat ? { chat: event.chat } : {}), payload: event.payload };
107
+ });
108
+ }
109
+ append(e) {
110
+ this.continuity.guardEventWriter();
111
+ const stmt = this.db.prepare("INSERT INTO events (ts, kind, agent_id, chat, payload) VALUES (?, ?, ?, ?, ?)");
112
+ const res = stmt.run(e.ts, e.kind, e.agentId ?? null, e.chat ?? null, JSON.stringify(e.payload));
113
+ return {
114
+ id: Number(res.lastInsertRowid),
115
+ ts: e.ts,
116
+ kind: e.kind,
117
+ ...(e.agentId ? { agentId: e.agentId } : {}),
118
+ ...(e.chat ? { chat: e.chat } : {}),
119
+ payload: e.payload,
120
+ };
121
+ }
122
+ /** The WHERE clause every read shares (list and count). */
123
+ where(opts) {
124
+ const clauses = [];
125
+ const params = [];
126
+ if (opts.since !== undefined) {
127
+ clauses.push("id > ?");
128
+ params.push(opts.since);
129
+ }
130
+ if (opts.before !== undefined) {
131
+ clauses.push("id < ?");
132
+ params.push(opts.before);
133
+ }
134
+ if (opts.kinds?.length) {
135
+ clauses.push(`kind IN (${opts.kinds.map(() => "?").join(",")})`);
136
+ params.push(...opts.kinds);
137
+ }
138
+ if (opts.sinceTs !== undefined) {
139
+ clauses.push("ts >= ?");
140
+ params.push(opts.sinceTs);
141
+ }
142
+ if (opts.chat !== undefined) {
143
+ if (opts.chat === MAIN_CHAT) {
144
+ // pre-chat history has no id and belongs to the main conversation
145
+ clauses.push("(chat = ? OR chat IS NULL)");
146
+ }
147
+ else {
148
+ clauses.push("chat = ?");
149
+ }
150
+ params.push(opts.chat);
151
+ }
152
+ if (opts.agentId !== undefined) {
153
+ clauses.push("agent_id = ?");
154
+ params.push(opts.agentId);
155
+ }
156
+ return { where: clauses.length ? `WHERE ${clauses.join(" AND ")}` : "", params };
157
+ }
158
+ count(opts = {}) {
159
+ const { where, params } = this.where(opts);
160
+ const row = this.db.prepare(`SELECT COUNT(*) AS n FROM events ${where}`).get(...params);
161
+ return Number(row.n);
162
+ }
163
+ list(opts = {}) {
164
+ const { where, params } = this.where(opts);
165
+ return this.listWhere(opts, where, params);
166
+ }
167
+ listWhere(opts, where, params) {
168
+ // When limiting, we want the *most recent* N in ascending order.
169
+ const sql = opts.limit
170
+ ? `SELECT * FROM (SELECT * FROM events ${where} ORDER BY id DESC LIMIT ?) ORDER BY id ASC`
171
+ : `SELECT * FROM events ${where} ORDER BY id ASC`;
172
+ if (opts.limit)
173
+ params.push(opts.limit);
174
+ const rows = this.db.prepare(sql).all(...params);
175
+ return rows.map((r) => ({
176
+ id: Number(r.id),
177
+ ts: r.ts,
178
+ kind: r.kind,
179
+ ...(r.agent_id ? { agentId: r.agent_id } : {}),
180
+ ...(r.chat ? { chat: r.chat } : {}),
181
+ payload: JSON.parse(r.payload),
182
+ }));
183
+ }
184
+ size() {
185
+ const n = this.db.prepare("SELECT COUNT(*) AS n FROM events").get();
186
+ let bytes = 0;
187
+ for (const f of [this.file, `${this.file}-wal`]) {
188
+ try {
189
+ bytes += fs.statSync(f).size;
190
+ }
191
+ catch {
192
+ /* no wal file is fine */
193
+ }
194
+ }
195
+ return { bytes, events: Number(n.n) };
196
+ }
197
+ compact() {
198
+ this.db.exec("VACUUM");
199
+ }
200
+ lastReplyIds() {
201
+ const rows = this.db
202
+ .prepare("SELECT COALESCE(chat, ?) AS c, MAX(id) AS m FROM events WHERE kind = 'message' AND agent_id IS NOT NULL GROUP BY COALESCE(chat, ?)")
203
+ .all(MAIN_CHAT, MAIN_CHAT);
204
+ return new Map(rows.map((r) => [r.c, Number(r.m)]));
205
+ }
206
+ lastId() {
207
+ const row = this.db.prepare("SELECT MAX(id) AS m FROM events").get();
208
+ return row?.m ? Number(row.m) : 0;
209
+ }
210
+ close() {
211
+ this.continuity.releaseOwner();
212
+ this.db.close();
213
+ }
214
+ }
215
+ //# sourceMappingURL=sqlite-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../../src/core/events/sqlite-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Pre-flight forecast: what a turn on this agent usually costs and takes,
3
+ * before you send it.
4
+ *
5
+ * Read from the agent's own recent turns, not a price list — a CLI on a
6
+ * subscription reports no dollars and gets a time-only forecast, a model
7
+ * agent's spend is what it actually spent here. "Typical" is the median and
8
+ * "high" the 80th percentile, so one marathon turn doesn't move the number.
9
+ * With a daily budget set, it says when one more high turn could cross it.
10
+ */
11
+ export interface Forecast {
12
+ /** How many recent turns it's read from. */
13
+ turns: number;
14
+ ms: {
15
+ typical: number;
16
+ high: number;
17
+ };
18
+ /** Absent when the agent reports no spend (a CLI on a subscription). */
19
+ usd?: {
20
+ typical: number;
21
+ high: number;
22
+ };
23
+ budget?: {
24
+ capUsd: number;
25
+ spentUsd: number;
26
+ mayCross: boolean;
27
+ };
28
+ }
29
+ /** The fewest turns a forecast is honest from. */
30
+ export declare const FORECAST_MIN_TURNS = 3;
31
+ /** How many recent turns it remembers per agent. */
32
+ export declare const FORECAST_WINDOW = 30;
33
+ export declare function forecastFrom(costs: number[], durations: number[], budget?: {
34
+ capUsd: number;
35
+ spentUsd: number;
36
+ }): Forecast | null;
37
+ /** A fixed-size record of the latest values. */
38
+ export declare class Recent {
39
+ private readonly size;
40
+ private xs;
41
+ constructor(size?: number);
42
+ push(x: number): void;
43
+ values(): number[];
44
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Pre-flight forecast: what a turn on this agent usually costs and takes,
3
+ * before you send it.
4
+ *
5
+ * Read from the agent's own recent turns, not a price list — a CLI on a
6
+ * subscription reports no dollars and gets a time-only forecast, a model
7
+ * agent's spend is what it actually spent here. "Typical" is the median and
8
+ * "high" the 80th percentile, so one marathon turn doesn't move the number.
9
+ * With a daily budget set, it says when one more high turn could cross it.
10
+ */
11
+ /** The fewest turns a forecast is honest from. */
12
+ export const FORECAST_MIN_TURNS = 3;
13
+ /** How many recent turns it remembers per agent. */
14
+ export const FORECAST_WINDOW = 30;
15
+ function quantile(xs, q) {
16
+ const s = [...xs].sort((a, b) => a - b);
17
+ const i = (s.length - 1) * q, lo = Math.floor(i), hi = Math.ceil(i);
18
+ return s[lo] + (s[hi] - s[lo]) * (i - lo);
19
+ }
20
+ export function forecastFrom(costs, durations, budget) {
21
+ const ms = durations.filter((x) => Number.isFinite(x) && x > 0);
22
+ if (ms.length < FORECAST_MIN_TURNS)
23
+ return null;
24
+ const usd = costs.filter((x) => Number.isFinite(x) && x > 0);
25
+ const out = { turns: ms.length, ms: { typical: Math.round(quantile(ms, 0.5)), high: Math.round(quantile(ms, 0.8)) } };
26
+ if (usd.length >= FORECAST_MIN_TURNS)
27
+ out.usd = { typical: round(quantile(usd, 0.5)), high: round(quantile(usd, 0.8)) };
28
+ if (budget && budget.capUsd > 0) {
29
+ const high = out.usd?.high ?? 0;
30
+ out.budget = { capUsd: budget.capUsd, spentUsd: round(budget.spentUsd), mayCross: budget.spentUsd + high >= budget.capUsd };
31
+ }
32
+ return out;
33
+ }
34
+ const round = (x) => Math.round(x * 10_000) / 10_000;
35
+ /** A fixed-size record of the latest values. */
36
+ export class Recent {
37
+ size;
38
+ xs = [];
39
+ constructor(size = FORECAST_WINDOW) {
40
+ this.size = size;
41
+ }
42
+ push(x) { this.xs.push(x); if (this.xs.length > this.size)
43
+ this.xs.shift(); }
44
+ values() { return this.xs; }
45
+ }
46
+ //# sourceMappingURL=forecast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forecast.js","sourceRoot":"","sources":["../../src/core/forecast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The free pool: a model agent that spreads its turns across every free model
3
+ * a provider serves, instead of leaning on one.
4
+ *
5
+ * OpenRouter's free models are rate-limited per model (a burst on one gets a
6
+ * 429 while the others are idle) and capped per account per day (50 requests
7
+ * on a free-tier key, 1000 with credits, shared by every `:free` model). Those
8
+ * are different failures with different answers:
9
+ *
10
+ * - one model rate-limited → rest it for a minute and take the next one;
11
+ * - the daily cap spent → every free model will say the same thing, so stop at
12
+ * once and say when it resets, rather than walking the list to collect the
13
+ * same 429 nineteen times.
14
+ *
15
+ * An agent opts in with the model id `pool:free` (`openrouter/pool:free` in a
16
+ * picker). Each turn takes the next model in a machine-wide rotation, so a
17
+ * crew of model agents on the pool lands on different models at once.
18
+ */
19
+ import { type ResolvedProvider } from "./providers.js";
20
+ export declare const FREE_POOL = "pool:free";
21
+ export declare const isPool: (model: string | undefined) => boolean;
22
+ interface PoolModel {
23
+ id: string;
24
+ context: number;
25
+ tools: boolean;
26
+ }
27
+ /** The provider's free chat models, best first (most context). */
28
+ export declare function freeModels(p: ResolvedProvider, opts?: {
29
+ tools?: boolean;
30
+ fetchImpl?: typeof fetch;
31
+ }): Promise<PoolModel[]>;
32
+ /**
33
+ * A free model the provider won't serve to Loom at all — OpenRouter keeps some
34
+ * "for agentic harnesses" on its own app list and answers 403. That's about the
35
+ * model, not the key: skip it for a week, then look again.
36
+ */
37
+ export declare function isClosedToUs(status: number, body: string): boolean;
38
+ export declare function closeModel(model: string): void;
39
+ /** Free here: by the provider's naming rule, or by the zero price its list gave. */
40
+ export declare function isFreeModel(p: ResolvedProvider, model: string): boolean;
41
+ /** A model that just said 429: leave it alone for a while. */
42
+ export declare function rest(model: string, ms?: number): void;
43
+ /**
44
+ * The order to try this turn: the next model in the rotation first, then the
45
+ * rest, with resting models at the back. `max` bounds a turn's attempts.
46
+ */
47
+ export declare function rotation(models: PoolModel[], max?: number): string[];
48
+ /** OpenRouter's "you've used today's free requests" (not one model being busy). */
49
+ export declare function isDailyCap(status: number, body: string): boolean;
50
+ /** When the cap lifts, from X-RateLimit-Reset (epoch ms or s), if it said. */
51
+ export declare function resetAt(headers: Headers | undefined): number | null;
52
+ export declare function dailyCapMessage(label: string, at: number | null): string;
53
+ /** One free request this machine made today (UTC day, as OpenRouter counts). */
54
+ export declare function countFreeRequest(): void;
55
+ /** The cap was hit: remember when, so the picker can say so without asking. */
56
+ export declare function noteCapped(at: number | null): void;
57
+ /** Today's free requests from this machine, and whether the cap is known to be hit. */
58
+ export declare function freeUsage(): {
59
+ day: string;
60
+ used: number;
61
+ cappedUntil: number | null;
62
+ };
63
+ /** Tests. */
64
+ export declare function resetPool(): void;
65
+ export {};
@@ -0,0 +1,171 @@
1
+ /**
2
+ * The free pool: a model agent that spreads its turns across every free model
3
+ * a provider serves, instead of leaning on one.
4
+ *
5
+ * OpenRouter's free models are rate-limited per model (a burst on one gets a
6
+ * 429 while the others are idle) and capped per account per day (50 requests
7
+ * on a free-tier key, 1000 with credits, shared by every `:free` model). Those
8
+ * are different failures with different answers:
9
+ *
10
+ * - one model rate-limited → rest it for a minute and take the next one;
11
+ * - the daily cap spent → every free model will say the same thing, so stop at
12
+ * once and say when it resets, rather than walking the list to collect the
13
+ * same 429 nineteen times.
14
+ *
15
+ * An agent opts in with the model id `pool:free` (`openrouter/pool:free` in a
16
+ * picker). Each turn takes the next model in a machine-wide rotation, so a
17
+ * crew of model agents on the pool lands on different models at once.
18
+ */
19
+ import fs from "node:fs";
20
+ import path from "node:path";
21
+ import { modelsUrl, requestHeaders } from "./providers.js";
22
+ import { loomHome } from "./registry.js";
23
+ export const FREE_POOL = "pool:free";
24
+ export const isPool = (model) => model?.trim() === FREE_POOL;
25
+ /** Not chat models, whatever their price: music, safety classifiers, embeddings, speech. */
26
+ const NOT_CHAT = /lyria|content-safety|guard|embed|tts|whisper|moderation|image-preview|-image\b/i;
27
+ const cache = new Map();
28
+ const LIST_TTL_MS = 30 * 60_000;
29
+ /** The provider's free chat models, best first (most context). */
30
+ export async function freeModels(p, opts = {}) {
31
+ const hit = cache.get(p.id);
32
+ let models = hit && Date.now() - hit.at < LIST_TTL_MS ? hit.models : null;
33
+ if (!models) {
34
+ const res = await (opts.fetchImpl ?? fetch)(modelsUrl(p), { headers: requestHeaders(p), signal: AbortSignal.timeout(15_000) });
35
+ if (!res.ok)
36
+ throw new Error(`${p.label} didn't list its models (${res.status})`);
37
+ const body = (await res.json());
38
+ models = (body.data ?? [])
39
+ .filter((m) => typeof m.id === "string")
40
+ .filter((m) => p.free(m.id) || (m.pricing?.prompt === "0" && m.pricing?.completion === "0"))
41
+ .filter((m) => !NOT_CHAT.test(m.id) && m.id !== "openrouter/free")
42
+ .filter((m) => !m.architecture?.output_modalities || m.architecture.output_modalities.includes("text"))
43
+ .map((m) => ({ id: m.id, context: m.context_length ?? 0, tools: (m.supported_parameters ?? []).includes("tools") }))
44
+ .sort((a, b) => b.context - a.context);
45
+ cache.set(p.id, { at: Date.now(), models });
46
+ }
47
+ const shut = closed();
48
+ return models.filter((m) => !shut.has(m.id) && (!opts.tools || m.tools));
49
+ }
50
+ // ---- models closed to Loom ---------------------------------------------------------
51
+ /**
52
+ * A free model the provider won't serve to Loom at all — OpenRouter keeps some
53
+ * "for agentic harnesses" on its own app list and answers 403. That's about the
54
+ * model, not the key: skip it for a week, then look again.
55
+ */
56
+ export function isClosedToUs(status, body) {
57
+ return (status === 403 || status === 404) && /only available (?:on|to|in)|not available (?:for|to|via)|restricted to/i.test(body);
58
+ }
59
+ const closedFile = () => path.join(loomHome(), "free-closed.json");
60
+ const WEEK = 7 * 24 * 3600_000;
61
+ function closed() {
62
+ try {
63
+ const all = JSON.parse(fs.readFileSync(closedFile(), "utf8"));
64
+ return new Set(Object.entries(all).filter(([, at]) => Date.now() - at < WEEK).map(([id]) => id));
65
+ }
66
+ catch {
67
+ return new Set();
68
+ }
69
+ }
70
+ export function closeModel(model) {
71
+ let all = {};
72
+ try {
73
+ all = JSON.parse(fs.readFileSync(closedFile(), "utf8"));
74
+ }
75
+ catch { /* none yet */ }
76
+ all[model] = Date.now();
77
+ try {
78
+ fs.mkdirSync(path.dirname(closedFile()), { recursive: true });
79
+ fs.writeFileSync(closedFile(), JSON.stringify(all));
80
+ }
81
+ catch { /* best effort */ }
82
+ }
83
+ /** Free here: by the provider's naming rule, or by the zero price its list gave. */
84
+ export function isFreeModel(p, model) {
85
+ return p.free(model) || Boolean(cache.get(p.id)?.models.some((m) => m.id === model));
86
+ }
87
+ // ---- rotation and rest -------------------------------------------------------
88
+ let cursor = 0;
89
+ const restingUntil = new Map();
90
+ /** A model that just said 429: leave it alone for a while. */
91
+ export function rest(model, ms = 60_000) {
92
+ restingUntil.set(model, Date.now() + ms);
93
+ }
94
+ /**
95
+ * The order to try this turn: the next model in the rotation first, then the
96
+ * rest, with resting models at the back. `max` bounds a turn's attempts.
97
+ */
98
+ export function rotation(models, max = 4) {
99
+ if (!models.length)
100
+ return [];
101
+ const start = cursor++ % models.length;
102
+ const ordered = [...models.slice(start), ...models.slice(0, start)].map((m) => m.id);
103
+ const now = Date.now();
104
+ const awake = ordered.filter((id) => (restingUntil.get(id) ?? 0) <= now);
105
+ const resting = ordered.filter((id) => (restingUntil.get(id) ?? 0) > now);
106
+ return [...awake, ...resting].slice(0, max);
107
+ }
108
+ // ---- the account's daily cap ---------------------------------------------------
109
+ /** OpenRouter's "you've used today's free requests" (not one model being busy). */
110
+ export function isDailyCap(status, body) {
111
+ return status === 429 && /free-models-per-day|per[- ]day|daily/i.test(body);
112
+ }
113
+ /** When the cap lifts, from X-RateLimit-Reset (epoch ms or s), if it said. */
114
+ export function resetAt(headers) {
115
+ const raw = headers?.get("x-ratelimit-reset");
116
+ const n = raw ? Number(raw) : NaN;
117
+ if (!Number.isFinite(n) || n <= 0)
118
+ return null;
119
+ return n < 1e12 ? n * 1000 : n;
120
+ }
121
+ export function dailyCapMessage(label, at) {
122
+ const when = at ? ` — it resets ${new Date(at).toLocaleString(undefined, { weekday: "short", hour: "numeric", minute: "2-digit" })}` : "";
123
+ return `${label}'s free requests for today are used up (every free model shares one daily cap)${when}. ` +
124
+ "Credits on the account raise the cap; until then, a paid model or another agent can take the turn.";
125
+ }
126
+ const usageFile = () => path.join(loomHome(), "free-usage.json");
127
+ const today = () => new Date().toISOString().slice(0, 10);
128
+ function readUsage() {
129
+ try {
130
+ const u = JSON.parse(fs.readFileSync(usageFile(), "utf8"));
131
+ if (u.day === today())
132
+ return u;
133
+ }
134
+ catch {
135
+ /* none yet */
136
+ }
137
+ return { day: today(), count: 0 };
138
+ }
139
+ function writeUsage(u) {
140
+ try {
141
+ fs.mkdirSync(path.dirname(usageFile()), { recursive: true });
142
+ fs.writeFileSync(usageFile(), JSON.stringify(u));
143
+ }
144
+ catch {
145
+ /* a counter is not worth failing a turn over */
146
+ }
147
+ }
148
+ /** One free request this machine made today (UTC day, as OpenRouter counts). */
149
+ export function countFreeRequest() {
150
+ const u = readUsage();
151
+ u.count++;
152
+ writeUsage(u);
153
+ }
154
+ /** The cap was hit: remember when, so the picker can say so without asking. */
155
+ export function noteCapped(at) {
156
+ const u = readUsage();
157
+ u.capped = at ?? Date.now() + 6 * 3600_000;
158
+ writeUsage(u);
159
+ }
160
+ /** Today's free requests from this machine, and whether the cap is known to be hit. */
161
+ export function freeUsage() {
162
+ const u = readUsage();
163
+ return { day: u.day, used: u.count, cappedUntil: u.capped && u.capped > Date.now() ? u.capped : null };
164
+ }
165
+ /** Tests. */
166
+ export function resetPool() {
167
+ cache.clear();
168
+ restingUntil.clear();
169
+ cursor = 0;
170
+ }
171
+ //# sourceMappingURL=free-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"free-pool.js","sourceRoot":"","sources":["../../src/core/free-pool.ts"],"names":[],"mappings":"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"}
@@ -90,6 +90,14 @@ export interface GitStatus {
90
90
  * that into one list and you get a checkbox that lies about what a commit will
91
91
  * contain.
92
92
  */
93
+ /**
94
+ * Stage exactly these paths and commit them — the per-turn commit's primitive.
95
+ *
96
+ * Scoped staging on purpose: `git add -A` here would swallow another agent's
97
+ * uncommitted work into this agent's commit, which is precisely the
98
+ * misattribution the feature exists to end.
99
+ */
100
+ export declare function stageAndCommitFiles(dir: string, paths: string[], message: string): Promise<CommitResult>;
93
101
  export declare function status(dir: string): Promise<GitStatus>;
94
102
  /**
95
103
  * Start version control here.
@@ -132,6 +140,28 @@ export interface Branches {
132
140
  }
133
141
  /** Local branches and which one is checked out — for the checkout picker. */
134
142
  export declare function branches(dir: string): Promise<Branches>;
143
+ /**
144
+ * Create a branch (if needed) and switch to it — the board-card primitive.
145
+ *
146
+ * `checkout -B` would move an existing branch's tip, silently discarding where
147
+ * it pointed; this creates only when absent and otherwise just switches, so
148
+ * re-dragging a card to Working is idempotent rather than destructive.
149
+ */
150
+ /**
151
+ * Run git (or another command) and hand back its output, errors and all.
152
+ *
153
+ * For the places that want to *look* — what's on a branch, what a PR would
154
+ * carry — rather than act, where a non-zero exit is an answer ("no such
155
+ * branch") and not a failure.
156
+ */
157
+ export declare function readOut(dir: string, args: string[], opts?: {
158
+ cmd?: string;
159
+ args?: string[];
160
+ }): Promise<string>;
161
+ export declare function ensureBranch(dir: string, name: string): Promise<{
162
+ branch: string;
163
+ created: boolean;
164
+ }>;
135
165
  /**
136
166
  * Switch to a branch or commit.
137
167
  *