@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,249 @@
1
+ # Agent Teams — feature spec
2
+
3
+ **Status:** Phase 1 built (crew core + one-link onboarding) · **Owner:** Harsha (@igharsha7) · **Author:** Nivesh (@nickthelegend) · **Date:** 2026-10-01
4
+ **Branch:** `feat/agent-teams` (off `main`, never directly on `main`)
5
+
6
+ > **Built on `feat/agent-teams` (2026-10-08):**
7
+ > - **Phase 1:** `core/crew.ts`, `core/crew-protocol.ts`, `daemon/routes/crews.ts`, the Crew tab and `loom crew`. One person's crew works one card at a time: the Lead plans, you approve, then build → review (rounds of changes) → test → apply. Goal worktrees, trailers, the channel, asks, replan on feedback, stop/resume across restarts.
8
+ > - **Onboarding, ahead of Phase 4:** `daemon/onboard.ts` and `core/invite-link.ts`. *Invite* (or `loom invite`) gives one https link (`site/join/`). It signs the teammate in, joins the team, clones the repo (granting and accepting GitHub access for private repos), opens it with their agents, shares it, and sets up your crews from their roster.
9
+ > - **Still to build:** persistent teammate sessions through continuity (P2), parallel builders and leases (P3), crews across people (P4), polish and the phone (P5).
10
+
11
+ ---
12
+
13
+ ## 1. The idea in one paragraph
14
+
15
+ Today Loom gives you **one agent per chat** and, for big goals, an **Orchestra**: an orchestrator plans a task graph, spawns a worker per task, and the workers die when their task merges. Loom Teams lets **several people** work on one repo without colliding. **Agent Teams joins the two.** Each person runs a **crew**: a named, long-lived group of agents with roles (a Lead, Builders, a Reviewer, a Tester). The crew keeps its context between goals, talks in a shared channel, claims work from the project board, reviews its own output across vendors, and ships **one PR per goal**. When several people each run a crew on the same repo, the crews coordinate through what Loom Teams already provides: presence, leases, the team brain and the landing queue. Humans stay in charge. You can talk to the whole crew or to any one teammate, and nothing merges without a human.
16
+
17
+ ## 2. Why
18
+
19
+ | What happens today | What it costs |
20
+ |---|---|
21
+ | An Orchestra worker starts cold for every task, and its context is thrown away when the task merges. | The next task re-reads the same files and repeats the same mistakes, and tokens go on rediscovery. |
22
+ | Workers never talk to each other; everything goes through the orchestrator. | The orchestrator is the bottleneck: a builder can't ask the tester "does this fail for you too?" |
23
+ | Review is one more agent turn, run when someone remembers. | Mixed-vendor output conflicts often. Our own research put it at 41.7% of overlapping agent pairs (`docs/teams-architecture.md`). |
24
+ | Each person's agents are separate from everyone else's, so a team of 5 is 5 people each driving 1–4 agents by hand. | No reusable, visible "who is doing what" for the agents, and the humans do the dispatching. |
25
+
26
+ The pieces already exist: native continuity (persistent per-chat sessions across Codex, Claude Code and OpenCode), warm provider sessions, the board, Orchestra's worktrees and integration branch, and Loom Teams' hub, leases, brain and landing. **Agent Teams is mostly composition**, plus a small amount of new protocol.
27
+
28
+ ## 3. Goals and non-goals
29
+
30
+ **Goals**
31
+ 1. A person can create a crew from a template in under a minute and give it a goal or a backlog.
32
+ 2. Teammates keep their own context across tasks and goals (native continuity per teammate).
33
+ 3. Teammates coordinate directly, in a crew channel and through board cards, without routing everything through the Lead.
34
+ 4. Built-in cross-vendor review and testing before anything reaches a PR.
35
+ 5. With several people, crews never silently collide: leases, conflict prediction and the landing queue apply per teammate.
36
+ 6. Everything is visible and steerable: the crew view, the channel, the board, the phone.
37
+ 7. Every action is in the event log, replayable and auditable.
38
+
39
+ **Non-goals (for now)**
40
+ - Agents approving or merging PRs. A human always merges.
41
+ - Agents spending money (APIs, cloud) beyond the configured budgets.
42
+ - Cross-repo crews. A crew belongs to one project, just as the brain does.
43
+ - Replacing Orchestra. Orchestra becomes one *play* a Lead can run (§6.4).
44
+
45
+ ## 4. Vocabulary
46
+
47
+ | Term | Meaning |
48
+ |---|---|
49
+ | **Crew** | A named group of teammates attached to a project and owned by one person (e.g. "Nivesh's ship crew"). |
50
+ | **Teammate** | One agent in a crew: a roster agent (codex, claude-code, opencode, a model agent…) plus a **role** and a **charter**. |
51
+ | **Lead** | The teammate that turns goals into cards, assigns them and integrates. Exactly one per crew. |
52
+ | **Role** | What a teammate is for: `lead`, `builder`, `reviewer`, `tester`, `researcher`, or a custom role. Roles set default permissions, briefing and which actions are allowed. |
53
+ | **Charter** | Standing instructions for a teammate (the existing per-agent instructions, scoped to the crew). |
54
+ | **Crew channel** | One chat where the crew and its humans talk. Every teammate also keeps its own chat (its private working thread). |
55
+ | **Card** | A board task: the unit of work a teammate claims. It carries `touches`, `blockedBy`, `priority` and `due`, all of which exist today. |
56
+ | **Claim** | A teammate taking a card. It takes the card's leases too (§7). |
57
+ | **Handoff** | A teammate passing a card to another teammate, with a note. |
58
+ | **Play** | A reusable way of working that the Lead can run: *build → review → test → land*, *race* (two builders, keep one), *orchestra* (DAG fan-out). |
59
+
60
+ ## 5. What the user sees
61
+
62
+ ### 5.1 Creating a crew
63
+ **Project settings → Crews → New crew**, or `loom crew create --template ship`. The templates are:
64
+
65
+ | Template | Teammates (defaults; every slot can be any installed agent) |
66
+ |---|---|
67
+ | **Ship** | Lead (Claude Code) · Builder ×2 (Codex, OpenCode) · Reviewer (a *different vendor* from the builders) · Tester (any) |
68
+ | **Fix** | Lead + Builder (same agent) · Tester |
69
+ | **Research** | Lead · Researcher ×2 · Writer |
70
+ | **Solo+** | One Builder + one Reviewer, no Lead (the human is the Lead) |
71
+
72
+ The reviewer's vendor is checked on save. A crew whose reviewer shares a vendor with every builder gets a warning, not a block.
73
+
74
+ ### 5.2 The Crew view
75
+ A new tab next to Orchestra, also shown as a sheet on the phone:
76
+ - **Roster:** each teammate's avatar, role, agent and model, live state (idle, working on card X, waiting, reviewing), context meter, and spend today.
77
+ - **Channel:** the crew chat. Messages from teammates are attributed (`@builder-1`), and humans can `@mention` any teammate or `@crew`.
78
+ - **Board lane:** the cards the crew owns, in its columns (Backlog → Claimed → In review → Testing → Ready to land), each with who holds it.
79
+ - **Goal strip:** the current goal, its integration branch, its PR, CI status and budget.
80
+
81
+ ### 5.3 Talking to it
82
+ - Type in the channel: "add rate limiting to the API". The Lead answers with a plan (cards) before anyone starts. **Plan approval is on by default** for crews and can be turned off per crew.
83
+ - Type `@reviewer be strict about error handling`. That goes to one teammate and is added to its charter for this goal.
84
+ - Click any teammate to open its private thread, see exactly what it did, and steer it.
85
+ - **Stop crew** interrupts everyone. **Pause** stops new claims and lets current turns finish.
86
+
87
+ ## 6. How work flows
88
+
89
+ ### 6.1 One goal, one crew
90
+ 1. A **goal** arrives: typed in the channel, picked from GitHub issues, or queued.
91
+ 2. The **Lead plans**. It writes cards with `title`, `touches` (globs), `blockedBy`, and a suggested role. They go to the board and, if plan approval is on, wait for 👍.
92
+ 3. **Builders claim** ready cards, one card per builder at a time. Each builder works in its **own worktree** on `loom/crew/<crew>/<goal>/<card>` (reusing Orchestra's worktree plumbing) and posts progress to the channel.
93
+ 4. When a builder finishes, the card moves to **In review**. The **Reviewer** gets the diff with the card and the plan, and either approves (the card moves to Testing) or **requests changes** (the card goes back to the same builder, *in the same session*, with the review attached).
94
+ 5. The **Tester** runs the project's tests (`landing.fastTest` or detected scripts) on the card's branch. A failure goes back to the builder with the log tail.
95
+ 6. The **Lead integrates** approved, green cards into the goal's integration branch (Orchestra's `integrate()`), resolves merge order, and opens **one PR per goal** (Loom Teams delivery, stacked when large).
96
+ 7. The PR gets Loom Teams' required **cross-vendor review check** and a human CODEOWNER review. The **auto-fix loop** (two attempts) routes CI failures back to the builder that owns the files.
97
+ 8. A human clicks **Land**.
98
+
99
+ ### 6.2 Talking directly
100
+ Teammates can address each other in the channel without the Lead: "@tester does `npm test` fail on main too?", "@builder-2 I'm touching `src/api/*`, wait or narrow". A message to a busy teammate queues behind its current turn (the existing prompt queue). Messages are rate-limited per teammate so two agents can't loop forever (§10).
101
+
102
+ ### 6.3 Continuity
103
+ Each teammate has its **own native session per crew** through native continuity (Harsha's Brain work). That session keeps the files, decisions and mistakes it has already seen, so the second card is cheaper and better than the first. A teammate moving between cards gets a *delta* packet (only what changed), not a full reconstruction. A crew-level memory scope (`scope: { crew }`) holds decisions the crew made, and it promotes to the project brain by the usual tiers.
104
+
105
+ ### 6.4 Plays
106
+ The Lead chooses how to run each goal. It suggests a play, the human confirms, and the default is **Ship**:
107
+
108
+ | Play | What it does | Built on |
109
+ |---|---|---|
110
+ | **Ship** | plan → claim → review → test → integrate → PR | new crew engine + Orchestra integrate |
111
+ | **Race** | two builders take the same card; the reviewer or the human keeps one | Orchestra race mode |
112
+ | **Fan-out** | a DAG of many small cards in parallel, ephemeral helpers allowed | Orchestra |
113
+ | **Pair** | builder and reviewer alternate on one card in a tight loop | crew engine |
114
+
115
+ ## 7. Several people, several crews ("both together")
116
+
117
+ Everything in Loom Teams applies, **per teammate instead of per person**:
118
+
119
+ - **Presence and Fleet:** teammates' crews appear in Fleet's Team section, grouped by owner. You see each crew's goal, cards and state, but not other people's transcripts (Loom Teams rule D21).
120
+ - **Leases:** a claim takes advisory leases on the card's `touches`, held by `member/crew/teammate`. Overlap rules are unchanged (D28–D39). A card that overlaps another member's lease is held with `overlap: wait | narrow | proceed:<reason>` before it starts. Hard zones from `loom.team.json` are enforced.
121
+ - **Conflict prediction:** `git merge-tree` against teammates' WIP refs runs on every card integration, and a predicted conflict notifies both crews' Leads *and* both humans.
122
+ - **Team brain:** crew decisions publish as proposals. Canon still changes only through the rolling `loom/canon` PR.
123
+ - **Asking another person's crew:** "@harsha/tester can you run the e2e suite on my branch?" is sent as a **request** that Harsha (the owner) accepts or declines on his phone. Crews never act for another member without that member's approval.
124
+ - **Runners:** a crew can be **hosted on a team runner** (Loom Teams Phase 5), so it keeps working while its owner's laptop is closed, under the runner's permission cap.
125
+ - **Policy** (`loom.team.json`, read from `origin/HEAD`), with these new fields:
126
+ ```json
127
+ "crews": {
128
+ "maxPerMember": 1,
129
+ "maxTeammates": 6,
130
+ "reviewerMustDifferFromBuilders": true,
131
+ "planApproval": "required",
132
+ "budgets": { "perCrewDailyUsd": 20 },
133
+ "roles": { "builder": { "permissions": "auto" }, "reviewer": { "permissions": "ask" } }
134
+ }
135
+ ```
136
+ - **Budgets:** spend rolls up per teammate, per crew, per member and per goal (the turn-stats and feed costs exist). A crew over budget pauses and asks.
137
+
138
+ ## 8. Architecture
139
+
140
+ ### 8.1 New pieces
141
+ | Piece | Where | What it does |
142
+ |---|---|---|
143
+ | **CrewEngine** | `src/core/crew.ts` | Per-project owner of crews: the scheduler (who takes the next turn), card claims and handoffs, review/test transitions, and plays. Pure logic over a host interface, like `OrchestraEngine`. |
144
+ | **Crew protocol** | `src/core/crew-protocol.ts` | The actions teammates emit in a `loom` code block, the same way the orchestrator does today, so any agent can take part even with no tools. A parser plus validation per role. |
145
+ | **Crew routes** | `src/daemon/routes/crews.ts` | REST for crews, the roster, the channel, claims and plays, plus WebSocket frames (`crew`). |
146
+ | **Crew view** | `src/web/project/crew.js` | The tab in §5.2, as a project factory like the others. Phone: `app/src/crew.tsx`. |
147
+ | **CLI** | `loom crew create/status/say/assign/pause/stop` | Thin over the routes. |
148
+
149
+ ### 8.2 Reused pieces (no new copies)
150
+ - **Agents and sessions:** roster agents and adapters; warm provider sessions; **native continuity** gives each teammate a binding per (crew, teammate).
151
+ - **Board:** cards gain `crew`, `claimedBy`, `stage` (claimed | review | test | ready) and `reviews[]`. They stay one board, one store.
152
+ - **Worktrees, integration, race:** from `OrchestraEngine`. Lift what's needed into a shared `src/core/worktrees.ts` instead of duplicating it.
153
+ - **Prompt queue:** a message to a busy teammate queues in that teammate's lane.
154
+ - **Leases, policy, brain, landing:** Loom Teams modules, called with a teammate as the holder.
155
+ - **Approvals and permissions:** per-role defaults through the existing permission modes.
156
+
157
+ ### 8.3 The protocol (first cut)
158
+ ```loom
159
+ {"actions": [
160
+ {"type": "plan", "cards": [{"title": "Rate-limit /api", "touches": ["src/api/**"], "role": "builder", "blockedBy": []}]},
161
+ {"type": "claim", "card": "c12"},
162
+ {"type": "post", "to": "@tester", "text": "does npm test fail on main too?"},
163
+ {"type": "handoff", "card": "c12", "to": "@builder-2", "note": "needs the cache layer first"},
164
+ {"type": "review", "card": "c12", "verdict": "approve" , "notes": "…"},
165
+ {"type": "test", "card": "c12", "result": "fail", "log": "…tail…"},
166
+ {"type": "ask", "question": "Postgres or SQLite for the limiter store?"},
167
+ {"type": "done", "summary": "…"}
168
+ ]}
169
+ ```
170
+ Allowed actions per role: the Lead may `plan`, `handoff`, `ask` and `done`; a builder may `claim`, `post`, `handoff` and `ask`; the reviewer may `review` and `post`; the tester may `test` and `post`. Anything else is refused and the refusal is logged as a reply. Later, the same actions are offered as **MCP tools** for agents that support MCP, which removes the parsing step.
171
+
172
+ ### 8.4 Data
173
+ - **Config** (`.loom/config.json`):
174
+ ```json
175
+ "crews": [{ "id": "ship", "name": "Ship crew", "play": "ship", "planApproval": true,
176
+ "teammates": [
177
+ { "id": "lead", "agent": "claude-code", "role": "lead" },
178
+ { "id": "builder-1","agent": "codex", "role": "builder" },
179
+ { "id": "builder-2","agent": "opencode", "role": "builder" },
180
+ { "id": "reviewer", "agent": "codex", "role": "reviewer", "charter": "be strict about errors" },
181
+ { "id": "tester", "agent": "opencode", "role": "tester" } ] }]
182
+ ```
183
+ A teammate references a roster agent. Several teammates can share one roster agent kind, each with its own session.
184
+ - **State:** crew runtime state (current goal, claims, stages) lives in `.loom/crews/<id>.json`, written like orchestra runs.
185
+ - **Events:** new kinds `crew` (phase changes) and `crew_message` (channel posts). Everything is in the log, so the UI, the phone and replay all read the same thing.
186
+ - **Hub** (several people only): `presence` rows gain `crew` and `teammate` columns. Leases already carry free-form holder metadata. No new tables are needed for Phase 4, but if one is, it needs a migration and **the owner's approval before it's applied to the hosted Supabase**.
187
+
188
+ ### 8.5 The scheduler
189
+ - At most one turn at a time per teammate. Per-crew concurrency is capped (`maxParallel`, default 3).
190
+ - **Priority:** human messages first, then review/test (to unblock builders), then claims by card `priority` and `due`.
191
+ - **Loop guards:** a teammate↔teammate exchange is capped at N messages per card (default 6) before it asks the Lead. The Lead's handoffs per card are capped at 3 before it asks the human.
192
+ - Stop and pause propagate to every teammate. Restart **resumes** crews the way Orchestra runs resume (interrupted turns continue, and the Lead is re-briefed).
193
+
194
+ ## 9. API and CLI
195
+
196
+ | Endpoint | Purpose |
197
+ |---|---|
198
+ | `GET/POST /api/projects/:id/crews` | List and create crews (from a template). |
199
+ | `GET/PATCH/DELETE /api/projects/:id/crews/:crew` | Read, edit and remove a crew. |
200
+ | `POST /api/projects/:id/crews/:crew/say` | Post to the channel (`{text, to?}`). |
201
+ | `POST /api/projects/:id/crews/:crew/goal` | Start a goal (`{text \| issue, play?}`). |
202
+ | `POST /api/projects/:id/crews/:crew/{pause,resume,stop}` | Control. |
203
+ | `POST /api/projects/:id/crews/:crew/cards/:card/{approve,reassign,unclaim}` | Human overrides. |
204
+ | WS frame `crew` | Roster and stage changes, live. |
205
+
206
+ CLI: `loom crew create --template ship`, `loom crew status`, `loom crew say "@reviewer …"`, `loom crew goal "add rate limiting"`, `loom crew pause|stop`.
207
+
208
+ ## 10. Risks and how we handle them
209
+ | Risk | Mitigation |
210
+ |---|---|
211
+ | Agents chatting in loops and burning tokens | Message caps per card, budgets per crew, and a "needs you" escalation; the scheduler refuses a teammate replying to itself. |
212
+ | Same-vendor rubber-stamp reviews | The reviewer's vendor must differ (policy), and reviews must cite file:line. |
213
+ | Parallel builders colliding inside one crew | Card `touches` and leases inside the crew too, plus merge-tree prediction on every integration. |
214
+ | Cost surprise | Per-teammate spend live in the roster, daily caps, and plan approval on by default. |
215
+ | Context bloat in long-lived sessions | Native continuity's delta packets and compaction handling; the Lead can **refresh** a teammate (new epoch). |
216
+ | Prompt injection from issues and web content | Memories from untrusted turns stay personal (Loom Teams D45); builders can't change crew policy. |
217
+ | One flaky teammate blocks the crew | Health checks (the existing agent Check), reassign on repeated failure, and a fallback agent per role. |
218
+
219
+ ## 11. Build plan (for Harsha)
220
+
221
+ Work on **`feat/agent-teams`** off `main`. **Don't push to `main`.** Open one PR per phase against `main`. Each PR must pass `npm test` (all DOM suites included) and CI.
222
+
223
+ | Phase | Scope | Done when |
224
+ |---|---|---|
225
+ | **P1 — Crew core (one person, sequential)** | config, `CrewEngine`, protocol parser, the channel and card claims, the Ship play with review/test stages, routes, CLI, a minimal Crew tab | a crew of fake agents (echo plus scripted adapters) plans, claims, reviews, tests and integrates a goal end to end in tests; a live run with OpenCode + Codex works |
226
+ | **P2 — Persistent teammates** | a native continuity binding per teammate, crew memory scope, refresh/epoch, resume after restart | the second card on the same teammate gets a delta packet; a daemon restart mid-goal resumes it |
227
+ | **P3 — Parallel and safe** | worktrees per builder, in-crew leases, merge-tree prediction, the Race and Fan-out plays (reusing Orchestra) | two builders on overlapping cards are held and resolved; integration conflicts route back to the owner |
228
+ | **P4 — Several people** | crews in hub presence and Fleet, cross-member requests with owner approval, runner-hosted crews, `loom.team.json` crew policy, budgets | two members' crews on one repo (the existing two-member test harness) never write the same file without a hold |
229
+ | **P5 — Polish** | templates, phone Crew sheet, notifications, the Crew view's board lane, docs | the phone can start a goal, approve a plan, and watch cards move |
230
+
231
+ **Testing rules**
232
+ - Never drive the real Claude Code in tests. Use echo, scripted adapters and the native fakes (`test/native-fakes.ts`, `test/opencode-fake.ts`).
233
+ - A live check uses OpenCode's free model (`opencode/big-pickle`) and, sparingly, Codex.
234
+ - Every new route gets an HTTP test; every UI change gets a DOM test (the `src/web` checkJs and accessor checks must stay at zero).
235
+
236
+ **Ask before:** applying any hosted Supabase migration, changing landing or merge behaviour, or adding a paid dependency.
237
+
238
+ ## 12. Open questions
239
+ 1. Should a crew be able to **own several goals at once**, or one goal at a time in v1? (Proposal: one at a time.)
240
+ 2. Should teammates get **MCP tools** in P1, or the `loom` code block only? (Proposal: block first, MCP in P3.)
241
+ 3. **Lending:** can a member lend one teammate (say, a reviewer) to another member's crew for a goal? (Proposal: P4, owner-approved.)
242
+ 4. Pricing: does a crew teammate count toward seats? (Proposal: no. Seats are humans; budgets cap agents.)
243
+
244
+ ## 13. Pointers
245
+ - Loom Teams design and decisions D1–D78: `docs/teams-architecture.md`, `docs/teams.md`
246
+ - Native continuity: `docs/brain-continuity.md`, `docs/refactoring/BRAIN-TODO.md`
247
+ - Orchestra: `src/core/orchestra.ts` (plan protocol, worktrees, integrate, race, resume)
248
+ - Provider core and warm sessions: `src/providers/`, `docs/refactoring/T3-PORT-NOTES.md`
249
+ - Web client structure: `src/web/README.md`