agent-tower 0.7.1-beta.2 → 0.7.1-beta.4

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 (379) hide show
  1. package/dist/executors/__tests__/base.executor.test.js +2 -2
  2. package/dist/executors/__tests__/base.executor.test.js.map +1 -1
  3. package/dist/executors/__tests__/codex.executor.test.js +137 -25
  4. package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
  5. package/dist/executors/__tests__/providers.test.js +69 -2
  6. package/dist/executors/__tests__/providers.test.js.map +1 -1
  7. package/dist/executors/__tests__/stdin-prompt.executors.test.js +61 -3
  8. package/dist/executors/__tests__/stdin-prompt.executors.test.js.map +1 -1
  9. package/dist/executors/base.executor.d.ts +8 -1
  10. package/dist/executors/base.executor.d.ts.map +1 -1
  11. package/dist/executors/base.executor.js +22 -8
  12. package/dist/executors/base.executor.js.map +1 -1
  13. package/dist/executors/claude-code.executor.d.ts +2 -0
  14. package/dist/executors/claude-code.executor.d.ts.map +1 -1
  15. package/dist/executors/claude-code.executor.js +51 -41
  16. package/dist/executors/claude-code.executor.js.map +1 -1
  17. package/dist/executors/codex.executor.d.ts +3 -0
  18. package/dist/executors/codex.executor.d.ts.map +1 -1
  19. package/dist/executors/codex.executor.js +35 -1
  20. package/dist/executors/codex.executor.js.map +1 -1
  21. package/dist/executors/cursor-agent.executor.d.ts +1 -0
  22. package/dist/executors/cursor-agent.executor.d.ts.map +1 -1
  23. package/dist/executors/cursor-agent.executor.js +2 -0
  24. package/dist/executors/cursor-agent.executor.js.map +1 -1
  25. package/dist/executors/default-providers.json +45 -39
  26. package/dist/executors/gemini-cli.executor.d.ts +3 -1
  27. package/dist/executors/gemini-cli.executor.d.ts.map +1 -1
  28. package/dist/executors/gemini-cli.executor.js +18 -12
  29. package/dist/executors/gemini-cli.executor.js.map +1 -1
  30. package/dist/executors/index.d.ts +4 -0
  31. package/dist/executors/index.d.ts.map +1 -1
  32. package/dist/executors/index.js +14 -4
  33. package/dist/executors/index.js.map +1 -1
  34. package/dist/executors/providers.d.ts +4 -1
  35. package/dist/executors/providers.d.ts.map +1 -1
  36. package/dist/executors/providers.js +20 -5
  37. package/dist/executors/providers.js.map +1 -1
  38. package/dist/output/__tests__/claude-code-parser-lifecycle.test.d.ts +2 -0
  39. package/dist/output/__tests__/claude-code-parser-lifecycle.test.d.ts.map +1 -0
  40. package/dist/output/__tests__/claude-code-parser-lifecycle.test.js +84 -0
  41. package/dist/output/__tests__/claude-code-parser-lifecycle.test.js.map +1 -0
  42. package/dist/output/claude-code-parser.d.ts +14 -2
  43. package/dist/output/claude-code-parser.d.ts.map +1 -1
  44. package/dist/output/claude-code-parser.js +55 -8
  45. package/dist/output/claude-code-parser.js.map +1 -1
  46. package/dist/pipeline/__tests__/agent-pipeline.test.js +48 -1
  47. package/dist/pipeline/__tests__/agent-pipeline.test.js.map +1 -1
  48. package/dist/pipeline/agent-pipeline.d.ts +6 -1
  49. package/dist/pipeline/agent-pipeline.d.ts.map +1 -1
  50. package/dist/pipeline/agent-pipeline.js +42 -4
  51. package/dist/pipeline/agent-pipeline.js.map +1 -1
  52. package/dist/routes/__tests__/providers.test.js +287 -12
  53. package/dist/routes/__tests__/providers.test.js.map +1 -1
  54. package/dist/routes/__tests__/sessions-runtime.test.js +9 -0
  55. package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
  56. package/dist/routes/__tests__/workspaces.test.js +48 -6
  57. package/dist/routes/__tests__/workspaces.test.js.map +1 -1
  58. package/dist/routes/providers.d.ts +2 -0
  59. package/dist/routes/providers.d.ts.map +1 -1
  60. package/dist/routes/providers.js +79 -34
  61. package/dist/routes/providers.js.map +1 -1
  62. package/dist/routes/sessions.js +2 -2
  63. package/dist/routes/sessions.js.map +1 -1
  64. package/dist/runtime/__tests__/acp-agent-definitions.test.js +54 -6
  65. package/dist/runtime/__tests__/acp-agent-definitions.test.js.map +1 -1
  66. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +85 -12
  67. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
  68. package/dist/runtime/__tests__/acp-driver.test.js +38 -1
  69. package/dist/runtime/__tests__/acp-driver.test.js.map +1 -1
  70. package/dist/runtime/__tests__/claude-cli-control.test.d.ts +2 -0
  71. package/dist/runtime/__tests__/claude-cli-control.test.d.ts.map +1 -0
  72. package/dist/runtime/__tests__/claude-cli-control.test.js +147 -0
  73. package/dist/runtime/__tests__/claude-cli-control.test.js.map +1 -0
  74. package/dist/runtime/__tests__/claude-cli-driver.test.d.ts +2 -0
  75. package/dist/runtime/__tests__/claude-cli-driver.test.d.ts.map +1 -0
  76. package/dist/runtime/__tests__/claude-cli-driver.test.js +327 -0
  77. package/dist/runtime/__tests__/claude-cli-driver.test.js.map +1 -0
  78. package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +107 -2
  79. package/dist/runtime/__tests__/cli-driver-lifecycle.test.js.map +1 -1
  80. package/dist/runtime/__tests__/codex-cli-control.test.d.ts +2 -0
  81. package/dist/runtime/__tests__/codex-cli-control.test.d.ts.map +1 -0
  82. package/dist/runtime/__tests__/codex-cli-control.test.js +287 -0
  83. package/dist/runtime/__tests__/codex-cli-control.test.js.map +1 -0
  84. package/dist/runtime/__tests__/codex-cli-identity.test.d.ts +2 -0
  85. package/dist/runtime/__tests__/codex-cli-identity.test.d.ts.map +1 -0
  86. package/dist/runtime/__tests__/codex-cli-identity.test.js +166 -0
  87. package/dist/runtime/__tests__/codex-cli-identity.test.js.map +1 -0
  88. package/dist/runtime/__tests__/codex-runtime-resolution.test.js +34 -0
  89. package/dist/runtime/__tests__/codex-runtime-resolution.test.js.map +1 -1
  90. package/dist/runtime/__tests__/runtime-coordinator.test.js +74 -0
  91. package/dist/runtime/__tests__/runtime-coordinator.test.js.map +1 -1
  92. package/dist/runtime/acp/acp-driver.d.ts.map +1 -1
  93. package/dist/runtime/acp/acp-driver.js +27 -9
  94. package/dist/runtime/acp/acp-driver.js.map +1 -1
  95. package/dist/runtime/acp/agents/claude-code.d.ts.map +1 -1
  96. package/dist/runtime/acp/agents/claude-code.js +6 -11
  97. package/dist/runtime/acp/agents/claude-code.js.map +1 -1
  98. package/dist/runtime/acp/agents/codex.d.ts.map +1 -1
  99. package/dist/runtime/acp/agents/codex.js +15 -6
  100. package/dist/runtime/acp/agents/codex.js.map +1 -1
  101. package/dist/runtime/acp/agents/cursor-agent.d.ts.map +1 -1
  102. package/dist/runtime/acp/agents/cursor-agent.js +2 -1
  103. package/dist/runtime/acp/agents/cursor-agent.js.map +1 -1
  104. package/dist/runtime/acp/agents/deepseek-hermes.js +3 -3
  105. package/dist/runtime/acp/agents/deepseek-hermes.js.map +1 -1
  106. package/dist/runtime/acp/agents/gemini-cli.d.ts.map +1 -1
  107. package/dist/runtime/acp/agents/gemini-cli.js +1 -0
  108. package/dist/runtime/acp/agents/gemini-cli.js.map +1 -1
  109. package/dist/runtime/acp/agents/grok-build.d.ts.map +1 -1
  110. package/dist/runtime/acp/agents/grok-build.js +4 -1
  111. package/dist/runtime/acp/agents/grok-build.js.map +1 -1
  112. package/dist/runtime/acp/agents/kiro-cli.d.ts.map +1 -1
  113. package/dist/runtime/acp/agents/kiro-cli.js +2 -1
  114. package/dist/runtime/acp/agents/kiro-cli.js.map +1 -1
  115. package/dist/runtime/acp/agents/minion-code.js +1 -1
  116. package/dist/runtime/acp/agents/minion-code.js.map +1 -1
  117. package/dist/runtime/acp/agents/native-agent.d.ts +2 -0
  118. package/dist/runtime/acp/agents/native-agent.d.ts.map +1 -1
  119. package/dist/runtime/acp/agents/native-agent.js +12 -16
  120. package/dist/runtime/acp/agents/native-agent.js.map +1 -1
  121. package/dist/runtime/acp/agents/opencode.d.ts.map +1 -1
  122. package/dist/runtime/acp/agents/opencode.js +50 -2
  123. package/dist/runtime/acp/agents/opencode.js.map +1 -1
  124. package/dist/runtime/acp/agents/pi-coding-agent.d.ts.map +1 -1
  125. package/dist/runtime/acp/agents/pi-coding-agent.js +2 -5
  126. package/dist/runtime/acp/agents/pi-coding-agent.js.map +1 -1
  127. package/dist/runtime/acp/agents/qwen-code.d.ts.map +1 -1
  128. package/dist/runtime/acp/agents/qwen-code.js +9 -11
  129. package/dist/runtime/acp/agents/qwen-code.js.map +1 -1
  130. package/dist/runtime/acp/agents/types.d.ts +4 -2
  131. package/dist/runtime/acp/agents/types.d.ts.map +1 -1
  132. package/dist/runtime/acp/codex-cli-identity.d.ts +52 -0
  133. package/dist/runtime/acp/codex-cli-identity.d.ts.map +1 -0
  134. package/dist/runtime/acp/codex-cli-identity.js +179 -0
  135. package/dist/runtime/acp/codex-cli-identity.js.map +1 -0
  136. package/dist/runtime/acp/codex-provider-config.d.ts +15 -2
  137. package/dist/runtime/acp/codex-provider-config.d.ts.map +1 -1
  138. package/dist/runtime/acp/codex-provider-config.js +42 -5
  139. package/dist/runtime/acp/codex-provider-config.js.map +1 -1
  140. package/dist/runtime/claude-cli-control.d.ts +32 -0
  141. package/dist/runtime/claude-cli-control.d.ts.map +1 -0
  142. package/dist/runtime/claude-cli-control.js +156 -0
  143. package/dist/runtime/claude-cli-control.js.map +1 -0
  144. package/dist/runtime/cli-action-summary.d.ts +3 -0
  145. package/dist/runtime/cli-action-summary.d.ts.map +1 -0
  146. package/dist/runtime/cli-action-summary.js +13 -0
  147. package/dist/runtime/cli-action-summary.js.map +1 -0
  148. package/dist/runtime/cli-driver.d.ts.map +1 -1
  149. package/dist/runtime/cli-driver.js +119 -26
  150. package/dist/runtime/cli-driver.js.map +1 -1
  151. package/dist/runtime/cli-parser.d.ts +4 -1
  152. package/dist/runtime/cli-parser.d.ts.map +1 -1
  153. package/dist/runtime/cli-parser.js +2 -2
  154. package/dist/runtime/cli-parser.js.map +1 -1
  155. package/dist/runtime/codex-cli-control.d.ts +63 -0
  156. package/dist/runtime/codex-cli-control.d.ts.map +1 -0
  157. package/dist/runtime/codex-cli-control.js +311 -0
  158. package/dist/runtime/codex-cli-control.js.map +1 -0
  159. package/dist/runtime/codex-cli-projector.d.ts +17 -0
  160. package/dist/runtime/codex-cli-projector.d.ts.map +1 -0
  161. package/dist/runtime/codex-cli-projector.js +80 -0
  162. package/dist/runtime/codex-cli-projector.js.map +1 -0
  163. package/dist/runtime/contracts.d.ts +12 -2
  164. package/dist/runtime/contracts.d.ts.map +1 -1
  165. package/dist/runtime/runtime-coordinator.d.ts +1 -1
  166. package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
  167. package/dist/runtime/runtime-coordinator.js +40 -6
  168. package/dist/runtime/runtime-coordinator.js.map +1 -1
  169. package/dist/services/__tests__/claude-cli-capabilities.service.test.d.ts +2 -0
  170. package/dist/services/__tests__/claude-cli-capabilities.service.test.d.ts.map +1 -0
  171. package/dist/services/__tests__/claude-cli-capabilities.service.test.js +37 -0
  172. package/dist/services/__tests__/claude-cli-capabilities.service.test.js.map +1 -0
  173. package/dist/services/__tests__/codex-cli-capabilities.service.test.d.ts +2 -0
  174. package/dist/services/__tests__/codex-cli-capabilities.service.test.d.ts.map +1 -0
  175. package/dist/services/__tests__/codex-cli-capabilities.service.test.js +35 -0
  176. package/dist/services/__tests__/codex-cli-capabilities.service.test.js.map +1 -0
  177. package/dist/services/__tests__/codex-model-capabilities.service.test.js +23 -2
  178. package/dist/services/__tests__/codex-model-capabilities.service.test.js.map +1 -1
  179. package/dist/services/__tests__/execution-permission.service.test.d.ts +2 -0
  180. package/dist/services/__tests__/execution-permission.service.test.d.ts.map +1 -0
  181. package/dist/services/__tests__/execution-permission.service.test.js +111 -0
  182. package/dist/services/__tests__/execution-permission.service.test.js.map +1 -0
  183. package/dist/services/__tests__/provider-config.service.test.js +1 -0
  184. package/dist/services/__tests__/provider-config.service.test.js.map +1 -1
  185. package/dist/services/__tests__/session-manager.lifecycle.test.js +151 -3
  186. package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
  187. package/dist/services/__tests__/workspace.service.test.js +38 -0
  188. package/dist/services/__tests__/workspace.service.test.js.map +1 -1
  189. package/dist/services/claude-cli-capabilities.service.d.ts +11 -0
  190. package/dist/services/claude-cli-capabilities.service.d.ts.map +1 -0
  191. package/dist/services/claude-cli-capabilities.service.js +54 -0
  192. package/dist/services/claude-cli-capabilities.service.js.map +1 -0
  193. package/dist/services/codex-cli-capabilities.service.d.ts +12 -0
  194. package/dist/services/codex-cli-capabilities.service.d.ts.map +1 -0
  195. package/dist/services/codex-cli-capabilities.service.js +65 -0
  196. package/dist/services/codex-cli-capabilities.service.js.map +1 -0
  197. package/dist/services/codex-model-capabilities.service.d.ts.map +1 -1
  198. package/dist/services/codex-model-capabilities.service.js +12 -1
  199. package/dist/services/codex-model-capabilities.service.js.map +1 -1
  200. package/dist/services/execution-permission.service.d.ts +30 -0
  201. package/dist/services/execution-permission.service.d.ts.map +1 -0
  202. package/dist/services/execution-permission.service.js +149 -0
  203. package/dist/services/execution-permission.service.js.map +1 -0
  204. package/dist/services/provider-config.service.d.ts.map +1 -1
  205. package/dist/services/provider-config.service.js +19 -29
  206. package/dist/services/provider-config.service.js.map +1 -1
  207. package/dist/services/session-manager.d.ts +9 -7
  208. package/dist/services/session-manager.d.ts.map +1 -1
  209. package/dist/services/session-manager.js +46 -7
  210. package/dist/services/session-manager.js.map +1 -1
  211. package/dist/services/task.service.d.ts +4 -4
  212. package/dist/services/workspace.service.d.ts +13 -7
  213. package/dist/services/workspace.service.d.ts.map +1 -1
  214. package/dist/services/workspace.service.js +1 -0
  215. package/dist/services/workspace.service.js.map +1 -1
  216. package/dist/utils/cli-duplex-channel.d.ts +21 -0
  217. package/dist/utils/cli-duplex-channel.d.ts.map +1 -0
  218. package/dist/utils/cli-duplex-channel.js +200 -0
  219. package/dist/utils/cli-duplex-channel.js.map +1 -0
  220. package/dist/utils/cli-duplex-channel.test.d.ts +2 -0
  221. package/dist/utils/cli-duplex-channel.test.d.ts.map +1 -0
  222. package/dist/utils/cli-duplex-channel.test.js +191 -0
  223. package/dist/utils/cli-duplex-channel.test.js.map +1 -0
  224. package/dist/utils/index.d.ts +1 -0
  225. package/dist/utils/index.d.ts.map +1 -1
  226. package/dist/utils/index.js +1 -0
  227. package/dist/utils/index.js.map +1 -1
  228. package/dist/utils/process-launch.d.ts +3 -0
  229. package/dist/utils/process-launch.d.ts.map +1 -1
  230. package/dist/utils/process-launch.js +129 -10
  231. package/dist/utils/process-launch.js.map +1 -1
  232. package/dist/utils/process-launch.test.js +103 -0
  233. package/dist/utils/process-launch.test.js.map +1 -1
  234. package/dist/web/assets/{AgentDemoPage-B6pABvRL.js → AgentDemoPage-B__0_CPX.js} +1 -1
  235. package/dist/web/assets/{AgentEnvironmentSettingsPage-CqMfdwkM.js → AgentEnvironmentSettingsPage-uSnG5iV3.js} +1 -1
  236. package/dist/web/assets/{AgentLogo-Ntqe3_Mx.js → AgentLogo-CoAT8dNB.js} +1 -1
  237. package/dist/web/assets/ConversationPage-BOfzGTyj.js +3 -0
  238. package/dist/web/assets/CreateTaskInput-DwQsAlWX.js +1 -0
  239. package/dist/web/assets/{DemoPage-D1Ki6sJ0.js → DemoPage-CuDLCuUQ.js} +1 -1
  240. package/dist/web/assets/ExecutionPermissionSelector-Cu7Z72Yk.js +29 -0
  241. package/dist/web/assets/{GeneralSettingsPage-DoAXPabw.js → GeneralSettingsPage-CmG_TW4-.js} +1 -1
  242. package/dist/web/assets/{Icons-KJJd6C8K.js → Icons-B6q-ul89.js} +1 -1
  243. package/dist/web/assets/{LoadingPreviewPage-BqCKBvgv.js → LoadingPreviewPage-Db5WcYw_.js} +1 -1
  244. package/dist/web/assets/{McpSettingsPage-QXVD4XCW.js → McpSettingsPage-CQV1RaHW.js} +1 -1
  245. package/dist/web/assets/{MemberAvatar-kbJEoyh0.js → MemberAvatar-BQA5sE4L.js} +1 -1
  246. package/dist/web/assets/{NotificationSettingsPage-BrqSeU--.js → NotificationSettingsPage-BGKJ6wO0.js} +1 -1
  247. package/dist/web/assets/{ProfileSettingsPage-BmWgVdnG.js → ProfileSettingsPage-dTvp-LFa.js} +1 -1
  248. package/dist/web/assets/{ProjectKanbanPage-D7RJm4yg.js → ProjectKanbanPage-CHZc9WB7.js} +35 -35
  249. package/dist/web/assets/{ProjectSettingsPage-BVINN99w.js → ProjectSettingsPage-CwLXTwwe.js} +1 -1
  250. package/dist/web/assets/ProviderSettingsPage-Ced1VN2f.js +67 -0
  251. package/dist/web/assets/{SettingsMasterDetail-OF28cvPV.js → SettingsMasterDetail-CEZsOwjq.js} +1 -1
  252. package/dist/web/assets/{TeamSettingsPage-BWGm0m7s.js → TeamSettingsPage-lErIz31n.js} +1 -1
  253. package/dist/web/assets/{arc-CqFgRaZU.js → arc-CgQPLQJF.js} +1 -1
  254. package/dist/web/assets/{architectureDiagram-3BPJPVTR-C0PMdIZJ.js → architectureDiagram-3BPJPVTR-BRns2_cB.js} +1 -1
  255. package/dist/web/assets/{blockDiagram-GPEHLZMM-SqqtxqkX.js → blockDiagram-GPEHLZMM-DUIPlzPN.js} +1 -1
  256. package/dist/web/assets/{c4Diagram-AAUBKEIU-DYJXB3xL.js → c4Diagram-AAUBKEIU-BfWsGU4R.js} +1 -1
  257. package/dist/web/assets/channel-CYUMBIeW.js +1 -0
  258. package/dist/web/assets/check-C_RQ5zOf.js +1 -0
  259. package/dist/web/assets/{chevron-down-BZfpVhYr.js → chevron-down-Dz61D9cJ.js} +1 -1
  260. package/dist/web/assets/{chevron-right-D52zUyOF.js → chevron-right-q_hHAFb1.js} +1 -1
  261. package/dist/web/assets/{chevron-up-CFOy5dmW.js → chevron-up-ChWM4fJS.js} +1 -1
  262. package/dist/web/assets/{chunk-2J33WTMH-DQCbv8W_.js → chunk-2J33WTMH-DOverrRX.js} +1 -1
  263. package/dist/web/assets/{chunk-4BX2VUAB-B_68_oNW.js → chunk-4BX2VUAB-BakE7rwb.js} +1 -1
  264. package/dist/web/assets/{chunk-55IACEB6-Bb-pPIxs.js → chunk-55IACEB6-BJY_hqWJ.js} +1 -1
  265. package/dist/web/assets/{chunk-727SXJPM-CAiaySk6.js → chunk-727SXJPM-Bz_y_ixN.js} +1 -1
  266. package/dist/web/assets/{chunk-AQP2D5EJ-ChCLJ4Wv.js → chunk-AQP2D5EJ-DPrP1E5u.js} +1 -1
  267. package/dist/web/assets/{chunk-FMBD7UC4-Kz0Cc0mv.js → chunk-FMBD7UC4--yjwIi92.js} +1 -1
  268. package/dist/web/assets/{chunk-ND2GUHAM-BttoT7UR.js → chunk-ND2GUHAM-BlN7Zpnx.js} +1 -1
  269. package/dist/web/assets/{chunk-QZHKN3VN-BcVhzXXK.js → chunk-QZHKN3VN-b97Y7iON.js} +1 -1
  270. package/dist/web/assets/{circle-alert-D67xfWMs.js → circle-alert-B3BU6yxp.js} +1 -1
  271. package/dist/web/assets/classDiagram-4FO5ZUOK-KLi01tMF.js +1 -0
  272. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-KLi01tMF.js +1 -0
  273. package/dist/web/assets/{code-block-OCS4YCEC-CMA1utSp.js → code-block-OCS4YCEC-pXxp6Ipb.js} +1 -1
  274. package/dist/web/assets/{confirm-dialog-BWvZEHpu.js → confirm-dialog-CeNfH2ZR.js} +1 -1
  275. package/dist/web/assets/{cose-bilkent-S5V4N54A-B391zTey.js → cose-bilkent-S5V4N54A-BE-ASlGZ.js} +1 -1
  276. package/dist/web/assets/cssMode-B8d06lCF.js +1 -0
  277. package/dist/web/assets/{dagre-BM42HDAG-CymH_FEZ.js → dagre-BM42HDAG-lAvNJn8H.js} +1 -1
  278. package/dist/web/assets/{diagram-2AECGRRQ-DXOIiLDr.js → diagram-2AECGRRQ-DBgI60j-.js} +1 -1
  279. package/dist/web/assets/{diagram-5GNKFQAL-B9ocgjdh.js → diagram-5GNKFQAL-BqFMhpcI.js} +1 -1
  280. package/dist/web/assets/{diagram-KO2AKTUF-DLMpk9Wg.js → diagram-KO2AKTUF-8dtMJ7XC.js} +1 -1
  281. package/dist/web/assets/{diagram-LMA3HP47-BBnF83je.js → diagram-LMA3HP47-CEbAGy_U.js} +1 -1
  282. package/dist/web/assets/{diagram-OG6HWLK6-AK4FunVI.js → diagram-OG6HWLK6-BTy4Wqho.js} +1 -1
  283. package/dist/web/assets/{erDiagram-TEJ5UH35-B1mryURg.js → erDiagram-TEJ5UH35-Fe0pjB7H.js} +1 -1
  284. package/dist/web/assets/{flowDiagram-I6XJVG4X-BjIG_1l5.js → flowDiagram-I6XJVG4X-Cn5xoMyS.js} +1 -1
  285. package/dist/web/assets/{folder-picker-CaM_drIJ.js → folder-picker-DlJ9hExj.js} +1 -1
  286. package/dist/web/assets/{freemarker2-Dj1C_6Ng.js → freemarker2-WBCTYbCf.js} +2 -2
  287. package/dist/web/assets/{ganttDiagram-6RSMTGT7-DjR6lyIQ.js → ganttDiagram-6RSMTGT7-Bwf7sOJW.js} +1 -1
  288. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-BpW2L4ry.js → gitGraphDiagram-PVQCEYII-DEqHf_N3.js} +1 -1
  289. package/dist/web/assets/handlebars-aoMw8XNP.js +1 -0
  290. package/dist/web/assets/html-mP4L-gn5.js +1 -0
  291. package/dist/web/assets/htmlMode-BRkGssBX.js +1 -0
  292. package/dist/web/assets/index-BoQh7Rhc.css +1 -0
  293. package/dist/web/assets/{index-DaRxJqVy.js → index-DxE1UagD.js} +4 -4
  294. package/dist/web/assets/index-_mroLJ3-.js +122 -0
  295. package/dist/web/assets/{infoDiagram-5YYISTIA-Cu-PA_-6.js → infoDiagram-5YYISTIA-BzITBBR6.js} +1 -1
  296. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-S6Esbkdw.js → ishikawaDiagram-YF4QCWOH-Bd9MT4ne.js} +1 -1
  297. package/dist/web/assets/javascript-CzeLwCQy.js +1 -0
  298. package/dist/web/assets/{journeyDiagram-JHISSGLW-wPF9FT9V.js → journeyDiagram-JHISSGLW-CR2x5gV0.js} +1 -1
  299. package/dist/web/assets/{jsonMode-D6IoFlQF.js → jsonMode-BixD4b0P.js} +4 -4
  300. package/dist/web/assets/{kanban-definition-UN3LZRKU-C4jl9zOj.js → kanban-definition-UN3LZRKU-DZx-6dHw.js} +1 -1
  301. package/dist/web/assets/{layers-hQUUT3Gb.js → layers-DOM1D0GC.js} +1 -1
  302. package/dist/web/assets/{linear-D83xDp0H.js → linear-BBLqccsD.js} +1 -1
  303. package/dist/web/assets/liquid-DGETTZ3q.js +1 -0
  304. package/dist/web/assets/{lspLanguageFeatures-CUyibjAN.js → lspLanguageFeatures-DLBGi3go.js} +1 -1
  305. package/dist/web/assets/mdx-Co95_1jL.js +1 -0
  306. package/dist/web/assets/{mermaid-NOHMQCX5-CGCWmHha.js → mermaid-NOHMQCX5-K1Nm51AP.js} +45 -45
  307. package/dist/web/assets/{message-square-B-uYQiTq.js → message-square-eTP8tZLX.js} +1 -1
  308. package/dist/web/assets/{mindmap-definition-RKZ34NQL-D5v2uvjn.js → mindmap-definition-RKZ34NQL-BuB-92St.js} +1 -1
  309. package/dist/web/assets/{modal-D87uszzb.js → modal-CSnK65Cb.js} +1 -1
  310. package/dist/web/assets/{monaco-B25-2nEB.js → monaco-C17UmdbS.js} +3 -3
  311. package/dist/web/assets/{pencil-CY2RnQrx.js → pencil-l1-UifOH.js} +1 -1
  312. package/dist/web/assets/{pieDiagram-4H26LBE5-6wdFz_7x.js → pieDiagram-4H26LBE5--40xP_i_.js} +1 -1
  313. package/dist/web/assets/python-CQw9WtC1.js +1 -0
  314. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-C1CrGMEK.js → quadrantDiagram-W4KKPZXB-BxiOfFTG.js} +1 -1
  315. package/dist/web/assets/razor-Du_XbZEg.js +1 -0
  316. package/dist/web/assets/{requirementDiagram-4Y6WPE33-mDtZrxpp.js → requirementDiagram-4Y6WPE33-GR0Dtr4T.js} +1 -1
  317. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-hBlj0XoH.js → sankeyDiagram-5OEKKPKP-tWpKambG.js} +1 -1
  318. package/dist/web/assets/select-DB6L9-KB.js +1 -0
  319. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DsWmMm20.js → sequenceDiagram-3UESZ5HK-ByVTWC_r.js} +1 -1
  320. package/dist/web/assets/{server-qlZupTvg.js → server-CrODl9NC.js} +1 -1
  321. package/dist/web/assets/{stateDiagram-AJRCARHV-VNyX1L66.js → stateDiagram-AJRCARHV-Bd8b6zV5.js} +1 -1
  322. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-A6YN_ZNd.js +1 -0
  323. package/dist/web/assets/{switch-1pvXCcP-.js → switch-DvXJc47w.js} +1 -1
  324. package/dist/web/assets/{textarea-D9oaz-Ba.js → textarea-CSKljQWP.js} +1 -1
  325. package/dist/web/assets/{timeline-definition-PNZ67QCA-DuBxxd9E.js → timeline-definition-PNZ67QCA-BZhaE4Q8.js} +1 -1
  326. package/dist/web/assets/{trash-2-C0P8jNpJ.js → trash-2-DdOhDOCv.js} +1 -1
  327. package/dist/web/assets/{tsMode-ogL-3MSe.js → tsMode-D9Lc5Ctp.js} +2 -2
  328. package/dist/web/assets/typescript-jsG0idOk.js +1 -0
  329. package/dist/web/assets/{upload-BYgsDplu.js → upload-9nN5Lg83.js} +1 -1
  330. package/dist/web/assets/{use-profiles-BkGnmson.js → use-profiles-8YJrKR2I.js} +1 -1
  331. package/dist/web/assets/{use-projects-B4w00h5I.js → use-projects-BdSJ4zPv.js} +1 -1
  332. package/dist/web/assets/use-providers-BlqWIGOP.js +1 -0
  333. package/dist/web/assets/{useNormalizedLogs-MsDkcnRQ.js → useNormalizedLogs-B_LoDoiT.js} +1 -1
  334. package/dist/web/assets/{vennDiagram-CIIHVFJN-RbPPOLBo.js → vennDiagram-CIIHVFJN-COnwMBZG.js} +1 -1
  335. package/dist/web/assets/{wardley-L42UT6IY-DXzUbdMF.js → wardley-L42UT6IY-DnIbpfhs.js} +1 -1
  336. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-B0QXobQM.js → wardleyDiagram-YWT4CUSO-QNFL1GWo.js} +1 -1
  337. package/dist/web/assets/xml-C_Zqe3tk.js +1 -0
  338. package/dist/web/assets/{xychartDiagram-2RQKCTM6-C7bFJItM.js → xychartDiagram-2RQKCTM6-CW7FVlM3.js} +1 -1
  339. package/dist/web/assets/yaml-CETOqGaS.js +1 -0
  340. package/dist/web/index.html +2 -2
  341. package/node_modules/@agent-tower/shared/dist/execution-permission.d.ts +19 -0
  342. package/node_modules/@agent-tower/shared/dist/execution-permission.d.ts.map +1 -0
  343. package/node_modules/@agent-tower/shared/dist/execution-permission.js +53 -0
  344. package/node_modules/@agent-tower/shared/dist/execution-permission.js.map +1 -0
  345. package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
  346. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
  347. package/node_modules/@agent-tower/shared/dist/index.js +1 -0
  348. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
  349. package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts +6 -5
  350. package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts.map +1 -1
  351. package/node_modules/@agent-tower/shared/dist/provider-capabilities.js.map +1 -1
  352. package/node_modules/@agent-tower/shared/dist/types.d.ts +49 -2
  353. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  354. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  355. package/package.json +1 -1
  356. package/dist/web/assets/ConversationPage-BINGA8XL.js +0 -3
  357. package/dist/web/assets/CreateTaskInput-8bLhHYOc.js +0 -1
  358. package/dist/web/assets/ProviderSettingsPage-BlgfQMwe.js +0 -95
  359. package/dist/web/assets/channel-B8s9dqlX.js +0 -1
  360. package/dist/web/assets/check-C1zWgxFO.js +0 -1
  361. package/dist/web/assets/classDiagram-4FO5ZUOK-61bPx188.js +0 -1
  362. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-61bPx188.js +0 -1
  363. package/dist/web/assets/cssMode-CNU1q_Gl.js +0 -1
  364. package/dist/web/assets/handlebars-DNXOgRZc.js +0 -1
  365. package/dist/web/assets/html-C20FgNS-.js +0 -1
  366. package/dist/web/assets/htmlMode-CtcV1Ktd.js +0 -1
  367. package/dist/web/assets/index-dElqH2UR.css +0 -1
  368. package/dist/web/assets/index-oC5eh7mZ.js +0 -122
  369. package/dist/web/assets/javascript-CFAVZ6Tb.js +0 -1
  370. package/dist/web/assets/liquid-CuzuRJIN.js +0 -1
  371. package/dist/web/assets/mdx-C3rxTvel.js +0 -1
  372. package/dist/web/assets/python-BYGLbOzO.js +0 -1
  373. package/dist/web/assets/razor-m0U9iUAj.js +0 -1
  374. package/dist/web/assets/select-D7WkUiad.js +0 -1
  375. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-DHz3oGyD.js +0 -1
  376. package/dist/web/assets/typescript-rHoDxTY8.js +0 -1
  377. package/dist/web/assets/use-providers-B70-BYNu.js +0 -1
  378. package/dist/web/assets/xml-BqnpQrAq.js +0 -1
  379. package/dist/web/assets/yaml-mz2Zn_K2.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-pipeline.js","sourceRoot":"","sources":["../../src/pipeline/agent-pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-pipeline.js","sourceRoot":"","sources":["../../src/pipeline/agent-pipeline.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,14 @@ import * as fs from 'node:fs';
3
3
  import * as os from 'node:os';
4
4
  import * as path from 'node:path';
5
5
  import { createServer } from 'node:http';
6
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
7
  import { AgentType, CODEX_NATIVE_MODEL_PROVIDER_IDS, RuntimeType, } from '@agent-tower/shared';
8
8
  import { providerRoutes } from '../providers.js';
9
9
  import { getAllProviders, getProviderById, reloadProviders } from '../../executors/providers.js';
10
+ import { resetCodexModelCatalogForTests } from '../../services/codex-model-capabilities.service.js';
11
+ import { ExecutionPermissionService } from '../../services/execution-permission.service.js';
12
+ import * as claudeCapabilities from '../../services/claude-cli-capabilities.service.js';
13
+ import * as codexCapabilities from '../../services/codex-cli-capabilities.service.js';
10
14
  import { AGENT_SUBPROCESS_BLOCKED_ENV_KEYS, AGENT_TOWER_MCP_IDENTITY_ENV_KEYS, AGENT_TOWER_MCP_SERVICE_ENV_KEYS, } from '../../executors/execution-env.js';
11
15
  const originalDataDir = process.env.AGENT_TOWER_DATA_DIR;
12
16
  const originalPath = process.env.PATH;
@@ -54,6 +58,189 @@ async function startLoopback(handler) {
54
58
  };
55
59
  }
56
60
  describe('provider routes', () => {
61
+ it('resolves the current draft and lets an ASK-only deployment repair an imported invalid ASK Provider', async () => {
62
+ const nativeSupport = claudeCapabilities.cachedClaudeCliAskSupport;
63
+ // Host-build verification is covered separately; retain the real override check.
64
+ const refresh = vi.spyOn(claudeCapabilities, 'refreshClaudeCliAskSupport').mockResolvedValue({ supported: true });
65
+ const support = vi.spyOn(claudeCapabilities, 'cachedClaudeCliAskSupport').mockImplementation(provider => {
66
+ const actual = nativeSupport(provider);
67
+ return actual.message?.startsWith('Claude router,') ? actual : { supported: true };
68
+ });
69
+ const app = Fastify();
70
+ await app.register(providerRoutes, { prefix: '/api', executionPermissions: new ExecutionPermissionService({ getAllowedModes: () => ['ASK'] }) });
71
+ const providerId = 'imported-claude-router';
72
+ const secret = 'private-capability-sentinel';
73
+ try {
74
+ const imported = await app.inject({ method: 'POST', url: '/api/providers/import', payload: {
75
+ version: 2, kind: 'provider-backup', mode: 'full', exportedAt: new Date().toISOString(),
76
+ providers: [{ id: providerId, name: 'Imported ASK', agentType: AgentType.CLAUDE_CODE, runtimeType: RuntimeType.CLI, executionPermission: 'ASK', config: { claudeCodeRouter: true }, env: { ANTHROPIC_API_KEY: secret } }],
77
+ } });
78
+ expect(imported.statusCode).toBe(200);
79
+ const ask = (response) => response.json().CLAUDE_CODE.executionPermissionOptions.CLI.find((option) => option.mode === 'ASK');
80
+ const saved = await app.inject({ method: 'GET', url: `/api/providers/capabilities?providerId=${providerId}` });
81
+ expect(ask(saved).selectable).toBe(false);
82
+ for (const config of [{}, { claudeCodeRouter: true }, { cmd: { baseCommandOverride: 'wrapper' } }, { cmd: { additionalParams: ['--extra'] } }, {}]) {
83
+ const response = await app.inject({ method: 'POST', url: '/api/providers/capabilities', payload: { providerId, agentType: AgentType.CLAUDE_CODE, runtimeType: RuntimeType.CLI, config } });
84
+ expect(response.statusCode).toBe(200);
85
+ expect(ask(response)).toMatchObject({ selectable: Object.keys(config).length === 0, authorized: true });
86
+ expect(response.json().CLAUDE_CODE.executionPermissionOptions.CLI.find((option) => option.mode === 'FULL_ACCESS')).toMatchObject({ authorized: false, selectable: false });
87
+ expect(response.body).not.toContain(secret);
88
+ expect(response.json().CLAUDE_CODE).not.toHaveProperty('env');
89
+ expect(response.json().CLAUDE_CODE).not.toHaveProperty('config');
90
+ expect(response.json().CLAUDE_CODE).not.toHaveProperty('settings');
91
+ }
92
+ // Capability resolution is read-only; persisted invalid state remains until save.
93
+ expect(ask(await app.inject({ method: 'GET', url: `/api/providers/capabilities?providerId=${providerId}` })).selectable).toBe(false);
94
+ const fixed = await app.inject({ method: 'PUT', url: `/api/providers/${providerId}`, payload: { config: {}, executionPermission: 'ASK' } });
95
+ expect(fixed.statusCode).toBe(200);
96
+ expect(fixed.json().executionPermission).toBe('ASK');
97
+ const rejected = await app.inject({ method: 'PUT', url: `/api/providers/${providerId}`, payload: { config: { cmd: { baseCommandOverride: 'wrapper' } }, executionPermission: 'ASK' } });
98
+ expect(rejected.statusCode).toBe(400);
99
+ expect(rejected.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'CAPABILITY_UNVERIFIED' })]));
100
+ }
101
+ finally {
102
+ await app.close();
103
+ refresh.mockRestore();
104
+ support.mockRestore();
105
+ }
106
+ });
107
+ it('uses the injected allowed-mode policy for capability UI, save and test', async () => {
108
+ const app = Fastify();
109
+ const executionPermissions = new ExecutionPermissionService({ getAllowedModes: () => ['ASK', 'AUTO_SANDBOX'] });
110
+ await app.register(providerRoutes, { prefix: '/api', executionPermissions });
111
+ const capabilities = (await app.inject({ method: 'GET', url: '/api/providers/capabilities' })).json();
112
+ expect(capabilities.CODEX.executionPermissionOptions.ACP).toEqual(expect.arrayContaining([
113
+ expect.objectContaining({ mode: 'FULL_ACCESS', supported: true, authorized: false, selectable: false }),
114
+ ]));
115
+ expect(capabilities.PI_CODING_AGENT.executionPermissionOptions.ACP.every((option) => !option.selectable)).toBe(true);
116
+ for (const url of ['/api/providers', '/api/providers/test']) {
117
+ const response = await app.inject({ method: 'POST', url, payload: {
118
+ name: 'Restricted', agentType: AgentType.CODEX, runtimeType: RuntimeType.ACP, executionPermission: 'FULL_ACCESS',
119
+ } });
120
+ expect(response.statusCode).toBe(403);
121
+ expect(response.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'POLICY_MODE_DENIED' })]));
122
+ }
123
+ await app.close();
124
+ });
125
+ it('keeps the deployment boundary for Codex CLI auto-review across draft models', async () => {
126
+ const refresh = vi.spyOn(codexCapabilities, 'refreshCodexCliSupport').mockResolvedValue({ supported: true });
127
+ const support = vi.spyOn(codexCapabilities, 'cachedCodexCliSupport').mockReturnValue({ supported: true });
128
+ const app = Fastify();
129
+ await app.register(providerRoutes, { prefix: '/api', executionPermissions: new ExecutionPermissionService({ getAllowedModes: () => ['ASK', 'AUTO_SANDBOX'] }) });
130
+ try {
131
+ const option = (response) => response.json().CODEX.executionPermissionOptions.CLI.find((item) => item.mode === 'AUTO_SANDBOX');
132
+ for (const config of [{}, { model: 'gpt-6.1-sol' }]) {
133
+ const restricted = await app.inject({ method: 'POST', url: '/api/providers/capabilities', payload: { agentType: AgentType.CODEX, runtimeType: RuntimeType.CLI, config } });
134
+ expect(option(restricted)).toMatchObject({ supported: true, authorized: false, selectable: false, reasons: [{ code: 'POLICY_ENFORCEMENT_UNAVAILABLE' }] });
135
+ expect(restricted.body).not.toContain('model_providers');
136
+ for (const url of ['/api/providers', '/api/providers/test']) {
137
+ const response = await app.inject({ method: 'POST', url, payload: {
138
+ name: 'Restricted auto-review', agentType: AgentType.CODEX, runtimeType: RuntimeType.CLI,
139
+ executionPermission: 'AUTO_SANDBOX', config,
140
+ } });
141
+ expect(response.statusCode, response.body).toBe(403);
142
+ expect(response.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'POLICY_ENFORCEMENT_UNAVAILABLE' })]));
143
+ }
144
+ }
145
+ const backup = { version: 2, kind: 'provider-backup', mode: 'full', exportedAt: new Date().toISOString(), providers: [{
146
+ id: 'restricted-auto-review', name: 'Restricted auto-review', agentType: AgentType.CODEX,
147
+ runtimeType: RuntimeType.CLI, executionPermission: 'AUTO_SANDBOX', config: { model: 'gpt-6-sol' }, env: {},
148
+ }] };
149
+ for (const url of ['/api/providers/import/preview', '/api/providers/import']) {
150
+ const response = await app.inject({ method: 'POST', url, payload: backup });
151
+ expect(response.statusCode, response.body).toBe(403);
152
+ expect(response.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'POLICY_ENFORCEMENT_UNAVAILABLE' })]));
153
+ }
154
+ }
155
+ finally {
156
+ await app.close();
157
+ refresh.mockRestore();
158
+ support.mockRestore();
159
+ }
160
+ });
161
+ it.each([{}, { model: 'gpt-6.1-sol' }])('accepts Codex CLI AUTO_SANDBOX drafts, saves and tests with config %j', async (config) => {
162
+ const refresh = vi.spyOn(codexCapabilities, 'refreshCodexCliSupport').mockResolvedValue({ supported: true });
163
+ const support = vi.spyOn(codexCapabilities, 'cachedCodexCliSupport').mockReturnValue({ supported: true });
164
+ const app = await createApp();
165
+ try {
166
+ const draft = { name: 'Codex AUTO', agentType: AgentType.CODEX, runtimeType: RuntimeType.CLI,
167
+ executionPermission: 'AUTO_SANDBOX', config };
168
+ const capabilities = await app.inject({ method: 'POST', url: '/api/providers/capabilities', payload: draft });
169
+ expect(capabilities.json().CODEX.executionPermissionOptions.CLI.find((option) => option.mode === 'AUTO_SANDBOX'))
170
+ .toMatchObject({ supported: true, authorized: true, selectable: true, reasons: [] });
171
+ const created = await app.inject({ method: 'POST', url: '/api/providers', payload: draft });
172
+ expect(created.statusCode, created.body).toBe(201);
173
+ expect(created.json().executionPermission).toBe('AUTO_SANDBOX');
174
+ const saved = await app.inject({ method: 'GET', url: `/api/providers/capabilities?providerId=${created.json().id}` });
175
+ expect(saved.json().CODEX.executionPermissionOptions.CLI.find((option) => option.mode === 'AUTO_SANDBOX'))
176
+ .toMatchObject({ supported: true, authorized: true, selectable: true, reasons: [] });
177
+ const tested = await app.inject({ method: 'POST', url: '/api/providers/test', payload: draft });
178
+ expect(tested.statusCode, tested.body).toBe(200);
179
+ expect(tested.json().diagnostics ?? []).not.toEqual(expect.arrayContaining([expect.objectContaining({ field: 'executionPermission' })]));
180
+ }
181
+ finally {
182
+ await app.close();
183
+ refresh.mockRestore();
184
+ support.mockRestore();
185
+ }
186
+ });
187
+ it('rejects Codex CLI AUTO_SANDBOX advanced sandbox overrides in draft, save, test and import', async () => {
188
+ const refresh = vi.spyOn(codexCapabilities, 'refreshCodexCliSupport').mockResolvedValue({ supported: true });
189
+ const support = vi.spyOn(codexCapabilities, 'cachedCodexCliSupport').mockReturnValue({ supported: true });
190
+ const app = await createApp();
191
+ const providerId = 'codex-auto-safe';
192
+ const settings = '[sandbox_workspace_write]\nwritable_roots=["/outside"]\nnetwork_access=true';
193
+ try {
194
+ const draft = { name: 'Codex AUTO', agentType: AgentType.CODEX, runtimeType: RuntimeType.CLI,
195
+ executionPermission: 'AUTO_SANDBOX', config: { model: 'gpt-6-sol' }, settings };
196
+ const option = (response) => response.json().CODEX.executionPermissionOptions.CLI.find((item) => item.mode === 'AUTO_SANDBOX');
197
+ const capabilities = await app.inject({ method: 'POST', url: '/api/providers/capabilities', payload: { ...draft, model: 'gpt-6-sol' } });
198
+ expect(option(capabilities)).toMatchObject({ supported: false, selectable: false, reasons: [{ code: 'CONFLICT' }] });
199
+ expect(option(await app.inject({ method: 'POST', url: '/api/providers/capabilities', payload: { ...draft, model: 'gpt-6-sol', settings: '' } })))
200
+ .toMatchObject({ supported: true, selectable: true });
201
+ for (const url of ['/api/providers', '/api/providers/test']) {
202
+ const response = await app.inject({ method: 'POST', url, payload: draft });
203
+ expect(response.statusCode, response.body).toBe(url === '/api/providers/test' ? 200 : 400);
204
+ if (url === '/api/providers/test')
205
+ expect(response.json()).toMatchObject({ ok: false, stage: 'validation' });
206
+ expect(response.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'CONFLICT' })]));
207
+ }
208
+ const created = await app.inject({ method: 'POST', url: '/api/providers', payload: { ...draft, settings: '' } });
209
+ expect(created.statusCode, created.body).toBe(201);
210
+ const savedId = created.json().id;
211
+ const update = await app.inject({ method: 'PUT', url: `/api/providers/${savedId}`, payload: { settings } });
212
+ expect(update.statusCode, update.body).toBe(400);
213
+ expect(update.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'CONFLICT' })]));
214
+ const backup = { version: 2, kind: 'provider-backup', mode: 'full', exportedAt: new Date().toISOString(),
215
+ providers: [{ ...draft, id: providerId, env: {}, isDefault: false }] };
216
+ for (const url of ['/api/providers/import/preview', '/api/providers/import']) {
217
+ const response = await app.inject({ method: 'POST', url, payload: backup });
218
+ expect(response.statusCode, response.body).toBe(400);
219
+ expect(response.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'CONFLICT' })]));
220
+ }
221
+ expect(getProviderById(providerId)).toBeNull();
222
+ }
223
+ finally {
224
+ await app.close();
225
+ refresh.mockRestore();
226
+ support.mockRestore();
227
+ }
228
+ });
229
+ it('defaults fresh Providers to ASK, blocks unsupported selections and never upgrades them', async () => {
230
+ const app = Fastify();
231
+ await app.register(providerRoutes, { prefix: '/api' });
232
+ const created = await app.inject({ method: 'POST', url: '/api/providers', payload: {
233
+ name: 'New Codex ACP', agentType: AgentType.CODEX, runtimeType: RuntimeType.ACP,
234
+ } });
235
+ expect(created.statusCode).toBe(201);
236
+ expect(created.json().executionPermission).toBe('ASK');
237
+ const blocked = await app.inject({ method: 'POST', url: '/api/providers', payload: {
238
+ name: 'New Pi', agentType: AgentType.PI_CODING_AGENT, runtimeType: RuntimeType.ACP,
239
+ } });
240
+ expect(blocked.statusCode).toBe(400);
241
+ expect(blocked.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ code: 'AGENT_MODE_UNSUPPORTED' })]));
242
+ await app.close();
243
+ });
57
244
  beforeEach(() => {
58
245
  dataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-tower-provider-routes-'));
59
246
  process.env.AGENT_TOWER_DATA_DIR = dataDir;
@@ -64,6 +251,7 @@ describe('provider routes', () => {
64
251
  process.env.PATH = `${binDir}${path.delimiter}${originalPath ?? ''}`;
65
252
  });
66
253
  afterEach(() => {
254
+ resetCodexModelCatalogForTests();
67
255
  if (originalDataDir === undefined)
68
256
  delete process.env.AGENT_TOWER_DATA_DIR;
69
257
  else
@@ -107,6 +295,63 @@ describe('provider routes', () => {
107
295
  expect(response.json()[AgentType.MINION_CODE]).toBeUndefined();
108
296
  await app.close();
109
297
  });
298
+ it('offers the documented GPT-6 effort ceiling for both Codex runtimes', async () => {
299
+ const catalog = {
300
+ models: [
301
+ { slug: 'gpt-6-sol', supported_reasoning_levels: [{ effort: 'low' }] },
302
+ { slug: 'gpt-6-luna', supported_reasoning_levels: [{ effort: 'low' }, { effort: 'ultra' }] },
303
+ ],
304
+ };
305
+ fs.writeFileSync(path.join(dataDir, 'bin', 'codex'), `#!/bin/sh\nprintf '%s\\n' '${JSON.stringify(catalog)}'\n`, { mode: 0o755 });
306
+ resetCodexModelCatalogForTests();
307
+ const app = await createApp();
308
+ for (const [model, effort] of [['gpt-6-sol', 'ultra'], ['gpt-6-luna', 'max']]) {
309
+ const capabilities = await app.inject({
310
+ method: 'GET',
311
+ url: `/api/providers/capabilities?agentType=CODEX&model=${model}`,
312
+ });
313
+ expect(capabilities.statusCode).toBe(200);
314
+ const options = capabilities.json()[AgentType.CODEX].reasoningEffort.options;
315
+ expect(options).toContain(effort);
316
+ if (model === 'gpt-6-luna')
317
+ expect(options).not.toContain('ultra');
318
+ for (const runtimeType of [RuntimeType.CLI, RuntimeType.ACP]) {
319
+ const created = await app.inject({
320
+ method: 'POST',
321
+ url: '/api/providers',
322
+ payload: {
323
+ name: `${model} ${runtimeType}`,
324
+ agentType: AgentType.CODEX,
325
+ executionPermission: 'FULL_ACCESS',
326
+ runtimeType,
327
+ simplified: { model, reasoningEffort: effort },
328
+ },
329
+ });
330
+ expect(created.statusCode).toBe(201);
331
+ expect(created.json()).toMatchObject({
332
+ runtimeType,
333
+ config: { model },
334
+ settings: `model_reasoning_effort = "${effort}"`,
335
+ });
336
+ }
337
+ }
338
+ const unsupported = await app.inject({
339
+ method: 'POST',
340
+ url: '/api/providers',
341
+ payload: {
342
+ name: 'Luna Ultra',
343
+ agentType: AgentType.CODEX,
344
+ executionPermission: 'FULL_ACCESS',
345
+ runtimeType: RuntimeType.ACP,
346
+ simplified: { model: 'gpt-6-luna', reasoningEffort: 'ultra' },
347
+ },
348
+ });
349
+ expect(unsupported.statusCode).toBe(400);
350
+ expect(unsupported.json()).toMatchObject({
351
+ diagnostics: [{ field: 'reasoningEffort', code: 'INVALID_ENUM' }],
352
+ });
353
+ await app.close();
354
+ });
110
355
  it('rejects creating a hidden Minion Code provider', async () => {
111
356
  const app = await createApp();
112
357
  const response = await app.inject({
@@ -130,9 +375,10 @@ describe('provider routes', () => {
130
375
  payload: {
131
376
  name: 'Codex ACP Custom',
132
377
  agentType: AgentType.CODEX,
378
+ executionPermission: 'ASK',
133
379
  runtimeType: RuntimeType.ACP,
134
380
  env: { OPENAI_API_KEY: { action: 'replace', value: 'acp-route-secret' } },
135
- config: { permissionMode: 'ASK' },
381
+ config: {},
136
382
  simplified: {
137
383
  apiBaseUrl: 'https://proxy.example/v1',
138
384
  model: 'gpt-acp',
@@ -144,7 +390,8 @@ describe('provider routes', () => {
144
390
  expect(created.json()).toMatchObject({
145
391
  agentType: AgentType.CODEX,
146
392
  runtimeType: RuntimeType.ACP,
147
- config: { model: 'gpt-acp', permissionMode: 'ASK' },
393
+ executionPermission: 'ASK',
394
+ config: { model: 'gpt-acp' },
148
395
  redactedEnv: { OPENAI_API_KEY: { configured: true, sensitive: true } },
149
396
  });
150
397
  const providerId = created.json().id;
@@ -165,6 +412,7 @@ describe('provider routes', () => {
165
412
  {
166
413
  name: 'Claude Code ACP Custom',
167
414
  agentType: AgentType.CLAUDE_CODE,
415
+ executionPermission: 'FULL_ACCESS',
168
416
  secretKey: 'ANTHROPIC_API_KEY',
169
417
  secret: 'claude-acp-route-secret',
170
418
  apiBaseUrl: 'https://anthropic-gateway.example/v1',
@@ -199,7 +447,8 @@ describe('provider routes', () => {
199
447
  expect(created.json()).toMatchObject({
200
448
  agentType,
201
449
  runtimeType: RuntimeType.ACP,
202
- config: { model, permissionMode: 'UNRESTRICTED' },
450
+ executionPermission: 'FULL_ACCESS',
451
+ config: { model },
203
452
  redactedEnv: { [secretKey]: { configured: true, sensitive: true } },
204
453
  simplified: {
205
454
  apiBaseUrl,
@@ -210,7 +459,7 @@ describe('provider routes', () => {
210
459
  expect(getProviderById(created.json().id)?.runtimeType).toBe(RuntimeType.ACP);
211
460
  await app.close();
212
461
  });
213
- it('migrates the legacy ACP AUTO_APPROVE value to UNRESTRICTED', async () => {
462
+ it('migrates the legacy ACP AUTO_APPROVE value to FULL_ACCESS', async () => {
214
463
  const app = await createApp();
215
464
  const created = await app.inject({
216
465
  method: 'POST',
@@ -224,11 +473,12 @@ describe('provider routes', () => {
224
473
  });
225
474
  expect(created.statusCode).toBe(201);
226
475
  expect(created.json()).toMatchObject({
227
- config: { permissionMode: 'UNRESTRICTED' },
476
+ executionPermission: 'FULL_ACCESS',
477
+ config: {},
228
478
  });
229
479
  await app.close();
230
480
  });
231
- it('migrates legacy Agent permission flags without overriding an explicit ASK mode', async () => {
481
+ it('migrates dangerous flags and rejects conflicting legacy ASK fields', async () => {
232
482
  const app = await createApp();
233
483
  const legacyFlag = await app.inject({
234
484
  method: 'POST',
@@ -241,7 +491,8 @@ describe('provider routes', () => {
241
491
  },
242
492
  });
243
493
  expect(legacyFlag.statusCode).toBe(201);
244
- expect(legacyFlag.json().config).toEqual({ permissionMode: 'UNRESTRICTED' });
494
+ expect(legacyFlag.json().config).toEqual({});
495
+ expect(legacyFlag.json().executionPermission).toBe('FULL_ACCESS');
245
496
  const explicitAsk = await app.inject({
246
497
  method: 'POST',
247
498
  url: '/api/providers',
@@ -252,8 +503,8 @@ describe('provider routes', () => {
252
503
  config: { permissionMode: 'ASK', yolo: true },
253
504
  },
254
505
  });
255
- expect(explicitAsk.statusCode).toBe(201);
256
- expect(explicitAsk.json().config).toEqual({ permissionMode: 'ASK' });
506
+ expect(explicitAsk.statusCode).toBe(400);
507
+ expect(explicitAsk.json().diagnostics).toEqual(expect.arrayContaining([expect.objectContaining({ field: 'executionPermission', code: 'CONFLICT' })]));
257
508
  await app.close();
258
509
  });
259
510
  it('rejects unsupported Runtime choices and invalid ACP permission values', async () => {
@@ -293,6 +544,7 @@ describe('provider routes', () => {
293
544
  const payload = {
294
545
  name: `Invalid URL ${index}`,
295
546
  agentType: AgentType.CODEX,
547
+ executionPermission: 'FULL_ACCESS',
296
548
  simplified: { apiBaseUrl },
297
549
  };
298
550
  const created = await app.inject({ method: 'POST', url: '/api/providers', payload });
@@ -315,6 +567,7 @@ describe('provider routes', () => {
315
567
  payload: {
316
568
  name: `Valid URL ${index}`,
317
569
  agentType: AgentType.CODEX,
570
+ executionPermission: 'FULL_ACCESS',
318
571
  simplified: { apiBaseUrl },
319
572
  },
320
573
  });
@@ -330,6 +583,7 @@ describe('provider routes', () => {
330
583
  payload: {
331
584
  name: 'Gemini Custom',
332
585
  agentType: AgentType.GEMINI_CLI,
586
+ executionPermission: 'FULL_ACCESS',
333
587
  env: { GEMINI_API_KEY: { action: 'replace', value: 'gemini-route-secret' } },
334
588
  simplified: { model: 'gemini-test' },
335
589
  },
@@ -377,6 +631,7 @@ describe('provider routes', () => {
377
631
  payload: {
378
632
  name: 'Codex Proxy',
379
633
  agentType: AgentType.CODEX,
634
+ executionPermission: 'FULL_ACCESS',
380
635
  env: { OPENAI_API_KEY: { action: 'replace', value: secret } },
381
636
  simplified: {
382
637
  apiBaseUrl: 'https://proxy.example/v1',
@@ -420,6 +675,7 @@ describe('provider routes', () => {
420
675
  payload: {
421
676
  name: 'Codex Dynamic Credential',
422
677
  agentType: AgentType.CODEX,
678
+ executionPermission: 'FULL_ACCESS',
423
679
  env: { PROXY_ACCESS: { action: 'replace', value: secret } },
424
680
  settings: [
425
681
  'model_provider = "proxy"',
@@ -462,6 +718,7 @@ describe('provider routes', () => {
462
718
  id: providerId,
463
719
  name: 'Imported Spaced Credential',
464
720
  agentType: AgentType.CODEX,
721
+ executionPermission: 'FULL_ACCESS',
465
722
  env: Object.fromEntries([
466
723
  ...aliasKeys.map((key, index) => [key, importedSentinels[index]]),
467
724
  ['UNKNOWN_ENV', unknownSentinel],
@@ -559,6 +816,7 @@ describe('provider routes', () => {
559
816
  const payload = {
560
817
  name: 'Codex Protected Credential',
561
818
  agentType: AgentType.CODEX,
819
+ executionPermission: 'FULL_ACCESS',
562
820
  env: { [envKey]: { action: 'replace', value: secret } },
563
821
  settings: [
564
822
  'model_provider = "proxy"',
@@ -597,6 +855,7 @@ describe('provider routes', () => {
597
855
  payload: {
598
856
  name: 'Unsaved Claude',
599
857
  agentType: AgentType.CLAUDE_CODE,
858
+ executionPermission: 'FULL_ACCESS',
600
859
  env: { ANTHROPIC_API_KEY: { action: 'replace', value: secret } },
601
860
  config: {},
602
861
  settings: '{"env":{"ANTHROPIC_API_KEY":"settings-secret"}}',
@@ -613,6 +872,7 @@ describe('provider routes', () => {
613
872
  const payload = {
614
873
  name: `Native ${modelProviderId}`,
615
874
  agentType: AgentType.CODEX,
875
+ executionPermission: 'FULL_ACCESS',
616
876
  env: { NATIVE_PROVIDER_OPTION: { action: 'replace', value: 'native-value' } },
617
877
  settings: `model_provider = "${modelProviderId}"\n`,
618
878
  };
@@ -651,6 +911,7 @@ describe('provider routes', () => {
651
911
  payload: {
652
912
  name: 'Unsaved Codex A',
653
913
  agentType: AgentType.CODEX,
914
+ executionPermission: 'FULL_ACCESS',
654
915
  env: { OPENAI_API_KEY: { action: 'replace', value: expectedKey } },
655
916
  simplified: { apiBaseUrl: `${loopback.baseUrl}/draft-a` },
656
917
  },
@@ -664,6 +925,7 @@ describe('provider routes', () => {
664
925
  payload: {
665
926
  name: 'Unsaved Codex B',
666
927
  agentType: AgentType.CODEX,
928
+ executionPermission: 'FULL_ACCESS',
667
929
  env: { OPENAI_API_KEY: { action: 'replace', value: expectedKey } },
668
930
  simplified: { apiBaseUrl: `${loopback.baseUrl}/draft-b` },
669
931
  },
@@ -685,6 +947,7 @@ describe('provider routes', () => {
685
947
  {
686
948
  name: 'Claude ACP gateway',
687
949
  agentType: AgentType.CLAUDE_CODE,
950
+ executionPermission: 'FULL_ACCESS',
688
951
  secretKey: 'ANTHROPIC_API_KEY',
689
952
  expectedHeader: 'x-api-key',
690
953
  },
@@ -749,6 +1012,7 @@ describe('provider routes', () => {
749
1012
  payload: {
750
1013
  name: 'Codex without CLI',
751
1014
  agentType: AgentType.CODEX,
1015
+ executionPermission: 'FULL_ACCESS',
752
1016
  simplified: { apiBaseUrl: loopback.baseUrl },
753
1017
  },
754
1018
  });
@@ -791,6 +1055,7 @@ describe('provider routes', () => {
791
1055
  payload: {
792
1056
  name: 'Saved Codex',
793
1057
  agentType: AgentType.CODEX,
1058
+ executionPermission: 'FULL_ACCESS',
794
1059
  env: { OPENAI_API_KEY: { action: 'replace', value: expectedKey } },
795
1060
  simplified: { apiBaseUrl: `${loopback.baseUrl}/saved-a` },
796
1061
  },
@@ -803,6 +1068,7 @@ describe('provider routes', () => {
803
1068
  providerId,
804
1069
  name: 'Saved Codex',
805
1070
  agentType: AgentType.CODEX,
1071
+ executionPermission: 'FULL_ACCESS',
806
1072
  env: { OPENAI_API_KEY: { action: 'keep' } },
807
1073
  },
808
1074
  });
@@ -814,6 +1080,7 @@ describe('provider routes', () => {
814
1080
  providerId,
815
1081
  name: 'Saved Codex',
816
1082
  agentType: AgentType.CODEX,
1083
+ executionPermission: 'FULL_ACCESS',
817
1084
  env: { OPENAI_API_KEY: { action: 'keep' } },
818
1085
  simplified: { apiBaseUrl: `${loopback.baseUrl}/saved-b` },
819
1086
  },
@@ -827,6 +1094,7 @@ describe('provider routes', () => {
827
1094
  providerId,
828
1095
  name: 'Saved Codex',
829
1096
  agentType: AgentType.CODEX,
1097
+ executionPermission: 'FULL_ACCESS',
830
1098
  env: { OPENAI_API_KEY: { action: 'replace', value: expectedKey } },
831
1099
  },
832
1100
  });
@@ -865,6 +1133,7 @@ describe('provider routes', () => {
865
1133
  payload: {
866
1134
  name: `Codex ${status}`,
867
1135
  agentType: AgentType.CODEX,
1136
+ executionPermission: 'FULL_ACCESS',
868
1137
  env: { OPENAI_API_KEY: { action: 'replace', value: secret } },
869
1138
  simplified: { apiBaseUrl: loopback.baseUrl },
870
1139
  },
@@ -887,6 +1156,7 @@ describe('provider routes', () => {
887
1156
  payload: {
888
1157
  name: 'Codex timeout',
889
1158
  agentType: AgentType.CODEX,
1159
+ executionPermission: 'FULL_ACCESS',
890
1160
  simplified: { apiBaseUrl: loopback.baseUrl },
891
1161
  },
892
1162
  });
@@ -906,6 +1176,7 @@ describe('provider routes', () => {
906
1176
  payload: {
907
1177
  name: 'Broken Codex',
908
1178
  agentType: AgentType.CODEX,
1179
+ executionPermission: 'FULL_ACCESS',
909
1180
  settings: `api_key = "${secret}"\nbroken = [toml`,
910
1181
  },
911
1182
  });
@@ -981,6 +1252,7 @@ describe('provider routes', () => {
981
1252
  payload: {
982
1253
  name: 'Codex HTTP transport',
983
1254
  agentType: AgentType.CODEX,
1255
+ executionPermission: 'FULL_ACCESS',
984
1256
  config: { disableResponsesWebsocket: true, unknown: { keep: true } },
985
1257
  },
986
1258
  });
@@ -1003,6 +1275,7 @@ describe('provider routes', () => {
1003
1275
  const payload = {
1004
1276
  name: 'Codex reserved alias collision',
1005
1277
  agentType: AgentType.CODEX,
1278
+ executionPermission: 'FULL_ACCESS',
1006
1279
  config: { disableResponsesWebsocket: true },
1007
1280
  settings: [
1008
1281
  'model_provider = "openai"',
@@ -1049,6 +1322,7 @@ describe('provider routes', () => {
1049
1322
  id: providerId,
1050
1323
  name: 'Invalid imported permission',
1051
1324
  agentType: AgentType.CODEX,
1325
+ executionPermission: 'FULL_ACCESS',
1052
1326
  env: { OPENAI_API_KEY: secret },
1053
1327
  config: { dangerouslyBypassApprovalsAndSandbox: invalidValue },
1054
1328
  isDefault: false,
@@ -1095,7 +1369,7 @@ describe('provider routes', () => {
1095
1369
  payload: backup,
1096
1370
  });
1097
1371
  expect(preview.statusCode).toBe(200);
1098
- expect(preview.json().items.map((item) => (item.incoming.config.dangerouslyBypassApprovalsAndSandbox))).toEqual([true, false]);
1372
+ expect(preview.json().items.map((item) => (item.incoming.executionPermission))).toEqual(['FULL_ACCESS', 'ASK']);
1099
1373
  const imported = await app.inject({
1100
1374
  method: 'POST',
1101
1375
  url: '/api/providers/import',
@@ -1103,7 +1377,7 @@ describe('provider routes', () => {
1103
1377
  });
1104
1378
  expect(imported.statusCode).toBe(200);
1105
1379
  reloadProviders();
1106
- expect(backup.providers.map(item => (getProviderById(item.id)?.config.dangerouslyBypassApprovalsAndSandbox))).toEqual([true, false]);
1380
+ expect(backup.providers.map(item => (getProviderById(item.id)?.executionPermission))).toEqual(['FULL_ACCESS', 'ASK']);
1107
1381
  for (const response of [preview, imported]) {
1108
1382
  for (const secret of secrets)
1109
1383
  expect(response.body).not.toContain(secret);
@@ -1128,6 +1402,7 @@ describe('provider routes', () => {
1128
1402
  id: 'structured-secret-provider',
1129
1403
  name: 'Structured Secret Provider',
1130
1404
  agentType: AgentType.CLAUDE_CODE,
1405
+ executionPermission: 'FULL_ACCESS',
1131
1406
  env: { ANTHROPIC_API_KEY: secrets[0] },
1132
1407
  config: { auth_token: { nested: secrets[1] } },
1133
1408
  settings: JSON.stringify({