@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,39 @@
1
+ <!doctype html>
2
+ <html lang="en" class="dark">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
6
+ <meta name="theme-color" content="#0a0a0a">
7
+ <link rel="manifest" href="/app/manifest.webmanifest">
8
+ <link rel="icon" id="favicon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='22' fill='%230a0a0a'/%3E%3Ctext x='50' y='60' font-size='36' text-anchor='middle' fill='%23fafafa' font-family='-apple-system,Segoe UI,sans-serif' font-weight='600'%3Elo%3C/text%3E%3Crect x='32' y='70' width='36' height='4' rx='2' fill='%2367e8f9'/%3E%3C/svg%3E">
9
+ <link rel="stylesheet" href="/app/vendor/xterm.css">
10
+ <title>Loom</title>
11
+ <script>
12
+ /* Apply the saved theme before first paint so there is no flash. */
13
+ try{var t=localStorage.getItem("loomTheme");if(t==="light"||(t==="system"&&matchMedia("(prefers-color-scheme: light)").matches))document.documentElement.classList.remove("dark")}catch(e){}
14
+ /* The telemetry backend's own UI, for the trace deep links, injected by the
15
+ daemon from LOOM_TRACE_UI_URL. Empty unless one is configured — the links
16
+ hide themselves rather than pointing at a guessed port. */
17
+ window.__loomTraceUrl="%%TRACE_UI_URL%%";
18
+ window.__loomPageRev="%%BUILD_REV%%";
19
+ </script>
20
+ <style>%%APP_CSS%%</style>
21
+ </head>
22
+ <body id="loom-app">
23
+ <!-- ADE brand marks, defined once (see brand-icons.ts). Every agent glyph on
24
+ the page is a <use> of one of these symbols. -->
25
+ %%BRAND_SPRITE%%
26
+ <div id="root"></div>
27
+ <div id="toast" role="status" aria-live="polite" aria-atomic="true"></div>
28
+ <div id="a11y-alert" role="alert" aria-live="assertive" class="visually-hidden"></div>
29
+ <!-- xterm.js, served by the daemon from node_modules: the app has no build
30
+ step and must work offline on a tailnet, so no bundler and no CDN. Only
31
+ used when the daemon has a real pty; the fallback needs none of it. -->
32
+ <script src="/app/vendor/xterm.js"></script>
33
+ <script src="/app/vendor/addon-fit.js"></script>
34
+ <script src="/app/vendor/addon-web-links.js"></script>
35
+ <script>
36
+ %%APP_JS%%
37
+ </script>
38
+ </body>
39
+ </html>
package/docs/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # Loom docs
2
+
3
+ | Doc | What's in it |
4
+ |---|---|
5
+ | [SETUP.md](SETUP.md) | Installing Loom and connecting your agents |
6
+ | [teams-architecture.md](teams-architecture.md) | Loom Teams: the design, all 78 decisions, and what's built |
7
+ | [teams.md](teams.md) | Loom Teams as a user: set up a team, share a repo, land goals, run a runner |
8
+ | [adapters.md](adapters.md) | How each agent CLI is driven, and how to add one |
9
+ | [cloud.md](cloud.md) | Loom Cloud: reaching your daemon from your phone on any network |
10
+ | [observability.md](observability.md) | Telemetry, the Observatory, and what's recorded |
11
+ | [loompad.md](loompad.md) | The LoomPad hardware controller |
12
+ | [design-system.md](design-system.md) | The UI's tokens and components |
13
+ | [integration-notes.md](integration-notes.md) | Notes from integrating t3code and agent-orchestrator ideas |
14
+ | [proposals/](proposals/) | Design proposals |
15
+
16
+ Code-level guides live beside the code:
17
+ [src/](../src/README.md), [src/adapters/](../src/adapters/README.md),
18
+ [src/hub/](../src/hub/README.md), [supabase/](../supabase/README.md),
19
+ [test/](../test/README.md), [scripts/](../scripts/README.md),
20
+ [desktop/](../desktop/README.md), [app/](../app/README.md),
21
+ [hardware/](../hardware/README.md).
package/docs/SETUP.md CHANGED
@@ -43,6 +43,7 @@ useful.
43
43
  | **Codex** | [Codex.app](https://openai.com/codex/), or `npm i -g @openai/codex` | `codex login` | `codex login status` |
44
44
  | **OpenCode** | `curl -fsSL https://opencode.ai/install \| bash` | `opencode auth login` | `opencode --version` |
45
45
  | **Grok Code** | [docs.x.ai](https://docs.x.ai) | `grok` (once, interactively) | `grok --version` |
46
+ | **Antigravity CLI** | `curl -fsSL https://antigravity.google/cli/install.sh \| bash` | `agy` (once, sign in with Google) | `agy --version` |
46
47
 
47
48
  Two things worth knowing:
48
49
 
@@ -55,6 +56,15 @@ coming up empty doesn't mean it's missing.
55
56
  **Being logged in is not optional and not detectable in advance.** Loom probes
56
57
  whether a CLI *exists*, not whether it's authenticated. An unauthenticated agent
57
58
  looks installed, takes your turn, and fails. Run each one once by hand first.
59
+ (The Antigravity CLI is the one exception Loom *can* check — `agy models` only
60
+ answers when you're signed in — but running it once yourself is still the move.)
61
+
62
+ **Antigravity comes in two shapes, and only one is on offer.** The **Antigravity
63
+ CLI** (`agy`) above is a real headless agent: it holds the baton and runs a turn
64
+ to completion on Gemini (or hosted Claude/GPT — `agy models` lists them), which
65
+ is how you offload work off your orchestrator's token budget. The Antigravity
66
+ **IDE** is a different thing — a GUI Loom could only watch — and the bridge that
67
+ drove it has been **withdrawn** in favour of the CLI.
58
68
 
59
69
  Then ask Loom what it can see:
60
70
 
package/docs/adapters.md CHANGED
@@ -8,7 +8,7 @@ decision:
8
8
  | Can hold the baton (write lock) | ✅ | ❌ never |
9
9
  | Must implement | `send`, live events, `injectMemory`, `interrupt`, `diff` | events (best-effort), `injectMemory` |
10
10
  | For | agents with a real API / headless mode | GUI agents without a stable control surface |
11
- | Examples | Claude Code, OpenCode | Antigravity |
11
+ | Examples | Claude Code, OpenCode, Codex, Grok Code, Antigravity CLI | Kiro |
12
12
 
13
13
  This split is deliberate (see [ARCHITECTURE.md](../ARCHITECTURE.md)): the baton
14
14
  authorizes *edits to the user's working tree*, so it can only be held by an agent Loom
@@ -16,9 +16,15 @@ can reliably start, stream, interrupt, and account for. If your target tool only
16
16
  a debug port and pixels, build a bridge; if it exposes an API, build an adapter. A
17
17
  bridge can graduate later.
18
18
 
19
+ Kiro is the only bridge Loom ships. Antigravity was one too — a CDP bridge that drove
20
+ the IDE's chat panel over DevTools and could only watch — and that is the graduation
21
+ path working: it was withdrawn once `antigravity-cli` could drive the same tool headless
22
+ as a real adapter. The registration survives so projects that still name `antigravity`
23
+ open, but nothing offers it (`src/adapters/index.ts`, `WITHDRAWN_KINDS`).
24
+
19
25
  ## The contract
20
26
 
21
- Everything lives in `threadloom/sdk`:
27
+ Everything lives in `@loompad/cli/sdk`:
22
28
 
23
29
  ```ts
24
30
  import {
@@ -27,7 +33,7 @@ import {
27
33
  registerAgentKind,
28
34
  type SendInput, // { text, briefing? }
29
35
  type AdapterEvent // { kind, payload }
30
- } from "threadloom/sdk";
36
+ } from "@loompad/cli/sdk";
31
37
  ```
32
38
 
33
39
  ### Events you can emit
@@ -49,7 +55,7 @@ becomes context for everyone else.
49
55
  ### A complete adapter
50
56
 
51
57
  ```ts
52
- import { AdapterBase, registerAgentKind, type SendInput } from "threadloom/sdk";
58
+ import { AdapterBase, registerAgentKind, type SendInput } from "@loompad/cli/sdk";
53
59
 
54
60
  export class MyAgentAdapter extends AdapterBase {
55
61
  // available(): is the underlying tool installed/reachable?
@@ -99,13 +105,15 @@ Users then declare it in `.loom/config.json`:
99
105
  ```
100
106
 
101
107
  `cfg.options` arrives in your constructor if you define one — see
102
- `src/adapters/claude-code.ts` and `src/adapters/opencode.ts` for real examples,
103
- including session persistence via project state.
108
+ `src/adapters/opencode.ts` for a real example, including session persistence via
109
+ project state and native continuity (a turn with `input.continuity` runs on its
110
+ binding's session and reports `turn_started` / `native_turn_accepted`). Codex and Claude Code are built differently — as warm provider
111
+ sessions on the contract in `src/providers/` (see `providers/agent.ts`).
104
112
 
105
113
  ### A bridge
106
114
 
107
115
  ```ts
108
- import { BridgeBase, registerAgentKind } from "threadloom/sdk";
116
+ import { BridgeBase, registerAgentKind } from "@loompad/cli/sdk";
109
117
 
110
118
  export class MyGuiBridge extends BridgeBase {
111
119
  async available() { return true; }
@@ -117,7 +125,12 @@ export class MyGuiBridge extends BridgeBase {
117
125
  // driving the GUI agent points it at that file.
118
126
  }
119
127
 
120
- registerAgentKind("my-gui", (cfg, dir) => new MyGuiBridge(cfg.id, "my-gui", dir));
128
+ // The third argument is the tier, and it defaults to "adapter". Omit it and your
129
+ // bridge is registered as an adapter: the roster answers "adapter or bridge?" from
130
+ // this map — it has to, for kinds that are switched off and have no instance to ask
131
+ // — so a disabled bridge would advertise itself as an adapter and the composer,
132
+ // which filters its chips on that field, would offer it the baton.
133
+ registerAgentKind("my-gui", (cfg, dir) => new MyGuiBridge(cfg.id, "my-gui", dir), "bridge");
121
134
  ```
122
135
 
123
136
  ## Ground rules
@@ -0,0 +1,186 @@
1
+ # Native Brain continuity
2
+
3
+ The deterministic implementation is **opt-in**. This guide describes what works
4
+ now; it does not claim every milestone in the [approved plan](proposals/brain-continuity-implementation.md)
5
+ is finished. Release gates and results are in [BRAIN-TODO](refactoring/BRAIN-TODO.md)
6
+ and [BRAIN-NOTES](refactoring/BRAIN-NOTES.md).
7
+
8
+ ## Enable and switch
9
+
10
+ Enable **Native context continuity** in Settings → Preferences, or set
11
+ `brain.continuity: true` in `.loom/config.json`. Finish/reconcile active turns and clear queued prompts before
12
+ changing modes. The default remains the legacy workflow.
13
+
14
+ Select Codex, Claude Code or OpenCode in an ordinary chat. The next request captures its
15
+ target/model. Requests sent during another foreground turn queue until it finishes;
16
+ later picker changes do not retarget them. Explicit handoff/Stop interrupts, waits
17
+ for process close, and refuses unproven quiescence. Preparing turns can also be stopped.
18
+
19
+ | Capability | Current support |
20
+ | --- | --- |
21
+ | Codex | Any installed version; `codex app-server`, explicit `thread/resume`; context in ordinary turn input (stdin, no argv limit). Acceptance is the `turn/start` response or `turn/started`. |
22
+ | Claude Code | Any installed version, driven through the Claude Agent SDK; explicit resume by session; context in the ordinary user message (stdin). Acceptance is the `requesting` status or the first output. |
23
+ | Lost native session | A resume that finds no session fails before any turn starts. The adapter reports `NativeSessionMissing`; the receipt fails and the binding moves to a new epoch, so the next packet reconstructs into a fresh session. |
24
+ | Harness health | Each native CLI is probed with `--version` every 20 s and before dispatch. An unreachable CLI refuses the turn before the request is recorded. Status reports `available` and `cliVersion`; transitions are logged. Protocol drift appears as missing acceptance evidence, never as success. |
25
+ | Per-chat model | Supported. Changing the model keeps the same native session (Codex and Claude accept a model on resume; OpenCode switches the session's model in place); other configuration changes select a new binding. |
26
+ | OpenCode | Driven over `opencode serve`'s HTTP API (verified on 1.18.31); explicit resume by session; context in the ordinary prompt. Acceptance is the prompt's admission; the turn is over, and quiescent, when `/api/session/active` no longer lists the session. A session the server no longer has fails before anything is sent, and the next packet rebuilds in a new one. An agent pointed at a running server (`baseUrl`) is probed by that server's health. |
27
+ | Bridges | Native continuity unsupported; legacy workflow available. |
28
+ | Parallel subagents/orchestra | Unsupported in this sequential mode. |
29
+ | Embeddings/inference/cheap helpers | Not loaded or launched by this mode; helpers disabled. |
30
+ | Attachments | Existing `[image]`/`[file]` upload protocol rejected; ordinary workspace references usable. |
31
+ | Native compaction | Every harness reports it: Claude as `status: compacting` then `compact_boundary`, Codex as a `contextCompaction` item, OpenCode as `session.next.compaction.started`/`.ended`. The binding is marked compacted, and the next packet rebuilds reviewed state and recent history into the same resumed session. The UI shows compaction while it runs, and the context in use against the model's window. No private transcript modifications. |
32
+
33
+ Checked fixtures are not live account validation on every listed version or
34
+ cross-platform packaging certification.
35
+
36
+ ## Context and storage
37
+
38
+ One ordinary foreground request contains an origin-labelled historical block and
39
+ the current request once. What the block carries depends on the target session:
40
+
41
+ - **Resumed session (delta).** The native session already holds everything earlier
42
+ packets gave it and its own turns. It receives only what it lacks: user messages
43
+ sent to another agent meanwhile, other agents' work since its last turn, and
44
+ reviewed items if they changed. Returning after a short detour costs roughly the
45
+ size of that detour, not the conversation.
46
+ - **New or compacted session (reconstruction).** Current reviewed items, the most
47
+ recent user messages exactly, one-line headlines for older user messages (full
48
+ text in a local evidence file) and recent observations, all within the target.
49
+
50
+ A request becomes conversation history only once it may have reached a harness.
51
+ Queued, overflowed or refused requests are not shown to other turns. Discussion is not automatically accepted
52
+ as a decision; agent claims are not automatically verified work. Corrections carry
53
+ revision/supersession and source references. Small user points never depend on top-K.
54
+
55
+ Canonical originals remain in `.loom/log.db` on EventLog's existing connection.
56
+ Brain adds versioned requests, native bindings, items/revisions/dispositions, packets,
57
+ receipts and FTS5 projections with lexical fallback. There is no second canonical
58
+ database or vector service. Writes retain the synchronous owner semantics; worker
59
+ isolation is a measured follow-up, without `Atomics.wait` or memory-only acknowledgements.
60
+
61
+ Source references include project, event ID, SHA-256 and validated UTF-8 spans.
62
+ Packets, rendered text/hashes and receipts are separate immutable/transitioned records.
63
+ Native IDs are scoped to chat, agent instance, workspace, compatibility fingerprint
64
+ and epoch. Ambiguous legacy instance IDs are neither adopted nor overwritten.
65
+
66
+ App packet assembly prevents cross-chat injection. A native coding harness with
67
+ project filesystem access can still inspect other local files; application scoping
68
+ is not a sandbox isolating private chats from a trusted local agent.
69
+
70
+ ## Budgets and checkpoints
71
+
72
+ The default target is **6,000 estimated turn-input tokens**, including the current
73
+ request and app-added context, estimated from UTF-8 bytes / 3,
74
+ rounded up. This is a heuristic, not a provider tokenizer or verified native capacity.
75
+ Native history, tools, output and provider caching affect usage outside
76
+ that estimate. The wire field retains its v1 name `estimatedAddedTokens`. Resuming a native session does not imply free or unlimited context.
77
+
78
+ Priority is: reviewed items and the current request, then user messages (exact
79
+ newest-first up to about 75% of the target, then headlines), then observations.
80
+ Nothing is dropped silently: each source is recorded as exact, summarized
81
+ (reviewed checkpoint), referenced (headline plus evidence file) or omitted.
82
+ Omitted observations are reconsidered by the next delta. Overflow now occurs only
83
+ when reviewed items plus the current request exceed the target. It saves the
84
+ request/packet without starting a coding turn. The review dialog
85
+ lets you increase the target or create a reviewed checkpoint from selected originals,
86
+ then resume the saved request. Increasing the target can consume more quota and
87
+ still exceed native capacity. Exact restrictions and unresolved questions belong in
88
+ the checkpoint; the app does not certify your summary's fidelity.
89
+
90
+ Original checkpoint evidence is accessible as content-addressed local JSON under
91
+ `.loom/brain/artifacts/`. It is flushed and atomically finalized before reference.
92
+ Submission checks integrity and rejects unsafe paths. Unreferenced crash artifacts
93
+ are retained for now; automatic GC/deletion/retention remains a release gate.
94
+
95
+ Checkpoints can be created or changed only while no agent turn is running, so a
96
+ running agent cannot forge user-reviewed context through the local API.
97
+
98
+ Protocol limits: 4 MB serialized contract input, nesting depth 32, 1 million
99
+ characters per text field, 1 MB rendered context, 10,000 protected messages/items,
100
+ 1,000 item sources, 32 MB native JSONL records/retrieval artifacts, 100 MB offline JSONL imports, and
101
+ an explicitly chosen added-context target of 128–100,000 estimated tokens.
102
+ Exceeding limits produces an error/overflow instead of silent truncation.
103
+
104
+ ## Delivery and recovery
105
+
106
+ `prepared` means stored; `submitting` means durable intent to call the harness.
107
+ `accepted` requires correlated native turn/output evidence, not spawn or initialization.
108
+ Execution is separately `running`, `complete`, `failed`, `interrupted` or `unknown`.
109
+ A provider error may arrive before process exit; it does not release the runtime
110
+ writer barrier early. Accepted does not mean understood or retained.
111
+
112
+ After restart/lost acknowledgement, uncertain runs keep their workspace lease.
113
+ Inspect native processes and changed files, then explicitly reconcile with evidence.
114
+ Reconciliation clears the lease and increments the binding epoch; it does not replay
115
+ the action. Reconciliation is atomic with binding invalidation and cannot be repeated
116
+ on a resolved receipt. Retry is a new deliberate request. Failed stops block successors.
117
+
118
+ Native POSIX launches own a process group. Parent exit starts inherited-child cleanup;
119
+ completion waits for containment and output drain. Unknown termination retains the
120
+ writer lease. Escaped/detached children are not fully contained; inspect them during
121
+ manual recovery. Windows native harnesses launch inside kill-on-close Job Objects;
122
+ the launch handshake completes containment before any harness or tool can start.
123
+ Shutdown verifies zero job members, and failed inspection retains the writer lease.
124
+ The daemon probes assignment on the current host (including enclosing jobs) before
125
+ enabling native continuity. OpenCode supports both the legacy `/api/session` API
126
+ and npm 1.19.0's `/session/:id/prompt_async` admission and `/session/status` idle proof.
127
+ App-owned diff/commit work also finishes before the next native turn starts.
128
+
129
+ The Brain pane lists the latest 100 attempt summaries and loads individual full
130
+ packets on demand. Project-authenticated routes under
131
+ `/api/projects/:id/brain/continuity` are:
132
+
133
+ | Method/path | Purpose |
134
+ | --- | --- |
135
+ | `GET /?requestId=...` | Bounded attempt summaries, counts, estimates and outcomes. |
136
+ | `GET /packets/:packetId` | One packet and exact rendered text/hash. |
137
+ | `GET /source/:eventId?chat=...` | Scoped original text/source hash. |
138
+ | `GET /items?chat=...`, `POST /items` | Reviewed `ContextItemV1` records. |
139
+ | `POST /checkpoint` | `{chat,itemId,eventIds,reviewed:true}`; atomic full-source dispositions. |
140
+ | `POST /requests/:requestId/resume` | `{targetAddedTokens}`; rebuild an unsubmitted overflow/preflight request. Submitted requests cannot be replayed here. |
141
+ | `POST /search/rebuild` | `{}`; rebuild FTS transactionally from canonical events. |
142
+ | `POST /reconcile` | `{receiptId,evidence,quiescent:true}`; explicit uncertain-run reconciliation. |
143
+
144
+ `POST /api/projects/:id/messages` accepts `requestId`. Same ID/content/target does
145
+ not append/execute twice; different content is a conflict. Captured queued text,
146
+ target and model are immutable, including whitespace. Native queue action edits are
147
+ unsupported until durable supersession is implemented; remove the unsent entry and
148
+ submit a new request. Removal stops dispatch, but retains original evidence.
149
+ Autonomous routes, orchestra and subagents reject before starting in native mode.
150
+
151
+ ## Migration and ownership
152
+
153
+ Activation backs up SQLite with `VACUUM INTO` before schema migration. Request/event
154
+ transactions publish only after commit. A second live Brain owner or unowned event
155
+ writer is refused. Dead-owner takeover is conservative; live/reused PIDs do not
156
+ authorize takeover. Use a local filesystem; network-filesystem recovery is not certified.
157
+
158
+ Legacy JSONL remains readable with `LOOM_STORE=jsonl` but cannot provide transactional
159
+ continuity. Stop the daemon, then run:
160
+
161
+ ```sh
162
+ loom brain:migrate /path/to/project
163
+ ```
164
+
165
+ The importer backs up JSONL/SQLite, preserves IDs/Main history and records a manifest.
166
+ Repeated imports are idempotent. Malformed records/conflicting IDs abort the import;
167
+ distinct histories are never merged/renumbered silently. Original files remain.
168
+ An unmatched SQLite/JSONL pair fails visibly. New SQLite events are not automatically
169
+ copied back to JSONL for an older reader; rollback requires explicit backup/export
170
+ reconciliation.
171
+
172
+ ## Verification and follow-ups
173
+
174
+ Protocol fakes (a Claude CLI speaking the SDK control protocol, a Codex app-server
175
+ speaking JSON-RPC; `test/native-fakes.ts`) test switching, chat isolation, corrections, explicit resume after restart,
176
+ captured queue targets/models, idempotency, protected overflow and uncertain delivery.
177
+ Storage tests exercise migration conflicts/rollback, SQLite contention, commit-before-
178
+ publication and unknown schema rejection. Ordinary tests make no paid model calls.
179
+
180
+ Remaining gates include isolated account-supported
181
+ cheap helpers, OpenCode parity, retention/GC, full platform packaging and long-history
182
+ quality/performance comparisons. Electron optimization remains future work.
183
+ See [architecture](../ARCHITECTURE.md) and the linked notes/TODO for measured evidence.
184
+
185
+ Cleanup evidence and the complete E01–E64 status audit are in
186
+ [BRAIN-AUDIT](refactoring/BRAIN-AUDIT.md).
package/docs/cloud.md ADDED
@@ -0,0 +1,108 @@
1
+ # Loom Cloud setup (Supabase)
2
+
3
+ One Supabase project powers three optional features:
4
+
5
+ | Feature | Uses | Without it |
6
+ |---|---|---|
7
+ | **Loom Cloud relay**: phone ↔ computer from any network | Realtime (broadcast) | The phone works on the same Wi-Fi or tailnet only |
8
+ | **Sign in with Google** in the phone app | Auth | "Continue without an account" still works fully |
9
+ | **Anonymous usage stats** (country only) | one Postgres table | Nothing is sent |
10
+
11
+ The free tier covers all three. Loom runs no server of its own, but out of the
12
+ box the relay and the Team Hub use Loom's hosted Supabase project (see
13
+ `src/core/hosted.ts`). Everything below points them at a project of your own.
14
+
15
+ ## 1. Create the project
16
+
17
+ 1. Go to https://supabase.com/dashboard and create a **New project**.
18
+ 2. Open **Project Settings → API** and copy two values:
19
+ - the **Project URL**: `https://<ref>.supabase.co`
20
+ - the **anon public** key.
21
+
22
+ The anon key is designed to be public. It ships inside the app, and everything
23
+ it can reach is locked down by the policies below.
24
+
25
+ ## 2. Realtime (the relay)
26
+
27
+ The relay uses **broadcast** channels named `loom-relay:<random id>`. Nothing is
28
+ stored, and every message is end-to-end encrypted with a key that exists only in
29
+ your pairing QR.
30
+
31
+ - **Realtime → Settings**: keep **public channels allowed**. This is the default.
32
+ If "private channels only" is on, the relay can't join.
33
+
34
+ Turn it on for your computer:
35
+
36
+ ```bash
37
+ loom cloud enable --url https://<ref>.supabase.co --key <anon key>
38
+ loom pair # the QR now carries the relay credentials in its #fragment
39
+ ```
40
+
41
+ Or set `LOOM_SUPABASE_URL` / `LOOM_SUPABASE_ANON_KEY` in the daemon's environment
42
+ and use **Settings → Loom Cloud** in the desktop app.
43
+
44
+ - `loom cloud rotate` mints a new key. Phones that paired through the cloud must
45
+ pair again.
46
+ - `loom cloud disable` leaves the channel.
47
+
48
+ ## 3. Sign in with Google
49
+
50
+ 1. **Google Cloud Console → APIs & Services → Credentials → Create credentials →
51
+ OAuth client ID**:
52
+ - Application type: **Web application**
53
+ - Authorized redirect URI: `https://<ref>.supabase.co/auth/v1/callback`
54
+ 2. **Supabase → Authentication → Sign In / Providers → Google**:
55
+ - enable it;
56
+ - paste the **Client ID** and **Client secret**.
57
+ 3. **Supabase → Authentication → URL Configuration → Redirect URLs**: add
58
+ - `loom://auth-callback` (installed app)
59
+ - `exp://**`, for development in Expo Go only.
60
+ 4. In the phone app, copy `app/.env.example` to `app/.env` and fill in:
61
+
62
+ ```
63
+ EXPO_PUBLIC_SUPABASE_URL=https://<ref>.supabase.co
64
+ EXPO_PUBLIC_SUPABASE_ANON_KEY=<anon key>
65
+ ```
66
+
67
+ For EAS builds, set the same two names as EAS environment variables.
68
+
69
+ An account is optional. Loom's local features never need one.
70
+
71
+ ## 4. Anonymous usage stats
72
+
73
+ Run [`supabase/migrations/0001_app_opens.sql`](../supabase/migrations/0001_app_opens.sql)
74
+ in **SQL Editor**, or use `supabase db push` if you use the CLI.
75
+
76
+ **What is collected, per app open (at most once a day):**
77
+ - **country**: from the phone's region setting. No IP address, no location.
78
+ - **platform**
79
+ - **app version**
80
+
81
+ **What is not collected:** no user id, no device id, no email, no prompts, no code.
82
+
83
+ - Anyone can insert. Nobody but the service role can read.
84
+ - The phone app has an **Anonymous usage stats** switch to turn it off.
85
+
86
+ Read the counts in the SQL editor, which runs as the service role:
87
+
88
+ ```sql
89
+ select country, count(*) from app_opens group by 1 order by 2 desc;
90
+ ```
91
+
92
+ ## Security model, in one paragraph
93
+
94
+ - **Supabase relays but cannot read.** Every relay message is
95
+ XChaCha20-Poly1305-sealed with a 32-byte key minted on your computer. That key
96
+ travels only in the pairing link's URL fragment, which is never sent to a server.
97
+ - **Requests are authorized exactly as on the LAN.** Your computer runs each
98
+ relayed request against itself, with the phone's own paired token. Revoking a
99
+ phone (`loom clients --revoke`) stops its requests the same way over the cloud.
100
+ Every phone paired to one computer shares one relay key, though, so a revoked
101
+ phone that kept the key can still *read* the others' traffic until you run
102
+ `loom cloud rotate` (which re-pairs everyone).
103
+ - **A captured request can't be replayed.** Each one carries its send time
104
+ inside the seal; your computer refuses anything stamped more than ten minutes
105
+ off and never runs the same request id twice.
106
+ - **The local admin bootstrap is refused over the relay.**
107
+ - Someone who learns your channel id still can't read or forge anything without
108
+ the key.
package/docs/crews.md ADDED
@@ -0,0 +1,62 @@
1
+
2
+
3
+ ## Desktop and phone controls
4
+
5
+ Crew is available beside Orchestra on desktop and in the phone project tabs.
6
+ Pick Ship, Fan-out or Race in Play and limits before starting the next goal.
7
+ Each active seat shows its own work, goal spend and native context epoch. The
8
+ board keeps Planned -> Building -> Review -> Testing -> Ready to integrate -> Done;
9
+ Race waits for Choose this result before integrating a winner.
10
+
11
+ Pause finishes active turns and then prevents new turns. Resume keeps a plan
12
+ waiting for approval. Budget and team holds explain why work stopped. A native
13
+ recovery warning requires inspecting/reconciling the action first; Resume is
14
+ not offered while the receipt is uncertain. Refresh context starts a new
15
+ native epoch only when it is safe to do so.
16
+
17
+ Team requests and runner crews contains encrypted requests for owner approval
18
+ and remote runner progress. Start composer goal on my runner queues the goal
19
+ text from the composer; the runner's plan still needs the owner's approval.
20
+ Completed runner goals provide Review PR; humans merge them.
21
+
22
+ Crew cards also appear in the ordinary Board with their crew, stage and seat.
23
+ These are scheduler-owned cards; open Crew to control them. Fleet includes
24
+ active crews, and a crew notification opens the corresponding Crew view.
25
+
26
+ CLI examples:
27
+
28
+ ```powershell
29
+ loom crew pause --crew ship
30
+ loom crew resume --crew ship
31
+ loom crew pick --crew ship --to builder-2
32
+ loom crew budget --crew ship --amount 15
33
+ loom crew overlap --crew ship --card c12 --decision narrow --touches 'src/api/**'
34
+ loom crew refresh --crew ship --to reviewer
35
+ loom crew deliver --crew ship
36
+ ```
37
+
38
+ Physical native-phone acceptance, hosted migration acceptance and trusted
39
+ installer signing are separate checks. The local browser checks and native
40
+ Windows orchestration evidence do not substitute for them.
41
+ The hosted hub needs migration `0010_crew_coordination.sql` for requests and
42
+ control jobs at full capacity. Review/apply it separately with admin access;
43
+ Loom does not apply it. The self-hosted hub supports these paths directly.
44
+
45
+
46
+ A reviewed role/runner permission ceiling is checked against the actual harness
47
+ before work starts. OpenCode's `ask` mode is currently unverified/unsupported,
48
+ so a team role requiring it must use Codex/Claude (or a separately reviewed,
49
+ supported role setting). Loom refuses the seat instead of silently using auto.
50
+ Tightening permissions during a goal settles and recreates the warm adapter
51
+ before its next turn; native compatibility changes receive a fresh binding.
52
+
53
+ The `hub-sql` CI job runs all migrations and authorization checks in a disposable
54
+ PostgreSQL cluster and fails if tools are missing. It never connects to hosted
55
+ Supabase. Migration 0010 and the other SQL checks passed there (26 checks).
56
+
57
+
58
+ If an owner-approved request stays queued because a budget or startup check
59
+ blocked admission, Check delivery retries that known unstarted item after the
60
+ block is resolved. A running, delivered or failed request is never executed
61
+ again by this button. An interrupted delivery needs inspection and a new
62
+ explicit request; restarting the daemon does not silently replay it.
@@ -11,7 +11,7 @@ Canonical token sources:
11
11
 
12
12
  | Surface | Token file |
13
13
  | --- | --- |
14
- | Web app (daemon-served) + Electron shell | `src/daemon/app-page.ts` (`:root` light / `.dark`) |
14
+ | Web app (daemon-served) + Electron shell | `src/web/styles/base.css` (`:root` light / `.dark`) |
15
15
  | Phone app (Expo RN) | `app/src/theme.ts` |
16
16
 
17
17
  ## Color tokens — web / desktop (from Orca desktop)
@@ -164,7 +164,7 @@ xterm.js, served from `node_modules` at `/app/vendor/*` — no bundler, no CDN.
164
164
  **`pipe` — the fallback** (no node-pty). `node-pty` is a native module, so it
165
165
  is an *optionalDependency* and ships prebuilds only for macOS/Windows; Loom
166
166
  runs headless on Linux boxes that may have no toolchain, and `npm i -g
167
- threadloom` must never break. A long-lived shell on plain pipes:
167
+ @loompad/cli` must never break. A long-lived shell on plain pipes:
168
168
 
169
169
  - `cd` and exported variables still persist; tabs are isolated.
170
170
  - No tty, so the daemon reports each command's exit code and cwd out of band:
@@ -202,6 +202,35 @@ pills.
202
202
  Mobile (<900px) keeps the single-column thread: chips row, glass sheets, and
203
203
  the docked composer.
204
204
 
205
+ ## The thread (1.1 layer)
206
+
207
+ The last block of the stylesheet ("Loom 1.1 design layer") is the finish on
208
+ top of the tokens above; it uses the same tokens and wins by order.
209
+
210
+ - **One reading column** — `--measure: 760px` with a `--gutter` either side.
211
+ Prose is Geist at 14.5px / 1.72; mono is for code, paths and ids only.
212
+ - **A reply is a byline, not a bubble.** `.who` = 22px mark tile (`.av`),
213
+ name, model pill, time (on hover). The body indents 30px under the name.
214
+ An agent continuing its own turn (`.msg.agent.cont`) drops the byline.
215
+ - **Your message** is the only bubble: `--secondary`, 18px radius with a
216
+ 6px tail corner, right-aligned.
217
+ - **Tool use** folds: consecutive `.tool` rows become one `details.acts`
218
+ whose summary counts them ("Ran 3 commands, read 2 files").
219
+ - **Every turn ends on `.turnend`** — agent · duration · model · cost.
220
+ - **Live** — `#feedlive` holds a `.livebox` per working agent: a bar
221
+ (spinning ring + shimmer label + timer) until text arrives, then the reply
222
+ itself with a cyan `.caret`. Never logged; the finished message replaces it.
223
+ - **Cards** — `.plancard` (orchestrator plan), `.nicard` (needs you, warn
224
+ tint), `.apcard` (approval), `.errcard` (error, raw payload folded),
225
+ `.odone` (orchestra complete, ok tint). One radius (14px), one shadow.
226
+ - **Motion** — custom `--ease-out`; nothing over 250ms on UI; no animation on
227
+ keyboard-driven actions; `prefers-reduced-motion` turns it all off.
228
+ - **Confirmations** are `askConfirm()` (an in-app `.cfmodal`), not
229
+ `window.confirm`.
230
+ - **Regex escapes in the page are written doubled** (`\\s`), because the
231
+ page is one template literal and a single backslash is eaten — a test
232
+ enforces it.
233
+
205
234
  ## Window chrome (Electron)
206
235
 
207
236
  Matches Orca: `titleBarStyle: hiddenInset` (macOS) with traffic lights at