agor-live 0.17.2 → 0.17.3

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 (316) hide show
  1. package/dist/cli/lib/banner.d.ts +1 -1
  2. package/dist/cli/lib/banner.js +1 -1
  3. package/dist/cli/lib/check-migrations.test.js +9627 -9112
  4. package/dist/cli/lib/daemon-manager.test.js +9632 -9117
  5. package/dist/cli/lib/help.js +1 -1
  6. package/dist/core/api/index.d.cts +3 -3
  7. package/dist/core/api/index.d.ts +3 -3
  8. package/dist/core/{board-comment-DIdOJrSF.d.cts → board-comment-CCFVVN7K.d.cts} +0 -2
  9. package/dist/core/{board-comment-3N-jSgsk.d.ts → board-comment-iT3DgZb4.d.ts} +0 -2
  10. package/dist/core/claude/index.cjs +29 -19
  11. package/dist/core/claude/index.d.cts +2 -2
  12. package/dist/core/claude/index.d.ts +2 -2
  13. package/dist/core/claude/index.js +32 -33
  14. package/dist/core/client/index.cjs +49 -0
  15. package/dist/core/client/index.d.cts +7 -7
  16. package/dist/core/client/index.d.ts +7 -7
  17. package/dist/core/client/index.js +46 -0
  18. package/dist/core/{client-B5PyIvNc.d.cts → client-CemqXk0v.d.cts} +116 -100
  19. package/dist/core/{client-C1CsRi19.d.ts → client-uYEOha6g.d.ts} +116 -100
  20. package/dist/core/config/browser.d.cts +3 -3
  21. package/dist/core/config/browser.d.ts +3 -3
  22. package/dist/core/config/index.cjs +84 -41
  23. package/dist/core/config/index.d.cts +59 -17
  24. package/dist/core/config/index.d.ts +59 -17
  25. package/dist/core/config/index.js +86 -55
  26. package/dist/core/{config-manager-TxxjFMRd.d.cts → config-manager-B8TP9Kz0.d.cts} +12 -3
  27. package/dist/core/{config-manager-DTrsj6G3.d.ts → config-manager-CDEB0FY4.d.ts} +12 -3
  28. package/dist/core/{config-services-YEZ4DwCD.d.cts → config-services-CXyQKEK5.d.cts} +1 -1
  29. package/dist/core/{config-services-DcO2GRgh.d.ts → config-services-DhM7_yWn.d.ts} +1 -1
  30. package/dist/core/db/index.cjs +235 -175
  31. package/dist/core/db/index.d.cts +190 -147
  32. package/dist/core/db/index.d.ts +190 -147
  33. package/dist/core/db/index.js +239 -190
  34. package/dist/core/db/session-guard.d.cts +4 -4
  35. package/dist/core/db/session-guard.d.ts +4 -4
  36. package/dist/core/drizzle/postgres/0028_queued_tasks.sql +8 -0
  37. package/dist/core/drizzle/postgres/0030_migrate_queued_messages.sql +24 -0
  38. package/dist/core/drizzle/postgres/0031_restructure_agentic_tool_config.sql +201 -0
  39. package/dist/core/drizzle/postgres/meta/_journal.json +21 -0
  40. package/dist/core/drizzle/sqlite/0039_queued_tasks.sql +13 -0
  41. package/dist/core/drizzle/sqlite/0040_migrate_queued_messages.sql +61 -0
  42. package/dist/core/drizzle/sqlite/0041_restructure_agentic_tool_config.sql +204 -0
  43. package/dist/core/drizzle/sqlite/meta/_journal.json +21 -0
  44. package/dist/core/gateway/index.d.cts +2 -2
  45. package/dist/core/gateway/index.d.ts +2 -2
  46. package/dist/core/{gateway-BnOlAelY.d.cts → gateway-BWq4j_Ll.d.cts} +1 -1
  47. package/dist/core/{gateway-B_4X-v07.d.ts → gateway-C3Jm_akw.d.ts} +1 -1
  48. package/dist/core/git/index.d.cts +4 -4
  49. package/dist/core/git/index.d.ts +4 -4
  50. package/dist/core/index.cjs +474 -201
  51. package/dist/core/index.d.cts +12 -10
  52. package/dist/core/index.d.ts +12 -10
  53. package/dist/core/index.js +473 -216
  54. package/dist/core/lib/feathers-validation.cjs +2 -1
  55. package/dist/core/lib/feathers-validation.d.cts +1 -1
  56. package/dist/core/lib/feathers-validation.d.ts +1 -1
  57. package/dist/core/lib/feathers-validation.js +2 -1
  58. package/dist/core/mcp/index.cjs +26 -16
  59. package/dist/core/mcp/index.js +26 -16
  60. package/dist/core/{message-DinITA7a.d.cts → message-CSWOsdcZ.d.cts} +1 -9
  61. package/dist/core/{message-CHUUP6OS.d.ts → message-DZa8g0s0.d.ts} +1 -9
  62. package/dist/core/models/index.d.cts +3 -73
  63. package/dist/core/models/index.d.ts +3 -73
  64. package/dist/core/package.json +5 -0
  65. package/dist/core/permissions/index.d.cts +1 -1
  66. package/dist/core/permissions/index.d.ts +1 -1
  67. package/dist/core/resolve-config-BcL-Hv8k.d.ts +74 -0
  68. package/dist/core/resolve-config-DTCxuSBx.d.cts +74 -0
  69. package/dist/core/seed/index.cjs +145 -98
  70. package/dist/core/seed/index.js +148 -112
  71. package/dist/core/{session-guard-C0LkDEN7.d.ts → session-guard-BFqVtBoS.d.ts} +1 -1
  72. package/dist/core/{session-guard-kvAx_8Fb.d.cts → session-guard-KHh0cnET.d.cts} +1 -1
  73. package/dist/core/sessions/index.cjs +184 -0
  74. package/dist/core/sessions/index.d.cts +79 -0
  75. package/dist/core/sessions/index.d.ts +79 -0
  76. package/dist/core/sessions/index.js +157 -0
  77. package/dist/core/{task-BLPFCORT.d.ts → task-BHV-YHg1.d.ts} +41 -3
  78. package/dist/core/{task-wht1RJEL.d.cts → task-C2Hy7H6u.d.cts} +41 -3
  79. package/dist/core/templates/session-context.d.cts +1 -1
  80. package/dist/core/templates/session-context.d.ts +1 -1
  81. package/dist/core/tools/mcp/oauth-mcp-transport.cjs +168 -66
  82. package/dist/core/tools/mcp/oauth-mcp-transport.d.cts +92 -16
  83. package/dist/core/tools/mcp/oauth-mcp-transport.d.ts +92 -16
  84. package/dist/core/tools/mcp/oauth-mcp-transport.js +165 -66
  85. package/dist/core/tools/mcp/oauth-refresh.cjs +43 -53
  86. package/dist/core/tools/mcp/oauth-refresh.d.cts +3 -3
  87. package/dist/core/tools/mcp/oauth-refresh.d.ts +3 -3
  88. package/dist/core/tools/mcp/oauth-refresh.js +58 -78
  89. package/dist/core/types/index.cjs +49 -0
  90. package/dist/core/types/index.d.cts +7 -7
  91. package/dist/core/types/index.d.ts +7 -7
  92. package/dist/core/types/index.js +46 -0
  93. package/dist/core/{types-DNqfdt1z.d.cts → types-D4Rl6ZKN.d.cts} +18 -2
  94. package/dist/core/{types-DqPMmTad.d.ts → types-n61iaXub.d.ts} +18 -2
  95. package/dist/core/unix/index.cjs +164 -110
  96. package/dist/core/unix/index.d.cts +7 -8
  97. package/dist/core/unix/index.d.ts +7 -8
  98. package/dist/core/unix/index.js +167 -124
  99. package/dist/core/{user-DkNdeFoz.d.cts → user-CpfkcV2C.d.cts} +139 -13
  100. package/dist/core/{user-BfVWBmXA.d.ts → user-DP-XZMIM.d.ts} +139 -13
  101. package/dist/core/utils/permission-mode-mapper.d.cts +0 -2
  102. package/dist/core/utils/permission-mode-mapper.d.ts +0 -2
  103. package/dist/daemon/index.js +2976 -2791
  104. package/dist/daemon/main.js +2976 -2791
  105. package/dist/daemon/mcp/server.js +177 -134
  106. package/dist/daemon/mcp/tools/analytics.js +19 -5
  107. package/dist/daemon/mcp/tools/artifacts.js +19 -5
  108. package/dist/daemon/mcp/tools/boards.js +19 -5
  109. package/dist/daemon/mcp/tools/card-types.js +19 -5
  110. package/dist/daemon/mcp/tools/cards.js +19 -5
  111. package/dist/daemon/mcp/tools/environment.js +19 -5
  112. package/dist/daemon/mcp/tools/mcp-servers.d.ts +29 -2
  113. package/dist/daemon/mcp/tools/mcp-servers.js +64 -54
  114. package/dist/daemon/mcp/tools/messages.js +19 -5
  115. package/dist/daemon/mcp/tools/repos.js +19 -5
  116. package/dist/daemon/mcp/tools/search.js +19 -5
  117. package/dist/daemon/mcp/tools/sessions.js +175 -53
  118. package/dist/daemon/mcp/tools/tasks.js +19 -5
  119. package/dist/daemon/mcp/tools/users.js +19 -5
  120. package/dist/daemon/mcp/tools/worktrees.js +37 -38
  121. package/dist/daemon/register-hooks.js +52 -1
  122. package/dist/daemon/register-routes.js +436 -424
  123. package/dist/daemon/register-services.js +255 -140
  124. package/dist/daemon/services/config.d.ts +7 -1
  125. package/dist/daemon/services/config.js +3 -2
  126. package/dist/daemon/services/gateway.js +28 -15
  127. package/dist/daemon/services/mcp-servers.d.ts +7 -2
  128. package/dist/daemon/services/repos.js +2 -0
  129. package/dist/daemon/services/sessions.d.ts +1 -1
  130. package/dist/daemon/services/sessions.js +8 -16
  131. package/dist/daemon/services/tasks.js +16 -10
  132. package/dist/daemon/services/terminals.js +2 -0
  133. package/dist/daemon/services/users.d.ts +27 -11
  134. package/dist/daemon/services/users.js +89 -43
  135. package/dist/daemon/services/worktree-owners.js +2 -0
  136. package/dist/daemon/services/worktrees.js +2 -0
  137. package/dist/daemon/setup/index.js +5 -2
  138. package/dist/daemon/setup/socketio.d.ts +10 -1
  139. package/dist/daemon/setup/socketio.js +7 -3
  140. package/dist/daemon/startup.js +13 -1
  141. package/dist/daemon/utils/apply-session-config-defaults.d.ts +54 -0
  142. package/dist/daemon/utils/apply-session-config-defaults.js +46 -0
  143. package/dist/daemon/utils/spawn-executor.js +2 -0
  144. package/dist/daemon/utils/worktree-authorization.d.ts +2 -4
  145. package/dist/executor/commands/zellij.d.ts.map +1 -1
  146. package/dist/executor/commands/zellij.js +2 -2
  147. package/dist/executor/handlers/sdk/base-executor.d.ts +4 -3
  148. package/dist/executor/handlers/sdk/base-executor.d.ts.map +1 -1
  149. package/dist/executor/handlers/sdk/base-executor.js +11 -5
  150. package/dist/executor/payload-types.d.ts +14 -14
  151. package/dist/executor/sdk-handlers/claude/claude-tool.d.ts.map +1 -1
  152. package/dist/executor/sdk-handlers/claude/claude-tool.js +9 -4
  153. package/dist/executor/sdk-handlers/claude/import/task-extractor.d.ts.map +1 -1
  154. package/dist/executor/sdk-handlers/claude/import/task-extractor.js +0 -5
  155. package/dist/executor/sdk-handlers/claude/message-builder.d.ts +23 -2
  156. package/dist/executor/sdk-handlers/claude/message-builder.d.ts.map +1 -1
  157. package/dist/executor/sdk-handlers/claude/message-builder.js +33 -2
  158. package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.d.ts +9 -1
  159. package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.d.ts.map +1 -1
  160. package/dist/executor/sdk-handlers/claude/permissions/permission-hooks.js +12 -0
  161. package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
  162. package/dist/executor/sdk-handlers/claude/query-builder.js +11 -6
  163. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts +0 -5
  164. package/dist/executor/sdk-handlers/codex/codex-tool.d.ts.map +1 -1
  165. package/dist/executor/sdk-handlers/codex/codex-tool.js +9 -24
  166. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +15 -2
  167. package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
  168. package/dist/executor/sdk-handlers/codex/prompt-service.js +39 -10
  169. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts +0 -5
  170. package/dist/executor/sdk-handlers/copilot/copilot-tool.d.ts.map +1 -1
  171. package/dist/executor/sdk-handlers/copilot/copilot-tool.js +5 -22
  172. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts +0 -5
  173. package/dist/executor/sdk-handlers/gemini/gemini-tool.d.ts.map +1 -1
  174. package/dist/executor/sdk-handlers/gemini/gemini-tool.js +9 -24
  175. package/dist/ui/assets/{CodeEditor.inner-CO-5PAnZ.js → CodeEditor.inner-CVLqZBtM.js} +1 -1
  176. package/dist/ui/assets/{CodeEditor.inner-CO-5PAnZ.js.gz → CodeEditor.inner-CVLqZBtM.js.gz} +0 -0
  177. package/dist/ui/assets/{_basePickBy-DfxojsEt.js → _basePickBy-CFq5ES2J.js} +1 -1
  178. package/dist/ui/assets/_basePickBy-CFq5ES2J.js.gz +0 -0
  179. package/dist/ui/assets/{_baseUniq-DWFPJOTC.js → _baseUniq-C4uKBvNt.js} +1 -1
  180. package/dist/ui/assets/_baseUniq-C4uKBvNt.js.gz +0 -0
  181. package/dist/ui/assets/{arc-vMZ_XGSI.js → arc-BnrcXDJJ.js} +1 -1
  182. package/dist/ui/assets/arc-BnrcXDJJ.js.gz +0 -0
  183. package/dist/ui/assets/{architectureDiagram-VXUJARFQ-DGpk_uOD.js → architectureDiagram-VXUJARFQ-DD9HD-WR.js} +1 -1
  184. package/dist/ui/assets/architectureDiagram-VXUJARFQ-DD9HD-WR.js.gz +0 -0
  185. package/dist/ui/assets/{base-80a1f760-BsVlOKqO.js → base-80a1f760-BK1VmxWU.js} +1 -1
  186. package/dist/ui/assets/{blockDiagram-VD42YOAC-BkRnxc94.js → blockDiagram-VD42YOAC-LBAckZZe.js} +1 -1
  187. package/dist/ui/assets/blockDiagram-VD42YOAC-LBAckZZe.js.gz +0 -0
  188. package/dist/ui/assets/{c4Diagram-YG6GDRKO-Dcf-anJy.js → c4Diagram-YG6GDRKO-yEdylcYP.js} +1 -1
  189. package/dist/ui/assets/{c4Diagram-YG6GDRKO-Dcf-anJy.js.gz → c4Diagram-YG6GDRKO-yEdylcYP.js.gz} +0 -0
  190. package/dist/ui/assets/channel-CMN-iY3Q.js +1 -0
  191. package/dist/ui/assets/{chunk-4BX2VUAB-C4oVWDo8.js → chunk-4BX2VUAB-IHtzKbmQ.js} +1 -1
  192. package/dist/ui/assets/{chunk-55IACEB6-CsBbTu57.js → chunk-55IACEB6-C4o5tv_F.js} +1 -1
  193. package/dist/ui/assets/{chunk-B4BG7PRW-DtkeCZab.js → chunk-B4BG7PRW-EPkzLvlB.js} +1 -1
  194. package/dist/ui/assets/chunk-B4BG7PRW-EPkzLvlB.js.gz +0 -0
  195. package/dist/ui/assets/{chunk-DI55MBZ5-BQ_asW-1.js → chunk-DI55MBZ5-CW-Bzkzj.js} +1 -1
  196. package/dist/ui/assets/chunk-DI55MBZ5-CW-Bzkzj.js.gz +0 -0
  197. package/dist/ui/assets/{chunk-FMBD7UC4-DAdcLNG-.js → chunk-FMBD7UC4-DvGU02Io.js} +1 -1
  198. package/dist/ui/assets/{chunk-QN33PNHL-Do2zad3m.js → chunk-QN33PNHL-C-PIlz9n.js} +1 -1
  199. package/dist/ui/assets/{chunk-QZHKN3VN-CyhMmSdC.js → chunk-QZHKN3VN-BhpJFm6h.js} +1 -1
  200. package/dist/ui/assets/{chunk-TZMSLE5B-DlPypnIq.js → chunk-TZMSLE5B-Biake8IU.js} +1 -1
  201. package/dist/ui/assets/chunk-TZMSLE5B-Biake8IU.js.gz +0 -0
  202. package/dist/ui/assets/classDiagram-2ON5EDUG-Bz1et8oA.js +1 -0
  203. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-Bz1et8oA.js +1 -0
  204. package/dist/ui/assets/clone-Dxo5sEAf.js +1 -0
  205. package/dist/ui/assets/{consoleHook-59e792cb-DHYIclEd.js → consoleHook-59e792cb-BzEkHWE8.js} +1 -1
  206. package/dist/ui/assets/consoleHook-59e792cb-BzEkHWE8.js.gz +0 -0
  207. package/dist/ui/assets/{cose-bilkent-S5V4N54A-DotJH9qH.js → cose-bilkent-S5V4N54A-vAiVi74s.js} +1 -1
  208. package/dist/ui/assets/cose-bilkent-S5V4N54A-vAiVi74s.js.gz +0 -0
  209. package/dist/ui/assets/{dagre-6UL2VRFP-Btssr8QF.js → dagre-6UL2VRFP-C8w7TshD.js} +1 -1
  210. package/dist/ui/assets/dagre-6UL2VRFP-C8w7TshD.js.gz +0 -0
  211. package/dist/ui/assets/{diagram-PSM6KHXK-D5_Jkog3.js → diagram-PSM6KHXK-CvnjEmtQ.js} +1 -1
  212. package/dist/ui/assets/diagram-PSM6KHXK-CvnjEmtQ.js.gz +0 -0
  213. package/dist/ui/assets/{diagram-QEK2KX5R-DlPEVSL5.js → diagram-QEK2KX5R-D245unng.js} +1 -1
  214. package/dist/ui/assets/diagram-QEK2KX5R-D245unng.js.gz +0 -0
  215. package/dist/ui/assets/{diagram-S2PKOQOG-CjO1k8aG.js → diagram-S2PKOQOG-DgGUHL8Z.js} +1 -1
  216. package/dist/ui/assets/diagram-S2PKOQOG-DgGUHL8Z.js.gz +0 -0
  217. package/dist/ui/assets/{erDiagram-Q2GNP2WA-3cO02-K3.js → erDiagram-Q2GNP2WA-Cf5paK9b.js} +1 -1
  218. package/dist/ui/assets/erDiagram-Q2GNP2WA-Cf5paK9b.js.gz +0 -0
  219. package/dist/ui/assets/{flowDiagram-NV44I4VS-CajTpSxI.js → flowDiagram-NV44I4VS-BJpHmEXV.js} +1 -1
  220. package/dist/ui/assets/flowDiagram-NV44I4VS-BJpHmEXV.js.gz +0 -0
  221. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-CnY_bV3o.js → ganttDiagram-LVOFAZNH-zOyTZcXC.js} +1 -1
  222. package/dist/ui/assets/{ganttDiagram-LVOFAZNH-CnY_bV3o.js.gz → ganttDiagram-LVOFAZNH-zOyTZcXC.js.gz} +0 -0
  223. package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-CH16bg-j.js → gitGraphDiagram-NY62KEGX-B0uxwqMv.js} +1 -1
  224. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-B0uxwqMv.js.gz +0 -0
  225. package/dist/ui/assets/{graph-IQoZvE3o.js → graph-NWXc73TO.js} +1 -1
  226. package/dist/ui/assets/graph-NWXc73TO.js.gz +0 -0
  227. package/dist/ui/assets/{index-599aeaf7-RUCkgwsg.js → index-599aeaf7-BKmNqoNF.js} +1 -1
  228. package/dist/ui/assets/index-599aeaf7-BKmNqoNF.js.gz +0 -0
  229. package/dist/ui/assets/{index-B3AvIgqP.js → index-BRYNiHLB.js} +345 -349
  230. package/dist/ui/assets/index-BRYNiHLB.js.gz +0 -0
  231. package/dist/ui/assets/{index-QV5-5yA2.js → index-BX6Xmhes.js} +1 -1
  232. package/dist/ui/assets/index-BX6Xmhes.js.gz +0 -0
  233. package/dist/ui/assets/{index-ChmRuj_T.js → index-W1hIq1uU.js} +1 -1
  234. package/dist/ui/assets/index-W1hIq1uU.js.gz +0 -0
  235. package/dist/ui/assets/{index-C-quzPWC.js → index-ctuok0zf.js} +1 -1
  236. package/dist/ui/assets/index-ctuok0zf.js.gz +0 -0
  237. package/dist/ui/assets/{infoDiagram-ER5ION4S-2e4gZVGT.js → infoDiagram-ER5ION4S-CquCuoTH.js} +1 -1
  238. package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-B5bgV3GH.js → journeyDiagram-XKPGCS4Q-B_XkufZ8.js} +1 -1
  239. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-B_XkufZ8.js.gz +0 -0
  240. package/dist/ui/assets/{kanban-definition-3W4ZIXB7-Bp-aWRSc.js → kanban-definition-3W4ZIXB7-C2Bo9HkB.js} +1 -1
  241. package/dist/ui/assets/kanban-definition-3W4ZIXB7-C2Bo9HkB.js.gz +0 -0
  242. package/dist/ui/assets/katex-C6wkUDai.css +1 -0
  243. package/dist/ui/assets/{katex-DGRguze2.css.gz → katex-C6wkUDai.css.gz} +0 -0
  244. package/dist/ui/assets/{layout-BH-2XJZq.js → layout-D9A7Uaku.js} +1 -1
  245. package/dist/ui/assets/layout-D9A7Uaku.js.gz +0 -0
  246. package/dist/ui/assets/{linear-DCYXhl_f.js → linear-BJUwJsxE.js} +1 -1
  247. package/dist/ui/assets/linear-BJUwJsxE.js.gz +0 -0
  248. package/dist/ui/assets/{mermaid.core-BAuL6kgQ.js → mermaid.core-DcOEcjcA.js} +5 -5
  249. package/dist/ui/assets/mermaid.core-DcOEcjcA.js.gz +0 -0
  250. package/dist/ui/assets/{mindmap-definition-VGOIOE7T-DpH5N-N0.js → mindmap-definition-VGOIOE7T-BFT1m7BG.js} +1 -1
  251. package/dist/ui/assets/mindmap-definition-VGOIOE7T-BFT1m7BG.js.gz +0 -0
  252. package/dist/ui/assets/{pieDiagram-ADFJNKIX-BB8fBxj1.js → pieDiagram-ADFJNKIX-BFaX1oBV.js} +1 -1
  253. package/dist/ui/assets/pieDiagram-ADFJNKIX-BFaX1oBV.js.gz +0 -0
  254. package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-D6oZLdUD.js → quadrantDiagram-AYHSOK5B-DQps5392.js} +1 -1
  255. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-DQps5392.js.gz +0 -0
  256. package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-B4uGPp8w.js → requirementDiagram-UZGBJVZJ-3EZ5KWEi.js} +1 -1
  257. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-3EZ5KWEi.js.gz +0 -0
  258. package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-MXhIjhme.js → sankeyDiagram-TZEHDZUN-D0qcydqq.js} +1 -1
  259. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-D0qcydqq.js.gz +0 -0
  260. package/dist/ui/assets/{sequenceDiagram-WL72ISMW-Cm53TYug.js → sequenceDiagram-WL72ISMW-BCR5gaaN.js} +1 -1
  261. package/dist/ui/assets/sequenceDiagram-WL72ISMW-BCR5gaaN.js.gz +0 -0
  262. package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BVuxUkj5.js → stateDiagram-FKZM4ZOC-BvX4FLQ9.js} +1 -1
  263. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BvX4FLQ9.js.gz +0 -0
  264. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CxLDvgTF.js +1 -0
  265. package/dist/ui/assets/{timeline-definition-IT6M3QCI-CMypNiEP.js → timeline-definition-IT6M3QCI-_AWp5LJn.js} +1 -1
  266. package/dist/ui/assets/timeline-definition-IT6M3QCI-_AWp5LJn.js.gz +0 -0
  267. package/dist/ui/assets/{treemap-KMMF4GRG-BEtnV3BT.js → treemap-KMMF4GRG-BZ9FBl5-.js} +1 -1
  268. package/dist/ui/assets/treemap-KMMF4GRG-BZ9FBl5-.js.gz +0 -0
  269. package/dist/ui/assets/{xychartDiagram-PRI3JC2R-BnioEYUM.js → xychartDiagram-PRI3JC2R-_wB7yuVd.js} +1 -1
  270. package/dist/ui/assets/xychartDiagram-PRI3JC2R-_wB7yuVd.js.gz +0 -0
  271. package/dist/ui/index.html +1 -1
  272. package/package.json +8 -8
  273. package/dist/ui/assets/_basePickBy-DfxojsEt.js.gz +0 -0
  274. package/dist/ui/assets/_baseUniq-DWFPJOTC.js.gz +0 -0
  275. package/dist/ui/assets/arc-vMZ_XGSI.js.gz +0 -0
  276. package/dist/ui/assets/architectureDiagram-VXUJARFQ-DGpk_uOD.js.gz +0 -0
  277. package/dist/ui/assets/blockDiagram-VD42YOAC-BkRnxc94.js.gz +0 -0
  278. package/dist/ui/assets/channel-B9aI4bYN.js +0 -1
  279. package/dist/ui/assets/chunk-B4BG7PRW-DtkeCZab.js.gz +0 -0
  280. package/dist/ui/assets/chunk-DI55MBZ5-BQ_asW-1.js.gz +0 -0
  281. package/dist/ui/assets/chunk-TZMSLE5B-DlPypnIq.js.gz +0 -0
  282. package/dist/ui/assets/classDiagram-2ON5EDUG-p-68WO4Z.js +0 -1
  283. package/dist/ui/assets/classDiagram-v2-WZHVMYZB-p-68WO4Z.js +0 -1
  284. package/dist/ui/assets/clone-DzK5ogfn.js +0 -1
  285. package/dist/ui/assets/consoleHook-59e792cb-DHYIclEd.js.gz +0 -0
  286. package/dist/ui/assets/cose-bilkent-S5V4N54A-DotJH9qH.js.gz +0 -0
  287. package/dist/ui/assets/dagre-6UL2VRFP-Btssr8QF.js.gz +0 -0
  288. package/dist/ui/assets/diagram-PSM6KHXK-D5_Jkog3.js.gz +0 -0
  289. package/dist/ui/assets/diagram-QEK2KX5R-DlPEVSL5.js.gz +0 -0
  290. package/dist/ui/assets/diagram-S2PKOQOG-CjO1k8aG.js.gz +0 -0
  291. package/dist/ui/assets/erDiagram-Q2GNP2WA-3cO02-K3.js.gz +0 -0
  292. package/dist/ui/assets/flowDiagram-NV44I4VS-CajTpSxI.js.gz +0 -0
  293. package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CH16bg-j.js.gz +0 -0
  294. package/dist/ui/assets/graph-IQoZvE3o.js.gz +0 -0
  295. package/dist/ui/assets/index-599aeaf7-RUCkgwsg.js.gz +0 -0
  296. package/dist/ui/assets/index-B3AvIgqP.js.gz +0 -0
  297. package/dist/ui/assets/index-C-quzPWC.js.gz +0 -0
  298. package/dist/ui/assets/index-ChmRuj_T.js.gz +0 -0
  299. package/dist/ui/assets/index-QV5-5yA2.js.gz +0 -0
  300. package/dist/ui/assets/journeyDiagram-XKPGCS4Q-B5bgV3GH.js.gz +0 -0
  301. package/dist/ui/assets/kanban-definition-3W4ZIXB7-Bp-aWRSc.js.gz +0 -0
  302. package/dist/ui/assets/katex-DGRguze2.css +0 -1
  303. package/dist/ui/assets/layout-BH-2XJZq.js.gz +0 -0
  304. package/dist/ui/assets/linear-DCYXhl_f.js.gz +0 -0
  305. package/dist/ui/assets/mermaid.core-BAuL6kgQ.js.gz +0 -0
  306. package/dist/ui/assets/mindmap-definition-VGOIOE7T-DpH5N-N0.js.gz +0 -0
  307. package/dist/ui/assets/pieDiagram-ADFJNKIX-BB8fBxj1.js.gz +0 -0
  308. package/dist/ui/assets/quadrantDiagram-AYHSOK5B-D6oZLdUD.js.gz +0 -0
  309. package/dist/ui/assets/requirementDiagram-UZGBJVZJ-B4uGPp8w.js.gz +0 -0
  310. package/dist/ui/assets/sankeyDiagram-TZEHDZUN-MXhIjhme.js.gz +0 -0
  311. package/dist/ui/assets/sequenceDiagram-WL72ISMW-Cm53TYug.js.gz +0 -0
  312. package/dist/ui/assets/stateDiagram-FKZM4ZOC-BVuxUkj5.js.gz +0 -0
  313. package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-8Jeww6Dc.js +0 -1
  314. package/dist/ui/assets/timeline-definition-IT6M3QCI-CMypNiEP.js.gz +0 -0
  315. package/dist/ui/assets/treemap-KMMF4GRG-BEtnV3BT.js.gz +0 -0
  316. package/dist/ui/assets/xychartDiagram-PRI3JC2R-BnioEYUM.js.gz +0 -0
@@ -15308,11 +15308,47 @@ async function getOAuthStatus(ctx, mcpServer) {
15308
15308
  }
15309
15309
  return { authenticated: false };
15310
15310
  }
15311
+ async function summarizeMcpServer(ctx, mcpServer) {
15312
+ const authType = mcpServer.auth?.type || "none";
15313
+ const oauthMode = mcpServer.auth?.oauth_mode || "per_user";
15314
+ const { authenticated } = await getOAuthStatus(ctx, mcpServer);
15315
+ return {
15316
+ mcp_server_id: mcpServer.mcp_server_id,
15317
+ name: mcpServer.name,
15318
+ display_name: mcpServer.display_name,
15319
+ transport: mcpServer.transport,
15320
+ auth_type: authType,
15321
+ oauth_mode: oauthMode,
15322
+ oauth_authenticated: authenticated,
15323
+ enabled: mcpServer.enabled
15324
+ };
15325
+ }
15326
+ async function listAttachedMcpServers(ctx, sessionId, opts = {}) {
15327
+ const sessionMCPServers = await ctx.app.service("session-mcp-servers").find({
15328
+ ...ctx.baseServiceParams,
15329
+ query: {
15330
+ session_id: sessionId,
15331
+ ...opts.includeDisabled ? {} : { enabled: true },
15332
+ $limit: 100
15333
+ }
15334
+ });
15335
+ const data = Array.isArray(sessionMCPServers) ? sessionMCPServers : sessionMCPServers.data;
15336
+ const summaries = [];
15337
+ for (const sms of data) {
15338
+ try {
15339
+ const mcpServer = await ctx.app.service("mcp-servers").get(sms.mcp_server_id, ctx.baseServiceParams);
15340
+ summaries.push(await summarizeMcpServer(ctx, mcpServer));
15341
+ } catch (error48) {
15342
+ console.warn(`Failed to fetch MCP server ${sms.mcp_server_id}:`, error48);
15343
+ }
15344
+ }
15345
+ return summaries;
15346
+ }
15311
15347
  function registerMcpServerTools(server, ctx) {
15312
15348
  server.registerTool(
15313
15349
  "agor_mcp_servers_list",
15314
15350
  {
15315
- description: "List MCP servers available to the current session. Shows each server's name, transport type, authentication type, and OAuth connection status. Use this to see which external tools/services are configured and whether they need authentication.",
15351
+ description: "List the MCP-server catalog the current user can access (i.e. servers eligible to attach to a session). Each entry includes name, transport, auth type, and OAuth status. Use this to discover IDs to pass to `agor_sessions_create({ mcpServerIds })`. To see which servers are currently ATTACHED to a session, read `attached_mcp_servers` from `agor_sessions_get_current` or `agor_sessions_get`.",
15316
15352
  annotations: { readOnlyHint: true },
15317
15353
  inputSchema: external_exports2.object({
15318
15354
  includeDisabled: external_exports2.boolean().optional().describe("Include disabled MCP servers (default: false)")
@@ -15320,62 +15356,20 @@ function registerMcpServerTools(server, ctx) {
15320
15356
  },
15321
15357
  async (args) => {
15322
15358
  const includeDisabled = args.includeDisabled === true;
15323
- const sessionMCPServers = await ctx.app.service("session-mcp-servers").find({
15359
+ const result = await ctx.app.service("mcp-servers").find({
15324
15360
  ...ctx.baseServiceParams,
15325
15361
  query: {
15326
- session_id: ctx.sessionId,
15362
+ scope: "global",
15327
15363
  ...includeDisabled ? {} : { enabled: true },
15328
15364
  $limit: 100
15329
15365
  }
15330
15366
  });
15367
+ const data = Array.isArray(result) ? result : result.data;
15331
15368
  const servers = [];
15332
- const sessionMCPData = Array.isArray(sessionMCPServers) ? sessionMCPServers : sessionMCPServers.data;
15333
- const mcpServerIds = sessionMCPData.map(
15334
- (sms) => sms.mcp_server_id
15335
- );
15336
- for (const serverId of mcpServerIds) {
15337
- try {
15338
- const mcpServer = await ctx.app.service("mcp-servers").get(serverId, ctx.baseServiceParams);
15339
- const authType = mcpServer.auth?.type || "none";
15340
- const oauthMode = mcpServer.auth?.oauth_mode || "per_user";
15341
- const { authenticated } = await getOAuthStatus(ctx, mcpServer);
15342
- servers.push({
15343
- mcp_server_id: mcpServer.mcp_server_id,
15344
- name: mcpServer.name,
15345
- display_name: mcpServer.display_name,
15346
- transport: mcpServer.transport,
15347
- auth_type: authType,
15348
- oauth_mode: oauthMode,
15349
- oauth_authenticated: authenticated,
15350
- enabled: mcpServer.enabled
15351
- });
15352
- } catch (error48) {
15353
- console.warn(`Failed to fetch MCP server ${serverId}:`, error48);
15354
- }
15355
- }
15356
- const globalServers = await ctx.app.service("mcp-servers").find({
15357
- ...ctx.baseServiceParams,
15358
- query: { scope: "global", ...includeDisabled ? {} : { enabled: true }, $limit: 100 }
15359
- });
15360
- for (const mcpServer of Array.isArray(globalServers) ? globalServers : globalServers.data) {
15361
- if (!mcpServerIds.includes(mcpServer.mcp_server_id)) {
15362
- const authType = mcpServer.auth?.type || "none";
15363
- const oauthMode = mcpServer.auth?.oauth_mode || "per_user";
15364
- const { authenticated } = await getOAuthStatus(ctx, mcpServer);
15365
- servers.push({
15366
- mcp_server_id: mcpServer.mcp_server_id,
15367
- name: mcpServer.name,
15368
- display_name: mcpServer.display_name,
15369
- transport: mcpServer.transport,
15370
- auth_type: authType,
15371
- oauth_mode: oauthMode,
15372
- oauth_authenticated: authenticated,
15373
- enabled: mcpServer.enabled
15374
- });
15375
- }
15369
+ for (const mcpServer of data) {
15370
+ servers.push(await summarizeMcpServer(ctx, mcpServer));
15376
15371
  }
15377
15372
  return textResult({
15378
- session_id: ctx.sessionId,
15379
15373
  mcp_servers: servers,
15380
15374
  summary: {
15381
15375
  total: servers.length,
@@ -15781,21 +15775,40 @@ function registerSearchTools(server, registry2) {
15781
15775
 
15782
15776
  // src/mcp/tools/sessions.ts
15783
15777
  import { WorktreeRepository as WorktreeRepository2 } from "@agor/core/db";
15784
- import { resolveModelConfigPrecedence } from "@agor/core/models";
15778
+ import {
15779
+ AVAILABLE_CLAUDE_MODEL_ALIASES,
15780
+ CODEX_MODEL_METADATA,
15781
+ DEFAULT_CLAUDE_MODEL,
15782
+ DEFAULT_CODEX_MODEL,
15783
+ DEFAULT_GEMINI_MODEL,
15784
+ GEMINI_MODELS
15785
+ } from "@agor/core/models";
15786
+ import { resolveSessionDefaults } from "@agor/core/sessions";
15785
15787
  import {
15786
15788
  AGENTIC_TOOL_CAPABILITIES,
15787
15789
  getSessionType
15788
15790
  } from "@agor/core/types";
15789
- var modelConfigInputSchema = external_exports2.object({
15791
+ var modelConfigObjectSchema = external_exports2.object({
15790
15792
  mode: external_exports2.enum(["alias", "exact"]).optional().describe("Model selection mode (default: 'alias')"),
15791
15793
  // .min(1): reject empty-string model explicitly so callers don't silently
15792
15794
  // fall through to user defaults when they meant to pin a specific model.
15793
15795
  model: external_exports2.string().min(1).describe("Model identifier (e.g. 'claude-opus-4-6', 'claude-sonnet-4-6')"),
15794
15796
  effort: external_exports2.enum(["low", "medium", "high", "max"]).optional().describe("Reasoning effort level (default: high)"),
15795
15797
  provider: external_exports2.string().optional().describe("Provider ID (OpenCode only, e.g. 'anthropic')")
15796
- }).optional().describe(
15797
- "Model override for this session. When set, overrides the user default model_config. Threaded through to the spawned agent process so it actually runs on the requested model."
15798
+ });
15799
+ var modelConfigInputSchema = external_exports2.union([
15800
+ external_exports2.string().min(1).describe(
15801
+ "Shorthand: just the model ID string (e.g. 'claude-opus-4-6'). Equivalent to { model: <id> }."
15802
+ ),
15803
+ modelConfigObjectSchema
15804
+ ]).optional().describe(
15805
+ "Model override for this session. Pass either a model ID string (e.g. 'claude-opus-4-6') or a full { mode, model, effort, provider } object. Overrides the user default model_config and is threaded through to the spawned agent process. Call agor_models_list to discover valid model IDs per agenticTool."
15798
15806
  );
15807
+ function coerceModelConfig(input) {
15808
+ if (input === void 0) return void 0;
15809
+ if (typeof input === "string") return { model: input };
15810
+ return input;
15811
+ }
15799
15812
  function registerSessionTools(server, ctx) {
15800
15813
  server.registerTool(
15801
15814
  "agor_sessions_list",
@@ -15848,7 +15861,7 @@ function registerSessionTools(server, ctx) {
15848
15861
  server.registerTool(
15849
15862
  "agor_sessions_get",
15850
15863
  {
15851
- description: "Get detailed information about a specific session, including genealogy and current state. The response includes a `url` field with a clickable link to view the session in the UI.",
15864
+ description: "Get detailed information about a specific session, including genealogy, current state, and the MCP servers currently attached to it (with OAuth status \u2014 check `attached_mcp_servers[].oauth_authenticated` to spot servers needing auth). The response includes a `url` field with a clickable link to view the session in the UI.",
15852
15865
  annotations: { readOnlyHint: true },
15853
15866
  inputSchema: external_exports2.object({
15854
15867
  sessionId: external_exports2.string().describe("Session ID (UUIDv7 or short ID like 01a1b2c3)")
@@ -15861,13 +15874,14 @@ function registerSessionTools(server, ctx) {
15861
15874
  _last_message_truncation_length: 500
15862
15875
  };
15863
15876
  const session = await ctx.app.service("sessions").get(args.sessionId, sessionParams);
15864
- return textResult(session);
15877
+ const attached_mcp_servers = await listAttachedMcpServers(ctx, session.session_id);
15878
+ return textResult({ ...session, attached_mcp_servers });
15865
15879
  }
15866
15880
  );
15867
15881
  server.registerTool(
15868
15882
  "agor_sessions_get_current",
15869
15883
  {
15870
- description: "Get information about the current session (the one making this MCP call). Returns session details plus denormalized worktree, repo, and board context \u2014 useful for introspection and getting IDs needed by other tools.",
15884
+ description: "Get information about the current session (the one making this MCP call). Returns session details, denormalized worktree/repo/board context, and the MCP servers attached to this session (each with `oauth_authenticated` so callers can spot servers needing auth). To browse the broader catalog of servers eligible to attach, use `agor_mcp_servers_list`.",
15871
15885
  annotations: { readOnlyHint: true },
15872
15886
  inputSchema: external_exports2.object({})
15873
15887
  },
@@ -15917,11 +15931,13 @@ function registerSessionTools(server, ctx) {
15917
15931
  } catch {
15918
15932
  }
15919
15933
  }
15934
+ const attached_mcp_servers = await listAttachedMcpServers(ctx, ctx.sessionId);
15920
15935
  return textResult({
15921
15936
  session,
15922
15937
  worktree,
15923
15938
  repo,
15924
- board
15939
+ board,
15940
+ attached_mcp_servers
15925
15941
  });
15926
15942
  }
15927
15943
  );
@@ -16078,10 +16094,10 @@ function registerSessionTools(server, ctx) {
16078
16094
  extraInstructions: args.extraInstructions,
16079
16095
  task_id: args.taskId,
16080
16096
  mcpServerIds: args.mcpServerIds,
16081
- modelConfig: args.modelConfig
16097
+ modelConfig: coerceModelConfig(args.modelConfig)
16082
16098
  };
16083
16099
  const childSession = await ctx.app.service("sessions").spawn(ctx.sessionId, spawnData, ctx.baseServiceParams);
16084
- const promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
16100
+ const task = await ctx.app.service("/sessions/:id/prompt").create(
16085
16101
  {
16086
16102
  prompt: args.prompt,
16087
16103
  permissionMode: childSession.permission_config?.mode || "acceptEdits",
@@ -16094,8 +16110,8 @@ function registerSessionTools(server, ctx) {
16094
16110
  );
16095
16111
  return textResult({
16096
16112
  session: childSession,
16097
- taskId: promptResponse.taskId,
16098
- status: promptResponse.status,
16113
+ taskId: task.task_id,
16114
+ status: task.status,
16099
16115
  note: "Subsession created and prompt execution started in background."
16100
16116
  });
16101
16117
  }
@@ -16125,22 +16141,23 @@ function registerSessionTools(server, ctx) {
16125
16141
  const mode = args.mode;
16126
16142
  const sessionId = await resolveSessionId(ctx, args.sessionId);
16127
16143
  if (mode === "continue") {
16128
- const promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
16144
+ const task = await ctx.app.service("/sessions/:id/prompt").create(
16129
16145
  { prompt: args.prompt, stream: true },
16130
16146
  { ...ctx.baseServiceParams, route: { id: sessionId } }
16131
16147
  );
16132
- if (promptResponse.queued) {
16148
+ if (task.status === "queued") {
16133
16149
  return textResult({
16134
16150
  success: true,
16135
16151
  queued: true,
16136
- queue_position: promptResponse.queue_position,
16152
+ taskId: task.task_id,
16153
+ queue_position: task.queue_position,
16137
16154
  note: "Session is busy. Prompt has been queued and will execute automatically when the session becomes idle."
16138
16155
  });
16139
16156
  }
16140
16157
  return textResult({
16141
16158
  success: true,
16142
- taskId: promptResponse.taskId,
16143
- status: promptResponse.status,
16159
+ taskId: task.task_id,
16160
+ status: task.status,
16144
16161
  note: "Prompt added to existing session and execution started."
16145
16162
  });
16146
16163
  } else if (mode === "fork" || mode === "btw") {
@@ -16169,7 +16186,7 @@ function registerSessionTools(server, ctx) {
16169
16186
  await ctx.app.service("sessions").patch(forkedSession.session_id, forkPatch, ctx.baseServiceParams);
16170
16187
  }
16171
16188
  const updatedSession = await ctx.app.service("sessions").get(forkedSession.session_id, ctx.baseServiceParams);
16172
- const promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
16189
+ const task = await ctx.app.service("/sessions/:id/prompt").create(
16173
16190
  {
16174
16191
  prompt: args.prompt,
16175
16192
  permissionMode: updatedSession.permission_config?.mode,
@@ -16180,21 +16197,21 @@ function registerSessionTools(server, ctx) {
16180
16197
  const note = mode === "btw" ? 'Ephemeral "btw" fork created. Result will be sent back via callback when done, then the fork will auto-archive.' : "Forked session created and prompt execution started.";
16181
16198
  return textResult({
16182
16199
  session: updatedSession,
16183
- taskId: promptResponse.taskId,
16184
- status: promptResponse.status,
16200
+ taskId: task.task_id,
16201
+ status: task.status,
16185
16202
  note
16186
16203
  });
16187
16204
  } else if (mode === "subsession") {
16188
16205
  const spawnData = {
16189
16206
  prompt: args.prompt,
16190
16207
  mcpServerIds: args.mcpServerIds,
16191
- modelConfig: args.modelConfig
16208
+ modelConfig: coerceModelConfig(args.modelConfig)
16192
16209
  };
16193
16210
  if (args.title) spawnData.title = args.title;
16194
16211
  if (args.agenticTool) spawnData.agent = args.agenticTool;
16195
16212
  if (args.taskId) spawnData.task_id = args.taskId;
16196
16213
  const childSession = await ctx.app.service("sessions").spawn(sessionId, spawnData, ctx.baseServiceParams);
16197
- const promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
16214
+ const task = await ctx.app.service("/sessions/:id/prompt").create(
16198
16215
  {
16199
16216
  prompt: args.prompt,
16200
16217
  permissionMode: childSession.permission_config?.mode,
@@ -16204,8 +16221,8 @@ function registerSessionTools(server, ctx) {
16204
16221
  );
16205
16222
  return textResult({
16206
16223
  session: childSession,
16207
- taskId: promptResponse.taskId,
16208
- status: promptResponse.status,
16224
+ taskId: task.task_id,
16225
+ status: task.status,
16209
16226
  note: "Subsession created and prompt execution started."
16210
16227
  });
16211
16228
  }
@@ -16215,7 +16232,7 @@ function registerSessionTools(server, ctx) {
16215
16232
  server.registerTool(
16216
16233
  "agor_sessions_create",
16217
16234
  {
16218
- description: "Create a new session in an existing worktree. Use for starting fresh work on a new task in the same codebase (e.g., new feature branch, separate investigation). Unlike spawn, this creates an independent session with no parent-child relationship. MCP servers are inherited from the worktree (if configured) or user defaults, or can be overridden via `mcpServerIds`. Model selection falls back to user defaults and can be overridden via `modelConfig`. Supports optional callbacks to notify the creating session when the new session completes.",
16235
+ description: 'Create a new session in an existing worktree. Use for starting fresh work on a new task in the same codebase (e.g., new feature branch, separate investigation). Unlike spawn, this creates an independent session with no parent-child relationship. MCP servers are inherited from the worktree (if configured) or user defaults, or can be overridden via `mcpServerIds`. Model selection falls back to user defaults and can be overridden via `modelConfig` (accepts either a model ID string like "claude-opus-4-6" or a full {mode, model, effort, provider} object \u2014 call `agor_models_list` to discover valid model IDs per agenticTool). Supports optional callbacks to notify the creating session when the new session completes.',
16219
16236
  inputSchema: external_exports2.object({
16220
16237
  worktreeId: external_exports2.string().describe("Worktree ID where the session will run (required)"),
16221
16238
  agenticTool: external_exports2.enum(["claude-code", "codex", "gemini"]).describe("Which agent to use for this session (required)"),
@@ -16249,27 +16266,20 @@ function registerSessionTools(server, ctx) {
16249
16266
  const { getGitState, getCurrentBranch } = await import("@agor/core/git");
16250
16267
  const currentSha = await getGitState(worktree.path);
16251
16268
  const currentRef = await getCurrentBranch(worktree.path);
16252
- const { getDefaultPermissionMode } = await import("@agor/core/types");
16253
- const { mapPermissionMode } = await import("@agor/core/utils/permission-mode-mapper");
16254
- const userToolDefaults = user?.default_agentic_config?.[agenticTool];
16255
- const requestedMode = userToolDefaults?.permissionMode || getDefaultPermissionMode(agenticTool);
16256
- const permissionMode = mapPermissionMode(requestedMode, agenticTool);
16257
- const permissionConfig = {
16258
- mode: permissionMode,
16259
- allowedTools: []
16260
- };
16261
- if (agenticTool === "codex" && userToolDefaults?.codexSandboxMode && userToolDefaults?.codexApprovalPolicy) {
16262
- permissionConfig.codex = {
16263
- sandboxMode: userToolDefaults.codexSandboxMode,
16264
- approvalPolicy: userToolDefaults.codexApprovalPolicy,
16265
- networkAccess: userToolDefaults.codexNetworkAccess
16266
- };
16267
- }
16268
- const modelConfig = resolveModelConfigPrecedence([
16269
- args.modelConfig,
16270
- userToolDefaults?.modelConfig
16271
- ]);
16272
- const mcpServerIds = args.mcpServerIds !== void 0 ? await Promise.all(args.mcpServerIds.map((id) => resolveMcpServerId(ctx, id))) : worktree.mcp_server_ids && worktree.mcp_server_ids.length > 0 ? worktree.mcp_server_ids : userToolDefaults?.mcpServerIds || [];
16269
+ const explicitMcpServerIds = args.mcpServerIds !== void 0 ? await Promise.all(args.mcpServerIds.map((id) => resolveMcpServerId(ctx, id))) : void 0;
16270
+ const resolvedDefaults = resolveSessionDefaults({
16271
+ agenticTool,
16272
+ user,
16273
+ worktree,
16274
+ overrides: {
16275
+ modelConfig: coerceModelConfig(args.modelConfig),
16276
+ mcpServerIds: explicitMcpServerIds
16277
+ }
16278
+ });
16279
+ const permissionConfig = resolvedDefaults.permission_config;
16280
+ const modelConfig = resolvedDefaults.model_config;
16281
+ const mcpServerIds = resolvedDefaults.mcp_server_ids;
16282
+ const permissionMode = permissionConfig.mode;
16273
16283
  const mcpServerIdsFromArgs = args.mcpServerIds !== void 0;
16274
16284
  const callbackConfig = {};
16275
16285
  const effectiveCallbackSessionId = args.callbackSessionId || ctx.sessionId;
@@ -16325,9 +16335,9 @@ function registerSessionTools(server, ctx) {
16325
16335
  if (mcpServerIds && mcpServerIds.length > 0) {
16326
16336
  for (const mcpServerId of mcpServerIds) {
16327
16337
  try {
16328
- await ctx.app.service("session-mcp-servers").create(
16329
- { session_id: session.session_id, mcp_server_id: mcpServerId },
16330
- ctx.baseServiceParams
16338
+ await ctx.app.service("/sessions/:id/mcp-servers").create(
16339
+ { mcpServerId },
16340
+ { ...ctx.baseServiceParams, route: { id: session.session_id } }
16331
16341
  );
16332
16342
  } catch (error48) {
16333
16343
  const reason = error48 instanceof Error ? error48.message : String(error48);
@@ -16341,9 +16351,9 @@ function registerSessionTools(server, ctx) {
16341
16351
  }
16342
16352
  }
16343
16353
  }
16344
- let promptResponse = null;
16354
+ let initialTask = null;
16345
16355
  if (args.initialPrompt) {
16346
- promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
16356
+ initialTask = await ctx.app.service("/sessions/:id/prompt").create(
16347
16357
  { prompt: args.initialPrompt, permissionMode, stream: true },
16348
16358
  { ...ctx.baseServiceParams, route: { id: session.session_id } }
16349
16359
  );
@@ -16352,7 +16362,7 @@ function registerSessionTools(server, ctx) {
16352
16362
  const mcpFailureNote = mcpAttachFailures.length > 0 ? ` Warning: ${mcpAttachFailures.length} requested MCP server(s) failed to attach \u2014 see mcpAttachFailures.` : "";
16353
16363
  return textResult({
16354
16364
  session,
16355
- taskId: promptResponse?.taskId,
16365
+ taskId: initialTask?.task_id,
16356
16366
  note: args.initialPrompt ? `Session created and initial prompt execution started.${callbackNote}${mcpFailureNote}` : `Session created successfully.${callbackNote}${mcpFailureNote}`,
16357
16367
  ...mcpAttachFailures.length > 0 && { mcpAttachFailures }
16358
16368
  });
@@ -16613,6 +16623,54 @@ function registerSessionTools(server, ctx) {
16613
16623
  });
16614
16624
  }
16615
16625
  );
16626
+ server.registerTool(
16627
+ "agor_models_list",
16628
+ {
16629
+ description: "List valid model IDs grouped by agenticTool. Use this to discover what to pass for `modelConfig` (or its string shorthand) in agor_sessions_create / spawn / prompt. Sourced live from the daemon model registry \u2014 when new models ship and the registry is updated, this tool returns them on the next call.",
16630
+ annotations: { readOnlyHint: true },
16631
+ inputSchema: external_exports2.object({
16632
+ agenticTool: external_exports2.enum(["claude-code", "codex", "gemini"]).optional().describe("Filter to a single agentic tool. Omit to return all tools.")
16633
+ })
16634
+ },
16635
+ async (args) => {
16636
+ const claudeModels = AVAILABLE_CLAUDE_MODEL_ALIASES.map((m) => ({
16637
+ id: m.id,
16638
+ displayName: m.displayName,
16639
+ description: m.description,
16640
+ family: m.family
16641
+ }));
16642
+ const codexModels = Object.entries(CODEX_MODEL_METADATA).map(([id, meta3]) => ({
16643
+ id,
16644
+ displayName: meta3.name,
16645
+ description: meta3.description
16646
+ }));
16647
+ const geminiModels = Object.entries(GEMINI_MODELS).map(([id, meta3]) => ({
16648
+ id,
16649
+ displayName: meta3.name,
16650
+ description: meta3.description,
16651
+ useCase: meta3.useCase
16652
+ }));
16653
+ const all = {
16654
+ "claude-code": {
16655
+ default: DEFAULT_CLAUDE_MODEL,
16656
+ models: claudeModels
16657
+ },
16658
+ codex: {
16659
+ default: DEFAULT_CODEX_MODEL,
16660
+ models: codexModels
16661
+ },
16662
+ gemini: {
16663
+ default: DEFAULT_GEMINI_MODEL,
16664
+ models: geminiModels,
16665
+ note: "Gemini models are normally fetched live from the Google API per-user. This is the static fallback list \u2014 newer models may exist."
16666
+ }
16667
+ };
16668
+ if (args.agenticTool) {
16669
+ return textResult({ [args.agenticTool]: all[args.agenticTool] });
16670
+ }
16671
+ return textResult(all);
16672
+ }
16673
+ );
16616
16674
  }
16617
16675
 
16618
16676
  // src/mcp/tools/tasks.ts
@@ -16797,7 +16855,7 @@ function registerUserTools(server, ctx) {
16797
16855
  // src/mcp/tools/worktrees.ts
16798
16856
  import { isWorktreeRbacEnabled as isWorktreeRbacEnabled2 } from "@agor/core/config";
16799
16857
  import { WorktreeRepository as WorktreeRepository3 } from "@agor/core/db";
16800
- import { resolveModelConfig } from "@agor/core/models";
16858
+ import { resolveSessionDefaults as resolveSessionDefaults2 } from "@agor/core/sessions";
16801
16859
  import { getAssistantConfig, isAssistant, WORKTREE_PERMISSION_LEVELS as WORKTREE_PERMISSION_LEVELS2 } from "@agor/core/types";
16802
16860
  import { computeZoneRelativePosition } from "@agor/core/utils/board-placement";
16803
16861
  import { normalizeOptionalHttpUrl } from "@agor/core/utils/url";
@@ -17235,27 +17293,28 @@ function registerWorktreeTools(server, ctx) {
17235
17293
  };
17236
17294
  const renderedPrompt = renderTemplate(zone.trigger.template, templateContext);
17237
17295
  if (renderedPrompt) {
17238
- const promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
17296
+ const task = await ctx.app.service("/sessions/:id/prompt").create(
17239
17297
  { prompt: renderedPrompt, stream: true },
17240
17298
  { ...ctx.baseServiceParams, route: { id: targetSessionId } }
17241
17299
  );
17242
- if (promptResponse.queued) {
17300
+ if (task.status === "queued") {
17243
17301
  promptResult = {
17244
17302
  queued: true,
17245
- queue_position: promptResponse.queue_position,
17303
+ taskId: task.task_id,
17304
+ queue_position: task.queue_position,
17246
17305
  sessionId: targetSessionId,
17247
17306
  note: "Session is busy. Zone trigger prompt has been queued."
17248
17307
  };
17249
17308
  console.log(
17250
- `\u{1F4EC} Zone trigger queued for session ${targetSessionId.substring(0, 8)} at position ${promptResponse.queue_position}`
17309
+ `\u{1F4EC} Zone trigger queued for session ${targetSessionId.substring(0, 8)} at position ${task.queue_position}`
17251
17310
  );
17252
17311
  } else {
17253
17312
  promptResult = {
17254
- taskId: promptResponse.taskId,
17313
+ taskId: task.task_id,
17255
17314
  sessionId: targetSessionId,
17256
17315
  note: "Zone trigger prompt sent to target session"
17257
17316
  };
17258
- console.log(`\u2705 Zone trigger executed: task ${promptResponse.taskId.substring(0, 8)}`);
17317
+ console.log(`\u2705 Zone trigger executed: task ${task.task_id.substring(0, 8)}`);
17259
17318
  }
17260
17319
  } else {
17261
17320
  promptResult = {
@@ -17295,24 +17354,11 @@ function registerWorktreeTools(server, ctx) {
17295
17354
  const { getGitState, getCurrentBranch } = await import("@agor/core/git");
17296
17355
  const currentSha = await getGitState(worktree.path);
17297
17356
  const currentRef = await getCurrentBranch(worktree.path);
17298
- const { getDefaultPermissionMode } = await import("@agor/core/types");
17299
- const { mapPermissionMode } = await import("@agor/core/utils/permission-mode-mapper");
17300
- const userToolDefaults = user?.default_agentic_config?.[agenticTool];
17301
- const requestedMode = userToolDefaults?.permissionMode || getDefaultPermissionMode(agenticTool);
17302
- const permissionMode = mapPermissionMode(requestedMode, agenticTool);
17303
- const permissionConfig = {
17304
- mode: permissionMode,
17305
- allowedTools: []
17306
- };
17307
- if (agenticTool === "codex" && userToolDefaults?.codexSandboxMode && userToolDefaults?.codexApprovalPolicy) {
17308
- permissionConfig.codex = {
17309
- sandboxMode: userToolDefaults.codexSandboxMode,
17310
- approvalPolicy: userToolDefaults.codexApprovalPolicy,
17311
- networkAccess: userToolDefaults.codexNetworkAccess
17312
- };
17313
- }
17314
- const modelConfig = resolveModelConfig(userToolDefaults?.modelConfig);
17315
- const mcpServerIds = worktree.mcp_server_ids && worktree.mcp_server_ids.length > 0 ? worktree.mcp_server_ids : userToolDefaults?.mcpServerIds || [];
17357
+ const {
17358
+ permission_config: permissionConfig,
17359
+ model_config: modelConfig,
17360
+ mcp_server_ids: mcpServerIds
17361
+ } = resolveSessionDefaults2({ agenticTool, user, worktree });
17316
17362
  const sessionData = {
17317
17363
  worktree_id: worktreeId,
17318
17364
  agentic_tool: agenticTool,
@@ -17337,12 +17383,9 @@ function registerWorktreeTools(server, ctx) {
17337
17383
  if (mcpServerIds.length > 0) {
17338
17384
  for (const mcpServerId of mcpServerIds) {
17339
17385
  try {
17340
- await ctx.app.service("session-mcp-servers").create(
17341
- {
17342
- session_id: newSession.session_id,
17343
- mcp_server_id: mcpServerId
17344
- },
17345
- ctx.baseServiceParams
17386
+ await ctx.app.service("/sessions/:id/mcp-servers").create(
17387
+ { mcpServerId },
17388
+ { ...ctx.baseServiceParams, route: { id: newSession.session_id } }
17346
17389
  );
17347
17390
  } catch (error48) {
17348
17391
  console.warn(
@@ -17352,16 +17395,16 @@ function registerWorktreeTools(server, ctx) {
17352
17395
  }
17353
17396
  console.log(`\u2705 Attached ${mcpServerIds.length} MCP servers`);
17354
17397
  }
17355
- const promptResponse = await ctx.app.service("/sessions/:id/prompt").create(
17398
+ const task = await ctx.app.service("/sessions/:id/prompt").create(
17356
17399
  { prompt: renderedPrompt, stream: true },
17357
17400
  { ...ctx.baseServiceParams, route: { id: newSession.session_id } }
17358
17401
  );
17359
17402
  promptResult = {
17360
- taskId: promptResponse.taskId,
17403
+ taskId: task.task_id,
17361
17404
  sessionId: newSession.session_id,
17362
17405
  note: `always_new trigger: created session ${newSession.session_id.substring(0, 8)} (${agenticTool}) and sent prompt`
17363
17406
  };
17364
- console.log(`\u2705 Zone trigger executed: task ${promptResponse.taskId.substring(0, 8)}`);
17407
+ console.log(`\u2705 Zone trigger executed: task ${task.task_id.substring(0, 8)}`);
17365
17408
  } else {
17366
17409
  promptResult = {
17367
17410
  note: "Zone trigger template rendered to empty string (check template syntax)"
@@ -13837,20 +13837,34 @@ import { extractSlugFromUrl, isValidGitUrl, isValidSlug } from "@agor/core/confi
13837
13837
 
13838
13838
  // src/mcp/tools/sessions.ts
13839
13839
  import { WorktreeRepository as WorktreeRepository2 } from "@agor/core/db";
13840
- import { resolveModelConfigPrecedence } from "@agor/core/models";
13840
+ import {
13841
+ AVAILABLE_CLAUDE_MODEL_ALIASES,
13842
+ CODEX_MODEL_METADATA,
13843
+ DEFAULT_CLAUDE_MODEL,
13844
+ DEFAULT_CODEX_MODEL,
13845
+ DEFAULT_GEMINI_MODEL,
13846
+ GEMINI_MODELS
13847
+ } from "@agor/core/models";
13848
+ import { resolveSessionDefaults } from "@agor/core/sessions";
13841
13849
  import {
13842
13850
  AGENTIC_TOOL_CAPABILITIES,
13843
13851
  getSessionType
13844
13852
  } from "@agor/core/types";
13845
- var modelConfigInputSchema = external_exports.object({
13853
+ var modelConfigObjectSchema = external_exports.object({
13846
13854
  mode: external_exports.enum(["alias", "exact"]).optional().describe("Model selection mode (default: 'alias')"),
13847
13855
  // .min(1): reject empty-string model explicitly so callers don't silently
13848
13856
  // fall through to user defaults when they meant to pin a specific model.
13849
13857
  model: external_exports.string().min(1).describe("Model identifier (e.g. 'claude-opus-4-6', 'claude-sonnet-4-6')"),
13850
13858
  effort: external_exports.enum(["low", "medium", "high", "max"]).optional().describe("Reasoning effort level (default: high)"),
13851
13859
  provider: external_exports.string().optional().describe("Provider ID (OpenCode only, e.g. 'anthropic')")
13852
- }).optional().describe(
13853
- "Model override for this session. When set, overrides the user default model_config. Threaded through to the spawned agent process so it actually runs on the requested model."
13860
+ });
13861
+ var modelConfigInputSchema = external_exports.union([
13862
+ external_exports.string().min(1).describe(
13863
+ "Shorthand: just the model ID string (e.g. 'claude-opus-4-6'). Equivalent to { model: <id> }."
13864
+ ),
13865
+ modelConfigObjectSchema
13866
+ ]).optional().describe(
13867
+ "Model override for this session. Pass either a model ID string (e.g. 'claude-opus-4-6') or a full { mode, model, effort, provider } object. Overrides the user default model_config and is threaded through to the spawned agent process. Call agor_models_list to discover valid model IDs per agenticTool."
13854
13868
  );
13855
13869
 
13856
13870
  // src/mcp/tools/users.ts
@@ -13859,7 +13873,7 @@ import { ROLES as ROLES2 } from "@agor/core/types";
13859
13873
  // src/mcp/tools/worktrees.ts
13860
13874
  import { isWorktreeRbacEnabled as isWorktreeRbacEnabled2 } from "@agor/core/config";
13861
13875
  import { WorktreeRepository as WorktreeRepository3 } from "@agor/core/db";
13862
- import { resolveModelConfig } from "@agor/core/models";
13876
+ import { resolveSessionDefaults as resolveSessionDefaults2 } from "@agor/core/sessions";
13863
13877
  import { getAssistantConfig, isAssistant, WORKTREE_PERMISSION_LEVELS as WORKTREE_PERMISSION_LEVELS2 } from "@agor/core/types";
13864
13878
  import { computeZoneRelativePosition } from "@agor/core/utils/board-placement";
13865
13879
  import { normalizeOptionalHttpUrl } from "@agor/core/utils/url";
@@ -13853,20 +13853,34 @@ import { extractSlugFromUrl, isValidGitUrl, isValidSlug } from "@agor/core/confi
13853
13853
 
13854
13854
  // src/mcp/tools/sessions.ts
13855
13855
  import { WorktreeRepository } from "@agor/core/db";
13856
- import { resolveModelConfigPrecedence } from "@agor/core/models";
13856
+ import {
13857
+ AVAILABLE_CLAUDE_MODEL_ALIASES,
13858
+ CODEX_MODEL_METADATA,
13859
+ DEFAULT_CLAUDE_MODEL,
13860
+ DEFAULT_CODEX_MODEL,
13861
+ DEFAULT_GEMINI_MODEL,
13862
+ GEMINI_MODELS
13863
+ } from "@agor/core/models";
13864
+ import { resolveSessionDefaults } from "@agor/core/sessions";
13857
13865
  import {
13858
13866
  AGENTIC_TOOL_CAPABILITIES,
13859
13867
  getSessionType
13860
13868
  } from "@agor/core/types";
13861
- var modelConfigInputSchema = external_exports.object({
13869
+ var modelConfigObjectSchema = external_exports.object({
13862
13870
  mode: external_exports.enum(["alias", "exact"]).optional().describe("Model selection mode (default: 'alias')"),
13863
13871
  // .min(1): reject empty-string model explicitly so callers don't silently
13864
13872
  // fall through to user defaults when they meant to pin a specific model.
13865
13873
  model: external_exports.string().min(1).describe("Model identifier (e.g. 'claude-opus-4-6', 'claude-sonnet-4-6')"),
13866
13874
  effort: external_exports.enum(["low", "medium", "high", "max"]).optional().describe("Reasoning effort level (default: high)"),
13867
13875
  provider: external_exports.string().optional().describe("Provider ID (OpenCode only, e.g. 'anthropic')")
13868
- }).optional().describe(
13869
- "Model override for this session. When set, overrides the user default model_config. Threaded through to the spawned agent process so it actually runs on the requested model."
13876
+ });
13877
+ var modelConfigInputSchema = external_exports.union([
13878
+ external_exports.string().min(1).describe(
13879
+ "Shorthand: just the model ID string (e.g. 'claude-opus-4-6'). Equivalent to { model: <id> }."
13880
+ ),
13881
+ modelConfigObjectSchema
13882
+ ]).optional().describe(
13883
+ "Model override for this session. Pass either a model ID string (e.g. 'claude-opus-4-6') or a full { mode, model, effort, provider } object. Overrides the user default model_config and is threaded through to the spawned agent process. Call agor_models_list to discover valid model IDs per agenticTool."
13870
13884
  );
13871
13885
 
13872
13886
  // src/mcp/tools/users.ts
@@ -13875,7 +13889,7 @@ import { ROLES as ROLES2 } from "@agor/core/types";
13875
13889
  // src/mcp/tools/worktrees.ts
13876
13890
  import { isWorktreeRbacEnabled as isWorktreeRbacEnabled2 } from "@agor/core/config";
13877
13891
  import { WorktreeRepository as WorktreeRepository2 } from "@agor/core/db";
13878
- import { resolveModelConfig } from "@agor/core/models";
13892
+ import { resolveSessionDefaults as resolveSessionDefaults2 } from "@agor/core/sessions";
13879
13893
  import { getAssistantConfig, isAssistant, WORKTREE_PERMISSION_LEVELS as WORKTREE_PERMISSION_LEVELS2 } from "@agor/core/types";
13880
13894
  import { computeZoneRelativePosition } from "@agor/core/utils/board-placement";
13881
13895
  import { normalizeOptionalHttpUrl } from "@agor/core/utils/url";