agent-tower 0.7.1-beta.3 → 0.7.1
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.
- package/dist/executors/__tests__/base.executor.test.js +2 -2
- package/dist/executors/__tests__/base.executor.test.js.map +1 -1
- package/dist/executors/__tests__/codex.executor.test.js +137 -25
- package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
- package/dist/executors/__tests__/providers.test.js +69 -2
- package/dist/executors/__tests__/providers.test.js.map +1 -1
- package/dist/executors/__tests__/stdin-prompt.executors.test.js +61 -3
- package/dist/executors/__tests__/stdin-prompt.executors.test.js.map +1 -1
- package/dist/executors/base.executor.d.ts +8 -1
- package/dist/executors/base.executor.d.ts.map +1 -1
- package/dist/executors/base.executor.js +22 -8
- package/dist/executors/base.executor.js.map +1 -1
- package/dist/executors/claude-code.executor.d.ts +2 -0
- package/dist/executors/claude-code.executor.d.ts.map +1 -1
- package/dist/executors/claude-code.executor.js +51 -41
- package/dist/executors/claude-code.executor.js.map +1 -1
- package/dist/executors/codex.executor.d.ts +3 -0
- package/dist/executors/codex.executor.d.ts.map +1 -1
- package/dist/executors/codex.executor.js +35 -1
- package/dist/executors/codex.executor.js.map +1 -1
- package/dist/executors/cursor-agent.executor.d.ts +1 -0
- package/dist/executors/cursor-agent.executor.d.ts.map +1 -1
- package/dist/executors/cursor-agent.executor.js +2 -0
- package/dist/executors/cursor-agent.executor.js.map +1 -1
- package/dist/executors/default-providers.json +45 -39
- package/dist/executors/gemini-cli.executor.d.ts +3 -1
- package/dist/executors/gemini-cli.executor.d.ts.map +1 -1
- package/dist/executors/gemini-cli.executor.js +18 -12
- package/dist/executors/gemini-cli.executor.js.map +1 -1
- package/dist/executors/index.d.ts +4 -0
- package/dist/executors/index.d.ts.map +1 -1
- package/dist/executors/index.js +14 -4
- package/dist/executors/index.js.map +1 -1
- package/dist/executors/providers.d.ts +4 -1
- package/dist/executors/providers.d.ts.map +1 -1
- package/dist/executors/providers.js +20 -5
- package/dist/executors/providers.js.map +1 -1
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.d.ts +2 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.d.ts.map +1 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.js +84 -0
- package/dist/output/__tests__/claude-code-parser-lifecycle.test.js.map +1 -0
- package/dist/output/claude-code-parser.d.ts +14 -2
- package/dist/output/claude-code-parser.d.ts.map +1 -1
- package/dist/output/claude-code-parser.js +55 -8
- package/dist/output/claude-code-parser.js.map +1 -1
- package/dist/pipeline/__tests__/agent-pipeline.test.js +48 -1
- package/dist/pipeline/__tests__/agent-pipeline.test.js.map +1 -1
- package/dist/pipeline/agent-pipeline.d.ts +6 -1
- package/dist/pipeline/agent-pipeline.d.ts.map +1 -1
- package/dist/pipeline/agent-pipeline.js +42 -4
- package/dist/pipeline/agent-pipeline.js.map +1 -1
- package/dist/routes/__tests__/providers.test.js +287 -12
- package/dist/routes/__tests__/providers.test.js.map +1 -1
- package/dist/routes/__tests__/sessions-runtime.test.js +9 -0
- package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
- package/dist/routes/providers.d.ts +2 -0
- package/dist/routes/providers.d.ts.map +1 -1
- package/dist/routes/providers.js +79 -34
- package/dist/routes/providers.js.map +1 -1
- package/dist/routes/sessions.js +2 -2
- package/dist/routes/sessions.js.map +1 -1
- package/dist/runtime/__tests__/acp-agent-definitions.test.js +54 -6
- package/dist/runtime/__tests__/acp-agent-definitions.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +85 -12
- package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
- package/dist/runtime/__tests__/acp-driver.test.js +38 -1
- package/dist/runtime/__tests__/acp-driver.test.js.map +1 -1
- package/dist/runtime/__tests__/claude-cli-control.test.d.ts +2 -0
- package/dist/runtime/__tests__/claude-cli-control.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/claude-cli-control.test.js +147 -0
- package/dist/runtime/__tests__/claude-cli-control.test.js.map +1 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.d.ts +2 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.js +327 -0
- package/dist/runtime/__tests__/claude-cli-driver.test.js.map +1 -0
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +107 -2
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js.map +1 -1
- package/dist/runtime/__tests__/codex-cli-control.test.d.ts +2 -0
- package/dist/runtime/__tests__/codex-cli-control.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/codex-cli-control.test.js +287 -0
- package/dist/runtime/__tests__/codex-cli-control.test.js.map +1 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.d.ts +2 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.js +166 -0
- package/dist/runtime/__tests__/codex-cli-identity.test.js.map +1 -0
- package/dist/runtime/__tests__/codex-runtime-resolution.test.js +32 -0
- package/dist/runtime/__tests__/codex-runtime-resolution.test.js.map +1 -1
- package/dist/runtime/__tests__/runtime-coordinator.test.js +74 -0
- package/dist/runtime/__tests__/runtime-coordinator.test.js.map +1 -1
- package/dist/runtime/acp/acp-driver.d.ts.map +1 -1
- package/dist/runtime/acp/acp-driver.js +27 -9
- package/dist/runtime/acp/acp-driver.js.map +1 -1
- package/dist/runtime/acp/agents/claude-code.d.ts.map +1 -1
- package/dist/runtime/acp/agents/claude-code.js +6 -11
- package/dist/runtime/acp/agents/claude-code.js.map +1 -1
- package/dist/runtime/acp/agents/codex.d.ts.map +1 -1
- package/dist/runtime/acp/agents/codex.js +15 -6
- package/dist/runtime/acp/agents/codex.js.map +1 -1
- package/dist/runtime/acp/agents/cursor-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/cursor-agent.js +2 -1
- package/dist/runtime/acp/agents/cursor-agent.js.map +1 -1
- package/dist/runtime/acp/agents/deepseek-hermes.js +3 -3
- package/dist/runtime/acp/agents/deepseek-hermes.js.map +1 -1
- package/dist/runtime/acp/agents/gemini-cli.d.ts.map +1 -1
- package/dist/runtime/acp/agents/gemini-cli.js +1 -0
- package/dist/runtime/acp/agents/gemini-cli.js.map +1 -1
- package/dist/runtime/acp/agents/grok-build.d.ts.map +1 -1
- package/dist/runtime/acp/agents/grok-build.js +4 -1
- package/dist/runtime/acp/agents/grok-build.js.map +1 -1
- package/dist/runtime/acp/agents/kiro-cli.d.ts.map +1 -1
- package/dist/runtime/acp/agents/kiro-cli.js +2 -1
- package/dist/runtime/acp/agents/kiro-cli.js.map +1 -1
- package/dist/runtime/acp/agents/minion-code.js +1 -1
- package/dist/runtime/acp/agents/minion-code.js.map +1 -1
- package/dist/runtime/acp/agents/native-agent.d.ts +2 -0
- package/dist/runtime/acp/agents/native-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/native-agent.js +12 -16
- package/dist/runtime/acp/agents/native-agent.js.map +1 -1
- package/dist/runtime/acp/agents/opencode.d.ts.map +1 -1
- package/dist/runtime/acp/agents/opencode.js +50 -2
- package/dist/runtime/acp/agents/opencode.js.map +1 -1
- package/dist/runtime/acp/agents/pi-coding-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/pi-coding-agent.js +2 -5
- package/dist/runtime/acp/agents/pi-coding-agent.js.map +1 -1
- package/dist/runtime/acp/agents/qwen-code.d.ts.map +1 -1
- package/dist/runtime/acp/agents/qwen-code.js +9 -11
- package/dist/runtime/acp/agents/qwen-code.js.map +1 -1
- package/dist/runtime/acp/agents/types.d.ts +4 -2
- package/dist/runtime/acp/agents/types.d.ts.map +1 -1
- package/dist/runtime/acp/codex-cli-identity.d.ts +52 -0
- package/dist/runtime/acp/codex-cli-identity.d.ts.map +1 -0
- package/dist/runtime/acp/codex-cli-identity.js +179 -0
- package/dist/runtime/acp/codex-cli-identity.js.map +1 -0
- package/dist/runtime/acp/codex-provider-config.d.ts +15 -2
- package/dist/runtime/acp/codex-provider-config.d.ts.map +1 -1
- package/dist/runtime/acp/codex-provider-config.js +42 -5
- package/dist/runtime/acp/codex-provider-config.js.map +1 -1
- package/dist/runtime/claude-cli-control.d.ts +32 -0
- package/dist/runtime/claude-cli-control.d.ts.map +1 -0
- package/dist/runtime/claude-cli-control.js +156 -0
- package/dist/runtime/claude-cli-control.js.map +1 -0
- package/dist/runtime/cli-action-summary.d.ts +3 -0
- package/dist/runtime/cli-action-summary.d.ts.map +1 -0
- package/dist/runtime/cli-action-summary.js +13 -0
- package/dist/runtime/cli-action-summary.js.map +1 -0
- package/dist/runtime/cli-driver.d.ts.map +1 -1
- package/dist/runtime/cli-driver.js +119 -26
- package/dist/runtime/cli-driver.js.map +1 -1
- package/dist/runtime/cli-parser.d.ts +4 -1
- package/dist/runtime/cli-parser.d.ts.map +1 -1
- package/dist/runtime/cli-parser.js +2 -2
- package/dist/runtime/cli-parser.js.map +1 -1
- package/dist/runtime/codex-cli-control.d.ts +63 -0
- package/dist/runtime/codex-cli-control.d.ts.map +1 -0
- package/dist/runtime/codex-cli-control.js +311 -0
- package/dist/runtime/codex-cli-control.js.map +1 -0
- package/dist/runtime/codex-cli-projector.d.ts +17 -0
- package/dist/runtime/codex-cli-projector.d.ts.map +1 -0
- package/dist/runtime/codex-cli-projector.js +80 -0
- package/dist/runtime/codex-cli-projector.js.map +1 -0
- package/dist/runtime/contracts.d.ts +12 -2
- package/dist/runtime/contracts.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.d.ts +1 -1
- package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
- package/dist/runtime/runtime-coordinator.js +40 -6
- package/dist/runtime/runtime-coordinator.js.map +1 -1
- package/dist/services/__tests__/claude-cli-capabilities.service.test.d.ts +2 -0
- package/dist/services/__tests__/claude-cli-capabilities.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/claude-cli-capabilities.service.test.js +37 -0
- package/dist/services/__tests__/claude-cli-capabilities.service.test.js.map +1 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.d.ts +2 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.js +35 -0
- package/dist/services/__tests__/codex-cli-capabilities.service.test.js.map +1 -0
- package/dist/services/__tests__/codex-model-capabilities.service.test.js +23 -2
- package/dist/services/__tests__/codex-model-capabilities.service.test.js.map +1 -1
- package/dist/services/__tests__/execution-permission.service.test.d.ts +2 -0
- package/dist/services/__tests__/execution-permission.service.test.d.ts.map +1 -0
- package/dist/services/__tests__/execution-permission.service.test.js +111 -0
- package/dist/services/__tests__/execution-permission.service.test.js.map +1 -0
- package/dist/services/__tests__/provider-config.service.test.js +1 -0
- package/dist/services/__tests__/provider-config.service.test.js.map +1 -1
- package/dist/services/__tests__/session-manager.lifecycle.test.js +151 -3
- package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
- package/dist/services/claude-cli-capabilities.service.d.ts +11 -0
- package/dist/services/claude-cli-capabilities.service.d.ts.map +1 -0
- package/dist/services/claude-cli-capabilities.service.js +54 -0
- package/dist/services/claude-cli-capabilities.service.js.map +1 -0
- package/dist/services/codex-cli-capabilities.service.d.ts +12 -0
- package/dist/services/codex-cli-capabilities.service.d.ts.map +1 -0
- package/dist/services/codex-cli-capabilities.service.js +65 -0
- package/dist/services/codex-cli-capabilities.service.js.map +1 -0
- package/dist/services/codex-model-capabilities.service.d.ts.map +1 -1
- package/dist/services/codex-model-capabilities.service.js +12 -1
- package/dist/services/codex-model-capabilities.service.js.map +1 -1
- package/dist/services/execution-permission.service.d.ts +30 -0
- package/dist/services/execution-permission.service.d.ts.map +1 -0
- package/dist/services/execution-permission.service.js +149 -0
- package/dist/services/execution-permission.service.js.map +1 -0
- package/dist/services/provider-config.service.d.ts.map +1 -1
- package/dist/services/provider-config.service.js +19 -29
- package/dist/services/provider-config.service.js.map +1 -1
- package/dist/services/session-manager.d.ts +9 -7
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +46 -7
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/task.service.d.ts +4 -4
- package/dist/services/workspace.service.d.ts +7 -7
- package/dist/utils/cli-duplex-channel.d.ts +21 -0
- package/dist/utils/cli-duplex-channel.d.ts.map +1 -0
- package/dist/utils/cli-duplex-channel.js +200 -0
- package/dist/utils/cli-duplex-channel.js.map +1 -0
- package/dist/utils/cli-duplex-channel.test.d.ts +2 -0
- package/dist/utils/cli-duplex-channel.test.d.ts.map +1 -0
- package/dist/utils/cli-duplex-channel.test.js +191 -0
- package/dist/utils/cli-duplex-channel.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/process-launch.d.ts +3 -0
- package/dist/utils/process-launch.d.ts.map +1 -1
- package/dist/utils/process-launch.js +129 -10
- package/dist/utils/process-launch.js.map +1 -1
- package/dist/utils/process-launch.test.js +103 -0
- package/dist/utils/process-launch.test.js.map +1 -1
- package/dist/web/assets/{AgentDemoPage-B6pABvRL.js → AgentDemoPage-Gr8q6VxC.js} +1 -1
- package/dist/web/assets/{AgentEnvironmentSettingsPage-CqMfdwkM.js → AgentEnvironmentSettingsPage-b0XzUzna.js} +1 -1
- package/dist/web/assets/{AgentLogo-Ntqe3_Mx.js → AgentLogo-q8Chady2.js} +1 -1
- package/dist/web/assets/ConversationPage-DQRA8WuD.js +3 -0
- package/dist/web/assets/CreateTaskInput-Dr6Lvllw.js +1 -0
- package/dist/web/assets/{DemoPage-D1Ki6sJ0.js → DemoPage-DaDC_MIJ.js} +1 -1
- package/dist/web/assets/ExecutionPermissionSelector-DglILGVC.js +29 -0
- package/dist/web/assets/{GeneralSettingsPage-DoAXPabw.js → GeneralSettingsPage-BKRf-usO.js} +1 -1
- package/dist/web/assets/{Icons-KJJd6C8K.js → Icons-7lThaqQv.js} +1 -1
- package/dist/web/assets/{LoadingPreviewPage-BqCKBvgv.js → LoadingPreviewPage-BHAQCQDA.js} +1 -1
- package/dist/web/assets/{McpSettingsPage-QXVD4XCW.js → McpSettingsPage-CVOEPwCv.js} +1 -1
- package/dist/web/assets/{MemberAvatar-kbJEoyh0.js → MemberAvatar-DUXHTIXf.js} +1 -1
- package/dist/web/assets/{NotificationSettingsPage-BrqSeU--.js → NotificationSettingsPage-DBe1YCNN.js} +1 -1
- package/dist/web/assets/{ProfileSettingsPage-BmWgVdnG.js → ProfileSettingsPage-DwziCseV.js} +1 -1
- package/dist/web/assets/ProjectKanbanPage-Dcz8KXWU.js +86 -0
- package/dist/web/assets/{ProjectSettingsPage-BVINN99w.js → ProjectSettingsPage-hzSrj79M.js} +1 -1
- package/dist/web/assets/ProviderSettingsPage-CC3zkdf6.js +67 -0
- package/dist/web/assets/{SettingsMasterDetail-OF28cvPV.js → SettingsMasterDetail-D5lNH2f6.js} +1 -1
- package/dist/web/assets/{TeamSettingsPage-BWGm0m7s.js → TeamSettingsPage-Cdbvh2ne.js} +1 -1
- package/dist/web/assets/{arc-CqFgRaZU.js → arc-d2D24uRQ.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-C0PMdIZJ.js → architectureDiagram-3BPJPVTR-C_p9_AH2.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-SqqtxqkX.js → blockDiagram-GPEHLZMM-CKsR1Tax.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-DYJXB3xL.js → c4Diagram-AAUBKEIU-BBUKt2FW.js} +1 -1
- package/dist/web/assets/channel-D0hF47LU.js +1 -0
- package/dist/web/assets/check-BqhuHtHP.js +1 -0
- package/dist/web/assets/{chevron-down-BZfpVhYr.js → chevron-down-Bw_76CB_.js} +1 -1
- package/dist/web/assets/{chevron-right-D52zUyOF.js → chevron-right-DbcFf_Dw.js} +1 -1
- package/dist/web/assets/{chevron-up-CFOy5dmW.js → chevron-up-x1n3MhC-.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-DQCbv8W_.js → chunk-2J33WTMH-BcGNhDoU.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-B_68_oNW.js → chunk-4BX2VUAB-9dL7TVjW.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-Bb-pPIxs.js → chunk-55IACEB6-CzJzh0tH.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-CAiaySk6.js → chunk-727SXJPM-Bp5EOgoG.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-ChCLJ4Wv.js → chunk-AQP2D5EJ-BaLnh9ac.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-Kz0Cc0mv.js → chunk-FMBD7UC4-BcbzC8r4.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-BttoT7UR.js → chunk-ND2GUHAM-DkT5Stbd.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-BcVhzXXK.js → chunk-QZHKN3VN-DszScpAV.js} +1 -1
- package/dist/web/assets/{circle-alert-D67xfWMs.js → circle-alert-ChWS5BPS.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-ulXJsBKw.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-ulXJsBKw.js +1 -0
- package/dist/web/assets/{code-block-OCS4YCEC-CMA1utSp.js → code-block-OCS4YCEC-G8tEtSdL.js} +1 -1
- package/dist/web/assets/{confirm-dialog-BWvZEHpu.js → confirm-dialog-0vHzUzvI.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-B391zTey.js → cose-bilkent-S5V4N54A-DueZsNr5.js} +1 -1
- package/dist/web/assets/cssMode-Dqx3XDOC.js +1 -0
- package/dist/web/assets/{dagre-BM42HDAG-CymH_FEZ.js → dagre-BM42HDAG-BkQGrA8s.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-DXOIiLDr.js → diagram-2AECGRRQ-D4qtEjjj.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-B9ocgjdh.js → diagram-5GNKFQAL-ZuFk-7GO.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-DLMpk9Wg.js → diagram-KO2AKTUF-kwBr5lw0.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-BBnF83je.js → diagram-LMA3HP47-m88-mNyr.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-AK4FunVI.js → diagram-OG6HWLK6-B9gV1dxA.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-B1mryURg.js → erDiagram-TEJ5UH35-De_DsoOX.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-BjIG_1l5.js → flowDiagram-I6XJVG4X-9VwLS0b3.js} +1 -1
- package/dist/web/assets/{folder-picker-CaM_drIJ.js → folder-picker-B0khMt7A.js} +1 -1
- package/dist/web/assets/{freemarker2-Dj1C_6Ng.js → freemarker2-CLp1Yffb.js} +2 -2
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-DjR6lyIQ.js → ganttDiagram-6RSMTGT7-DoOyYr5i.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-BpW2L4ry.js → gitGraphDiagram-PVQCEYII-CMGuTxMz.js} +1 -1
- package/dist/web/assets/handlebars-CmLfR6Uy.js +1 -0
- package/dist/web/assets/html-D34UDOLc.js +1 -0
- package/dist/web/assets/htmlMode-qjrvkZFJ.js +1 -0
- package/dist/web/assets/{index-DaRxJqVy.js → index-DI7lHrAR.js} +4 -4
- package/dist/web/assets/index-DrzmyANC.js +122 -0
- package/dist/web/assets/index-MMCbS8_L.css +1 -0
- package/dist/web/assets/{infoDiagram-5YYISTIA-Cu-PA_-6.js → infoDiagram-5YYISTIA-gUCDmQX7.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-S6Esbkdw.js → ishikawaDiagram-YF4QCWOH-CmfFhhIz.js} +1 -1
- package/dist/web/assets/javascript-D5tp0LcO.js +1 -0
- package/dist/web/assets/{journeyDiagram-JHISSGLW-wPF9FT9V.js → journeyDiagram-JHISSGLW-BvV5GoR_.js} +1 -1
- package/dist/web/assets/{jsonMode-D6IoFlQF.js → jsonMode-BbjYNQ7Q.js} +4 -4
- package/dist/web/assets/{kanban-definition-UN3LZRKU-C4jl9zOj.js → kanban-definition-UN3LZRKU-BpTm0MC-.js} +1 -1
- package/dist/web/assets/{layers-hQUUT3Gb.js → layers-DslPQJ3T.js} +1 -1
- package/dist/web/assets/{linear-D83xDp0H.js → linear-BJ_g8wqu.js} +1 -1
- package/dist/web/assets/liquid-DBu3_6XS.js +1 -0
- package/dist/web/assets/{lspLanguageFeatures-CUyibjAN.js → lspLanguageFeatures-PSX0tqnR.js} +1 -1
- package/dist/web/assets/mdx-Bb4nrA8s.js +1 -0
- package/dist/web/assets/{mermaid-NOHMQCX5-CGCWmHha.js → mermaid-NOHMQCX5-B44shuzc.js} +45 -45
- package/dist/web/assets/{message-square-B-uYQiTq.js → message-square-C-22K3oa.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-D5v2uvjn.js → mindmap-definition-RKZ34NQL-DS5GLydx.js} +1 -1
- package/dist/web/assets/{modal-D87uszzb.js → modal-CFVLBZ5p.js} +1 -1
- package/dist/web/assets/{monaco-B25-2nEB.js → monaco-CkaUvvB4.js} +3 -3
- package/dist/web/assets/{pencil-CY2RnQrx.js → pencil-DB3VPszm.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-6wdFz_7x.js → pieDiagram-4H26LBE5-C1PJJGsh.js} +1 -1
- package/dist/web/assets/python-BfodDYt4.js +1 -0
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-C1CrGMEK.js → quadrantDiagram-W4KKPZXB-CzDfs-TQ.js} +1 -1
- package/dist/web/assets/razor-DdED1MBH.js +1 -0
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-mDtZrxpp.js → requirementDiagram-4Y6WPE33-qHbU7oZa.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-hBlj0XoH.js → sankeyDiagram-5OEKKPKP-BfRgrEeN.js} +1 -1
- package/dist/web/assets/select-CL78HCY0.js +1 -0
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DsWmMm20.js → sequenceDiagram-3UESZ5HK-CGTNzKk3.js} +1 -1
- package/dist/web/assets/{server-qlZupTvg.js → server-Cd7APx6v.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-VNyX1L66.js → stateDiagram-AJRCARHV-BY1LJ4b7.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-BV_JKRZC.js +1 -0
- package/dist/web/assets/{switch-1pvXCcP-.js → switch-DmQ0Brgd.js} +1 -1
- package/dist/web/assets/{textarea-D9oaz-Ba.js → textarea-DOte4pMQ.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-DuBxxd9E.js → timeline-definition-PNZ67QCA-BBhCKsly.js} +1 -1
- package/dist/web/assets/{trash-2-C0P8jNpJ.js → trash-2-BSAHXKfW.js} +1 -1
- package/dist/web/assets/{tsMode-ogL-3MSe.js → tsMode-B6rHoWny.js} +2 -2
- package/dist/web/assets/typescript-C2A3q8UY.js +1 -0
- package/dist/web/assets/{upload-BYgsDplu.js → upload-e87qV_RH.js} +1 -1
- package/dist/web/assets/{use-profiles-BkGnmson.js → use-profiles-Cv2zBJOC.js} +1 -1
- package/dist/web/assets/{use-projects-B4w00h5I.js → use-projects-C8WDJXdj.js} +1 -1
- package/dist/web/assets/use-providers-CnpIgITQ.js +1 -0
- package/dist/web/assets/{useNormalizedLogs-MsDkcnRQ.js → useNormalizedLogs-AbIXa8s-.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-RbPPOLBo.js → vennDiagram-CIIHVFJN-DrDrt_Jg.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-DXzUbdMF.js → wardley-L42UT6IY-CMYQm14y.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-B0QXobQM.js → wardleyDiagram-YWT4CUSO-COLA9A80.js} +1 -1
- package/dist/web/assets/xml-D4xDxfjR.js +1 -0
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-C7bFJItM.js → xychartDiagram-2RQKCTM6-BDegkKoT.js} +1 -1
- package/dist/web/assets/yaml-yJExA7tq.js +1 -0
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/execution-permission.d.ts +19 -0
- package/node_modules/@agent-tower/shared/dist/execution-permission.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/execution-permission.js +53 -0
- package/node_modules/@agent-tower/shared/dist/execution-permission.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/index.js +1 -0
- package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts +6 -5
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/provider-capabilities.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.d.ts +49 -2
- package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/assets/ConversationPage-BINGA8XL.js +0 -3
- package/dist/web/assets/CreateTaskInput-8bLhHYOc.js +0 -1
- package/dist/web/assets/ProjectKanbanPage-D7RJm4yg.js +0 -92
- package/dist/web/assets/ProviderSettingsPage-BlgfQMwe.js +0 -95
- package/dist/web/assets/channel-B8s9dqlX.js +0 -1
- package/dist/web/assets/check-C1zWgxFO.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-61bPx188.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-61bPx188.js +0 -1
- package/dist/web/assets/cssMode-CNU1q_Gl.js +0 -1
- package/dist/web/assets/handlebars-DNXOgRZc.js +0 -1
- package/dist/web/assets/html-C20FgNS-.js +0 -1
- package/dist/web/assets/htmlMode-CtcV1Ktd.js +0 -1
- package/dist/web/assets/index-dElqH2UR.css +0 -1
- package/dist/web/assets/index-oC5eh7mZ.js +0 -122
- package/dist/web/assets/javascript-CFAVZ6Tb.js +0 -1
- package/dist/web/assets/liquid-CuzuRJIN.js +0 -1
- package/dist/web/assets/mdx-C3rxTvel.js +0 -1
- package/dist/web/assets/python-BYGLbOzO.js +0 -1
- package/dist/web/assets/razor-m0U9iUAj.js +0 -1
- package/dist/web/assets/select-D7WkUiad.js +0 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-DHz3oGyD.js +0 -1
- package/dist/web/assets/typescript-rHoDxTY8.js +0 -1
- package/dist/web/assets/use-providers-B70-BYNu.js +0 -1
- package/dist/web/assets/xml-BqnpQrAq.js +0 -1
- 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":"
|
|
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: {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
476
|
+
executionPermission: 'FULL_ACCESS',
|
|
477
|
+
config: {},
|
|
228
478
|
});
|
|
229
479
|
await app.close();
|
|
230
480
|
});
|
|
231
|
-
it('migrates
|
|
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({
|
|
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(
|
|
256
|
-
expect(explicitAsk.json().
|
|
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.
|
|
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)?.
|
|
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({
|