@loompad/cli 0.1.0 → 1.1.2

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 (688) hide show
  1. package/ARCHITECTURE.md +96 -11
  2. package/CHANGELOG.md +1054 -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 +4646 -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/release-notes/v1.1.2.md +21 -0
  674. package/docs/teams-architecture.md +697 -0
  675. package/docs/teams.md +171 -0
  676. package/docs/windows.md +85 -0
  677. package/package.json +22 -9
  678. package/dist/adapters/claude-code.d.ts +0 -26
  679. package/dist/adapters/claude-code.js +0 -209
  680. package/dist/adapters/claude-code.js.map +0 -1
  681. package/dist/adapters/codex.d.ts +0 -51
  682. package/dist/adapters/codex.js +0 -291
  683. package/dist/adapters/codex.js.map +0 -1
  684. package/docs/img/board-linear.png +0 -0
  685. package/docs/img/board-projects.png +0 -0
  686. package/docs/img/brain.png +0 -0
  687. package/docs/img/settings.png +0 -0
  688. package/docs/img/workspace.png +0 -0
@@ -0,0 +1,77 @@
1
+ ## Loom 0.2.3 — an Update button, and a Browser tab that runs your app
2
+
3
+ ### Loom updates itself
4
+
5
+ There are releases now, so Loom checks for one — a quiet pill in the status
6
+ bar, never a banner — and **Settings → Updates** has the button.
7
+
8
+ It says what it will do before it does it, because that depends on how you
9
+ installed it: a **git checkout** pulls, installs and rebuilds; a **global npm
10
+ install** reinstalls itself; anything else is pointed at the release rather
11
+ than having a command guessed at and run over it. A checkout with uncommitted
12
+ changes is refused — that tree is yours. The commands run with their output
13
+ streaming, and the daemon comes back on the new build with the page
14
+ reconnecting to it.
15
+
16
+ From the terminal: `loom update --check` to look, `loom update` to do it.
17
+
18
+ *(The desktop app still sends you to the release page: updating itself needs a
19
+ signed app, which needs a certificate. That's its own issue.)*
20
+
21
+ ### The Browser tab becomes a real browser pane
22
+
23
+ It used to be an address bar and an iframe: you typed a port and hoped. Now
24
+ Loom knows what it's showing.
25
+
26
+ - **Your dev servers, run by Loom.** Declared under `servers` in
27
+ `.loom/config.json` and suggested from `package.json` — a suggestion you
28
+ accept, never something that starts itself. Start, stop and restart from the
29
+ rail or with `loom servers`.
30
+ - **State that's a fact, not a guess:** *running* means a port answered,
31
+ *starting* means the process is up and nothing is listening yet, and
32
+ *crashed* carries the exit code it died with.
33
+ - **Server output under the page it serves**, live — usually where the reason
34
+ for a blank frame is — and a server that dies while an agent works against it
35
+ says so in the thread.
36
+ - **The page reports back.** Loom previews a server through its own proxy,
37
+ which forwards everything (including the socket hot reload rides on) and
38
+ injects one small script. The **Page** pane shows what the page logged and
39
+ what it fetched, and **one click puts a line in the composer** as the context
40
+ an agent needs.
41
+ - **Pick the broken thing.** Click an element in the preview and its selector,
42
+ text, size and markup land in the composer.
43
+ - **A camera** that captures the live page into the composer, at the width
44
+ you're previewing, using the project's own Playwright.
45
+ - **Width presets** (Fit / 375 / 768 / 1280, remembered per project) and
46
+ **auto-reload** when an agent changes what a server serves.
47
+
48
+ Nothing about a previewed page is rewritten — the injected script only reports,
49
+ and stays silent if any part of it fails.
50
+
51
+ ### Also fixed
52
+
53
+ - An overridden `loom/review` no longer leaves its own "reviewing…" status
54
+ pending for ever on a commit the owner already decided about.
55
+ - A bad retarget of a queued prompt is refused when you make it, not when the
56
+ queue reaches it.
57
+ - A dev server that accepts a connection and never answers gets a 504 that says
58
+ so, instead of a preview that hangs.
59
+ - Five smaller ones found while building the preview: a buffered page keeping
60
+ two framings, the hot-reload socket's first message pushed the wrong way,
61
+ `innerText` being undefined on SVG icons, upgraded sockets blocking shutdown,
62
+ and a restored Browser pane whose rail spun for ever.
63
+
64
+ ### Downloads
65
+
66
+ - **macOS**: `Loom-Desktop-0.2.3-arm64.dmg` (Apple Silicon) or `-x64.dmg` (Intel)
67
+ - **Windows**: the `.exe` installer
68
+ - **Linux**: `.AppImage` or `.deb`
69
+ - **Android**: `loompad-0.2.3-android.apk`
70
+ - **CLI**: `npm install -g github:nickthelegend/loom`
71
+
72
+ The Android apk is signed with the project's release key. The desktop
73
+ installers are not signed by a certificate authority: on macOS the app is
74
+ ad-hoc signed, so right-click → Open the first time; on Windows, "More info →
75
+ Run anyway". Checksums are in `SHA256SUMS.txt`.
76
+
77
+ Full list of changes: [CHANGELOG.md](https://github.com/nickthelegend/loom/blob/main/CHANGELOG.md).
@@ -0,0 +1,128 @@
1
+ ## Loom 0.2.4 — a queue that waits, goals that share, routes that decide
2
+
3
+ ### The queue learned to wait
4
+
5
+ A queued prompt no longer means "next". It can wait **for a time**, until a
6
+ goal actually **lands** (merged, not merely finished), until that goal's
7
+ **checks go green**, or until the project has been **quiet** for a while. The
8
+ row says what it's waiting for, and a click releases it.
9
+
10
+ ```sh
11
+ loom queue at 03:00 "run the migration"
12
+ loom queue after landed:o1 "update the changelog"
13
+ loom queue after green:o1 "cut the release"
14
+ ```
15
+
16
+ Every branch reads a fact the daemon already has, so none of them can be wrong
17
+ in an interesting way — and a condition about a goal that no longer exists
18
+ **releases** the prompt rather than stranding it forever. The clock ticks only
19
+ while something is waiting on it.
20
+
21
+ **Recipes.** `loom queue save ship` keeps what's queued; `loom queue run ship`
22
+ replays it on any project. Steps remember their target **by role**, because an
23
+ agent id from one machine means nothing on another; a role this project hasn't
24
+ got becomes an **Auto** prompt rather than a refusal.
25
+
26
+ **Reordering.** Drag in the web app, and up/down on the phone, which had no way
27
+ to reorder at all. The arrows stay on both — the accessible path.
28
+
29
+ ### Goals: a cap, and more than one at a time
30
+
31
+ `loom orchestrate --max-usd 2` stops a goal at its cap the way the team budget
32
+ always did: running work finishes, nothing new starts, the goal waits for you.
33
+ A project default lives in `budgets.perGoalUsd`, and a word lands in the thread
34
+ at 80%, because the halt shouldn't be the first you hear of a budget.
35
+
36
+ `maxConcurrentGoals` lets goals run side by side **when their paths can't
37
+ collide**. A goal's scope is the `touches` its plan declares; one that hasn't
38
+ said what it touches counts as touching everything and waits. Anything not
39
+ provably disjoint queues with the collision named — *waiting for "rework
40
+ billing" — both touch src/billing/\*\* and src/billing/tax.ts*. Still one at a
41
+ time unless you ask for more.
42
+
43
+ ### Coming back to a project
44
+
45
+ **A digest of what happened while you were away** — goals, landings, failures,
46
+ a dead server, and what's waiting on you, newest first, each line clicking
47
+ through to the moment it came from. Nothing is written without an event behind
48
+ it, and a quiet night says nothing at all. `loom digest --since 8` in the
49
+ terminal.
50
+
51
+ **Notifications carry the question**, not "an agent needs you" — and on macOS
52
+ you can answer from the notification. Nothing fires while you're already
53
+ looking at the conversation it would be about.
54
+
55
+ ### A pull request you asked for
56
+
57
+ With branch-per-card on, a card in review shows what a PR **would** carry: the
58
+ branch, its commits, its files, and the exact command. It opens only when you
59
+ press the button. Asking pushes nothing — publishing has never been implicit
60
+ here, and still isn't.
61
+
62
+ ### Routes: steps that decide whether to run
63
+
64
+ A route step can carry a condition on the previous turn, and is skipped when it
65
+ doesn't hold:
66
+
67
+ ```sh
68
+ loom route 'planner,executor,reviewer?lines>200' "tighten the tax rules"
69
+ ```
70
+
71
+ `changed>N`, `changed<N`, `lines>N`, `lines<N`, `touched:<glob>`,
72
+ `!touched:<glob>` — all read off the turn's own diff. That bar is the design: a
73
+ condition must be something Loom **measured**, never a judgement about whether
74
+ the work was any good; judgement stays with the LLM router. Unreadable
75
+ conditions are refused when the route is *defined* rather than silently never
76
+ matching, the first step can't be conditional (there's no turn before it), and
77
+ a skipped step says so in the thread with the numbers that decided it. Skipping
78
+ isn't failing: the route completes.
79
+
80
+ ### The baton can carry the work
81
+
82
+ With `worktreePerAgent`, handing A → B left B's checkout holding the state from
83
+ before A started. `git.mergeOnHandoff` merges `agent/A` into B's tree — and
84
+ refuses far more often than it merges: A's uncommitted work isn't on A's branch
85
+ (merging would deliver a convincing half of it), B's tree has to be clean, and
86
+ a merge already in progress is never stacked on. Each refusal says what to do
87
+ about it.
88
+
89
+ A conflict is **left in place** rather than aborted — those files are the thing
90
+ to resolve — and it's named at the top of the incoming briefing, in the handoff
91
+ event, and it stops a route instead of prompting a step on a tree full of
92
+ conflict markers.
93
+
94
+ ### Dark mode in the preview
95
+
96
+ Widths landed in 0.2.3; this is the other half. No API lets one document set
97
+ another's `prefers-color-scheme` — but Loom isn't outside the page: the proxy
98
+ served it *and* its stylesheets. So the bridge re-points the page's own
99
+ `@media (prefers-color-scheme: …)` rules, sets the UA colour-scheme, and makes
100
+ `matchMedia` answer to match (firing `change`, so an app that themes itself in
101
+ JavaScript re-renders). Every rewritten rule remembers the media text it came
102
+ with, so **Auto is the page exactly as it shipped**.
103
+
104
+ A page Loom isn't proxying says so instead of offering a switch that does
105
+ nothing, and the screenshot — a real browser — honours the scheme either way.
106
+ Both the width and the scheme ride along with what you send: *Screenshot taken
107
+ at 375×812, dark mode*.
108
+
109
+ ### The desktop app can update itself, where that's honest
110
+
111
+ **Help → Check for Updates…** on **Windows** and the **Linux AppImage**: it
112
+ asks before downloading, installs on quit, and restarts only when you press
113
+ Restart. On **macOS** it refuses and says why — that build is ad-hoc signed,
114
+ and macOS only replaces an app signed by a certificate it already trusts — and
115
+ opens the releases page instead. A `.deb` is left to the package manager that
116
+ owns it. The release publishes the update feed for those two platforms and
117
+ deliberately not for macOS: advertising an update the OS will refuse to install
118
+ is worse than advertising none.
119
+
120
+ ### Also
121
+
122
+ - `loom team webhook --repo <r>` no longer warns that a shared repo isn't
123
+ shared. An empty cached team view was allowed to answer for the hub, and a
124
+ view fetched before the share landed lists nothing.
125
+ - Retrieval has a number now: recall@5 of **1.00** literal, **0.80** across
126
+ word forms and typos, **0.50** across synonyms. The first two are floors a
127
+ regression trips over; the third is the gap a dense channel would have to
128
+ close.
@@ -0,0 +1,153 @@
1
+ ## Loom 0.2.5 — an agent doesn't have to be a CLI
2
+
3
+ Every agent Loom drove was a command: `claude`, `codex`, `opencode`, `grok`,
4
+ `agy`. That was the right call — a CLI brings its own tools, its own session,
5
+ its own auth — and it meant your roster could only hold what somebody had
6
+ installed, and every turn cost whatever that CLI's subscription costs, whether
7
+ it was a four-hour refactor or a one-line summary.
8
+
9
+ This release adds agents that are **models**: an HTTP endpoint, any
10
+ OpenAI-compatible provider, a model you pick off a list. Nothing to install,
11
+ and on a provider's free tier, nothing to pay.
12
+
13
+ ### A `model` agent
14
+
15
+ ```sh
16
+ loom providers:set openrouter --key sk-… # or $OPENROUTER_API_KEY
17
+ loom models --free # what costs nothing today
18
+ loom agents:add model --as cheap --role reviewer \
19
+ --model "google/gemma-4-31b-it:free" --tools
20
+ ```
21
+
22
+ It streams into the thread like any other agent, shows reasoning as reasoning,
23
+ reports its token counts, holds the baton, and takes route steps. Out of the
24
+ box it's a thinker rather than an editor — planning, reviewing, summarising,
25
+ answering, routing, which is most of what a fleet does between edits.
26
+
27
+ **Keys are never project config.** `.loom/config.json` is committed in most
28
+ projects, so it names a *provider*; the key lives in the environment or in
29
+ `~/.loom/providers.json` at mode 0600. No route, log or listing hands one
30
+ back — you get the last four characters, which tells two keys apart and uses
31
+ neither.
32
+
33
+ **Refusals are read, not guessed at.** Each of these means something different
34
+ and gets a different answer:
35
+
36
+ | the provider says | Loom says | Loom does |
37
+ |---|---|---|
38
+ | 401 *unauthorized client* | it refused Loom as a client, not your key | stops |
39
+ | 401 / 403 | it rejected the key | stops |
40
+ | **402** dry pool | no quota left for this model right now | **next model in `fallbacks`** |
41
+ | **429** | it's rate-limiting this key | **next model in `fallbacks`** |
42
+ | 503 / 404 | no channel for that model — the name may be wrong | stops |
43
+
44
+ Falling back on a 503 would hide a typo rather than fix it, which is why it
45
+ doesn't.
46
+
47
+ `loom models` asks each configured provider what it has right now, cached for
48
+ ten minutes and refreshable, free ones marked. A model list typed out by hand
49
+ goes stale; one that's asked for doesn't.
50
+
51
+ ### It can read the project, and write it if you say so
52
+
53
+ `--tools` adds `read_file`, `list_files` and `search`: read-only, inside the
54
+ project, `.git` and `.loom` refused, every path resolved and proven contained
55
+ before anything opens it. A reviewer that can't open the file it's reviewing is
56
+ being asked to guess.
57
+
58
+ `--write` adds `write_file`; `--run "npm test"` adds `run` with that
59
+ allow-list. **Every write and every command is a card you allow or deny
60
+ first:**
61
+
62
+ > **write_file** — write src/app.ts: 40 lines (replacing 12) — fix the port
63
+ > &nbsp;&nbsp;[Allow] [Deny]
64
+
65
+ It asks in `auto` as well as `ask`, which is stricter than the mapping for
66
+ CLIs and deliberately so: a CLI in your roster is one you installed and signed
67
+ into, and a model agent is a name you picked off a provider's list an hour ago.
68
+ `bypass` is the only mode that doesn't ask. **With nobody to ask, the answer is
69
+ no** — a write that went through because the UI wasn't wired up would be the
70
+ worst failure available here.
71
+
72
+ The allow-list is a prefix match on whole commands and there is no shell, so
73
+ `npm test` permits `npm test --watch` and refuses `npm testify`,
74
+ `npm test; rm -rf ~`, backticks, pipes and redirection. A tool is only offered
75
+ to the model when it can actually be used: no allow-list, no `run` tool at all.
76
+
77
+ ### Threads that remember who answers in them
78
+
79
+ A chat used to be a label on events — whoever held the baton answered
80
+ everywhere, so two threads couldn't be talking to two agents. Pin an agent to a
81
+ thread and it answers there whatever the baton is doing elsewhere: one thread
82
+ planning on a free model, one editing with Claude Code, neither waiting for the
83
+ other.
84
+
85
+ **It doesn't take the baton.** The baton is the write lock for work on the
86
+ repository; a conversation doesn't need it, and taking it would stop whatever
87
+ is actually working. The main thread still follows the baton — that's what
88
+ makes it the main thread.
89
+
90
+ ### Asking several models at once
91
+
92
+ ```sh
93
+ loom ask --free --limit 3 "is this migration reversible?"
94
+ ```
95
+
96
+ One prompt, one thread per model, all at the same time, each thread named after
97
+ the model that answered in it. With free quota, asking five models costs what
98
+ asking one costs — and *which of these is right* is a judgement a person makes
99
+ in ten seconds and a model makes badly. The agents are transient, so five asks
100
+ don't leave five agents in your roster, and one model failing leaves its error
101
+ in its own thread while the others answer.
102
+
103
+ ### Retrieval that can follow a synonym
104
+
105
+ The brain had three lexical channels and couldn't match *how does login work*
106
+ to a note about Supabase JWKS. `brain.semantic` adds an all-MiniLM-L6-v2
107
+ channel. Measured on the recall set that ships with the tests, recall@5:
108
+
109
+ | | lexical | with the model |
110
+ |---|---|---|
111
+ | literal | 1.00 | **1.00** |
112
+ | word forms, typos | 0.80 | **1.00** |
113
+ | synonyms | 0.50 | **1.00** |
114
+
115
+ It isn't a dependency and won't become one: the model is 23MB, the ONNX runtime
116
+ that executes it is ~470MB, so Loom asks you to install that
117
+ (`npm i -g @huggingface/transformers`) and behaves exactly as before when it's
118
+ missing.
119
+
120
+ ### Install it with Homebrew
121
+
122
+ ```sh
123
+ brew tap nickthelegend/loom https://github.com/nickthelegend/loom
124
+ brew install --cask loom-desktop
125
+ brew upgrade --cask loom-desktop
126
+ ```
127
+
128
+ The cask carries both architectures and is regenerated from the published
129
+ checksums by the release job, so it can't go stale. **Check for Updates…**
130
+ recognises a Homebrew install and offers to run the upgrade **in Loom's own
131
+ terminal** — the one in the dock — so you watch it happen rather than having it
132
+ happen invisibly inside the app.
133
+
134
+ It does not get you past Gatekeeper and doesn't pretend to: Homebrew
135
+ quarantines cask downloads on purpose, and the cask deliberately does not strip
136
+ that attribute, because it's the protection that exists *because* this build is
137
+ unsigned. First launch asks once, as it does for a dmg you downloaded yourself.
138
+
139
+ *(There is no free Apple Developer ID for open-source projects — the fee waiver
140
+ is for nonprofits, schools and government entities, and a free Apple ID cannot
141
+ sign for distribution at all. So: buy one, be one of those, or ship unsigned
142
+ and say so. Loom says so.)*
143
+
144
+ ### Also
145
+
146
+ - macOS **Check for Updates…** finds the build for your architecture,
147
+ downloads it, and **verifies its SHA-256** against the release's published
148
+ checksums — a file that doesn't match is deleted, not opened — then opens the
149
+ disk image for the drag.
150
+ - `loom team webhook --repo <r>` no longer warns that a shared repo isn't
151
+ shared. An empty cached team view was allowed to answer for the hub.
152
+ - The README was audited against the code. Eight things it claimed had quietly
153
+ stopped being true as features landed underneath them.
@@ -0,0 +1,62 @@
1
+ ## Loom 0.2.6 — right-click, and a Setup that tells the truth
2
+
3
+ A small release, made entirely of things found by opening the app and looking
4
+ at it rather than by reading the code.
5
+
6
+ ### Right-click works now
7
+
8
+ **A project** — open, new chat, settings, **rename**, copy path, and remove.
9
+ Those were scattered: settings behind a gear, rename nowhere at all, and
10
+ removing a project only in `loom projects --forget`.
11
+
12
+ It says **Remove from Loom**, not *Delete*, and the confirm says the folder,
13
+ the history and `.loom/` stay on disk — the route only unregisters. A menu item
14
+ that says delete and doesn't is as bad as one that says delete and does.
15
+
16
+ **A thread** — open, rename, pin which agent answers in it, forget. The main
17
+ thread's menu offers only what applies to it, rather than offering everything
18
+ and refusing half of it when you click.
19
+
20
+ Escape and any click outside close the menu, the arrow keys walk it, and it
21
+ flips rather than hanging off the edge of the window.
22
+
23
+ ### A composer that fits
24
+
25
+ That row was holding the model picker, the agent, a permission chip, MCPs,
26
+ Skills, a mic, Prompts, Plan **and** send — and wrapped on a narrow window.
27
+ MCPs and Skills are occasional settings, so they moved into a **More** menu
28
+ that also reaches Prompts and Attach. The skills count badge stayed on the
29
+ outside, because *two skills are on* is the part you need without opening
30
+ anything.
31
+
32
+ ### Setup tells the truth about your machine
33
+
34
+ - **Claude Code said "not installed"** on machines where it is. Anthropic's
35
+ installer puts the binary in `~/.local/bin`, and Loom trusted `PATH` alone —
36
+ which an interactive shell has and a detached daemon may not. Codex, Grok and
37
+ Antigravity already looked in their known locations; claude-code was the one
38
+ still guessing. Telling someone to reinstall software they already have is
39
+ the worst kind of wrong answer, because they'll do it.
40
+ - **The Model (API) row** said "couldn't confirm it's signed in" and printed a
41
+ blank command. There is nothing to sign in to: it names the providers that
42
+ have a key, and offers `loom providers:set …` when none does.
43
+ - **A new project no longer gets a `model` agent it can't use.** That kind
44
+ probes as available whenever any provider has a key — a true fact about the
45
+ machine, and the wrong basis for a roster entry, because *which* model is a
46
+ choice nobody has made yet. It landed with no options and refused every turn.
47
+
48
+ ### The desktop app says Loom
49
+
50
+ The menu bar said **Electron**. macOS takes that title from the running
51
+ bundle's `Info.plist`, not from `app.setName()` — which is why naming the app
52
+ in code never fixed it. `CFBundleDisplayName` is the lever: the packaged app
53
+ sets it, and a dev run gets a prestart script that stamps the disposable
54
+ Electron.app with the same name.
55
+
56
+ The `.app` filename is deliberately unchanged, because the Homebrew cask names
57
+ it and renaming would break every install that already has one.
58
+
59
+ ### If Setup looks wrong, restart the daemon first
60
+
61
+ Half of the above was a daemon that had been running since before the fixes
62
+ landed, serving answers from an older build. `loom up --restart`.
@@ -0,0 +1,120 @@
1
+ ## Loom 1.0 — you can see what it did, and you can take it back
2
+
3
+ The 0.2 line got the fleet working: several agents, one baton, one brain, goals
4
+ split into parallel tasks. This one is about what that felt like to *watch* —
5
+ and what happened when you didn't like the result.
6
+
7
+ Five things, all of them found by using it rather than reading it.
8
+
9
+ ### Rewind
10
+
11
+ An agent turn can touch forty files. Until now the honest answer to *undo that*
12
+ was "read the diff and retype it".
13
+
14
+ So Loom writes down what the files were before every turn, and the turn's
15
+ **Update(…)** card offers **Rewind**. There is a **Rewind…** list under More for
16
+ the whole history, and `loom rewind` in the terminal.
17
+
18
+ It is a working tree, not a history. Rewinding restores what changed, removes
19
+ what was created, brings back what was deleted — and does not move HEAD, does
20
+ not touch your commits, does not edit the thread. What happened still happened;
21
+ the files just don't have to live with it.
22
+
23
+ **Three things it will never touch.** Checkpoints are captured with `git add -A`,
24
+ so `.gitignore` applies: your `node_modules`, your build output and your `.env`
25
+ are never read, never stored and never restored. `.loom/` is ignored too, which
26
+ is why a rewind cannot eat the event log.
27
+
28
+ **It is itself rewindable.** A rewind saves what it is about to replace before
29
+ it replaces it, and hands that back — *Undo the rewind* in the thread, an id on
30
+ the command line. A one-way undo is a trap, and the one time that matters is the
31
+ time someone rewinds past work they meant to keep.
32
+
33
+ **It refuses while an agent is mid-turn**, naming who. Replacing the tree under
34
+ a running agent gives it a working directory that contradicts everything it has
35
+ read, and the damage lands in whatever it writes next.
36
+
37
+ Checkpoints live on hidden refs under `refs/loom/checkpoints/`, so no branch
38
+ listing, no stash and no `git log` ever shows them. The newest 60 are kept.
39
+
40
+ ### A transcript you can turn up
41
+
42
+ The thread showed one fixed level of detail and no way to change it. More now
43
+ has a transcript section:
44
+
45
+ | | |
46
+ |---|---|
47
+ | **Normal** | what it said and did |
48
+ | **Thinking** | + reasoning |
49
+ | **Verbose** | + raw payloads |
50
+
51
+ Normal drops reasoning *entirely* rather than folding it away — the working out
52
+ is not the transcript. Verbose opens it and attaches the raw payload to tool
53
+ calls and to the orchestrator's brief, the two places a one-line summary is
54
+ standing in for something much bigger.
55
+
56
+ The level is remembered per project, so reading one run at Verbose doesn't turn
57
+ every other project's thread into a wall of JSON.
58
+
59
+ **And output you can reach the end of.** A long block used to sit in a scroll
60
+ box you could see the start of and never the end of — the orchestrator's
61
+ `{"actions": […]}` plan, most visibly. Code now wraps instead of scrolling out
62
+ of the bubble, and every block carries a copy button.
63
+
64
+ ### Orchestrating from Main stays in Main
65
+
66
+ Orchestrating from a thread abandoned that thread. The run opened one of its
67
+ own, titled after the goal, and the app walked you into it — so the goal you
68
+ typed and every word of its answer lived somewhere you hadn't asked for.
69
+
70
+ Now the orchestrator answers where you asked. Each task still gets its own
71
+ thread, and **each task row in the transcript opens it** —
72
+ `t3 · Document data model → Antigravity · done` is a link now, not a label. They
73
+ were findable only by hunting the sidebar for a title you half remembered.
74
+
75
+ A run records whether it borrowed its thread. Replying in a run's *own* thread
76
+ steers the run for good; a borrowed thread stops answering for the run when the
77
+ run ends, so Main goes back to being Main instead of forwarding every message
78
+ you ever send to a finished goal.
79
+
80
+ ### A thread says who is working in it, and whether it is still going
81
+
82
+ Two bugs that were the same bug: a thread couldn't answer questions the daemon
83
+ already knew the answer to.
84
+
85
+ - **The wrong logo.** A task thread claimed to be whoever held the project
86
+ baton, so during a run with four workers a Codex task and an Antigravity task
87
+ both wore the Claude Code mark. The header now comes from the task.
88
+ - **No sign of life.** A thread row showed nothing about whether its work was
89
+ running, done or failed. It now carries a mark — pulsing while it runs, green
90
+ when it lands — and *nothing at all* when the daemon can't say, rather than a
91
+ guess.
92
+
93
+ ### Models in Orchestrate
94
+
95
+ Orchestrate could pick *who* ran a goal and never *what they ran it on*. Every
96
+ agent chip — the orchestrator and each worker — now carries its model beside its
97
+ permission chip, click to change.
98
+
99
+ And an API model can join the cast without leaving the composer: a dashed
100
+ **+ model** chip adds one and opens its picker straight away, because the state
101
+ it lands in with no model chosen is the one state it cannot run in. Until one is
102
+ picked the chip says so in warning colour, and Orchestrate refuses to start —
103
+ naming the agent and opening its list — rather than failing three tasks into the
104
+ run.
105
+
106
+ Two things the model list itself was getting wrong: a model agent's list is
107
+ asked of the providers, and that case had no branch in the footer, so it printed
108
+ *"no model list for this agent"* directly above 446 of them. And it offered a
109
+ model agent a **Default**, which for that kind does not exist.
110
+
111
+ ### Install
112
+
113
+ ```sh
114
+ brew tap nickthelegend/loom https://github.com/nickthelegend/loom
115
+ brew install --cask loom-desktop
116
+ ```
117
+
118
+ Still unsigned, and still says so: Homebrew quarantines cask downloads on
119
+ purpose and this cask deliberately doesn't strip that, because it is the
120
+ protection that exists *because* the build is unsigned. First launch asks once.
@@ -0,0 +1,77 @@
1
+ ## Loom 1.0.1 — orchestra spawns its workers again
2
+
3
+ Three bugs found by opening 1.0 on a real project and watching it fail.
4
+
5
+ ### The plan was being thrown away before it ran
6
+
7
+ Every orchestra run planned tasks and started **none**. The Fleet showed every
8
+ agent idle, no task threads appeared, and the thread said:
9
+
10
+ > Your reply had no ```loom actions block, so nothing ran.
11
+
12
+ …directly underneath a reply that plainly contained one.
13
+
14
+ The engine parses accumulated turn text rather than the logged message, and
15
+ that text was capped to its **last** 20,000 characters. A plan's block sits at
16
+ the end of a long reply, so the cap kept the *closing* fence and threw away the
17
+ *opening* one. The parser saw an unterminated block and correctly reported that
18
+ there was nothing to run.
19
+
20
+ Which means **the better the orchestrator planned, the more certainly its plan
21
+ was binned** — a thorough orchestrator writes long task prompts, and long is
22
+ exactly what killed it.
23
+
24
+ Replaying one real run through the shipped parser, the logged reply against the
25
+ same reply after the cap:
26
+
27
+ ```
28
+ id=176 len= 26551 logged=6 acts capped=NULL
29
+ id=207 len= 28329 logged=5 acts capped=NULL
30
+ id=213 len= 24296 logged=5 acts capped=NULL
31
+ id=227 len= 28318 logged=5 acts capped=NULL
32
+ id=234 len= 20297 logged=5 acts capped=NULL
33
+ id=564 len= 51901 logged=8 acts capped=NULL
34
+ id=570 len= 50836 logged=8 acts capped=NULL
35
+ ```
36
+
37
+ Seven consecutive plans — 6, 5, 5, 5, 5, 8 and 8 tasks — every one parseable
38
+ from the log, every one destroyed. All seven parse intact now.
39
+
40
+ The budget is far clear of any plausible reply, and when it *is* reached the
41
+ cut is made at the start of the actions block rather than at a blind character
42
+ offset. What protects memory can no longer decapitate the payload.
43
+
44
+ ### Answer an agent where it asked you
45
+
46
+ An agent stopping to ask something was one flat line with nothing to click:
47
+
48
+ > ⏸ claude-code asks: Want me to dig into the DBC integration specifically, or
49
+ > get the working tree into a committable state?
50
+
51
+ To answer it you went to the composer — and in an orchestra thread the composer
52
+ aims at the **orchestrator**, so your answer went to the wrong agent entirely.
53
+ The one moment Loom exists to surface had the worst affordance in the app.
54
+
55
+ It is now a card you answer in place. The reply goes to the agent that asked,
56
+ read off the card rather than off whatever the composer is pointed at. A
57
+ question that plainly offers a choice becomes buttons:
58
+
59
+ > **dig into the DBC integration specifically** · **get the working tree into a committable state**
60
+
61
+ Anything ambiguous falls back to the text box. A wrong guess would put words in
62
+ your mouth and send them to an agent, so it guesses at nothing: no question
63
+ mark, no clean *or*, no buttons.
64
+
65
+ ### A giant icon no longer eats the Board
66
+
67
+ Board → GitHub rendered a single enormous ⓘ filling the whole pane, with the
68
+ columns pushed out of view, whenever `gh` couldn't list pull requests — a
69
+ common state, so the footnote became the screen.
70
+
71
+ `svg()` emitted no `width` or `height`. Every icon depends on a CSS rule to
72
+ size it, and an icon in a container that forgot one has no intrinsic size, so
73
+ in a flex row it stretches to fill the line. `.bnote` was such a container.
74
+
75
+ Icons now carry a default size. CSS still wins, so every existing rule is
76
+ unchanged — what this buys is that the *next* icon dropped somewhere unstyled
77
+ looks slightly wrong instead of covering the screen.