@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,145 @@
1
+ /**
2
+ * Loom Teams, Phase 2 — what a lease covers, and when two leases collide.
3
+ *
4
+ * Decisions this implements (docs/teams-architecture.md §1a):
5
+ * D28 overlap is computed on REAL files: each lease carries its globs, the
6
+ * tracked files they match right now, and the literal directory
7
+ * prefixes of its globs (for files that don't exist yet). Two leases
8
+ * overlap on a shared file, or where one's file or prefix sits under
9
+ * the other's prefix. `**\/*.test.ts` vs `src/auth/**` is caught because
10
+ * the expansion finds src/auth/session.test.ts in both.
11
+ * D10 hard zones: globs where only one goal may hold a lease at a time.
12
+ *
13
+ * Pure functions, no IO — the hub, the daemon and the phone share them.
14
+ */
15
+ export const MAX_LEASE_FILES = 500;
16
+ /** Normalize a repo-relative path: no leading ./ or /, forward slashes. */
17
+ export function normPath(p) {
18
+ return p.trim().replace(/\\/g, "/").replace(/^\.\//, "").replace(/^\/+/, "");
19
+ }
20
+ /**
21
+ * A glob as a RegExp: `**` spans directories, `*` and `?` don't, `{a,b}`
22
+ * alternates. Enough of git's pathspec-ish syntax for declaring touches.
23
+ */
24
+ export function globToRegExp(glob) {
25
+ const g = normPath(glob);
26
+ let re = "";
27
+ for (let i = 0; i < g.length; i++) {
28
+ const c = g[i];
29
+ if (c === "*") {
30
+ if (g[i + 1] === "*") {
31
+ i++;
32
+ if (g[i + 1] === "/") {
33
+ i++;
34
+ re += "(?:.*/)?"; // "**/" — zero or more directories
35
+ }
36
+ else {
37
+ re += ".*";
38
+ }
39
+ }
40
+ else {
41
+ re += "[^/]*";
42
+ }
43
+ }
44
+ else if (c === "?")
45
+ re += "[^/]";
46
+ else if (c === "{") {
47
+ const end = g.indexOf("}", i);
48
+ if (end > i) {
49
+ re += `(?:${g.slice(i + 1, end).split(",").map(escapeRe).join("|")})`;
50
+ i = end;
51
+ }
52
+ else
53
+ re += "\\{";
54
+ }
55
+ else
56
+ re += escapeRe(c);
57
+ }
58
+ // A bare directory ("src/auth" or "src/auth/") means everything in it.
59
+ if (!/[*?{]/.test(g))
60
+ return new RegExp(`^${escapeRe(g.replace(/\/$/, ""))}(?:/.*)?$`);
61
+ return new RegExp(`^${re}$`);
62
+ }
63
+ function escapeRe(s) {
64
+ return s.replace(/[.+^$()|[\]\\]/g, "\\$&");
65
+ }
66
+ /** The literal part of a glob before its first wildcard, as a directory (or exact path). */
67
+ export function literalPrefix(glob) {
68
+ const g = normPath(glob);
69
+ const wild = g.search(/[*?{]/);
70
+ if (wild < 0)
71
+ return g; // an exact path or a bare directory
72
+ const head = g.slice(0, wild);
73
+ const slash = head.lastIndexOf("/");
74
+ return slash < 0 ? "" : head.slice(0, slash + 1);
75
+ }
76
+ /** Build a lease scope from declared globs against the repo's tracked files. */
77
+ export function scopeOf(globs, tracked) {
78
+ const clean = [...new Set(globs.map(normPath).filter(Boolean))].slice(0, 50);
79
+ const res = clean.map(globToRegExp);
80
+ const files = [];
81
+ for (const f of tracked) {
82
+ const p = normPath(f);
83
+ if (res.some((r) => r.test(p))) {
84
+ files.push(p);
85
+ if (files.length >= MAX_LEASE_FILES)
86
+ break;
87
+ }
88
+ }
89
+ const prefixes = [...new Set(clean.map(literalPrefix))];
90
+ return { globs: clean, files, prefixes };
91
+ }
92
+ /** `under("src/auth/x.ts", "src/auth/")` — a path inside a prefix (or equal to an exact one). */
93
+ function under(p, prefix) {
94
+ if (prefix === "")
95
+ return true; // a glob starting with a wildcard covers the whole repo
96
+ if (prefix.endsWith("/"))
97
+ return p.startsWith(prefix);
98
+ return p === prefix || p.startsWith(prefix + "/");
99
+ }
100
+ /**
101
+ * Where two scopes collide: shared files, files of one under a prefix of the
102
+ * other, and nested prefixes (two plans for the same not-yet-existing folder).
103
+ * Empty when they don't overlap. Repo-wide prefixes ("") only collide through
104
+ * real files — a `**\/*.md` lease must not look like it owns everything.
105
+ */
106
+ export function overlap(a, b) {
107
+ const out = new Set();
108
+ const bFiles = new Set(b.files);
109
+ for (const f of a.files)
110
+ if (bFiles.has(f))
111
+ out.add(f);
112
+ const aPre = a.prefixes.filter((p) => p !== "");
113
+ const bPre = b.prefixes.filter((p) => p !== "");
114
+ const aRe = a.globs.map(globToRegExp);
115
+ const bRe = b.globs.map(globToRegExp);
116
+ for (const f of a.files)
117
+ if (bPre.some((p) => under(f, p)) && bRe.some((r) => r.test(f)))
118
+ out.add(f);
119
+ for (const f of b.files)
120
+ if (aPre.some((p) => under(f, p)) && aRe.some((r) => r.test(f)))
121
+ out.add(f);
122
+ for (const pa of aPre)
123
+ for (const pb of bPre)
124
+ if (under(pa, pb) || under(pb, pa))
125
+ out.add(pa.length >= pb.length ? pa : pb);
126
+ return [...out].sort();
127
+ }
128
+ /** The first hard zone this scope touches, or null. */
129
+ export function zoneOf(scope, zones) {
130
+ for (const z of zones) {
131
+ const re = globToRegExp(z);
132
+ const zp = literalPrefix(z);
133
+ if (scope.files.some((f) => re.test(f)))
134
+ return z;
135
+ if (scope.prefixes.some((p) => p !== "" && (under(p, zp) || (zp !== "" && under(zp, p)))))
136
+ return z;
137
+ }
138
+ return null;
139
+ }
140
+ /** Does a path fall inside any of these globs? (Drift detection, D33.) */
141
+ export function covered(path, globs) {
142
+ const p = normPath(path);
143
+ return globs.some((g) => globToRegExp(g).test(p));
144
+ }
145
+ //# sourceMappingURL=team-leases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-leases.js","sourceRoot":"","sources":["../../src/core/team-leases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Loom Teams, Phase 3 — one brain: how a briefing ranks what the team knows.
3
+ *
4
+ * D42 canon > confirmed by 2+ members > your own > a teammate's proposal,
5
+ * and every briefed line says which (so the model knows how sure to be)
6
+ * D16 failures and facts fade out of briefings after ~90 days unless they're
7
+ * re-confirmed; decisions, conventions and constraints persist until
8
+ * superseded
9
+ * D43 untrusted memories (learned from outside content) are yours alone and
10
+ * say so
11
+ *
12
+ * Built on the solo brain's retrieval (BM25 + entities + trigram), re-weighted
13
+ * by tier. Pure — the daemon hands it the pools.
14
+ */
15
+ import type { Memory } from "./brain.js";
16
+ import { type RetrieveOpts } from "./brain-index.js";
17
+ export type Tier = "canon" | "confirmed" | "own" | "proposed";
18
+ export interface TieredMemory extends Memory {
19
+ tier: Tier;
20
+ /** GitHub login of whoever's agent learned it (teammates' memories). */
21
+ author?: string;
22
+ /** Members whose agents learned exactly this (D41). */
23
+ confirmedBy?: string[];
24
+ }
25
+ export declare const TIER_WEIGHT: Record<Tier, number>;
26
+ export declare const AGE_OUT_MS: number;
27
+ /** D16: a failure or fact nobody has re-confirmed in ~90 days is out of briefings (canon never ages). */
28
+ export declare function agedOut(m: TieredMemory, now?: number): boolean;
29
+ export interface TieredHit {
30
+ memory: TieredMemory;
31
+ score: number;
32
+ }
33
+ /**
34
+ * Rank every pool together, then weight by tier. Canon that's relevant at all
35
+ * always makes the cut — a briefing that drops the team's settled rules for a
36
+ * better keyword match has its priorities backwards.
37
+ */
38
+ export declare function retrieveTiered(pool: TieredMemory[], opts: RetrieveOpts & {
39
+ now?: number;
40
+ }): TieredHit[];
41
+ /** The briefing block: grouped by kind, each line labelled with its tier. */
42
+ export declare function compileTieredBrief(hits: TieredHit[]): string;
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Loom Teams, Phase 3 — one brain: how a briefing ranks what the team knows.
3
+ *
4
+ * D42 canon > confirmed by 2+ members > your own > a teammate's proposal,
5
+ * and every briefed line says which (so the model knows how sure to be)
6
+ * D16 failures and facts fade out of briefings after ~90 days unless they're
7
+ * re-confirmed; decisions, conventions and constraints persist until
8
+ * superseded
9
+ * D43 untrusted memories (learned from outside content) are yours alone and
10
+ * say so
11
+ *
12
+ * Built on the solo brain's retrieval (BM25 + entities + trigram), re-weighted
13
+ * by tier. Pure — the daemon hands it the pools.
14
+ */
15
+ import { retrieveFrom } from "./brain-index.js";
16
+ export const TIER_WEIGHT = { canon: 1.6, confirmed: 1.25, own: 1, proposed: 0.8 };
17
+ export const AGE_OUT_MS = 90 * 24 * 60 * 60_000;
18
+ /** D16: a failure or fact nobody has re-confirmed in ~90 days is out of briefings (canon never ages). */
19
+ export function agedOut(m, now = Date.now()) {
20
+ if (m.tier === "canon")
21
+ return false;
22
+ if (m.kind !== "failure" && m.kind !== "fact")
23
+ return false;
24
+ return now - m.updatedAt > AGE_OUT_MS;
25
+ }
26
+ /**
27
+ * Rank every pool together, then weight by tier. Canon that's relevant at all
28
+ * always makes the cut — a briefing that drops the team's settled rules for a
29
+ * better keyword match has its priorities backwards.
30
+ */
31
+ export function retrieveTiered(pool, opts) {
32
+ const now = opts.now ?? Date.now();
33
+ const live = pool.filter((m) => !agedOut(m, now));
34
+ const byId = new Map(live.map((m) => [m.id, m]));
35
+ const limit = opts.limit ?? 12;
36
+ const raw = retrieveFrom(live, { ...opts, limit: Math.max(limit * 3, 30) });
37
+ const hits = raw
38
+ .map((h) => {
39
+ const m = byId.get(h.memory.id);
40
+ return { memory: m, score: h.score * TIER_WEIGHT[m.tier] };
41
+ })
42
+ .sort((a, b) => b.score - a.score || b.memory.updatedAt - a.memory.updatedAt);
43
+ const canon = hits.filter((h) => h.memory.tier === "canon");
44
+ const rest = hits.filter((h) => h.memory.tier !== "canon");
45
+ return [...canon, ...rest].slice(0, limit);
46
+ }
47
+ function label(m) {
48
+ if (m.tier === "canon")
49
+ return "team canon";
50
+ if (m.tier === "confirmed")
51
+ return `confirmed by ${m.confirmedBy?.length ?? 2} teammates`;
52
+ if (m.tier === "proposed")
53
+ return `proposed by ${m.author ?? "a teammate"} — not yet confirmed`;
54
+ return m.untrusted ? "yours · learned from external content, unverified" : "";
55
+ }
56
+ const KIND_TITLE = {
57
+ constraint: "Constraints reality imposes",
58
+ failure: "Known failures — do not repeat these",
59
+ decision: "Decisions made, and why",
60
+ convention: "How this project does things",
61
+ fact: "Facts",
62
+ task: "Current work",
63
+ };
64
+ /** The briefing block: grouped by kind, each line labelled with its tier. */
65
+ export function compileTieredBrief(hits) {
66
+ if (!hits.length)
67
+ return "";
68
+ const lines = [
69
+ "## What your team has learned (relevant to the work at hand)",
70
+ "Team canon is settled — follow it. Confirmed memories are reliable; a single teammate's proposal is useful but unverified.",
71
+ ];
72
+ for (const kind of ["constraint", "failure", "decision", "convention", "fact", "task"]) {
73
+ const items = hits.filter((h) => h.memory.kind === kind);
74
+ if (!items.length)
75
+ continue;
76
+ lines.push("", `### ${KIND_TITLE[kind]}`);
77
+ for (const h of items) {
78
+ const l = label(h.memory);
79
+ lines.push(`- ${h.memory.text}${l ? ` _(${l})_` : ""}`);
80
+ }
81
+ }
82
+ return lines.join("\n");
83
+ }
84
+ //# sourceMappingURL=team-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-memory.js","sourceRoot":"","sources":["../../src/core/team-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Loom Teams, Phase 2 — `loom.team.json`, the team's policy as code.
3
+ *
4
+ * D37: it's read from the default branch on origin (`git show origin/HEAD:…`),
5
+ * so changing policy takes a reviewed PR; a local copy may only make rules
6
+ * STRICTER. D38: it enforces hard zones, a permission ceiling, an agent
7
+ * allowlist, protected-branch delivery and concurrency caps. D39: changes apply
8
+ * to new actions only — callers check policy at the moment they act.
9
+ *
10
+ * {
11
+ * "hardZones": ["db/migrations/**", "package-lock.json"],
12
+ * "permissions": { "ceiling": "auto", "bypassRequiresPlan": true },
13
+ * "agents": { "allow": ["claude-code", "codex", "antigravity-cli"] },
14
+ * "delivery": { "protected": ["main", "release/*"] },
15
+ * "orchestra": { "maxParallelPerMember": 6, "teamMaxConcurrentAgents": 20 },
16
+ * "landing": { "fastTest": "npm test -- --changed", "timeoutMin": 10, "autoFixAttempts": 2,
17
+ * "lanes": { "web": ["web/**"], "api": ["api/**", "db/**"] } },
18
+ * "review": { "enabled": true, "maxRuns": 3 },
19
+ * "budgets": { "perGoalUsd": 15, "perMemberDailyUsd": 60 },
20
+ * "runners": { "shared": true, "permissions": "bypass" }
21
+ * }
22
+ *
23
+ * Phase 4 (D56–D64) adds landing, review, stacks (`delivery.stack`) and budgets.
24
+ */
25
+ import type { PermissionMode } from "./permissions.js";
26
+ import { type CrewPolicy } from "./crew-policy.js";
27
+ export interface TeamPolicy {
28
+ crews?: CrewPolicy;
29
+ hardZones: string[];
30
+ permissions: {
31
+ ceiling: PermissionMode;
32
+ bypassRequiresPlan: boolean;
33
+ };
34
+ agents: {
35
+ allow: string[] | null;
36
+ };
37
+ delivery: {
38
+ protected: string[];
39
+ stack: "auto" | "off";
40
+ };
41
+ orchestra: {
42
+ maxParallelPerMember: number | null;
43
+ teamMaxConcurrentAgents: number | null;
44
+ };
45
+ /** Phase 6 (D81): `lanes` are path scopes for the landing train — goals in different lanes land at once. */
46
+ landing: {
47
+ fastTest: string | null;
48
+ timeoutMin: number;
49
+ autoFixAttempts: number;
50
+ lanes: Record<string, string[]>;
51
+ };
52
+ review: {
53
+ enabled: boolean;
54
+ maxRuns: number;
55
+ };
56
+ budgets: {
57
+ perGoalUsd: number | null;
58
+ perMemberDailyUsd: number | null;
59
+ };
60
+ /** Phase 5 (D68, D70): may a member's runner take teammates' goals; the permission ceiling on runners. */
61
+ runners: {
62
+ shared: boolean;
63
+ permissions: PermissionMode;
64
+ };
65
+ }
66
+ export declare const OPEN_POLICY: TeamPolicy;
67
+ /** Parse a policy file leniently: unknown keys ignored, bad values fall back to open. */
68
+ export declare function parsePolicy(raw: unknown): TeamPolicy;
69
+ /**
70
+ * Combine the reviewed policy with a local one so the local copy can only
71
+ * tighten: more hard zones, a lower ceiling, a narrower allowlist, more
72
+ * protected branches, smaller caps.
73
+ */
74
+ export declare function stricter(base: TeamPolicy, local: TeamPolicy): TeamPolicy;
75
+ /**
76
+ * The effective policy for a repo: origin's default branch, tightened by any
77
+ * local working-copy file. No file anywhere → the open policy.
78
+ */
79
+ export declare function loadPolicy(repoDir: string): Promise<TeamPolicy & {
80
+ source: "origin" | "local" | "none";
81
+ }>;
82
+ /** The permission mode an agent actually gets under this policy (D38). */
83
+ export declare function cappedPermission(policy: TeamPolicy, wanted: PermissionMode, planMode: boolean): PermissionMode;
84
+ export declare function agentAllowed(policy: TeamPolicy, kind: string): boolean;
85
+ export declare function isProtected(policy: TeamPolicy, branch: string): boolean;
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Loom Teams, Phase 2 — `loom.team.json`, the team's policy as code.
3
+ *
4
+ * D37: it's read from the default branch on origin (`git show origin/HEAD:…`),
5
+ * so changing policy takes a reviewed PR; a local copy may only make rules
6
+ * STRICTER. D38: it enforces hard zones, a permission ceiling, an agent
7
+ * allowlist, protected-branch delivery and concurrency caps. D39: changes apply
8
+ * to new actions only — callers check policy at the moment they act.
9
+ *
10
+ * {
11
+ * "hardZones": ["db/migrations/**", "package-lock.json"],
12
+ * "permissions": { "ceiling": "auto", "bypassRequiresPlan": true },
13
+ * "agents": { "allow": ["claude-code", "codex", "antigravity-cli"] },
14
+ * "delivery": { "protected": ["main", "release/*"] },
15
+ * "orchestra": { "maxParallelPerMember": 6, "teamMaxConcurrentAgents": 20 },
16
+ * "landing": { "fastTest": "npm test -- --changed", "timeoutMin": 10, "autoFixAttempts": 2,
17
+ * "lanes": { "web": ["web/**"], "api": ["api/**", "db/**"] } },
18
+ * "review": { "enabled": true, "maxRuns": 3 },
19
+ * "budgets": { "perGoalUsd": 15, "perMemberDailyUsd": 60 },
20
+ * "runners": { "shared": true, "permissions": "bypass" }
21
+ * }
22
+ *
23
+ * Phase 4 (D56–D64) adds landing, review, stacks (`delivery.stack`) and budgets.
24
+ */
25
+ import { execFile } from "./process.js";
26
+ import fs from "node:fs";
27
+ import path from "node:path";
28
+ import { parseLanes } from "./team-landing.js";
29
+ import { globToRegExp } from "./team-leases.js";
30
+ import { parseCrewPolicy, stricterCrewPolicy, DEFAULT_CREW_POLICY } from "./crew-policy.js";
31
+ export const OPEN_POLICY = {
32
+ crews: DEFAULT_CREW_POLICY,
33
+ hardZones: [],
34
+ permissions: { ceiling: "bypass", bypassRequiresPlan: false },
35
+ agents: { allow: null },
36
+ delivery: { protected: [], stack: "off" },
37
+ orchestra: { maxParallelPerMember: null, teamMaxConcurrentAgents: null },
38
+ landing: { fastTest: null, timeoutMin: 10, autoFixAttempts: 2, lanes: {} },
39
+ review: { enabled: true, maxRuns: 3 },
40
+ budgets: { perGoalUsd: null, perMemberDailyUsd: null },
41
+ runners: { shared: false, permissions: "bypass" },
42
+ };
43
+ const RANK = { ask: 0, auto: 1, bypass: 2 };
44
+ function strs(v) {
45
+ return Array.isArray(v) ? v.map(String).map((s) => s.trim()).filter(Boolean).slice(0, 200) : [];
46
+ }
47
+ function posInt(v) {
48
+ const n = Number(v);
49
+ return Number.isInteger(n) && n > 0 ? n : null;
50
+ }
51
+ function posNum(v) {
52
+ const n = Number(v);
53
+ return v !== null && v !== undefined && Number.isFinite(n) && n > 0 ? n : null;
54
+ }
55
+ function intIn(v, lo, hi, dflt) {
56
+ const n = Number(v);
57
+ return Number.isInteger(n) && n >= lo && n <= hi ? n : dflt;
58
+ }
59
+ /** Parse a policy file leniently: unknown keys ignored, bad values fall back to open. */
60
+ export function parsePolicy(raw) {
61
+ const o = (raw && typeof raw === "object" ? raw : {});
62
+ const perm = (o.permissions ?? {});
63
+ const ceiling = ["ask", "auto", "bypass"].includes(String(perm.ceiling)) ? perm.ceiling : "bypass";
64
+ const agents = (o.agents ?? {});
65
+ const allow = Array.isArray(agents.allow) ? strs(agents.allow) : null;
66
+ const orch = (o.orchestra ?? {});
67
+ const del = (o.delivery ?? {});
68
+ const land = (o.landing ?? {});
69
+ const rev = (o.review ?? {});
70
+ const bud = (o.budgets ?? {});
71
+ const run = (o.runners ?? {});
72
+ return {
73
+ crews: parseCrewPolicy(o.crews),
74
+ hardZones: strs(o.hardZones),
75
+ permissions: { ceiling, bypassRequiresPlan: perm.bypassRequiresPlan === true },
76
+ agents: { allow },
77
+ delivery: { protected: strs(del.protected), stack: del.stack === "auto" ? "auto" : "off" },
78
+ orchestra: {
79
+ maxParallelPerMember: posInt(orch.maxParallelPerMember),
80
+ teamMaxConcurrentAgents: posInt(orch.teamMaxConcurrentAgents),
81
+ },
82
+ landing: {
83
+ fastTest: typeof land.fastTest === "string" && land.fastTest.trim() ? land.fastTest.trim().slice(0, 500) : null,
84
+ timeoutMin: intIn(land.timeoutMin, 1, 120, 10),
85
+ autoFixAttempts: intIn(land.autoFixAttempts, 0, 5, 2),
86
+ lanes: parseLanes(land.lanes),
87
+ },
88
+ review: { enabled: rev.enabled !== false, maxRuns: intIn(rev.maxRuns, 0, 10, 3) },
89
+ budgets: { perGoalUsd: posNum(bud.perGoalUsd), perMemberDailyUsd: posNum(bud.perMemberDailyUsd) },
90
+ runners: {
91
+ shared: run.shared === true,
92
+ permissions: ["ask", "auto", "bypass"].includes(String(run.permissions)) ? run.permissions : "bypass",
93
+ },
94
+ };
95
+ }
96
+ /**
97
+ * Combine the reviewed policy with a local one so the local copy can only
98
+ * tighten: more hard zones, a lower ceiling, a narrower allowlist, more
99
+ * protected branches, smaller caps.
100
+ */
101
+ export function stricter(base, local) {
102
+ const minN = (a, b) => (a === null ? b : b === null ? a : Math.min(a, b));
103
+ const allow = base.agents.allow === null ? local.agents.allow : local.agents.allow === null ? base.agents.allow
104
+ : base.agents.allow.filter((x) => local.agents.allow.includes(x));
105
+ return {
106
+ crews: stricterCrewPolicy(base.crews ?? DEFAULT_CREW_POLICY, local.crews ?? DEFAULT_CREW_POLICY),
107
+ hardZones: [...new Set([...base.hardZones, ...local.hardZones])],
108
+ permissions: {
109
+ ceiling: RANK[local.permissions.ceiling] < RANK[base.permissions.ceiling] ? local.permissions.ceiling : base.permissions.ceiling,
110
+ bypassRequiresPlan: base.permissions.bypassRequiresPlan || local.permissions.bypassRequiresPlan,
111
+ },
112
+ agents: { allow },
113
+ delivery: {
114
+ protected: [...new Set([...base.delivery.protected, ...local.delivery.protected])],
115
+ // stacking is a delivery shape, not a safety rule: the reviewed file decides
116
+ stack: base.delivery.stack,
117
+ },
118
+ orchestra: {
119
+ maxParallelPerMember: minN(base.orchestra.maxParallelPerMember, local.orchestra.maxParallelPerMember),
120
+ teamMaxConcurrentAgents: minN(base.orchestra.teamMaxConcurrentAgents, local.orchestra.teamMaxConcurrentAgents),
121
+ },
122
+ landing: {
123
+ // a local file may add a fast test the team didn't require, never drop one
124
+ fastTest: base.landing.fastTest ?? local.landing.fastTest,
125
+ timeoutMin: base.landing.timeoutMin,
126
+ autoFixAttempts: Math.min(base.landing.autoFixAttempts, local.landing.autoFixAttempts),
127
+ // lanes let goals land side by side: only the reviewed file may split them
128
+ lanes: base.landing.lanes,
129
+ },
130
+ review: { enabled: base.review.enabled || local.review.enabled, maxRuns: base.review.maxRuns },
131
+ budgets: {
132
+ perGoalUsd: minN(base.budgets.perGoalUsd, local.budgets.perGoalUsd),
133
+ perMemberDailyUsd: minN(base.budgets.perMemberDailyUsd, local.budgets.perMemberDailyUsd),
134
+ },
135
+ runners: {
136
+ shared: base.runners.shared && local.runners.shared,
137
+ permissions: RANK[local.runners.permissions] < RANK[base.runners.permissions] ? local.runners.permissions : base.runners.permissions,
138
+ },
139
+ };
140
+ }
141
+ function git(args, cwd) {
142
+ return new Promise((resolve, reject) => {
143
+ execFile("git", args, { cwd, timeout: 15_000 }, (err, out, errOut) => (err ? reject(new Error(errOut || err.message)) : resolve(out)));
144
+ });
145
+ }
146
+ /**
147
+ * The effective policy for a repo: origin's default branch, tightened by any
148
+ * local working-copy file. No file anywhere → the open policy.
149
+ */
150
+ export async function loadPolicy(repoDir) {
151
+ let base = null;
152
+ const head = (await git(["symbolic-ref", "--short", "refs/remotes/origin/HEAD"], repoDir).catch(() => "")).trim() || "origin/main";
153
+ const text = await git(["show", `${head}:loom.team.json`], repoDir).catch(() => "");
154
+ if (text) {
155
+ try {
156
+ base = parsePolicy(JSON.parse(text));
157
+ }
158
+ catch {
159
+ base = null; // a broken policy file on main is a review failure; fall through to open
160
+ }
161
+ }
162
+ let local = null;
163
+ try {
164
+ local = parsePolicy(JSON.parse(fs.readFileSync(path.join(repoDir, "loom.team.json"), "utf8")));
165
+ }
166
+ catch {
167
+ local = null;
168
+ }
169
+ if (base && local)
170
+ return { ...stricter(base, local), source: "origin" };
171
+ if (base)
172
+ return { ...base, source: "origin" };
173
+ // A local-only file can't loosen anything (there's nothing to loosen), so it applies as-is.
174
+ if (local)
175
+ return { ...stricter(OPEN_POLICY, local), source: "local" };
176
+ return { ...OPEN_POLICY, source: "none" };
177
+ }
178
+ /** The permission mode an agent actually gets under this policy (D38). */
179
+ export function cappedPermission(policy, wanted, planMode) {
180
+ let mode = RANK[wanted] > RANK[policy.permissions.ceiling] ? policy.permissions.ceiling : wanted;
181
+ if (mode === "bypass" && policy.permissions.bypassRequiresPlan && !planMode)
182
+ mode = "auto";
183
+ return mode;
184
+ }
185
+ export function agentAllowed(policy, kind) {
186
+ return policy.agents.allow === null || policy.agents.allow.includes(kind);
187
+ }
188
+ export function isProtected(policy, branch) {
189
+ return policy.delivery.protected.some((p) => globToRegExp(p).test(branch));
190
+ }
191
+ //# sourceMappingURL=team-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-policy.js","sourceRoot":"","sources":["../../src/core/team-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A chat as Markdown: your prompts, the replies, what was done and what
3
+ * changed. The same shape the app's "Export as Markdown" writes.
4
+ */
5
+ import type { LoomEvent } from "../types.js";
6
+ export declare function threadMarkdown(events: LoomEvent[], title: string, now?: Date): string;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A chat as Markdown: your prompts, the replies, what was done and what
3
+ * changed. The same shape the app's "Export as Markdown" writes.
4
+ */
5
+ function day(ts) {
6
+ return new Date(ts).toLocaleDateString([], { weekday: "short", month: "short", day: "numeric", year: "numeric" });
7
+ }
8
+ function clock(ts) {
9
+ return new Date(ts).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
10
+ }
11
+ function dur(ms) {
12
+ const s = Math.round(ms / 1000);
13
+ return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m ${s % 60}s`;
14
+ }
15
+ export function threadMarkdown(events, title, now = new Date()) {
16
+ const out = [`# ${title}`, "", `_Exported from Loom ${now.toLocaleString()} · ${events.length} events_`, ""];
17
+ let lastDay = "";
18
+ for (const e of events) {
19
+ const p = e.payload;
20
+ const d = day(e.ts);
21
+ if (d !== lastDay) {
22
+ lastDay = d;
23
+ out.push("", "---", "", `*${d}*`, "");
24
+ }
25
+ if (e.kind === "message" && !e.agentId && p.author !== "loom")
26
+ out.push("", `### You · ${clock(e.ts)}`, "", String(p.text ?? ""));
27
+ else if (e.kind === "message" && e.agentId && !p.reasoning)
28
+ out.push("", `### ${e.agentId}${p.model ? ` (${p.model})` : ""} · ${clock(e.ts)}${p.partial ? " · stopped" : ""}`, "", String(p.text ?? ""));
29
+ else if (e.kind === "tool_call")
30
+ out.push(`- ⚙ ${String(p.summary ?? p.tool ?? p.name ?? "tool").split("\n")[0]}`);
31
+ else if (e.kind === "turn_diff") {
32
+ const files = p.files ?? [];
33
+ out.push("", `> Edited ${files.length} file(s) · +${Number(p.added ?? 0)} −${Number(p.removed ?? 0)}: ${files.slice(0, 12).map((f) => f.path).join(", ")}`);
34
+ }
35
+ else if (e.kind === "error")
36
+ out.push("", `> **Error** (${e.agentId ?? "loom"}): ${String(p.message ?? p.error ?? "").split("\n")[0]}`);
37
+ else if (e.kind === "run_complete")
38
+ out.push("", `_${e.agentId ?? "agent"} finished${p.durationMs ? ` in ${dur(Number(p.durationMs))}` : ""}${p.costUsd ? ` · $${Number(p.costUsd).toFixed(4)}` : ""}_`);
39
+ }
40
+ return out.join("\n") + "\n";
41
+ }
42
+ //# sourceMappingURL=thread-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-md.js","sourceRoot":"","sources":["../../src/core/thread-md.ts"],"names":[],"mappings":"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"}