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
@@ -102,6 +102,15 @@ declare function getSocketAuthState(socket: Socket): SocketAuthState;
102
102
  * Exported for unit tests.
103
103
  */
104
104
  declare function createTokenBucket(capacity: number, refillPerSec: number, now?: () => number): () => boolean;
105
+ /**
106
+ * Per-user socket.io room name. Sockets owned by `userId` auto-join this room
107
+ * on connect / login (see the connection handler and the `app.on('login', …)`
108
+ * hook in this file). Use this everywhere we want to emit to "every tab the
109
+ * user owns" — e.g. user-scoped notifications like `oauth:completed`.
110
+ *
111
+ * Centralized so the prefix can change in one place without drift.
112
+ */
113
+ declare function userRoomName(userId: string): string;
105
114
  /**
106
115
  * Validate a terminal channel name and extract its target user_id.
107
116
  *
@@ -150,4 +159,4 @@ declare function createSocketIOConfig(app: Application, options: SocketIOOptions
150
159
  */
151
160
  declare function configureChannels(app: Application): void;
152
161
 
153
- export { type SocketAuthState, type SocketIOOptions, type SocketIOResult, configureChannels, createSocketIOConfig, createTokenBucket, getSocketAuthState, parseTerminalChannel };
162
+ export { type SocketAuthState, type SocketIOOptions, type SocketIOResult, configureChannels, createSocketIOConfig, createTokenBucket, getSocketAuthState, parseTerminalChannel, userRoomName };
@@ -32,6 +32,9 @@ function createTokenBucket(capacity, refillPerSec, now = Date.now) {
32
32
  return false;
33
33
  };
34
34
  }
35
+ function userRoomName(userId) {
36
+ return `user:${userId}`;
37
+ }
35
38
  function parseTerminalChannel(channel) {
36
39
  if (typeof channel !== "string") return null;
37
40
  if (!channel.startsWith("user/") || !channel.endsWith("/terminal")) return null;
@@ -125,7 +128,7 @@ function createSocketIOConfig(app, options) {
125
128
  });
126
129
  }
127
130
  if (user?.user_id) {
128
- socket.join(`user:${user.user_id}`);
131
+ socket.join(userRoomName(user.user_id));
129
132
  console.log(
130
133
  `\u{1F3E0} Socket ${socket.id} joined user room at connection: user:${user.user_id.substring(0, 8)}`
131
134
  );
@@ -320,7 +323,7 @@ function createSocketIOConfig(app, options) {
320
323
  if (!userId) return;
321
324
  for (const [, socket] of io.sockets.sockets) {
322
325
  if (socket.feathers === context.connection) {
323
- socket.join(`user:${userId}`);
326
+ socket.join(userRoomName(userId));
324
327
  console.log(
325
328
  `\u{1F3E0} Socket ${socket.id} joined user room after login: user:${userId.substring(0, 8)}`
326
329
  );
@@ -364,5 +367,6 @@ export {
364
367
  createSocketIOConfig,
365
368
  createTokenBucket,
366
369
  getSocketAuthState,
367
- parseTerminalChannel
370
+ parseTerminalChannel,
371
+ userRoomName
368
372
  };
@@ -735,7 +735,19 @@ async function cleanupOrphans(ctx) {
735
735
  }
736
736
  }
737
737
  }
738
- if (orphanedTasks.length === 0 && orphanedSessions.length === 0) {
738
+ const queuedResult = await tasksService.find({
739
+ query: { status: TaskStatus.QUEUED, $limit: 1e3 }
740
+ });
741
+ const queuedTasks = queuedResult.data;
742
+ if (queuedTasks.length > 0) {
743
+ console.log(` Found ${queuedTasks.length} queued task(s) \u2014 wiping queue on restart`);
744
+ for (const task of queuedTasks) {
745
+ await tasksService.patch(task.task_id, {
746
+ status: TaskStatus.STOPPED
747
+ });
748
+ }
749
+ }
750
+ if (orphanedTasks.length === 0 && orphanedSessions.length === 0 && queuedTasks.length === 0) {
739
751
  console.log(" No orphaned tasks or sessions found");
740
752
  }
741
753
  }
@@ -0,0 +1,54 @@
1
+ import { HookContext } from '@agor/core/types';
2
+
3
+ /**
4
+ * Before-create hook that auto-fills `permission_config` and `model_config`
5
+ * from the creator's `default_agentic_config[tool]` when the caller omits them.
6
+ *
7
+ * Why this hook exists
8
+ * --------------------
9
+ * Multiple session-creation paths (MCP `agor_sessions_create`, MCP
10
+ * `agor_worktrees_set_zone`, gateway, the UI drag-into-zone handler, raw
11
+ * REST) used to each carry their own copy of the "fetch user → read tool
12
+ * defaults → resolve permission mode → build permission_config" dance. The UI
13
+ * drag handler shipped without it (issue #1064), so dragged sessions were
14
+ * created with `permission_config: null` — which Claude Code interprets as
15
+ * the most restrictive mode and which made every dragged session hang
16
+ * waiting for manual approval.
17
+ *
18
+ * Centralizing the resolution as a `before:create` hook means:
19
+ * - Every caller benefits, including future ones.
20
+ * - Callers that DO want to set explicit config (MCP tools with `modelConfig`
21
+ * args, gateway with channel-level config, spawn/fork with parent
22
+ * inheritance) just pre-populate the field — the hook leaves populated
23
+ * fields untouched.
24
+ *
25
+ * The shared resolution logic lives in `@agor/core/sessions`
26
+ * ({@link resolveSessionDefaults}); this hook is just the FeathersJS adapter
27
+ * around it.
28
+ *
29
+ * Caveats
30
+ * -------
31
+ * - The hook ONLY fills `permission_config` and `model_config`. MCP server
32
+ * attachment is intentionally left to caller-side code because the
33
+ * "explicit-failures-must-surface" semantics differ between
34
+ * explicitly-requested servers (caller wants to know about failures) and
35
+ * inherited servers (best-effort, log-and-skip). See the open follow-up
36
+ * in `apps/agor-ui/src/components/SessionCanvas/SessionCanvas.tsx`.
37
+ * - Internal calls (no `params.provider`) only resolve via `data.created_by`,
38
+ * so service-to-service callers must stamp it (or the helper falls back to
39
+ * the system default — same behavior as the bug today, just no longer
40
+ * reachable via REST/MCP/UI).
41
+ */
42
+
43
+ /**
44
+ * @param opts.warnOnExternalDefaultFill — when `true` (recommended in dev),
45
+ * logs a warning whenever an external (REST/socketio/MCP) caller omits
46
+ * `permission_config`. This surfaces lazy callers without breaking them.
47
+ * The hook still applies defaults; the warning is purely diagnostic.
48
+ */
49
+ interface ApplySessionConfigDefaultsOpts {
50
+ warnOnExternalDefaultFill?: boolean;
51
+ }
52
+ declare function applySessionConfigDefaults(opts?: ApplySessionConfigDefaultsOpts): (context: HookContext) => Promise<HookContext>;
53
+
54
+ export { type ApplySessionConfigDefaultsOpts, applySessionConfigDefaults };
@@ -0,0 +1,46 @@
1
+ // src/utils/apply-session-config-defaults.ts
2
+ import { resolveSessionDefaults } from "@agor/core/sessions";
3
+ function applySessionConfigDefaults(opts = {}) {
4
+ const { warnOnExternalDefaultFill = true } = opts;
5
+ return async (context) => {
6
+ if (Array.isArray(context.data)) {
7
+ return context;
8
+ }
9
+ const data = context.data;
10
+ if (!data) return context;
11
+ const hasPermission = data.permission_config != null;
12
+ const hasModel = data.model_config != null;
13
+ if (hasPermission && hasModel) return context;
14
+ const agenticTool = data.agentic_tool;
15
+ if (!agenticTool) return context;
16
+ const userId = data.created_by;
17
+ if (!userId) return context;
18
+ let user;
19
+ try {
20
+ const usersService = context.app.service("users");
21
+ user = await usersService.get(userId, { provider: void 0 });
22
+ } catch (err) {
23
+ console.warn(
24
+ `[apply-session-config-defaults] Failed to load user ${userId} for defaults:`,
25
+ err instanceof Error ? err.message : String(err)
26
+ );
27
+ user = null;
28
+ }
29
+ const resolved = resolveSessionDefaults({ agenticTool, user });
30
+ if (!hasPermission) {
31
+ data.permission_config = resolved.permission_config;
32
+ if (warnOnExternalDefaultFill && context.params.provider) {
33
+ console.warn(
34
+ `[apply-session-config-defaults] Filled missing permission_config for ${agenticTool} session (user=${userId}, provider=${context.params.provider}, mode=${resolved.permission_config.mode}). Caller should send permission_config explicitly.`
35
+ );
36
+ }
37
+ }
38
+ if (!hasModel && resolved.model_config) {
39
+ data.model_config = resolved.model_config;
40
+ }
41
+ return context;
42
+ };
43
+ }
44
+ export {
45
+ applySessionConfigDefaults
46
+ };
@@ -100,7 +100,9 @@ function spawnExecutorLocal(payload, options) {
100
100
  ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY,
101
101
  ANTHROPIC_AUTH_TOKEN: env.ANTHROPIC_AUTH_TOKEN,
102
102
  ANTHROPIC_BASE_URL: env.ANTHROPIC_BASE_URL,
103
+ CLAUDE_CODE_OAUTH_TOKEN: env.CLAUDE_CODE_OAUTH_TOKEN,
103
104
  OPENAI_API_KEY: env.OPENAI_API_KEY,
105
+ OPENAI_BASE_URL: env.OPENAI_BASE_URL,
104
106
  GEMINI_API_KEY: env.GEMINI_API_KEY,
105
107
  GOOGLE_API_KEY: env.GOOGLE_API_KEY
106
108
  }).filter(([_, v]) => v !== void 0)
@@ -9,8 +9,7 @@ import { WorktreePermissionLevel, Session, HookContext, Worktree, UUID } from '@
9
9
  * Uses RBACParams to provide type-safe access to cached RBAC entities (worktree, session, ownership).
10
10
  * This avoids redundant database queries within hook chains.
11
11
  *
12
- * @see context/explorations/rbac.md
13
- * @see context/explorations/unix-user-modes.md
12
+ * @see context/guides/rbac-and-unix-isolation.md
14
13
  */
15
14
 
16
15
  /**
@@ -183,8 +182,7 @@ declare function loadWorktreeFromSession(worktreeRepo: WorktreeRepository): (con
183
182
  * This is CRITICAL for Unix isolation - session execution context is determined
184
183
  * by session.created_by (which maps to Unix user) and session.unix_username.
185
184
  *
186
- * @see context/explorations/rbac.md - Session Ownership (CRITICAL)
187
- * @see context/explorations/unix-user-modes.md - Session Execution Model
185
+ * @see context/guides/rbac-and-unix-isolation.md Session Ownership / Execution Model
188
186
  */
189
187
  declare function ensureSessionImmutability(): (context: HookContext) => HookContext<unknown>;
190
188
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"zellij.d.ts","sourceRoot":"","sources":["../../src/commands/zellij.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsBjD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAgQzB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAgDzB;AAuID;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAWpC"}
1
+ {"version":3,"file":"zellij.d.ts","sourceRoot":"","sources":["../../src/commands/zellij.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAoPzB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,cAAc,CAAC,CAgDzB;AAuID;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAWpC"}
@@ -85,8 +85,8 @@ export async function handleZellijAttach(payload, options) {
85
85
  process.exit(0);
86
86
  });
87
87
  // Import node-pty dynamically (native module)
88
- // Using @homebridge/node-pty-prebuilt-multiarch for consistency with daemon
89
- const nodePty = (await import('@homebridge/node-pty-prebuilt-multiarch'));
88
+ // Using upstream microsoft/node-pty (no engines cap, supports Node 24/25)
89
+ const nodePty = await import('node-pty');
90
90
  // Build zellij command - config path added after fs/actualHome are defined below
91
91
  const zellijArgs = ['attach', sessionName, '--create'];
92
92
  // Build clean environment for Zellij
@@ -4,7 +4,8 @@
4
4
  * This module provides shared helpers to reduce duplication across
5
5
  * Claude, Codex, Gemini, and OpenCode executors.
6
6
  */
7
- import type { MessageID, MessageSource, PermissionMode, SessionID, TaskID } from '@agor/core/types';
7
+ import { type ApiKeyName } from '@agor/core/config';
8
+ import type { AgenticToolName, MessageID, MessageSource, PermissionMode, SessionID, TaskID } from '@agor/core/types';
8
9
  import { createFeathersBackedRepositories } from '../../db/feathers-repositories.js';
9
10
  import type { StreamingCallbacks } from '../../sdk-handlers/base/types.js';
10
11
  import type { AgorClient } from '../../services/feathers-client.js';
@@ -87,8 +88,8 @@ export declare function executeToolTask(params: {
87
88
  prompt: string;
88
89
  permissionMode?: PermissionMode;
89
90
  abortController: AbortController;
90
- apiKeyEnvVar: string;
91
- toolName: string;
91
+ apiKeyEnvVar: ApiKeyName;
92
+ toolName: AgenticToolName;
92
93
  messageSource?: 'gateway' | 'agor';
93
94
  createTool: (repos: ReturnType<typeof createFeathersBackedRepositories>, apiKey: string, useNativeAuth: boolean) => BaseTool;
94
95
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"base-executor.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdk/base-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-executor.d.ts","sourceRoot":"","sources":["../../../src/handlers/sdk/base-executor.ts"],"names":[],"mappings":"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"}
@@ -158,13 +158,16 @@ async function captureGitStateAtTaskEnd(client, sessionId) {
158
158
  *
159
159
  * Returns resolution result with key, source, and useNativeAuth flag
160
160
  */
161
- async function resolveApiKeyForTask(keyName, client, taskId) {
161
+ async function resolveApiKeyForTask(keyName, client, taskId, tool) {
162
162
  // Call daemon service to resolve API key (no direct database access from executor!)
163
- // This allows executors to run as different Unix users without needing database access
163
+ // This allows executors to run as different Unix users without needing database access.
164
+ // `tool` scopes the per-user lookup to the calling SDK's bucket so a Codex spawn
165
+ // never resolves a key stored under `agentic_tools['claude-code']`, and vice versa.
164
166
  try {
165
167
  const result = (await client.service('config/resolve-api-key').create({
166
168
  taskId,
167
169
  keyName,
170
+ tool,
168
171
  }));
169
172
  console.log(`[API Key Resolution] Resolved ${keyName} via daemon (source: ${result.source})`);
170
173
  return result;
@@ -181,13 +184,16 @@ async function resolveApiKeyForTask(keyName, client, taskId) {
181
184
  export async function executeToolTask(params) {
182
185
  const { client, sessionId, taskId, prompt, permissionMode, apiKeyEnvVar, toolName, createTool } = params;
183
186
  console.log(`[${toolName}] Executing task ${taskId.substring(0, 8)}...`);
184
- // Resolve API key with proper precedence (user → config → env → native auth)
185
- const resolution = await resolveApiKeyForTask(apiKeyEnvVar, client, taskId);
187
+ // Resolve API key with proper precedence (user → config → env → native auth).
188
+ // Pass `toolName` so the daemon scopes the per-user lookup to this tool's
189
+ // credential bucket — prevents cross-SDK leak (e.g. Codex picking up an
190
+ // ANTHROPIC_API_KEY stored under claude-code).
191
+ const resolution = await resolveApiKeyForTask(apiKeyEnvVar, client, taskId, toolName);
186
192
  // Fail fast if stored key can't be decrypted (e.g. master secret changed)
187
193
  if (resolution.decryptionFailed) {
188
194
  throw new Error(`API key "${apiKeyEnvVar}" could not be decrypted. ` +
189
195
  `The stored key may have been encrypted with a different master secret. ` +
190
- `Please re-enter your API key in Settings > API Keys.`);
196
+ `Please re-enter your API key in Settings > ${toolName} > Authentication.`);
191
197
  }
192
198
  // Log resolution result
193
199
  if (resolution.apiKey) {
@@ -12,11 +12,11 @@ import { z } from 'zod';
12
12
  * Tool types supported by the prompt command
13
13
  */
14
14
  export declare const ToolTypeSchema: z.ZodEnum<{
15
- opencode: "opencode";
16
15
  "claude-code": "claude-code";
17
- copilot: "copilot";
18
16
  gemini: "gemini";
19
17
  codex: "codex";
18
+ opencode: "opencode";
19
+ copilot: "copilot";
20
20
  }>;
21
21
  export type ToolType = z.infer<typeof ToolTypeSchema>;
22
22
  /**
@@ -31,12 +31,12 @@ export type ToolType = z.infer<typeof ToolTypeSchema>;
31
31
  */
32
32
  export declare const PermissionModeSchema: z.ZodEnum<{
33
33
  default: "default";
34
- autoEdit: "autoEdit";
35
- yolo: "yolo";
36
34
  acceptEdits: "acceptEdits";
37
35
  bypassPermissions: "bypassPermissions";
38
36
  plan: "plan";
39
37
  dontAsk: "dontAsk";
38
+ autoEdit: "autoEdit";
39
+ yolo: "yolo";
40
40
  ask: "ask";
41
41
  auto: "auto";
42
42
  "on-failure": "on-failure";
@@ -69,20 +69,20 @@ export declare const PromptPayloadSchema: z.ZodObject<{
69
69
  taskId: z.ZodString;
70
70
  prompt: z.ZodString;
71
71
  tool: z.ZodEnum<{
72
- opencode: "opencode";
73
72
  "claude-code": "claude-code";
74
- copilot: "copilot";
75
73
  gemini: "gemini";
76
74
  codex: "codex";
75
+ opencode: "opencode";
76
+ copilot: "copilot";
77
77
  }>;
78
78
  permissionMode: z.ZodOptional<z.ZodEnum<{
79
79
  default: "default";
80
- autoEdit: "autoEdit";
81
- yolo: "yolo";
82
80
  acceptEdits: "acceptEdits";
83
81
  bypassPermissions: "bypassPermissions";
84
82
  plan: "plan";
85
83
  dontAsk: "dontAsk";
84
+ autoEdit: "autoEdit";
85
+ yolo: "yolo";
86
86
  ask: "ask";
87
87
  auto: "auto";
88
88
  "on-failure": "on-failure";
@@ -90,8 +90,8 @@ export declare const PromptPayloadSchema: z.ZodObject<{
90
90
  }>>;
91
91
  cwd: z.ZodString;
92
92
  messageSource: z.ZodOptional<z.ZodEnum<{
93
- agor: "agor";
94
93
  gateway: "gateway";
94
+ agor: "agor";
95
95
  }>>;
96
96
  }, z.core.$strip>;
97
97
  }, z.core.$strip>;
@@ -344,20 +344,20 @@ export declare const ExecutorPayloadSchema: z.ZodDiscriminatedUnion<[z.ZodObject
344
344
  taskId: z.ZodString;
345
345
  prompt: z.ZodString;
346
346
  tool: z.ZodEnum<{
347
- opencode: "opencode";
348
347
  "claude-code": "claude-code";
349
- copilot: "copilot";
350
348
  gemini: "gemini";
351
349
  codex: "codex";
350
+ opencode: "opencode";
351
+ copilot: "copilot";
352
352
  }>;
353
353
  permissionMode: z.ZodOptional<z.ZodEnum<{
354
354
  default: "default";
355
- autoEdit: "autoEdit";
356
- yolo: "yolo";
357
355
  acceptEdits: "acceptEdits";
358
356
  bypassPermissions: "bypassPermissions";
359
357
  plan: "plan";
360
358
  dontAsk: "dontAsk";
359
+ autoEdit: "autoEdit";
360
+ yolo: "yolo";
361
361
  ask: "ask";
362
362
  auto: "auto";
363
363
  "on-failure": "on-failure";
@@ -365,8 +365,8 @@ export declare const ExecutorPayloadSchema: z.ZodDiscriminatedUnion<[z.ZodObject
365
365
  }>>;
366
366
  cwd: z.ZodString;
367
367
  messageSource: z.ZodOptional<z.ZodEnum<{
368
- agor: "agor";
369
368
  gateway: "gateway";
369
+ agor: "agor";
370
370
  }>>;
371
371
  }, z.core.$strip>;
372
372
  }, z.core.$strip>, z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"claude-tool.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/claude-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,MAAM,EAEZ,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0E5F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAE3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9B,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,IAAI,EAAE;QACX,KAAK,EAAE,YAAY,GAAG,eAAe,GAAG,gBAAgB,CAAC;QACzD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC/B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAE9B,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACrD;AAED,qBAAa,UAAW,YAAW,KAAK;IAOpC,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IAErB,OAAO,CAAC,eAAe,CAAC;IAIxB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,qBAAqB,CAAC;IAdhC,QAAQ,CAAC,QAAQ,EAAG,aAAa,CAAU;IAC3C,QAAQ,CAAC,IAAI,iBAAiB;IAE9B,OAAO,CAAC,aAAa,CAAC,CAAsB;gBAGlC,YAAY,CAAC,EAAE,kBAAkB,YAAA,EACjC,YAAY,CAAC,EAAE,iBAAiB,YAAA,EACxC,MAAM,CAAC,EAAE,MAAM,EACP,eAAe,CAAC,EAAE,eAAe,YAAA,EACzC,cAAc,CAAC,EAAE,0BAA0B,EAC3C,aAAa,CAAC,EAAE,mBAAmB,EACnC,iBAAiB,CAAC,EAAE,iBAAiB,EAC7B,YAAY,CAAC,EAAE,YAAY,YAAA,EAC3B,qBAAqB,CAAC,EAAE,qBAAqB,YAAA,EACrD,eAAe,CAAC,EAAE,eAAe,EACjC,aAAa,CAAC,EAAE,kBAAkB,EAClC,SAAS,CAAC,EAAE,cAAc,EAC1B,UAAU,CAAC,EAAE,OAAO,EACpB,cAAc,CAAC,EAAE,OAAO,EAAE,+EAA+E;IACzG,mBAAmB,CAAC,EAAE,OAAO,4CAA4C,EAAE,mBAAmB,EAC9F,SAAS,CAAC,EAAE,OAAO,gCAAgC,EAAE,eAAe;IAsBtE,eAAe,IAAI,gBAAgB;IAY7B,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;YAW1B,aAAa;IAarB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IA6BrF;;;;;;;;;;;;;;OAcG;IACG,0BAA0B,CAC9B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,cAAc,EAC/B,kBAAkB,CAAC,EAAE,OAAO,SAAS,EAAE,kBAAkB,EACzD,eAAe,CAAC,EAAE,eAAe,EACjC,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC;QACT,aAAa,EAAE,SAAS,CAAC;QACzB,mBAAmB,EAAE,SAAS,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,OAAO,gBAAgB,EAAE,gBAAgB,CAAC;QAC3D,mFAAmF;QACnF,eAAe,CAAC,EAAE,OAAO,gBAAgB,EAAE,iCAAiC,CAAC;QAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oGAAoG;QACpG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA+lBF;;;OAGG;YACW,qBAAqB;IA0CnC;;;;;;;;OAQG;IACG,aAAa,CACjB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,cAAc,EAC/B,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC;QACT,aAAa,EAAE,SAAS,CAAC;QACzB,mBAAmB,EAAE,SAAS,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,CAAC,EAAE,OAAO,gBAAgB,EAAE,gBAAgB,CAAC;QAC3D,mFAAmF;QACnF,eAAe,CAAC,EAAE,OAAO,gBAAgB,EAAE,iCAAiC,CAAC;QAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oGAAoG;QACpG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IA6PF;;;;;;;;OAQG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;SAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IA2BF;;;;;OAKG;IACH,qBAAqB,CAAC,YAAY,EAAE,cAAc,GAAG,qBAAqB;IAM1E;;;;;;;;;;;;;;;;;;;OAmBG;IACH;;;;;;;;;;;;;;;OAeG;IACG,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,EACvB,sBAAsB,CAAC,EAAE,OAAO,GAC/B,OAAO,CAAC,MAAM,CAAC;CAMnB"}
1
+ {"version":3,"file":"claude-tool.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/claude-tool.ts"],"names":[],"mappings":"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"}
@@ -163,8 +163,11 @@ export class ClaudeTool {
163
163
  // Get next message index
164
164
  const existingMessages = await this.messagesRepo.findBySessionId(sessionId);
165
165
  let nextIndex = existingMessages.length;
166
- // Create user message
167
- const userMessage = await createUserMessage(sessionId, prompt, taskId, nextIndex++, this.messagesService, messageSource);
166
+ // Create user message (or reuse the daemon's pre-write — see Alt D in
167
+ // docs/never-lose-prompt-design.md). When the row is reused, advance
168
+ // nextIndex from the returned message's actual index.
169
+ const userMessage = await createUserMessage(sessionId, prompt, taskId, nextIndex, this.messagesService, { messageSource, existingMessages });
170
+ nextIndex = userMessage.index + 1;
168
171
  // Execute prompt via Agent SDK with streaming
169
172
  const assistantMessageIds = [];
170
173
  let capturedAgentSessionId;
@@ -655,8 +658,10 @@ export class ClaudeTool {
655
658
  // Get next message index
656
659
  const existingMessages = await this.messagesRepo.findBySessionId(sessionId);
657
660
  let nextIndex = existingMessages.length;
658
- // Create user message
659
- const userMessage = await createUserMessage(sessionId, prompt, taskId, nextIndex++, this.messagesService, messageSource);
661
+ // Create user message (or reuse the daemon's pre-write — see Alt D in
662
+ // docs/never-lose-prompt-design.md).
663
+ const userMessage = await createUserMessage(sessionId, prompt, taskId, nextIndex, this.messagesService, { messageSource, existingMessages });
664
+ nextIndex = userMessage.index + 1;
660
665
  // Execute prompt via Agent SDK
661
666
  const assistantMessageIds = [];
662
667
  let capturedAgentSessionId;
@@ -1 +1 @@
1
- {"version":3,"file":"task-extractor.d.ts","sourceRoot":"","sources":["../../../../src/sdk-handlers/claude/import/task-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAQ,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,UAAU,CAAC,SAAS,CAAC;IACpC,aAAa,EAAE;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,EAAE,CA6EjB"}
1
+ {"version":3,"file":"task-extractor.d.ts","sourceRoot":"","sources":["../../../../src/sdk-handlers/claude/import/task-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAQ,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,UAAU,CAAC,SAAS,CAAC;IACpC,aAAa,EAAE;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,SAAS,EAAE;QACT,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC,EAAE,CAsEjB"}
@@ -44,10 +44,6 @@ export function extractTasksFromMessages(messages, sessionId) {
44
44
  else {
45
45
  fullPrompt = JSON.stringify(userMessage.content);
46
46
  }
47
- // Clean up newlines and excessive whitespace for description
48
- const cleanPrompt = fullPrompt.replace(/\n/g, ' ').replace(/\s+/g, ' ').trim();
49
- // Generate short description (first 120 chars)
50
- const description = cleanPrompt.substring(0, 120) + (cleanPrompt.length > 120 ? '...' : '');
51
47
  // Get timestamps
52
48
  const startTimestamp = userMessage.timestamp;
53
49
  const endMessage = messages[endIndex];
@@ -57,7 +53,6 @@ export function extractTasksFromMessages(messages, sessionId) {
57
53
  task_id: generateId(),
58
54
  session_id: sessionId,
59
55
  full_prompt: fullPrompt,
60
- description,
61
56
  status: TaskStatus.COMPLETED, // Imported sessions are historical
62
57
  message_range: {
63
58
  start_index: startIndex,
@@ -17,9 +17,30 @@ import type { MessagesService, TasksService } from './claude-tool.js';
17
17
  */
18
18
  export declare function extractTokenUsage(raw: unknown): TokenUsage | undefined;
19
19
  /**
20
- * Create user message in database (from text prompt)
20
+ * Create user message in database (from text prompt).
21
+ *
22
+ * Idempotency (Alt D — "never lose a prompt"): when `options.existingMessages` is
23
+ * provided AND a user message already exists for this `taskId`, this returns the
24
+ * pre-existing row WITHOUT inserting. This lets the executor remain a safe
25
+ * fallback writer even after the daemon adopts the user-message write up-front
26
+ * inside `POST /sessions/:id/prompt`.
27
+ *
28
+ * Callers should always pass `existingMessages` (the result of
29
+ * `messagesRepo.findBySessionId(sessionId)` they already fetched to compute
30
+ * `nextIndex`) so the guard can fire. The `nextIndex` argument is still used
31
+ * for the freshly-created row's `index`; if the guard fires, callers should
32
+ * recompute their next index from the returned message:
33
+ *
34
+ * nextIndex = userMessage.index + 1;
21
35
  */
22
- export declare function createUserMessage(sessionId: SessionID, prompt: string, taskId: TaskID | undefined, nextIndex: number, messagesService: MessagesService, messageSource?: MessageSource): Promise<Message>;
36
+ export declare function createUserMessage(sessionId: SessionID, prompt: string, taskId: TaskID | undefined, nextIndex: number, messagesService: MessagesService, options?: {
37
+ messageSource?: MessageSource;
38
+ /**
39
+ * Pre-fetched messages for this session. When provided, used to detect a
40
+ * pre-existing user-message row for `taskId` and skip the insert.
41
+ */
42
+ existingMessages?: ReadonlyArray<Message>;
43
+ }): Promise<Message>;
23
44
  /**
24
45
  * Create user message from SDK content (tool results, etc.)
25
46
  */
@@ -1 +1 @@
1
- {"version":3,"file":"message-builder.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/message-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGtE;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAetE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,EAChC,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,EACF,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,EAChC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,OAAO,CAAC,OAAO,CAAC,CA8BlB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,CAAC,EACF,QAAQ,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GAAG,SAAS,EACzF,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,eAAe,EAAE,eAAe,EAChC,YAAY,CAAC,EAAE,YAAY,EAC3B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,EAC/B,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,OAAO,CAAC,CAmClB;AA0BD;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC,EACF,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
1
+ {"version":3,"file":"message-builder.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/message-builder.ts"],"names":[],"mappings":"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"}
@@ -30,9 +30,40 @@ export function extractTokenUsage(raw) {
30
30
  };
31
31
  }
32
32
  /**
33
- * Create user message in database (from text prompt)
33
+ * Create user message in database (from text prompt).
34
+ *
35
+ * Idempotency (Alt D — "never lose a prompt"): when `options.existingMessages` is
36
+ * provided AND a user message already exists for this `taskId`, this returns the
37
+ * pre-existing row WITHOUT inserting. This lets the executor remain a safe
38
+ * fallback writer even after the daemon adopts the user-message write up-front
39
+ * inside `POST /sessions/:id/prompt`.
40
+ *
41
+ * Callers should always pass `existingMessages` (the result of
42
+ * `messagesRepo.findBySessionId(sessionId)` they already fetched to compute
43
+ * `nextIndex`) so the guard can fire. The `nextIndex` argument is still used
44
+ * for the freshly-created row's `index`; if the guard fires, callers should
45
+ * recompute their next index from the returned message:
46
+ *
47
+ * nextIndex = userMessage.index + 1;
34
48
  */
35
- export async function createUserMessage(sessionId, prompt, taskId, nextIndex, messagesService, messageSource) {
49
+ export async function createUserMessage(sessionId, prompt, taskId, nextIndex, messagesService, options) {
50
+ const { messageSource, existingMessages } = options ?? {};
51
+ // Skip-if-exists guard (Alt D): if the daemon already wrote the initial
52
+ // prompt row for this task, return it instead of inserting a duplicate.
53
+ //
54
+ // Match on `role === USER` regardless of `type`, because the daemon writes
55
+ // callback prompts as `type:'system', role:'user'` (so the UI can apply the
56
+ // Agor-callback styling) while normal prompts are `type:'user', role:'user'`.
57
+ // A `type`-strict predicate misses callback rows and double-inserts the
58
+ // prompt. Tool-result rows (also role:USER) cannot exist yet at executor
59
+ // startup — this guard runs before any agent turn has produced output —
60
+ // so role-only matching is safe here.
61
+ if (taskId && existingMessages) {
62
+ const existing = existingMessages.find((m) => m.task_id === taskId && m.role === MessageRole.USER);
63
+ if (existing) {
64
+ return existing;
65
+ }
66
+ }
36
67
  const userMessage = {
37
68
  message_id: generateId(),
38
69
  session_id: sessionId,
@@ -5,7 +5,7 @@
5
5
  * Fires AFTER SDK checks settings.json, respects user's existing permissions.
6
6
  * Uses SDK's built-in permission persistence via updatedPermissions.
7
7
  */
8
- import type { SessionID, TaskID } from '@agor/core/types';
8
+ import type { PermissionMode, SessionID, TaskID } from '@agor/core/types';
9
9
  import type { MCPServerRepository, MessagesRepository, SessionMCPServerRepository, SessionRepository } from '../../../db/feathers-repositories.js';
10
10
  import type { InputRequestService } from '../../../input-requests/input-request-service.js';
11
11
  import type { PermissionService } from '../../../permissions/permission-service.js';
@@ -28,6 +28,14 @@ export declare function createCanUseToolCallback(sessionId: SessionID, taskId: T
28
28
  permissionLocks: Map<SessionID, Promise<void>>;
29
29
  mcpServerRepo: MCPServerRepository;
30
30
  sessionMCPRepo: SessionMCPServerRepository;
31
+ /**
32
+ * Effective permission mode for this query. Used to fast-path non-
33
+ * AskUserQuestion tools to `allow` when running in `bypassPermissions`,
34
+ * since the callback is now registered in bypass mode too (see
35
+ * query-builder.ts for why — AskUserQuestion's `requiresUserInteraction`
36
+ * forces the SDK to invoke `canUseTool` regardless of mode).
37
+ */
38
+ permissionMode?: PermissionMode;
31
39
  }): (toolName: string, toolInput: Record<string, unknown>, options: {
32
40
  signal: AbortSignal;
33
41
  suggestions?: Array<Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"permission-hooks.d.ts","sourceRoot":"","sources":["../../../../src/sdk-handlers/claude/permissions/permission-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAS9E,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,EAAE,kBAAkB,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,aAAa,EAAE,mBAAmB,CAAC;IACnC,cAAc,EAAE,0BAA0B,CAAC;CAC5C,IAGC,UAAU,MAAM,EAChB,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,SAAS;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,KAC7E,OAAO,CAAC;IACT,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,kBAAkB,CAAC,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,UAAU,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,EAAE,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,eAAe,CAAC;KAC/E,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAweH"}
1
+ {"version":3,"file":"permission-hooks.d.ts","sourceRoot":"","sources":["../../../../src/sdk-handlers/claude/permissions/permission-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAsB,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAS9F,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kDAAkD,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,EAAE,kBAAkB,CAAC;IACjC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,aAAa,EAAE,mBAAmB,CAAC;IACnC,cAAc,EAAE,0BAA0B,CAAC;IAC3C;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC,IAGC,UAAU,MAAM,EAChB,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,SAAS;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,KAC7E,OAAO,CAAC;IACT,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,kBAAkB,CAAC,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,UAAU,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,EAAE,SAAS,GAAG,iBAAiB,GAAG,cAAc,GAAG,eAAe,CAAC;KAC/E,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAqfH"}
@@ -138,6 +138,18 @@ export function createCanUseToolCallback(sessionId, taskId, deps) {
138
138
  };
139
139
  }
140
140
  }
141
+ // Bypass-mode fast-path: when permissionMode is `bypassPermissions`, the SDK
142
+ // would normally skip canUseTool entirely. We register the callback anyway
143
+ // so AskUserQuestion (handled above) still routes through Agor's UI — but
144
+ // every other tool should be auto-allowed without prompting, matching the
145
+ // mode's semantics. Without this, registering canUseTool in bypass mode
146
+ // would force every tool through the WebSocket permission flow.
147
+ if (deps.permissionMode === 'bypassPermissions') {
148
+ return {
149
+ behavior: 'allow',
150
+ updatedInput: toolInput,
151
+ };
152
+ }
141
153
  // Auto-approve MCP tools only if they belong to an attached MCP server
142
154
  // MCP tool names follow pattern: mcp__<server_name>__<tool_name>
143
155
  if (toolName.startsWith('mcp__')) {