agor-live 0.21.2 → 0.22.0
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/cli/commands/branch/env/restart.js +1 -1
- package/dist/cli/commands/branch/env/start.js +1 -1
- package/dist/cli/commands/branch/env/stop.js +1 -1
- package/dist/core/api/index.cjs +5 -1
- package/dist/core/api/index.d.ts +6 -1
- package/dist/core/api/index.d.ts.map +1 -1
- package/dist/core/api/index.js +5 -1
- package/dist/core/claude/index.cjs +162 -14
- package/dist/core/claude/index.js +166 -18
- package/dist/core/client/index.cjs +43 -3
- package/dist/core/client/index.js +37 -3
- package/dist/core/config/browser.cjs +2 -2
- package/dist/core/config/browser.js +2 -2
- package/dist/core/config/config-manager.d.ts.map +1 -1
- package/dist/core/config/constants.d.ts +1 -1
- package/dist/core/config/index.cjs +174 -20
- package/dist/core/config/index.js +178 -24
- package/dist/core/config/types.d.ts +8 -0
- package/dist/core/config/types.d.ts.map +1 -1
- package/dist/core/db/index.cjs +495 -86
- package/dist/core/db/index.js +482 -75
- package/dist/core/db/repositories/artifacts.d.ts.map +1 -1
- package/dist/core/db/repositories/branches.d.ts +13 -1
- package/dist/core/db/repositories/branches.d.ts.map +1 -1
- package/dist/core/db/repositories/gateway-channels.d.ts.map +1 -1
- package/dist/core/db/repositories/index.d.ts +1 -0
- package/dist/core/db/repositories/index.d.ts.map +1 -1
- package/dist/core/db/repositories/session-relationships.d.ts +30 -0
- package/dist/core/db/repositories/session-relationships.d.ts.map +1 -0
- package/dist/core/db/repositories/users.d.ts +11 -0
- package/dist/core/db/repositories/users.d.ts.map +1 -1
- package/dist/core/db/schema.d.ts +421 -4
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.postgres.d.ts +226 -2
- package/dist/core/db/schema.postgres.d.ts.map +1 -1
- package/dist/core/db/schema.sqlite.d.ts +228 -2
- package/dist/core/db/schema.sqlite.d.ts.map +1 -1
- package/dist/core/drizzle/postgres/0050_artifact_source_session.sql +3 -0
- package/dist/core/drizzle/postgres/0051_session_relationships.sql +26 -0
- package/dist/core/drizzle/postgres/meta/_journal.json +14 -0
- package/dist/core/drizzle/sqlite/0059_artifact_source_session.sql +2 -0
- package/dist/core/drizzle/sqlite/0060_session_relationships.sql +23 -0
- package/dist/core/drizzle/sqlite/meta/_journal.json +14 -0
- package/dist/core/gateway/connector-registry.d.ts.map +1 -1
- package/dist/core/gateway/connector.d.ts +22 -0
- package/dist/core/gateway/connector.d.ts.map +1 -1
- package/dist/core/gateway/connectors/slack.d.ts +35 -3
- package/dist/core/gateway/connectors/slack.d.ts.map +1 -1
- package/dist/core/gateway/connectors/teams.d.ts +107 -0
- package/dist/core/gateway/connectors/teams.d.ts.map +1 -0
- package/dist/core/gateway/context.d.ts.map +1 -1
- package/dist/core/gateway/index.cjs +552 -52
- package/dist/core/gateway/index.d.ts +3 -2
- package/dist/core/gateway/index.d.ts.map +1 -1
- package/dist/core/gateway/index.js +544 -52
- package/dist/core/gateway/system-message.d.ts +21 -0
- package/dist/core/gateway/system-message.d.ts.map +1 -1
- package/dist/core/index.cjs +616 -127
- package/dist/core/index.js +597 -116
- package/dist/core/mcp/index.cjs +146 -9
- package/dist/core/mcp/index.js +146 -9
- package/dist/core/mcp/template-resolver.d.ts.map +1 -1
- package/dist/core/seed/index.cjs +375 -59
- package/dist/core/seed/index.js +378 -62
- package/dist/core/sessions/index.cjs +19 -0
- package/dist/core/sessions/index.js +19 -0
- package/dist/core/templates/agor-system-prompt.md +21 -53
- package/dist/core/templates/session-context.cjs +2 -73
- package/dist/core/templates/session-context.d.ts +9 -53
- package/dist/core/templates/session-context.d.ts.map +1 -1
- package/dist/core/templates/session-context.js +2 -72
- package/dist/core/tools/mcp/jwt-auth.cjs +2 -20
- package/dist/core/tools/mcp/jwt-auth.d.ts.map +1 -1
- package/dist/core/tools/mcp/jwt-auth.js +2 -20
- package/dist/core/tools/mcp/oauth-mcp-transport.cjs +2 -15
- package/dist/core/tools/mcp/oauth-mcp-transport.d.ts.map +1 -1
- package/dist/core/tools/mcp/oauth-mcp-transport.js +2 -15
- package/dist/core/tools/mcp/oauth-refresh.cjs +167 -19
- package/dist/core/tools/mcp/oauth-refresh.js +167 -19
- package/dist/core/types/artifact.d.ts +5 -1
- package/dist/core/types/artifact.d.ts.map +1 -1
- package/dist/core/types/branch.d.ts +14 -0
- package/dist/core/types/branch.d.ts.map +1 -1
- package/dist/core/types/gateway.d.ts +1 -1
- package/dist/core/types/gateway.d.ts.map +1 -1
- package/dist/core/types/id.d.ts +1 -0
- package/dist/core/types/id.d.ts.map +1 -1
- package/dist/core/types/index.cjs +36 -0
- package/dist/core/types/index.js +30 -0
- package/dist/core/types/session.d.ts +65 -1
- package/dist/core/types/session.d.ts.map +1 -1
- package/dist/core/types/task.d.ts +9 -0
- package/dist/core/types/task.d.ts.map +1 -1
- package/dist/core/unix/index.cjs +371 -55
- package/dist/core/unix/index.js +374 -58
- package/dist/core/unix/unix-integration-service.d.ts +10 -7
- package/dist/core/unix/unix-integration-service.d.ts.map +1 -1
- package/dist/core/utils/permission-mode-mapper.cjs +19 -0
- package/dist/core/utils/permission-mode-mapper.js +19 -0
- package/dist/daemon/declarations.d.ts +7 -0
- package/dist/daemon/declarations.d.ts.map +1 -1
- package/dist/daemon/hooks/gateway-route.d.ts.map +1 -1
- package/dist/daemon/hooks/gateway-route.js +53 -1
- package/dist/daemon/index.js +3760 -2107
- package/dist/daemon/main.js +3760 -2107
- package/dist/daemon/mcp/server.js +155 -17
- package/dist/daemon/mcp/tools/analytics.js +6 -7
- package/dist/daemon/mcp/tools/artifacts.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/artifacts.js +7 -7
- package/dist/daemon/mcp/tools/boards.js +6 -7
- package/dist/daemon/mcp/tools/branches.js +6 -7
- package/dist/daemon/mcp/tools/card-types.js +6 -7
- package/dist/daemon/mcp/tools/cards.js +6 -7
- package/dist/daemon/mcp/tools/environment.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/environment.js +19 -12
- package/dist/daemon/mcp/tools/knowledge.js +6 -7
- package/dist/daemon/mcp/tools/mcp-servers.js +6 -7
- package/dist/daemon/mcp/tools/messages.js +6 -7
- package/dist/daemon/mcp/tools/proxies.js +6 -7
- package/dist/daemon/mcp/tools/repos.js +6 -7
- package/dist/daemon/mcp/tools/schedules.js +6 -7
- package/dist/daemon/mcp/tools/search.js +6 -7
- package/dist/daemon/mcp/tools/sessions.d.ts.map +1 -1
- package/dist/daemon/mcp/tools/sessions.js +140 -11
- package/dist/daemon/mcp/tools/tasks.js +6 -7
- package/dist/daemon/mcp/tools/users.js +6 -7
- package/dist/daemon/mcp/tools/widgets.js +7 -8
- package/dist/daemon/register-hooks.d.ts +5 -1
- package/dist/daemon/register-hooks.d.ts.map +1 -1
- package/dist/daemon/register-hooks.js +404 -179
- package/dist/daemon/register-routes.d.ts.map +1 -1
- package/dist/daemon/register-routes.js +360 -162
- package/dist/daemon/register-services.d.ts.map +1 -1
- package/dist/daemon/register-services.js +1928 -671
- package/dist/daemon/services/artifacts.d.ts +10 -1
- package/dist/daemon/services/artifacts.d.ts.map +1 -1
- package/dist/daemon/services/artifacts.js +25 -1
- package/dist/daemon/services/branches.d.ts +11 -1
- package/dist/daemon/services/branches.d.ts.map +1 -1
- package/dist/daemon/services/branches.js +470 -184
- package/dist/daemon/services/claude-models.js +879 -339
- package/dist/daemon/services/gateway.d.ts +58 -2
- package/dist/daemon/services/gateway.d.ts.map +1 -1
- package/dist/daemon/services/gateway.js +590 -47
- package/dist/daemon/services/groups.d.ts +2 -0
- package/dist/daemon/services/groups.d.ts.map +1 -1
- package/dist/daemon/services/groups.js +56 -0
- package/dist/daemon/services/mcp-servers.d.ts.map +1 -1
- package/dist/daemon/services/mcp-servers.js +0 -6
- package/dist/daemon/services/scheduler.d.ts.map +1 -1
- package/dist/daemon/services/scheduler.js +6 -2
- package/dist/daemon/services/sessions.d.ts +11 -3
- package/dist/daemon/services/sessions.d.ts.map +1 -1
- package/dist/daemon/services/sessions.js +68 -7
- package/dist/daemon/services/tasks.d.ts +13 -2
- package/dist/daemon/services/tasks.d.ts.map +1 -1
- package/dist/daemon/services/tasks.js +42 -26
- package/dist/daemon/startup.js +6 -2
- package/dist/daemon/utils/session-stop.d.ts +43 -0
- package/dist/daemon/utils/session-stop.d.ts.map +1 -0
- package/dist/daemon/utils/session-stop.js +102 -0
- package/dist/daemon/utils/session-task-state.d.ts +7 -2
- package/dist/daemon/utils/session-task-state.d.ts.map +1 -1
- package/dist/daemon/utils/session-task-state.js +9 -3
- package/dist/daemon/utils/session-tasks.d.ts +4 -4
- package/dist/daemon/utils/session-tasks.d.ts.map +1 -1
- package/dist/daemon/utils/session-tasks.js +4 -8
- package/dist/executor/commands/environment.d.ts +13 -0
- package/dist/executor/commands/environment.d.ts.map +1 -0
- package/dist/executor/commands/environment.js +287 -0
- package/dist/executor/commands/index.d.ts.map +1 -1
- package/dist/executor/commands/index.js +5 -1
- package/dist/executor/commands/unix.d.ts +8 -1
- package/dist/executor/commands/unix.d.ts.map +1 -1
- package/dist/executor/commands/unix.js +157 -2
- package/dist/executor/payload-types.d.ts +201 -5
- package/dist/executor/payload-types.d.ts.map +1 -1
- package/dist/executor/payload-types.js +98 -0
- package/dist/executor/sdk-handlers/base/mcp-scoping.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/base/mcp-scoping.js +14 -0
- package/dist/executor/sdk-handlers/claude/message-processor.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/message-processor.js +0 -1
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts +1 -0
- package/dist/executor/sdk-handlers/claude/query-builder.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/claude/query-builder.js +91 -39
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts +12 -5
- package/dist/executor/sdk-handlers/codex/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/codex/prompt-service.js +72 -30
- package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts +2 -4
- package/dist/executor/sdk-handlers/copilot/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/copilot/prompt-service.js +4 -13
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts +2 -4
- package/dist/executor/sdk-handlers/gemini/prompt-service.d.ts.map +1 -1
- package/dist/executor/sdk-handlers/gemini/prompt-service.js +4 -13
- package/dist/ui/assets/App-DcEY8Ota.js +3 -0
- package/dist/ui/assets/App-DcEY8Ota.js.gz +0 -0
- package/dist/ui/assets/{ArtifactConsentModal-ParNk5kW.js → ArtifactConsentModal-CiCbK9iv.js} +1 -1
- package/dist/ui/assets/ArtifactConsentModal-CiCbK9iv.js.gz +0 -0
- package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js +9 -0
- package/dist/ui/assets/ArtifactFullscreenPage-CfsTEGKd.js.gz +0 -0
- package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js +18 -0
- package/dist/ui/assets/AutocompleteTextarea-BAFFH_5e.js.gz +0 -0
- package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js +34 -0
- package/dist/ui/assets/BoardObjectNodes-D-O6bZIG.js.gz +0 -0
- package/dist/ui/assets/{CodeEditor.inner-D51Z_CLQ.js → CodeEditor.inner-DBgsP4tn.js} +2 -2
- package/dist/ui/assets/CodeEditor.inner-DBgsP4tn.js.gz +0 -0
- package/dist/ui/assets/ConversationView-CUWR0gR6.js +1 -0
- package/dist/ui/assets/ConversationView-CUWR0gR6.js.gz +0 -0
- package/dist/ui/assets/KnowledgePage-B2bzlXfn.js +24 -0
- package/dist/ui/assets/KnowledgePage-B2bzlXfn.js.gz +0 -0
- package/dist/ui/assets/MarketingScreenshotPage-9Qd7eZsm.css +1 -0
- package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js +143 -0
- package/dist/ui/assets/MarketingScreenshotPage-zv5RUCuV.js.gz +0 -0
- package/dist/ui/assets/MobileApp-VgVnsnsN.js +1 -0
- package/dist/ui/assets/MobileApp-VgVnsnsN.js.gz +0 -0
- package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js +20 -0
- package/dist/ui/assets/SessionCanvas-f1-1Gbcw.js.gz +0 -0
- package/dist/ui/assets/{App-BAdBsEnV.css → SessionCanvas-mEmYGZhC.css} +1 -1
- package/dist/ui/assets/SessionCanvas-mEmYGZhC.css.gz +0 -0
- package/dist/ui/assets/{StreamdownDemoPage-B9wbgp2s.js → StreamdownDemoPage-wzWaqWwr.js} +1 -1
- package/dist/ui/assets/StreamdownDemoPage-wzWaqWwr.js.gz +0 -0
- package/dist/ui/assets/{ThemeSwitcher-ubn6IOz9.js → ThemeSwitcher-Dly2y9pi.js} +1 -1
- package/dist/ui/assets/ThemeSwitcher-Dly2y9pi.js.gz +0 -0
- package/dist/ui/assets/antd-CfbbHJOz.js +401 -0
- package/dist/ui/assets/antd-CfbbHJOz.js.gz +0 -0
- package/dist/ui/assets/architecture-U656AL7Q-CykGFbQU.js +1 -0
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-ChmZt3zk.js → architectureDiagram-VXUJARFQ-C8HXAenz.js} +1 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-C8HXAenz.js.gz +0 -0
- package/dist/ui/assets/{blockDiagram-VD42YOAC-CzGHAHao.js → blockDiagram-VD42YOAC-BhZaEN19.js} +1 -1
- package/dist/ui/assets/blockDiagram-VD42YOAC-BhZaEN19.js.gz +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-DscJyaWN.js → c4Diagram-YG6GDRKO-Dk_UH-sY.js} +1 -1
- package/dist/ui/assets/c4Diagram-YG6GDRKO-Dk_UH-sY.js.gz +0 -0
- package/dist/ui/assets/channel-D6_nUWlW.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-DoWpTvP8.js → chunk-4BX2VUAB-XprbG2TG.js} +1 -1
- package/dist/ui/assets/chunk-55IACEB6-ByzqIgSb.js +1 -0
- package/dist/ui/assets/{chunk-ABZYJK2D-RzDCrjE6.js → chunk-ABZYJK2D-BJcrryHK.js} +1 -1
- package/dist/ui/assets/chunk-ABZYJK2D-BJcrryHK.js.gz +0 -0
- package/dist/ui/assets/{chunk-AGHRB4JF-jidCS5Of.js → chunk-AGHRB4JF-DvxmfbM0.js} +1 -1
- package/dist/ui/assets/chunk-AGHRB4JF-DvxmfbM0.js.gz +0 -0
- package/dist/ui/assets/{chunk-ATLVNIR6-BEIIfJtC.js → chunk-ATLVNIR6-DbeJ0OrR.js} +1 -1
- package/dist/ui/assets/chunk-ATLVNIR6-DbeJ0OrR.js.gz +0 -0
- package/dist/ui/assets/{chunk-B4BG7PRW-B8b6dQQ2.js → chunk-B4BG7PRW-C53q2ggf.js} +1 -1
- package/dist/ui/assets/chunk-B4BG7PRW-C53q2ggf.js.gz +0 -0
- package/dist/ui/assets/{chunk-CVBHYZKI-D-mQAfrk.js → chunk-CVBHYZKI-B3EBSlb3.js} +1 -1
- package/dist/ui/assets/{chunk-DI55MBZ5-BfATX3V8.js → chunk-DI55MBZ5-vIyNEQN-.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-vIyNEQN-.js.gz +0 -0
- package/dist/ui/assets/chunk-EXTU4WIE-B3ObkuOm.js +1 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-fqXscNvc.js → chunk-FMBD7UC4-rddmfK-Z.js} +1 -1
- package/dist/ui/assets/{chunk-HN2XXSSU-BCHvD80g.js → chunk-HN2XXSSU-Dttqcg3b.js} +1 -1
- package/dist/ui/assets/chunk-HN2XXSSU-Dttqcg3b.js.gz +0 -0
- package/dist/ui/assets/{chunk-JA3XYJ7Z-Cp6dqHnY.js → chunk-JA3XYJ7Z-DbNDev3D.js} +1 -1
- package/dist/ui/assets/chunk-JA3XYJ7Z-DbNDev3D.js.gz +0 -0
- package/dist/ui/assets/{chunk-JZLCHNYA-cKMooY3y.js → chunk-JZLCHNYA-EUmx2y4H.js} +1 -1
- package/dist/ui/assets/chunk-JZLCHNYA-EUmx2y4H.js.gz +0 -0
- package/dist/ui/assets/{chunk-MI3HLSF2-BlzO5wOE.js → chunk-MI3HLSF2-65n9Mkyc.js} +1 -1
- package/dist/ui/assets/chunk-MI3HLSF2-65n9Mkyc.js.gz +0 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js +2 -0
- package/dist/ui/assets/chunk-N4CR4FBY-mv5koXqW.js.gz +0 -0
- package/dist/ui/assets/{chunk-QN33PNHL-DIHGQ_pd.js → chunk-QN33PNHL-DsRKK6NR.js} +1 -1
- package/dist/ui/assets/{chunk-QXUST7PY-C9l0muI0.js → chunk-QXUST7PY-BCYnMiS3.js} +1 -1
- package/dist/ui/assets/chunk-QXUST7PY-BCYnMiS3.js.gz +0 -0
- package/dist/ui/assets/chunk-QZHKN3VN-HucAw4xW.js +1 -0
- package/dist/ui/assets/{chunk-S3R3BYOJ-VJiLzt2o.js → chunk-S3R3BYOJ-CWMEa9Dc.js} +1 -1
- package/dist/ui/assets/chunk-S3R3BYOJ-CWMEa9Dc.js.gz +0 -0
- package/dist/ui/assets/{chunk-TZMSLE5B-DZwI0C_2.js → chunk-TZMSLE5B-BuQUQcTr.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-BuQUQcTr.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-CUT3rPTB.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-CUT3rPTB.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-Ipik-oSD.js → cose-bilkent-S5V4N54A-CnPB3ARO.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-CnPB3ARO.js.gz +0 -0
- package/dist/ui/assets/cursor-QEb7m-rN.png +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-BDpyWQnh.js → dagre-6UL2VRFP-DhS-k_Se.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-DhS-k_Se.js.gz +0 -0
- package/dist/ui/assets/{dagre-CgA4KhUX.js → dagre-KgLoHEuy.js} +1 -1
- package/dist/ui/assets/dagre-KgLoHEuy.js.gz +0 -0
- package/dist/ui/assets/{diagram-PSM6KHXK-B4GRzxLJ.js → diagram-PSM6KHXK-BZg3MJmb.js} +1 -1
- package/dist/ui/assets/diagram-PSM6KHXK-BZg3MJmb.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-BWPW28XI.js → diagram-QEK2KX5R-BPCitvbo.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-BPCitvbo.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-BIHhcGoV.js → diagram-S2PKOQOG-NW4uK6sx.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-NW4uK6sx.js.gz +0 -0
- package/dist/ui/assets/{editor-C-HJ7Yw0.js → editor-CzFWIUw2.js} +1 -1
- package/dist/ui/assets/editor-CzFWIUw2.js.gz +0 -0
- package/dist/ui/assets/{emoji-D8F6B62m.js → emoji-Dkz4Zzv_.js} +1 -1
- package/dist/ui/assets/emoji-Dkz4Zzv_.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-ubTaAFcK.js → erDiagram-Q2GNP2WA-me1fboaf.js} +1 -1
- package/dist/ui/assets/erDiagram-Q2GNP2WA-me1fboaf.js.gz +0 -0
- package/dist/ui/assets/{flowDiagram-NV44I4VS-BHLCTYjI.js → flowDiagram-NV44I4VS-DzE8dGsh.js} +1 -1
- package/dist/ui/assets/flowDiagram-NV44I4VS-DzE8dGsh.js.gz +0 -0
- package/dist/ui/assets/{ganttDiagram-LVOFAZNH-ClC3pay1.js → ganttDiagram-LVOFAZNH-CFQD09Mi.js} +2 -2
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-CFQD09Mi.js.gz +0 -0
- package/dist/ui/assets/{gitGraph-F6HP7TQM-DghoobE6.js → gitGraph-F6HP7TQM-CfFE_uAC.js} +1 -1
- package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-Clqpiswu.js → gitGraphDiagram-NY62KEGX-CaVoxU4C.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CaVoxU4C.js.gz +0 -0
- package/dist/ui/assets/index-BN5_Qq7R.js +324 -0
- package/dist/ui/assets/index-BN5_Qq7R.js.gz +0 -0
- package/dist/ui/assets/index-DxuPq13l.css +1 -0
- package/dist/ui/assets/index-DxuPq13l.css.gz +0 -0
- package/dist/ui/assets/{info-NVLQJR56-0ZldEXPQ.js → info-NVLQJR56-i_xHYg3f.js} +1 -1
- package/dist/ui/assets/{infoDiagram-ER5ION4S-DMmPX-il.js → infoDiagram-ER5ION4S-2NL93b78.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-CrVickA2.js → journeyDiagram-XKPGCS4Q-CZF-2DHU.js} +1 -1
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CZF-2DHU.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-C_BsdHYL.js → kanban-definition-3W4ZIXB7-CfvJIOny.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-CfvJIOny.js.gz +0 -0
- package/dist/ui/assets/{line-CfBP7Yic.js → line-DDv8kOJk.js} +1 -1
- package/dist/ui/assets/{linear-BsjageUB.js → linear-Daef-l29.js} +1 -1
- package/dist/ui/assets/linear-Daef-l29.js.gz +0 -0
- package/dist/ui/assets/{mermaid-parser.core-DZdP-NFq.js → mermaid-parser.core-CdK9QgYV.js} +2 -2
- package/dist/ui/assets/mermaid-parser.core-CdK9QgYV.js.gz +0 -0
- package/dist/ui/assets/{mermaid.core-TNrI0pHG.js → mermaid.core-D6GS9mU-.js} +3 -3
- package/dist/ui/assets/mermaid.core-D6GS9mU-.js.gz +0 -0
- package/dist/ui/assets/message-SqLqNYcv.js +36 -0
- package/dist/ui/assets/message-SqLqNYcv.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-BbmaUjMY.js → mindmap-definition-VGOIOE7T-Cb3QMflX.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-Cb3QMflX.js.gz +0 -0
- package/dist/ui/assets/{packet-BFZMPI3H-D_ZhkXuT.js → packet-BFZMPI3H-Bm2uwz4i.js} +1 -1
- package/dist/ui/assets/{particles-Dv28pjOd.js → particles-DsJFOarW.js} +1 -1
- package/dist/ui/assets/particles-DsJFOarW.js.gz +0 -0
- package/dist/ui/assets/{pie-7BOR55EZ-Dn0Q3qNx.js → pie-7BOR55EZ-5i17tVnF.js} +1 -1
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-BbyjfYu8.js → pieDiagram-ADFJNKIX-BxIwQWvw.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-BxIwQWvw.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-Bc3GqMKz.js → quadrantDiagram-AYHSOK5B-B5HPe4ga.js} +1 -1
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-B5HPe4ga.js.gz +0 -0
- package/dist/ui/assets/{radar-NHE76QYJ-BHwoAy1q.js → radar-NHE76QYJ-BTn-tq0k.js} +1 -1
- package/dist/ui/assets/{reactflow-BVYPxNhc.js → reactflow-Bf74ngoo.js} +2 -2
- package/dist/ui/assets/reactflow-Bf74ngoo.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-BQaKKL09.js → requirementDiagram-UZGBJVZJ-YfI6llkX.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-YfI6llkX.js.gz +0 -0
- package/dist/ui/assets/{sandpack-BQW_FQ7G.js → sandpack-D7koO5op.js} +1 -1
- package/dist/ui/assets/sandpack-D7koO5op.js.gz +0 -0
- package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-DiJvDvhb.js → sankeyDiagram-TZEHDZUN-DOk_B10B.js} +1 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DOk_B10B.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-Dw32824o.js → sequenceDiagram-WL72ISMW-DAe4Um17.js} +1 -1
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-DAe4Um17.js.gz +0 -0
- package/dist/ui/assets/{stateDiagram-FKZM4ZOC-BCOpNdHV.js → stateDiagram-FKZM4ZOC-CCesDu_C.js} +1 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-CCesDu_C.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-CMlIrsoO.js +1 -0
- package/dist/ui/assets/{syntax-VJrU5BEu.js → syntax-C-M-8jOU.js} +1 -1
- package/dist/ui/assets/syntax-C-M-8jOU.js.gz +0 -0
- package/dist/ui/assets/{theme-DZtFA8b4.js → theme-BQZdiqwv.js} +1 -1
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-Jh_WZzXv.js → timeline-definition-IT6M3QCI-D6P5txjT.js} +1 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-D6P5txjT.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-CPYIgjxE.js → treemap-KMMF4GRG-Bitm3gy4.js} +1 -1
- package/dist/ui/assets/{knowledgeRoutes-CivaUqha.js → useUserLocalStorage-Ckb8HsIw.js} +1 -1
- package/dist/ui/assets/useUserLocalStorage-Ckb8HsIw.js.gz +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-CERc7Rdb.js → xychartDiagram-PRI3JC2R-CsybjUbd.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-CsybjUbd.js.gz +0 -0
- package/dist/ui/index.html +13 -11
- package/dist/ui/index.html.gz +0 -0
- package/package.json +10 -9
- package/dist/ui/assets/App-9s2WHM6S.js +0 -22
- package/dist/ui/assets/App-9s2WHM6S.js.gz +0 -0
- package/dist/ui/assets/App-BAdBsEnV.css.gz +0 -0
- package/dist/ui/assets/ArtifactConsentModal-ParNk5kW.js.gz +0 -0
- package/dist/ui/assets/ArtifactFullscreenPage-VQxLMCiN.js +0 -9
- package/dist/ui/assets/ArtifactFullscreenPage-VQxLMCiN.js.gz +0 -0
- package/dist/ui/assets/AutocompleteTextarea-3RchrIgk.js +0 -18
- package/dist/ui/assets/AutocompleteTextarea-3RchrIgk.js.gz +0 -0
- package/dist/ui/assets/CodeEditor.inner-D51Z_CLQ.js.gz +0 -0
- package/dist/ui/assets/ConversationView-Dyddw2b1.js +0 -34
- package/dist/ui/assets/ConversationView-Dyddw2b1.js.gz +0 -0
- package/dist/ui/assets/KnowledgePage-CdftslnF.js +0 -24
- package/dist/ui/assets/KnowledgePage-CdftslnF.js.gz +0 -0
- package/dist/ui/assets/MobileApp-BdBMpnJ1.js +0 -1
- package/dist/ui/assets/MobileApp-BdBMpnJ1.js.gz +0 -0
- package/dist/ui/assets/StreamdownDemoPage-B9wbgp2s.js.gz +0 -0
- package/dist/ui/assets/ThemeSwitcher-ubn6IOz9.js.gz +0 -0
- package/dist/ui/assets/antd-C-HfEC4E.js +0 -400
- package/dist/ui/assets/antd-C-HfEC4E.js.gz +0 -0
- package/dist/ui/assets/architecture-U656AL7Q-dkBewUpN.js +0 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-ChmZt3zk.js.gz +0 -0
- package/dist/ui/assets/blockDiagram-VD42YOAC-CzGHAHao.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-DscJyaWN.js.gz +0 -0
- package/dist/ui/assets/channel-DvRQqEqC.js +0 -1
- package/dist/ui/assets/chunk-55IACEB6-DojF2pZN.js +0 -1
- package/dist/ui/assets/chunk-ABZYJK2D-RzDCrjE6.js.gz +0 -0
- package/dist/ui/assets/chunk-AGHRB4JF-jidCS5Of.js.gz +0 -0
- package/dist/ui/assets/chunk-ATLVNIR6-BEIIfJtC.js.gz +0 -0
- package/dist/ui/assets/chunk-B4BG7PRW-B8b6dQQ2.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-BfATX3V8.js.gz +0 -0
- package/dist/ui/assets/chunk-EXTU4WIE-BKt6lPJM.js +0 -1
- package/dist/ui/assets/chunk-HN2XXSSU-BCHvD80g.js.gz +0 -0
- package/dist/ui/assets/chunk-JA3XYJ7Z-Cp6dqHnY.js.gz +0 -0
- package/dist/ui/assets/chunk-JZLCHNYA-cKMooY3y.js.gz +0 -0
- package/dist/ui/assets/chunk-MI3HLSF2-BlzO5wOE.js.gz +0 -0
- package/dist/ui/assets/chunk-N4CR4FBY-pASDorUx.js +0 -2
- package/dist/ui/assets/chunk-N4CR4FBY-pASDorUx.js.gz +0 -0
- package/dist/ui/assets/chunk-QXUST7PY-C9l0muI0.js.gz +0 -0
- package/dist/ui/assets/chunk-QZHKN3VN-CZskCFCf.js +0 -1
- package/dist/ui/assets/chunk-S3R3BYOJ-VJiLzt2o.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-DZwI0C_2.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-BFASUbmZ.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-BFASUbmZ.js +0 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-Ipik-oSD.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-BDpyWQnh.js.gz +0 -0
- package/dist/ui/assets/dagre-CgA4KhUX.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-B4GRzxLJ.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-BWPW28XI.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-BIHhcGoV.js.gz +0 -0
- package/dist/ui/assets/editor-C-HJ7Yw0.js.gz +0 -0
- package/dist/ui/assets/emoji-D8F6B62m.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-ubTaAFcK.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-BHLCTYjI.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-ClC3pay1.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-Clqpiswu.js.gz +0 -0
- package/dist/ui/assets/index-D9OElx9A.css +0 -1
- package/dist/ui/assets/index-D9OElx9A.css.gz +0 -0
- package/dist/ui/assets/index-DxPuzG7E.js +0 -350
- package/dist/ui/assets/index-DxPuzG7E.js.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-CrVickA2.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-C_BsdHYL.js.gz +0 -0
- package/dist/ui/assets/knowledgeRoutes-CivaUqha.js.gz +0 -0
- package/dist/ui/assets/linear-BsjageUB.js.gz +0 -0
- package/dist/ui/assets/mermaid-parser.core-DZdP-NFq.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-TNrI0pHG.js.gz +0 -0
- package/dist/ui/assets/message-BtWWJ9Af.js +0 -36
- package/dist/ui/assets/message-BtWWJ9Af.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-BbmaUjMY.js.gz +0 -0
- package/dist/ui/assets/particles-Dv28pjOd.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-BbyjfYu8.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-Bc3GqMKz.js.gz +0 -0
- package/dist/ui/assets/reactflow-BVYPxNhc.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-BQaKKL09.js.gz +0 -0
- package/dist/ui/assets/sandpack-BQW_FQ7G.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-DiJvDvhb.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-Dw32824o.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-BCOpNdHV.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-Cuqwvgfg.js +0 -1
- package/dist/ui/assets/syntax-VJrU5BEu.js.gz +0 -0
- package/dist/ui/assets/timeline-definition-IT6M3QCI-Jh_WZzXv.js.gz +0 -0
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-CERc7Rdb.js.gz +0 -0
|
@@ -23,6 +23,9 @@ function mcpDebug(...args) {
|
|
|
23
23
|
console.debug(...args);
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
+
function compareStrings(a, b) {
|
|
27
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
28
|
+
}
|
|
26
29
|
/**
|
|
27
30
|
* Get MCP servers that should be attached to a session
|
|
28
31
|
*
|
|
@@ -147,6 +150,17 @@ export async function getMcpServersForSession(sessionId, deps) {
|
|
|
147
150
|
if (serversSkipped > 0) {
|
|
148
151
|
console.warn(` ⚠️ Skipped ${serversSkipped} MCP server(s) due to unresolved required templates`);
|
|
149
152
|
}
|
|
153
|
+
// Keep MCP config order stable across turns. Provider SDKs serialize MCP
|
|
154
|
+
// tools into the prompt prefix, so DB/default ordering drift can reduce
|
|
155
|
+
// server-side prompt-cache hits even when the effective server set is the
|
|
156
|
+
// same. Global servers stay before session-assigned servers to preserve the
|
|
157
|
+
// historical scoping precedence; names and IDs make the ordering total.
|
|
158
|
+
servers.sort((a, b) => {
|
|
159
|
+
const sourceRank = (source) => (source === 'global' ? 0 : 1);
|
|
160
|
+
return (sourceRank(a.source) - sourceRank(b.source) ||
|
|
161
|
+
compareStrings(a.server.name, b.server.name) ||
|
|
162
|
+
compareStrings(String(a.server.mcp_server_id), String(b.server.mcp_server_id)));
|
|
163
|
+
});
|
|
150
164
|
}
|
|
151
165
|
catch (error) {
|
|
152
166
|
console.warn(`⚠️ Failed to resolve MCP servers: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-processor.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/message-processor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"message-processor.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/message-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -480,7 +480,6 @@ export class SDKMessageProcessor {
|
|
|
480
480
|
// Blacklist approach: surface unhandled system subtypes by default
|
|
481
481
|
const subtype = ('subtype' in msg ? msg.subtype : undefined) || 'unknown';
|
|
482
482
|
if (shouldSuppressClaudeSystemEvent(msg)) {
|
|
483
|
-
console.debug(`🔇 Suppressed system subtype: ${subtype}`);
|
|
484
483
|
return [];
|
|
485
484
|
}
|
|
486
485
|
console.log(`📡 Surfacing unhandled system subtype: ${subtype}`);
|
|
@@ -10,6 +10,7 @@ import type { BranchRepository, MCPServerRepository, MessagesRepository, RepoRep
|
|
|
10
10
|
import type { PermissionService } from '../../permissions/permission-service.js';
|
|
11
11
|
import type { SessionID, TaskID } from '../../types.js';
|
|
12
12
|
import type { MessagesService, SessionsPatchClient, TasksService } from '../base/index.js';
|
|
13
|
+
export declare function formatListForLog(items: string[], maxItems?: number): string;
|
|
13
14
|
export interface QuerySetupDeps {
|
|
14
15
|
sessionsRepo: SessionRepository;
|
|
15
16
|
reposRepo?: RepoRepository;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/query-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/claude/query-builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAOxC,KAAK,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAI5C,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,KAAK,EAAoB,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+B3F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAI,GAAG,MAAM,CAKtE;AAgDD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,iBAAiB,CAAC;IAChC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,0BAA0B,CAAC;IAC5C,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,eAAe,IAAI,OAAO,CAAC,OAAO,gBAAgB,EAAE,iCAAiC,CAAC,CAAC;IACvF;;;;OAIG;IACH,YAAY,IAAI,IAAI,CAAC;IAErB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;CAC9C;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,eAAe,CAAC;CAC9B,GACL,OAAO,CAAC;IACT,KAAK,EAAE,kBAAkB,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,MAAM,CAAC;CACzB,CAAC,CAqjBD"}
|
|
@@ -11,6 +11,7 @@ import { Claude } from '@agor/core/sdk';
|
|
|
11
11
|
import { renderAgorSystemPrompt } from '@agor/core/templates/session-context';
|
|
12
12
|
import { mergeMCPRemoteHeaders } from '@agor/core/tools/mcp/http-headers';
|
|
13
13
|
import { resolveMCPAuthHeaders } from '@agor/core/tools/mcp/jwt-auth';
|
|
14
|
+
import { isGatewaySession } from '@agor/core/types';
|
|
14
15
|
const { query } = Claude;
|
|
15
16
|
import { getDaemonUrl, resolveUserEnvironment } from '../../config.js';
|
|
16
17
|
import { resolveContextUserId } from '../base/context-user.js';
|
|
@@ -19,21 +20,33 @@ import { CLAUDE_CODE_DISALLOWED_TOOLS } from './constants.js';
|
|
|
19
20
|
import { parseModelWithBetas } from './model-utils.js';
|
|
20
21
|
import { DEFAULT_CLAUDE_MODEL } from './models.js';
|
|
21
22
|
import { createCanUseToolCallback } from './permissions/permission-hooks.js';
|
|
22
|
-
|
|
23
|
-
* Summarize MCP config for logging without exposing sensitive env values.
|
|
24
|
-
* Returns a safe object showing server names and transport types only.
|
|
25
|
-
*/
|
|
26
|
-
function summarizeMcpConfig(config) {
|
|
23
|
+
function summarizeMcpConfigCounts(config) {
|
|
27
24
|
if (!config || typeof config !== 'object')
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
return 'none';
|
|
26
|
+
let total = 0;
|
|
27
|
+
let remote = 0;
|
|
28
|
+
let stdio = 0;
|
|
29
|
+
let withEnv = 0;
|
|
30
|
+
for (const server of Object.values(config)) {
|
|
31
|
+
total += 1;
|
|
32
|
+
const type = server.type || 'stdio';
|
|
33
|
+
if (type === 'stdio') {
|
|
34
|
+
stdio += 1;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
remote += 1;
|
|
38
|
+
}
|
|
39
|
+
if (server.env && Object.keys(server.env).length > 0) {
|
|
40
|
+
withEnv += 1;
|
|
41
|
+
}
|
|
35
42
|
}
|
|
36
|
-
return
|
|
43
|
+
return `total=${total} remote=${remote} stdio=${stdio} with_env=${withEnv}`;
|
|
44
|
+
}
|
|
45
|
+
export function formatListForLog(items, maxItems = 5) {
|
|
46
|
+
if (items.length <= maxItems) {
|
|
47
|
+
return items.join(', ');
|
|
48
|
+
}
|
|
49
|
+
return `${items.slice(0, maxItems).join(', ')} +${items.length - maxItems} more`;
|
|
37
50
|
}
|
|
38
51
|
/**
|
|
39
52
|
* Get path to Claude Code executable
|
|
@@ -78,6 +91,7 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
78
91
|
if (!session) {
|
|
79
92
|
throw new Error(`Session not found: ${sessionId}`);
|
|
80
93
|
}
|
|
94
|
+
const shouldBlockOnMcpStartup = isGatewaySession(session);
|
|
81
95
|
// Determine which user's context to use for environment variables and API
|
|
82
96
|
// keys: the task creator (prompter) when known, else the session owner.
|
|
83
97
|
const contextUserId = await resolveContextUserId({
|
|
@@ -150,19 +164,14 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
150
164
|
const claudeCodePath = getClaudeCodePath();
|
|
151
165
|
// Buffer to capture stderr for better error messages
|
|
152
166
|
let stderrBuffer = '';
|
|
153
|
-
//
|
|
154
|
-
const agorSystemPrompt = await renderAgorSystemPrompt(
|
|
155
|
-
sessions: deps.sessionsRepo,
|
|
156
|
-
branches: deps.branchesRepo,
|
|
157
|
-
repos: deps.reposRepo,
|
|
158
|
-
users: deps.usersRepo,
|
|
159
|
-
});
|
|
167
|
+
// Append static Agor orientation. Dynamic context is available through Agor MCP.
|
|
168
|
+
const agorSystemPrompt = await renderAgorSystemPrompt();
|
|
160
169
|
const queryOptions = {
|
|
161
170
|
cwd,
|
|
162
171
|
systemPrompt: {
|
|
163
172
|
type: 'preset',
|
|
164
173
|
preset: 'claude_code',
|
|
165
|
-
append: agorSystemPrompt,
|
|
174
|
+
append: agorSystemPrompt,
|
|
166
175
|
},
|
|
167
176
|
settingSources: ['user', 'project', 'local'], // Load user + project + local permissions, auto-loads CLAUDE.md
|
|
168
177
|
// Defensive copy — the const is readonly but the SDK option is typed `string[]`.
|
|
@@ -210,18 +219,29 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
210
219
|
console.log(`🧠 Effort level: high (default)`);
|
|
211
220
|
}
|
|
212
221
|
// Configure Claude Code's server-side advisor tool model when a session-level
|
|
213
|
-
// override is present.
|
|
214
|
-
// (
|
|
222
|
+
// override is present. Pass it through the CLI's first-class `--advisor` flag
|
|
223
|
+
// (via the SDK's `extraArgs`) — NOT through the `settings` object.
|
|
224
|
+
//
|
|
225
|
+
// Why not `settings`: passing `settings` as an object makes the Agent SDK emit
|
|
226
|
+
// `--settings '<inline JSON>'`, which the Claude CLI can materialize into a
|
|
227
|
+
// CONTENT-ADDRESSED temp file at `${os.tmpdir()}/claude-settings-<hash>.json`
|
|
228
|
+
// when it hands the resolved flag-settings layer to its workers. In the daemon,
|
|
229
|
+
// `os.tmpdir()` resolves to the shared, sticky-bit `/tmp` (the daemon runs with
|
|
230
|
+
// TMPDIR stripped), so every session with identical advisor settings targets the
|
|
231
|
+
// SAME path. The first writer owns it mode 0600; later sessions — or other Unix
|
|
232
|
+
// users under insulated/strict isolation — then fail to open it with
|
|
233
|
+
// `EACCES ... claude-settings-*.json`, crashing the CLI before the first message.
|
|
234
|
+
// `--advisor <model>` is the CLI's dedicated, server-validated flag (Claude Code
|
|
235
|
+
// >= 2.1.175) and writes no settings file, so it sidesteps the collision entirely.
|
|
215
236
|
const rawAdvisorModel = session.model_config?.advisorModel?.trim();
|
|
216
237
|
if (rawAdvisorModel) {
|
|
217
238
|
const { model: advisorModel, betas: advisorBetas } = parseModelWithBetas(rawAdvisorModel);
|
|
218
239
|
for (const beta of advisorBetas)
|
|
219
240
|
sdkBetas.add(beta);
|
|
220
|
-
queryOptions.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
};
|
|
224
|
-
console.log(`🧭 Advisor model: ${advisorModel}`);
|
|
241
|
+
const extraArgs = queryOptions.extraArgs ?? {};
|
|
242
|
+
extraArgs.advisor = advisorModel;
|
|
243
|
+
queryOptions.extraArgs = extraArgs;
|
|
244
|
+
console.log(`🧭 Advisor model: ${advisorModel} (via --advisor)`);
|
|
225
245
|
}
|
|
226
246
|
// Add beta flags (e.g., 1M context window for [1m] model variants)
|
|
227
247
|
const betaList = [...sdkBetas];
|
|
@@ -385,6 +405,7 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
385
405
|
headers: {
|
|
386
406
|
Authorization: `Bearer ${mcpToken}`,
|
|
387
407
|
},
|
|
408
|
+
...(shouldBlockOnMcpStartup ? { alwaysLoad: true } : {}),
|
|
388
409
|
},
|
|
389
410
|
};
|
|
390
411
|
queryOptions.mcpServers = mcpConfig;
|
|
@@ -407,14 +428,26 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
407
428
|
// Convert to SDK format
|
|
408
429
|
const mcpConfig = {};
|
|
409
430
|
const allowedTools = [];
|
|
431
|
+
let remoteServerCount = 0;
|
|
432
|
+
let stdioServerCount = 0;
|
|
433
|
+
let serversWithHeaders = 0;
|
|
434
|
+
const missingAuthServers = [];
|
|
435
|
+
const unresolvedAuthServers = [];
|
|
410
436
|
for (const { server } of serversWithSource) {
|
|
411
437
|
// Infer transport if missing (backwards compatibility)
|
|
412
438
|
const transport = server.transport || (server.url ? 'sse' : 'stdio');
|
|
439
|
+
if (transport === 'stdio') {
|
|
440
|
+
stdioServerCount += 1;
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
remoteServerCount += 1;
|
|
444
|
+
}
|
|
413
445
|
// Build server config (convert 'transport' field to 'type' for Claude Code)
|
|
414
446
|
const serverConfig = {
|
|
415
447
|
type: transport,
|
|
416
448
|
env: server.env,
|
|
417
449
|
};
|
|
450
|
+
let canAlwaysLoad = shouldBlockOnMcpStartup;
|
|
418
451
|
// Add transport-specific fields
|
|
419
452
|
if (transport === 'stdio') {
|
|
420
453
|
serverConfig.command = server.command;
|
|
@@ -427,19 +460,28 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
427
460
|
try {
|
|
428
461
|
// Pass mcpUrl for OAuth token cache lookup
|
|
429
462
|
const authHeaders = await resolveMCPAuthHeaders(server.auth, server.url);
|
|
463
|
+
const missingRequiredAuth = !!server.auth &&
|
|
464
|
+
server.auth.type !== 'none' &&
|
|
465
|
+
transport !== 'stdio' &&
|
|
466
|
+
!authHeaders?.Authorization;
|
|
430
467
|
const headers = mergeMCPRemoteHeaders({ custom: server.headers, auth: authHeaders });
|
|
431
468
|
if (headers && transport !== 'stdio') {
|
|
432
469
|
serverConfig.headers = headers;
|
|
433
|
-
|
|
470
|
+
serversWithHeaders += 1;
|
|
434
471
|
}
|
|
435
|
-
|
|
436
|
-
//
|
|
437
|
-
|
|
438
|
-
|
|
472
|
+
if (missingRequiredAuth) {
|
|
473
|
+
// Auth-backed remote server but no usable token. Track one concise summary below.
|
|
474
|
+
missingAuthServers.push(server.name);
|
|
475
|
+
canAlwaysLoad = false;
|
|
439
476
|
}
|
|
440
477
|
}
|
|
441
478
|
catch (error) {
|
|
442
|
-
|
|
479
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
480
|
+
unresolvedAuthServers.push(`${server.name}: ${message}`);
|
|
481
|
+
canAlwaysLoad = false;
|
|
482
|
+
}
|
|
483
|
+
if (canAlwaysLoad) {
|
|
484
|
+
serverConfig.alwaysLoad = true;
|
|
443
485
|
}
|
|
444
486
|
mcpConfig[server.name] = serverConfig;
|
|
445
487
|
// Add tools to allowlist
|
|
@@ -454,11 +496,21 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
454
496
|
...(queryOptions.mcpServers || {}),
|
|
455
497
|
...mcpConfig,
|
|
456
498
|
};
|
|
457
|
-
// Log summary
|
|
458
|
-
console.log(` 🔧 MCP servers configured
|
|
499
|
+
// Log one safe summary line. Env/header values may contain secrets after template resolution.
|
|
500
|
+
console.log(` 🔧 MCP servers configured: total=${serversWithSource.length} remote=${remoteServerCount} ` +
|
|
501
|
+
`stdio=${stdioServerCount} headers=${serversWithHeaders} missing_auth=${missingAuthServers.length} ` +
|
|
502
|
+
`auth_errors=${unresolvedAuthServers.length}`);
|
|
503
|
+
if (missingAuthServers.length > 0) {
|
|
504
|
+
console.warn(` ⚠️ ${missingAuthServers.length} MCP server(s) have configured auth but no valid token: ` +
|
|
505
|
+
`${formatListForLog(missingAuthServers)}. Check Settings → MCP Servers.`);
|
|
506
|
+
}
|
|
507
|
+
if (unresolvedAuthServers.length > 0) {
|
|
508
|
+
console.warn(` ⚠️ Failed to resolve MCP auth for ${unresolvedAuthServers.length} server(s): ` +
|
|
509
|
+
formatListForLog(unresolvedAuthServers, 3));
|
|
510
|
+
}
|
|
459
511
|
if (allowedTools.length > 0) {
|
|
460
512
|
queryOptions.allowedTools = allowedTools;
|
|
461
|
-
console.log(` 🔧
|
|
513
|
+
console.log(` 🔧 MCP tools allowlist: ${allowedTools.length} tool(s)`);
|
|
462
514
|
}
|
|
463
515
|
}
|
|
464
516
|
}
|
|
@@ -470,8 +522,8 @@ export async function setupQuery(sessionId, prompt, deps, options = {}) {
|
|
|
470
522
|
console.log('📤 Calling query() with:');
|
|
471
523
|
console.log(` prompt: "${prompt.substring(0, 100)}${prompt.length > 100 ? '...' : ''}"`);
|
|
472
524
|
console.log(` queryOptions keys: ${Object.keys(queryOptions).join(', ')}`);
|
|
473
|
-
// Log MCP
|
|
474
|
-
console.log(` MCP servers
|
|
525
|
+
// Log safe MCP counts only. Per-server names/details are intentionally omitted from this per-query log.
|
|
526
|
+
console.log(` MCP servers: ${summarizeMcpConfigCounts(queryOptions.mcpServers)}`);
|
|
475
527
|
// Wrap the string prompt in an AsyncIterable so the SDK treats this as a
|
|
476
528
|
// streaming-input query. When a plain string is passed, the SDK sets
|
|
477
529
|
// `isSingleUserTurn = true` and closes stdin right after the first result
|
|
@@ -107,11 +107,9 @@ export declare class CodexPromptService {
|
|
|
107
107
|
private sessionsRepo;
|
|
108
108
|
private sessionMCPServerRepo?;
|
|
109
109
|
private branchesRepo?;
|
|
110
|
-
private reposRepo?;
|
|
111
110
|
private mcpServerRepo?;
|
|
112
|
-
private usersRepo?;
|
|
113
111
|
private tasksService?;
|
|
114
|
-
private codex
|
|
112
|
+
private codex?;
|
|
115
113
|
private lastApiKey;
|
|
116
114
|
private lastBaseUrl;
|
|
117
115
|
private lastClientFingerprint;
|
|
@@ -130,7 +128,7 @@ export declare class CodexPromptService {
|
|
|
130
128
|
* Logged at DEBUG only (could leak internal hostnames).
|
|
131
129
|
*/
|
|
132
130
|
private resolveBaseUrl;
|
|
133
|
-
constructor(_messagesRepo: MessagesRepository, sessionsRepo: SessionRepository, sessionMCPServerRepo?: SessionMCPServerRepository | undefined, branchesRepo?: BranchRepository | undefined,
|
|
131
|
+
constructor(_messagesRepo: MessagesRepository, sessionsRepo: SessionRepository, sessionMCPServerRepo?: SessionMCPServerRepository | undefined, branchesRepo?: BranchRepository | undefined, _reposRepo?: RepoRepository, apiKey?: string, mcpServerRepo?: MCPServerRepository | undefined, _usersRepo?: UsersRepository, useNativeAuth?: boolean, tasksService?: TasksService | undefined);
|
|
134
132
|
/**
|
|
135
133
|
* Delete `agor-codex-instructions-*.md` files in `os.tmpdir()` (and the
|
|
136
134
|
* `~/.agor/tmp` fallback dir) older than 24h. Bounds the disk leak from
|
|
@@ -184,7 +182,16 @@ export declare class CodexPromptService {
|
|
|
184
182
|
*/
|
|
185
183
|
private ensureCodexClient;
|
|
186
184
|
/**
|
|
187
|
-
*
|
|
185
|
+
* Best-effort close for SDK clients that expose a lifecycle method. The
|
|
186
|
+
* current Codex SDK API has changed over time, so probe common method names
|
|
187
|
+
* rather than depending on one concrete type. Awaiting close before replacement
|
|
188
|
+
* keeps abandoned app-server/MCP transports from overlapping the new client.
|
|
189
|
+
*/
|
|
190
|
+
private closeCodexClient;
|
|
191
|
+
private replaceCodexClient;
|
|
192
|
+
private getCodexClient;
|
|
193
|
+
/**
|
|
194
|
+
* Write the rendered static Agor orientation prompt to a single file under
|
|
188
195
|
* `os.tmpdir()` and return its absolute path.
|
|
189
196
|
*
|
|
190
197
|
* Replaces the per-session CODEX_HOME directory + AGENTS.md mechanism — we
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/codex/prompt-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,OAAO,KAAK,EAAoB,oBAAoB,EAAe,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-service.d.ts","sourceRoot":"","sources":["../../../src/sdk-handlers/codex/prompt-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ import { Codex } from '@agor/core/sdk';
|
|
|
30
30
|
import { renderAgorSystemPrompt } from '@agor/core/templates/session-context';
|
|
31
31
|
import { mergeMCPRemoteHeaders } from '@agor/core/tools/mcp/http-headers';
|
|
32
32
|
import { resolveMCPAuthHeaders } from '@agor/core/tools/mcp/jwt-auth';
|
|
33
|
+
import { isGatewaySession } from '@agor/core/types';
|
|
33
34
|
import { getDefaultCodexPermissionConfig } from '@agor/core/utils/permission-mode-mapper';
|
|
34
35
|
import { getDaemonUrl } from '../../config.js';
|
|
35
36
|
import { resolveContextUserId } from '../base/context-user.js';
|
|
@@ -62,19 +63,24 @@ function toCodexReasoningEffort(effort) {
|
|
|
62
63
|
* clears the prompt.
|
|
63
64
|
*/
|
|
64
65
|
const MCP_AUTO_APPROVE = { default_tools_approval_mode: 'approve' };
|
|
66
|
+
const GATEWAY_MCP_STARTUP_TIMEOUT_MS = 30_000;
|
|
65
67
|
const DEBUG_CODEX = process.env.AGOR_DEBUG_CODEX === '1' || process.env.DEBUG?.includes('codex');
|
|
66
68
|
function codexDebug(...args) {
|
|
67
69
|
if (DEBUG_CODEX) {
|
|
68
70
|
console.debug(...args);
|
|
69
71
|
}
|
|
70
72
|
}
|
|
73
|
+
function applyGatewayMcpStartupGuard(config, requireMcpServers) {
|
|
74
|
+
if (!requireMcpServers)
|
|
75
|
+
return;
|
|
76
|
+
config.required = true;
|
|
77
|
+
config.startup_timeout_ms = GATEWAY_MCP_STARTUP_TIMEOUT_MS;
|
|
78
|
+
}
|
|
71
79
|
export class CodexPromptService {
|
|
72
80
|
sessionsRepo;
|
|
73
81
|
sessionMCPServerRepo;
|
|
74
82
|
branchesRepo;
|
|
75
|
-
reposRepo;
|
|
76
83
|
mcpServerRepo;
|
|
77
|
-
usersRepo;
|
|
78
84
|
tasksService;
|
|
79
85
|
codex;
|
|
80
86
|
lastApiKey = null;
|
|
@@ -98,13 +104,11 @@ export class CodexPromptService {
|
|
|
98
104
|
const raw = process.env.OPENAI_BASE_URL?.trim();
|
|
99
105
|
return raw && raw.length > 0 ? raw : undefined;
|
|
100
106
|
}
|
|
101
|
-
constructor(_messagesRepo, sessionsRepo, sessionMCPServerRepo, branchesRepo,
|
|
107
|
+
constructor(_messagesRepo, sessionsRepo, sessionMCPServerRepo, branchesRepo, _reposRepo, apiKey, mcpServerRepo, _usersRepo, useNativeAuth = false, tasksService) {
|
|
102
108
|
this.sessionsRepo = sessionsRepo;
|
|
103
109
|
this.sessionMCPServerRepo = sessionMCPServerRepo;
|
|
104
110
|
this.branchesRepo = branchesRepo;
|
|
105
|
-
this.reposRepo = reposRepo;
|
|
106
111
|
this.mcpServerRepo = mcpServerRepo;
|
|
107
|
-
this.usersRepo = usersRepo;
|
|
108
112
|
this.tasksService = tasksService;
|
|
109
113
|
// Store API key from base-executor (already resolved with proper precedence)
|
|
110
114
|
this.apiKey = apiKey || '';
|
|
@@ -126,10 +130,11 @@ export class CodexPromptService {
|
|
|
126
130
|
if (baseUrl) {
|
|
127
131
|
codexDebug(`🔗 [Codex] Using custom OPENAI_BASE_URL`);
|
|
128
132
|
}
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
// MCP
|
|
132
|
-
|
|
133
|
+
// Do not construct the Codex SDK client until promptSessionStreaming has
|
|
134
|
+
// resolved the session-scoped config (instructions file + MCP servers).
|
|
135
|
+
// Constructing here with no MCP config and then replacing it moments later
|
|
136
|
+
// makes the SDK/app-server briefly start with the wrong lifecycle, which is
|
|
137
|
+
// visible as MCP disconnect/reconnect waves in gateway-driven turns.
|
|
133
138
|
this.lastClientFingerprint = null;
|
|
134
139
|
// Best-effort sweep of orphaned per-session instructions files in
|
|
135
140
|
// tmpdir. `closeSession()` removes a session's file when called, but
|
|
@@ -235,13 +240,12 @@ export class CodexPromptService {
|
|
|
235
240
|
const currentBaseUrl = this.resolveBaseUrl();
|
|
236
241
|
const baseUrlChanged = (this.lastBaseUrl ?? null) !== (currentBaseUrl ?? null);
|
|
237
242
|
if (this.lastApiKey !== currentApiKey || baseUrlChanged) {
|
|
238
|
-
console.log(`🔄 [Codex] ${this.lastApiKey !== currentApiKey ? 'API key' : 'Base URL'} changed,
|
|
239
|
-
this.codex = new Codex.Codex(this.buildCodexOptions(currentApiKey, currentBaseUrl, undefined));
|
|
243
|
+
console.log(`🔄 [Codex] ${this.lastApiKey !== currentApiKey ? 'API key' : 'Base URL'} changed, invalidating SDK client...`);
|
|
240
244
|
this.apiKey = currentApiKey;
|
|
241
245
|
this.lastApiKey = currentApiKey;
|
|
242
246
|
this.lastBaseUrl = currentBaseUrl ?? null;
|
|
243
247
|
this.lastClientFingerprint = null;
|
|
244
|
-
console.log('✅ [Codex] SDK
|
|
248
|
+
console.log('✅ [Codex] SDK configuration invalidated');
|
|
245
249
|
}
|
|
246
250
|
}
|
|
247
251
|
/**
|
|
@@ -274,7 +278,7 @@ export class CodexPromptService {
|
|
|
274
278
|
* rotated MCP bearer tokens invalidate the cache even when the config
|
|
275
279
|
* shape stays the same — see `snapshotMcpEnvValues()`.
|
|
276
280
|
*/
|
|
277
|
-
ensureCodexClient(config) {
|
|
281
|
+
async ensureCodexClient(config) {
|
|
278
282
|
const baseUrl = this.resolveBaseUrl();
|
|
279
283
|
const fingerprint = JSON.stringify({
|
|
280
284
|
apiKey: this.apiKey || '',
|
|
@@ -287,13 +291,45 @@ export class CodexPromptService {
|
|
|
287
291
|
return;
|
|
288
292
|
}
|
|
289
293
|
codexDebug(`🔄 [Codex] Per-session config changed, reinitializing SDK (apiKey=${this.apiKey ? 'set' : 'unset'}, useNativeAuth=${this.useNativeAuth})`);
|
|
290
|
-
this.
|
|
294
|
+
await this.replaceCodexClient(this.buildCodexOptions(this.apiKey, baseUrl, config));
|
|
291
295
|
this.lastApiKey = this.apiKey || null;
|
|
292
296
|
this.lastBaseUrl = baseUrl ?? null;
|
|
293
297
|
this.lastClientFingerprint = fingerprint;
|
|
294
298
|
}
|
|
295
299
|
/**
|
|
296
|
-
*
|
|
300
|
+
* Best-effort close for SDK clients that expose a lifecycle method. The
|
|
301
|
+
* current Codex SDK API has changed over time, so probe common method names
|
|
302
|
+
* rather than depending on one concrete type. Awaiting close before replacement
|
|
303
|
+
* keeps abandoned app-server/MCP transports from overlapping the new client.
|
|
304
|
+
*/
|
|
305
|
+
async closeCodexClient(client) {
|
|
306
|
+
if (!client)
|
|
307
|
+
return;
|
|
308
|
+
const candidate = client;
|
|
309
|
+
const close = candidate.close ?? candidate.dispose ?? candidate.shutdown;
|
|
310
|
+
if (!close)
|
|
311
|
+
return;
|
|
312
|
+
try {
|
|
313
|
+
await Promise.resolve(close.call(candidate));
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
console.warn('⚠️ [Codex] Failed to close previous SDK client:', error);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async replaceCodexClient(options) {
|
|
320
|
+
const previous = this.codex;
|
|
321
|
+
this.codex = undefined;
|
|
322
|
+
await this.closeCodexClient(previous);
|
|
323
|
+
this.codex = new Codex.Codex(options);
|
|
324
|
+
}
|
|
325
|
+
getCodexClient() {
|
|
326
|
+
if (!this.codex) {
|
|
327
|
+
throw new Error('Codex SDK client was not initialized before use');
|
|
328
|
+
}
|
|
329
|
+
return this.codex;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Write the rendered static Agor orientation prompt to a single file under
|
|
297
333
|
* `os.tmpdir()` and return its absolute path.
|
|
298
334
|
*
|
|
299
335
|
* Replaces the per-session CODEX_HOME directory + AGENTS.md mechanism — we
|
|
@@ -304,12 +340,7 @@ export class CodexPromptService {
|
|
|
304
340
|
* config.toml stay where they are.
|
|
305
341
|
*/
|
|
306
342
|
async ensureCodexInstructionsFile(sessionId) {
|
|
307
|
-
const agorSystemPrompt = await renderAgorSystemPrompt(
|
|
308
|
-
sessions: this.sessionsRepo,
|
|
309
|
-
branches: this.branchesRepo,
|
|
310
|
-
repos: this.reposRepo,
|
|
311
|
-
users: this.usersRepo,
|
|
312
|
-
});
|
|
343
|
+
const agorSystemPrompt = await renderAgorSystemPrompt();
|
|
313
344
|
const fileName = `agor-codex-instructions-${sessionId}.md`;
|
|
314
345
|
// Try /tmp first; fall back to ~/.agor/tmp if /tmp is unavailable
|
|
315
346
|
// (sandboxed executors / containers without /tmp).
|
|
@@ -371,7 +402,7 @@ export class CodexPromptService {
|
|
|
371
402
|
* scoping layer — without it, OAuth-protected MCP servers won't pick up
|
|
372
403
|
* the requesting user's stored OAuth tokens.
|
|
373
404
|
*/
|
|
374
|
-
async buildMcpServersConfig(sessionId, mcpToken, forUserId) {
|
|
405
|
+
async buildMcpServersConfig(sessionId, mcpToken, forUserId, requireMcpServers = false) {
|
|
375
406
|
codexDebug(`🔍 [Codex MCP] Fetching MCP servers for session ${shortId(sessionId)}...`);
|
|
376
407
|
codexDebug(` [Codex MCP] forUserId: ${forUserId || 'NOT SET'}`);
|
|
377
408
|
const serversWithSource = await getMcpServersForSession(sessionId, {
|
|
@@ -399,14 +430,15 @@ export class CodexPromptService {
|
|
|
399
430
|
result.agor = {
|
|
400
431
|
url: `${daemonUrl}/mcp`,
|
|
401
432
|
bearer_token_env_var: agorBearerEnvVar,
|
|
402
|
-
required: false,
|
|
403
433
|
...MCP_AUTO_APPROVE,
|
|
404
434
|
};
|
|
435
|
+
applyGatewayMcpStartupGuard(result.agor, requireMcpServers);
|
|
405
436
|
codexDebug(` 📝 [Codex MCP] Configuring built-in Agor MCP server (HTTP) at ${daemonUrl}/mcp`);
|
|
406
437
|
}
|
|
407
438
|
for (const server of stdioServers) {
|
|
408
439
|
const serverName = this.claimMcpServerName(server.name, claimedNames, server.name.toLowerCase() === 'agor' ? 'conflicts with built-in Agor MCP server' : undefined);
|
|
409
440
|
const serverConfig = { ...MCP_AUTO_APPROVE };
|
|
441
|
+
applyGatewayMcpStartupGuard(serverConfig, requireMcpServers);
|
|
410
442
|
codexDebug(` 📝 [Codex MCP] Configuring STDIO server: ${server.name} -> ${serverName}`);
|
|
411
443
|
if (server.command) {
|
|
412
444
|
serverConfig.command = server.command;
|
|
@@ -425,6 +457,7 @@ export class CodexPromptService {
|
|
|
425
457
|
for (const server of httpServers) {
|
|
426
458
|
const serverName = this.claimMcpServerName(server.name, claimedNames, server.name.toLowerCase() === 'agor' ? 'conflicts with built-in Agor MCP server' : undefined);
|
|
427
459
|
const serverConfig = { ...MCP_AUTO_APPROVE };
|
|
460
|
+
let canRequireServer = requireMcpServers;
|
|
428
461
|
codexDebug(` 📝 [Codex MCP] Configuring HTTP server: ${server.name} -> ${serverName}`);
|
|
429
462
|
if (server.url) {
|
|
430
463
|
serverConfig.url = server.url;
|
|
@@ -440,6 +473,7 @@ export class CodexPromptService {
|
|
|
440
473
|
const authHeaders = await resolveMCPAuthHeaders(server.auth, server.url);
|
|
441
474
|
const headers = mergeMCPRemoteHeaders({ custom: server.headers, auth: authHeaders });
|
|
442
475
|
const authHeader = headers?.Authorization;
|
|
476
|
+
const missingRequiredAuth = !!server.auth && server.auth.type !== 'none' && !authHeader;
|
|
443
477
|
const customHeaders = headers ? { ...headers } : undefined;
|
|
444
478
|
if (customHeaders)
|
|
445
479
|
delete customHeaders.Authorization;
|
|
@@ -456,17 +490,24 @@ export class CodexPromptService {
|
|
|
456
490
|
codexDebug(` auth: ${server.auth?.type ?? 'bearer'} token via ${envVarName}`);
|
|
457
491
|
}
|
|
458
492
|
else {
|
|
493
|
+
canRequireServer = false;
|
|
459
494
|
console.warn(` ⚠️ auth: resolved Authorization header for "${server.name}" is not a Bearer scheme (Codex CLI only supports bearer); skipping injection`);
|
|
460
495
|
}
|
|
461
496
|
}
|
|
462
|
-
else if (
|
|
463
|
-
|
|
464
|
-
console.warn(`
|
|
497
|
+
else if (missingRequiredAuth) {
|
|
498
|
+
canRequireServer = false;
|
|
499
|
+
console.warn(` ⚠️ [Codex MCP] Server "${server.name}" has configured auth but no valid token found.`);
|
|
500
|
+
const action = server.auth?.type === 'oauth'
|
|
501
|
+
? `Start OAuth Flow for ${server.name}`
|
|
502
|
+
: `check credentials for ${server.name}`;
|
|
503
|
+
console.warn(` 💡 Go to Settings → MCP Servers → ${action}.`);
|
|
465
504
|
}
|
|
466
505
|
}
|
|
467
506
|
catch (error) {
|
|
468
507
|
console.warn(` ⚠️ [Codex MCP] Failed to resolve auth headers for "${server.name}":`, error instanceof Error ? error.message : String(error));
|
|
508
|
+
canRequireServer = false;
|
|
469
509
|
}
|
|
510
|
+
applyGatewayMcpStartupGuard(serverConfig, canRequireServer);
|
|
470
511
|
result[serverName] = serverConfig;
|
|
471
512
|
}
|
|
472
513
|
const total = stdioServers.length + httpServers.length + (mcpToken ? 1 : 0);
|
|
@@ -684,14 +725,15 @@ export class CodexPromptService {
|
|
|
684
725
|
taskId,
|
|
685
726
|
tasksService: this.tasksService,
|
|
686
727
|
});
|
|
687
|
-
const
|
|
728
|
+
const requireMcpServers = isGatewaySession(session);
|
|
729
|
+
const { servers: mcpServersConfig, total: mcpServerCount } = await this.buildMcpServersConfig(sessionId, mcpToken, forUserId, requireMcpServers);
|
|
688
730
|
const codexConfigPayload = {
|
|
689
731
|
model_instructions_file: instructionsFile,
|
|
690
732
|
...(Object.keys(mcpServersConfig).length > 0 ? { mcp_servers: mcpServersConfig } : {}),
|
|
691
733
|
};
|
|
692
734
|
// Recreate Codex instance only if the per-session config payload (or
|
|
693
735
|
// apiKey/baseUrl) actually changed — issue #133 protection.
|
|
694
|
-
this.ensureCodexClient(codexConfigPayload);
|
|
736
|
+
await this.ensureCodexClient(codexConfigPayload);
|
|
695
737
|
codexDebug(` Configured: sandboxMode=${sandboxMode}, approvalPolicy=${approvalPolicy}, networkAccess=${networkAccess}, ${mcpServerCount} MCP server(s)`);
|
|
696
738
|
// Fetch branch to get working directory
|
|
697
739
|
const branch = this.branchesRepo ? await this.branchesRepo.findById(session.branch_id) : null;
|
|
@@ -756,7 +798,7 @@ export class CodexPromptService {
|
|
|
756
798
|
let thread;
|
|
757
799
|
if (session.sdk_session_id) {
|
|
758
800
|
codexDebug(`🔄 [Codex] Resuming thread: ${session.sdk_session_id}`);
|
|
759
|
-
thread = this.
|
|
801
|
+
thread = this.getCodexClient().resumeThread(session.sdk_session_id, threadOptions);
|
|
760
802
|
// If approval policy changed, send slash command to update thread settings
|
|
761
803
|
if (approvalPolicyChanged) {
|
|
762
804
|
console.log(`⚙️ [Codex] Approval policy changed: ${previousApprovalPolicy} → ${approvalPolicy}`);
|
|
@@ -781,7 +823,7 @@ export class CodexPromptService {
|
|
|
781
823
|
if (mcpServerCount > 0) {
|
|
782
824
|
codexDebug(`✅ [Codex MCP] New thread will have ${mcpServerCount} MCP server(s) available via --config flags`);
|
|
783
825
|
}
|
|
784
|
-
thread = this.
|
|
826
|
+
thread = this.getCodexClient().startThread(threadOptions);
|
|
785
827
|
}
|
|
786
828
|
try {
|
|
787
829
|
codexDebug(`▶️ [Codex] Running prompt: "${prompt.substring(0, 50)}${prompt.length > 50 ? '...' : ''}"`);
|