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
|
@@ -187,15 +187,19 @@ var init_unix_group_init = __esm({
|
|
|
187
187
|
|
|
188
188
|
// src/services/branches.ts
|
|
189
189
|
import { existsSync as existsSync2 } from "fs";
|
|
190
|
-
import { mkdir } from "fs/promises";
|
|
191
|
-
import { homedir } from "os";
|
|
192
|
-
import { dirname, join } from "path";
|
|
193
190
|
import { analyticsLogger } from "@agor/core/analytics";
|
|
194
|
-
import {
|
|
191
|
+
import {
|
|
192
|
+
createUserProcessEnvironment,
|
|
193
|
+
ENVIRONMENT,
|
|
194
|
+
isBranchRbacEnabled,
|
|
195
|
+
loadConfig,
|
|
196
|
+
PAGINATION
|
|
197
|
+
} from "@agor/core/config";
|
|
195
198
|
import {
|
|
196
199
|
BoardRepository,
|
|
197
200
|
BranchRepository as BranchRepository2,
|
|
198
|
-
KnowledgeNamespaceRepository as KnowledgeNamespaceRepository2
|
|
201
|
+
KnowledgeNamespaceRepository as KnowledgeNamespaceRepository2,
|
|
202
|
+
UsersRepository as UsersRepository2
|
|
199
203
|
} from "@agor/core/db";
|
|
200
204
|
import { renderBranchSnapshot } from "@agor/core/environment/render-snapshot";
|
|
201
205
|
import {
|
|
@@ -208,7 +212,11 @@ import {
|
|
|
208
212
|
import { BadRequest, Forbidden as Forbidden2, NotAuthenticated as NotAuthenticated2 } from "@agor/core/feathers";
|
|
209
213
|
import { stripGitUrlCredentials } from "@agor/core/git";
|
|
210
214
|
import { getAssistantConfig as getAssistantConfig2, isAssistant as isAssistant3 } from "@agor/core/types";
|
|
211
|
-
import {
|
|
215
|
+
import {
|
|
216
|
+
getGidFromGroupName,
|
|
217
|
+
resolveUnixUserForImpersonation,
|
|
218
|
+
validateResolvedUnixUser
|
|
219
|
+
} from "@agor/core/unix";
|
|
212
220
|
import { resolveHostIpAddress } from "@agor/core/utils/host-ip";
|
|
213
221
|
import { isAllowedHealthCheckUrl } from "@agor/core/utils/url";
|
|
214
222
|
|
|
@@ -624,19 +632,19 @@ function generateTaskId() {
|
|
|
624
632
|
return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
625
633
|
}
|
|
626
634
|
function findExecutorPath() {
|
|
627
|
-
const
|
|
635
|
+
const dirname = typeof __dirname !== "undefined" ? __dirname : path.dirname(fileURLToPath(import.meta.url));
|
|
628
636
|
const possiblePaths = [
|
|
629
|
-
path.join(
|
|
637
|
+
path.join(dirname, "../executor/cli.js"),
|
|
630
638
|
// Bundled in agor-live
|
|
631
|
-
path.join(
|
|
639
|
+
path.join(dirname, "../../executor/cli.js"),
|
|
632
640
|
// Bundled one level up
|
|
633
|
-
path.join(
|
|
641
|
+
path.join(dirname, "../../../packages/executor/bin/agor-executor"),
|
|
634
642
|
// Development - bin script
|
|
635
|
-
path.join(
|
|
643
|
+
path.join(dirname, "../../../packages/executor/dist/cli.js"),
|
|
636
644
|
// Development - built dist
|
|
637
|
-
path.join(
|
|
645
|
+
path.join(dirname, "../../../../packages/executor/bin/agor-executor"),
|
|
638
646
|
// Development from deeper nesting
|
|
639
|
-
path.join(
|
|
647
|
+
path.join(dirname, "../../../../packages/executor/dist/cli.js")
|
|
640
648
|
// Development from deeper nesting
|
|
641
649
|
];
|
|
642
650
|
const executorPath = possiblePaths.find((p) => existsSync(p));
|
|
@@ -796,6 +804,263 @@ function spawnExecutorWithTemplate(payload, options) {
|
|
|
796
804
|
executorProcess.stdin?.write(JSON.stringify(payload));
|
|
797
805
|
executorProcess.stdin?.end();
|
|
798
806
|
}
|
|
807
|
+
var EXECUTOR_RESULT_PREFIX = "AGOR_EXECUTOR_RESULT ";
|
|
808
|
+
function parseExecutorResultFromStdout(stdout) {
|
|
809
|
+
const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
810
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
811
|
+
const line = lines[i];
|
|
812
|
+
const resultJson = line.startsWith(EXECUTOR_RESULT_PREFIX) ? line.slice(EXECUTOR_RESULT_PREFIX.length) : line.startsWith("{") && line.endsWith("}") ? line : null;
|
|
813
|
+
if (!resultJson) continue;
|
|
814
|
+
try {
|
|
815
|
+
const parsed = JSON.parse(resultJson);
|
|
816
|
+
if (parsed && typeof parsed === "object" && "success" in parsed) {
|
|
817
|
+
return parsed;
|
|
818
|
+
}
|
|
819
|
+
} catch {
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
return null;
|
|
823
|
+
}
|
|
824
|
+
function logChunkedOutput(prefix, stream, chunk) {
|
|
825
|
+
const text = chunk.toString();
|
|
826
|
+
for (const line of text.split(/\r?\n/)) {
|
|
827
|
+
if (!line.trim()) continue;
|
|
828
|
+
if (line.trim().startsWith(EXECUTOR_RESULT_PREFIX)) continue;
|
|
829
|
+
if (stream === "stdout") {
|
|
830
|
+
if (process.env.AGOR_EXECUTOR_DEBUG_STDOUT === "1") {
|
|
831
|
+
console.log(`${prefix} ${line}`);
|
|
832
|
+
}
|
|
833
|
+
} else {
|
|
834
|
+
console.error(`${prefix} ${line}`);
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
async function runExecutorCommand(payload, options = {}) {
|
|
839
|
+
const { templateVariables, logPrefix = "[Executor]", timeoutMs = 6e4 } = options;
|
|
840
|
+
const executorCommandTemplate = options.executorCommandTemplate !== void 0 ? options.executorCommandTemplate || void 0 : configuredExecutorDefaults.executorCommandTemplate;
|
|
841
|
+
const asUser = options.asUser !== void 0 ? options.asUser || void 0 : configuredExecutorDefaults.asUser;
|
|
842
|
+
const payloadWithConfig = withResolvedConfig(payload);
|
|
843
|
+
if (executorCommandTemplate) {
|
|
844
|
+
return runExecutorCommandWithTemplate(payloadWithConfig, {
|
|
845
|
+
...options,
|
|
846
|
+
timeoutMs,
|
|
847
|
+
asUser,
|
|
848
|
+
executorCommandTemplate,
|
|
849
|
+
templateVariables: {
|
|
850
|
+
command: payloadWithConfig.command,
|
|
851
|
+
task_id: generateTaskId(),
|
|
852
|
+
unix_user: asUser,
|
|
853
|
+
log_level: resolveExecutorLogLevel(options.env ?? process.env),
|
|
854
|
+
...templateVariables
|
|
855
|
+
},
|
|
856
|
+
logPrefix
|
|
857
|
+
});
|
|
858
|
+
}
|
|
859
|
+
return runExecutorCommandLocal(payloadWithConfig, { ...options, timeoutMs, asUser, logPrefix });
|
|
860
|
+
}
|
|
861
|
+
function runExecutorCommandLocal(payload, options) {
|
|
862
|
+
const executorPath = findExecutorPath();
|
|
863
|
+
const executorDir = path.dirname(path.dirname(executorPath));
|
|
864
|
+
const {
|
|
865
|
+
cwd = executorDir,
|
|
866
|
+
env = process.env,
|
|
867
|
+
logPrefix = "[Executor]",
|
|
868
|
+
asUser: rawAsUser,
|
|
869
|
+
preparedEnv,
|
|
870
|
+
preparedEnvFilePath,
|
|
871
|
+
timeoutMs = 6e4
|
|
872
|
+
} = options;
|
|
873
|
+
const asUser = rawAsUser || void 0;
|
|
874
|
+
if (cwd && !existsSync(cwd)) {
|
|
875
|
+
return Promise.resolve({
|
|
876
|
+
success: false,
|
|
877
|
+
error: {
|
|
878
|
+
code: "EXECUTOR_CWD_MISSING",
|
|
879
|
+
message: `Refusing to spawn: cwd does not exist on disk: ${cwd}`
|
|
880
|
+
}
|
|
881
|
+
});
|
|
882
|
+
}
|
|
883
|
+
const daemonUrl = getDaemonUrl();
|
|
884
|
+
const envWithDaemonUrl = preparedEnv ? withDaemonExecutorEnv(preparedEnv, daemonUrl) : asUser ? withDaemonExecutorEnv(
|
|
885
|
+
Object.fromEntries(
|
|
886
|
+
Object.entries({
|
|
887
|
+
PATH: env.PATH || "/usr/local/bin:/usr/bin:/bin",
|
|
888
|
+
NODE_ENV: env.NODE_ENV,
|
|
889
|
+
LOG_LEVEL: env.LOG_LEVEL,
|
|
890
|
+
ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY,
|
|
891
|
+
ANTHROPIC_AUTH_TOKEN: env.ANTHROPIC_AUTH_TOKEN,
|
|
892
|
+
ANTHROPIC_BASE_URL: env.ANTHROPIC_BASE_URL,
|
|
893
|
+
CLAUDE_CODE_OAUTH_TOKEN: env.CLAUDE_CODE_OAUTH_TOKEN,
|
|
894
|
+
OPENAI_API_KEY: env.OPENAI_API_KEY,
|
|
895
|
+
OPENAI_BASE_URL: env.OPENAI_BASE_URL,
|
|
896
|
+
GEMINI_API_KEY: env.GEMINI_API_KEY,
|
|
897
|
+
GOOGLE_API_KEY: env.GOOGLE_API_KEY,
|
|
898
|
+
GIT_CONFIG_PARAMETERS: env.GIT_CONFIG_PARAMETERS
|
|
899
|
+
}).filter(([_, v]) => v !== void 0)
|
|
900
|
+
),
|
|
901
|
+
daemonUrl
|
|
902
|
+
) : withDaemonExecutorEnv(env, daemonUrl);
|
|
903
|
+
const prepared = asUser ? preparedEnvFilePath ? {
|
|
904
|
+
inlineEnv: Object.fromEntries(
|
|
905
|
+
Object.entries(envWithDaemonUrl).filter(([k]) => !isSecretEnvKey(k))
|
|
906
|
+
),
|
|
907
|
+
envFilePath: preparedEnvFilePath
|
|
908
|
+
} : prepareImpersonationEnv({ asUser, env: envWithDaemonUrl }) : { inlineEnv: void 0, envFilePath: void 0 };
|
|
909
|
+
const { cmd, args } = buildSpawnArgs("node", [executorPath, "--stdin"], {
|
|
910
|
+
asUser,
|
|
911
|
+
env: asUser ? prepared.inlineEnv : void 0,
|
|
912
|
+
envFilePath: prepared.envFilePath
|
|
913
|
+
});
|
|
914
|
+
console.log(`${logPrefix} Running executor command: ${payload.command ?? "?"}`);
|
|
915
|
+
return new Promise((resolve) => {
|
|
916
|
+
let stdout = "";
|
|
917
|
+
let stderr = "";
|
|
918
|
+
let settled = false;
|
|
919
|
+
const child = spawn(cmd, args, {
|
|
920
|
+
cwd,
|
|
921
|
+
env: asUser ? void 0 : { ...envWithDaemonUrl },
|
|
922
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
923
|
+
detached: false
|
|
924
|
+
});
|
|
925
|
+
attachEnvFileCleanup(child, { envFilePath: prepared.envFilePath, asUser });
|
|
926
|
+
const timer = setTimeout(() => {
|
|
927
|
+
if (settled) return;
|
|
928
|
+
settled = true;
|
|
929
|
+
child.kill("SIGTERM");
|
|
930
|
+
resolve({
|
|
931
|
+
success: false,
|
|
932
|
+
error: {
|
|
933
|
+
code: "EXECUTOR_TIMEOUT",
|
|
934
|
+
message: `Executor command timed out after ${timeoutMs}ms`,
|
|
935
|
+
details: { command: payload.command }
|
|
936
|
+
}
|
|
937
|
+
});
|
|
938
|
+
}, timeoutMs);
|
|
939
|
+
child.stdout?.on("data", (chunk) => {
|
|
940
|
+
stdout += chunk.toString();
|
|
941
|
+
logChunkedOutput(logPrefix, "stdout", chunk);
|
|
942
|
+
});
|
|
943
|
+
child.stderr?.on("data", (chunk) => {
|
|
944
|
+
stderr += chunk.toString();
|
|
945
|
+
logChunkedOutput(logPrefix, "stderr", chunk);
|
|
946
|
+
});
|
|
947
|
+
child.on("error", (error) => {
|
|
948
|
+
if (settled) return;
|
|
949
|
+
settled = true;
|
|
950
|
+
clearTimeout(timer);
|
|
951
|
+
resolve({
|
|
952
|
+
success: false,
|
|
953
|
+
error: {
|
|
954
|
+
code: "EXECUTOR_SPAWN_ERROR",
|
|
955
|
+
message: error.message,
|
|
956
|
+
details: { command: payload.command }
|
|
957
|
+
}
|
|
958
|
+
});
|
|
959
|
+
});
|
|
960
|
+
child.on("exit", (code) => {
|
|
961
|
+
if (settled) return;
|
|
962
|
+
settled = true;
|
|
963
|
+
clearTimeout(timer);
|
|
964
|
+
const result = parseExecutorResultFromStdout(stdout);
|
|
965
|
+
if (result) {
|
|
966
|
+
resolve(result);
|
|
967
|
+
return;
|
|
968
|
+
}
|
|
969
|
+
resolve({
|
|
970
|
+
success: false,
|
|
971
|
+
error: {
|
|
972
|
+
code: "EXECUTOR_RESULT_MISSING",
|
|
973
|
+
message: `Executor exited with code ${code} but did not emit a JSON result`,
|
|
974
|
+
details: {
|
|
975
|
+
command: payload.command,
|
|
976
|
+
exitCode: code,
|
|
977
|
+
stderr: stderr ? "[redacted; enable executor debug logs]" : ""
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
});
|
|
981
|
+
});
|
|
982
|
+
child.stdin?.write(JSON.stringify(payload));
|
|
983
|
+
child.stdin?.end();
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
function runExecutorCommandWithTemplate(payload, options) {
|
|
987
|
+
const {
|
|
988
|
+
executorCommandTemplate,
|
|
989
|
+
templateVariables,
|
|
990
|
+
logPrefix = "[Executor]",
|
|
991
|
+
timeoutMs = 6e4
|
|
992
|
+
} = options;
|
|
993
|
+
const logLevel = templateVariables.log_level ?? getCurrentLogLevel();
|
|
994
|
+
const command = substituteTemplateVariables(executorCommandTemplate, templateVariables);
|
|
995
|
+
console.log(`${logPrefix} Running templated executor command: ${payload.command ?? "?"}`);
|
|
996
|
+
return new Promise((resolve) => {
|
|
997
|
+
let stdout = "";
|
|
998
|
+
let stderr = "";
|
|
999
|
+
let settled = false;
|
|
1000
|
+
const child = spawn("sh", ["-c", command], {
|
|
1001
|
+
env: { ...process.env, LOG_LEVEL: logLevel },
|
|
1002
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
1003
|
+
});
|
|
1004
|
+
const timer = setTimeout(() => {
|
|
1005
|
+
if (settled) return;
|
|
1006
|
+
settled = true;
|
|
1007
|
+
child.kill("SIGTERM");
|
|
1008
|
+
resolve({
|
|
1009
|
+
success: false,
|
|
1010
|
+
error: {
|
|
1011
|
+
code: "EXECUTOR_TIMEOUT",
|
|
1012
|
+
message: `Executor command timed out after ${timeoutMs}ms`,
|
|
1013
|
+
details: { command: payload.command, taskId: templateVariables.task_id }
|
|
1014
|
+
}
|
|
1015
|
+
});
|
|
1016
|
+
}, timeoutMs);
|
|
1017
|
+
child.stdout?.on("data", (chunk) => {
|
|
1018
|
+
stdout += chunk.toString();
|
|
1019
|
+
logChunkedOutput(logPrefix, "stdout", chunk);
|
|
1020
|
+
});
|
|
1021
|
+
child.stderr?.on("data", (chunk) => {
|
|
1022
|
+
stderr += chunk.toString();
|
|
1023
|
+
logChunkedOutput(logPrefix, "stderr", chunk);
|
|
1024
|
+
});
|
|
1025
|
+
child.on("error", (error) => {
|
|
1026
|
+
if (settled) return;
|
|
1027
|
+
settled = true;
|
|
1028
|
+
clearTimeout(timer);
|
|
1029
|
+
resolve({
|
|
1030
|
+
success: false,
|
|
1031
|
+
error: {
|
|
1032
|
+
code: "EXECUTOR_SPAWN_ERROR",
|
|
1033
|
+
message: error.message,
|
|
1034
|
+
details: { command: payload.command, taskId: templateVariables.task_id }
|
|
1035
|
+
}
|
|
1036
|
+
});
|
|
1037
|
+
});
|
|
1038
|
+
child.on("exit", (code) => {
|
|
1039
|
+
if (settled) return;
|
|
1040
|
+
settled = true;
|
|
1041
|
+
clearTimeout(timer);
|
|
1042
|
+
const result = parseExecutorResultFromStdout(stdout);
|
|
1043
|
+
if (result) {
|
|
1044
|
+
resolve(result);
|
|
1045
|
+
return;
|
|
1046
|
+
}
|
|
1047
|
+
resolve({
|
|
1048
|
+
success: false,
|
|
1049
|
+
error: {
|
|
1050
|
+
code: "EXECUTOR_RESULT_MISSING",
|
|
1051
|
+
message: `Executor exited with code ${code} but did not emit a JSON result`,
|
|
1052
|
+
details: {
|
|
1053
|
+
command: payload.command,
|
|
1054
|
+
exitCode: code,
|
|
1055
|
+
stderr: stderr ? "[redacted; enable executor debug logs]" : ""
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
});
|
|
1059
|
+
});
|
|
1060
|
+
child.stdin?.write(JSON.stringify(payload));
|
|
1061
|
+
child.stdin?.end();
|
|
1062
|
+
});
|
|
1063
|
+
}
|
|
799
1064
|
function getDaemonUrl() {
|
|
800
1065
|
if (configuredDaemonUrl) return configuredDaemonUrl;
|
|
801
1066
|
return `http://localhost:${process.env.PORT || "3030"}`;
|
|
@@ -1060,6 +1325,136 @@ var BranchesService = class extends DrizzleService {
|
|
|
1060
1325
|
truncated
|
|
1061
1326
|
};
|
|
1062
1327
|
}
|
|
1328
|
+
async resolveEnvironmentExecutorContext(branch) {
|
|
1329
|
+
const config = await loadConfig();
|
|
1330
|
+
const unixUserMode = config.execution?.unix_user_mode ?? "simple";
|
|
1331
|
+
let asUser;
|
|
1332
|
+
if (unixUserMode !== "simple") {
|
|
1333
|
+
const usersRepo = new UsersRepository2(this.db);
|
|
1334
|
+
const user = await usersRepo.findById(branch.created_by);
|
|
1335
|
+
const impersonationResult = resolveUnixUserForImpersonation({
|
|
1336
|
+
mode: unixUserMode,
|
|
1337
|
+
userUnixUsername: user?.unix_username,
|
|
1338
|
+
executorUnixUser: config.execution?.executor_unix_user
|
|
1339
|
+
});
|
|
1340
|
+
asUser = impersonationResult.unixUser ?? void 0;
|
|
1341
|
+
if (asUser) {
|
|
1342
|
+
validateResolvedUnixUser(unixUserMode, asUser);
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
const env = await createUserProcessEnvironment(branch.created_by, this.db, void 0, !!asUser);
|
|
1346
|
+
return { asUser, env };
|
|
1347
|
+
}
|
|
1348
|
+
async createEnvironmentExecutorPayload(options) {
|
|
1349
|
+
const { branch, action, params } = options;
|
|
1350
|
+
const userId = params?.user?.user_id ?? branch.created_by;
|
|
1351
|
+
const appWithToken = this.app;
|
|
1352
|
+
const sessionToken = await appWithToken.sessionTokenService?.generateToken(
|
|
1353
|
+
`environment-${action}`,
|
|
1354
|
+
userId,
|
|
1355
|
+
{ branchId: branch.branch_id, maxUses: -1 }
|
|
1356
|
+
);
|
|
1357
|
+
if (!sessionToken) {
|
|
1358
|
+
throw new Error(`Session token service unavailable; cannot dispatch environment ${action}`);
|
|
1359
|
+
}
|
|
1360
|
+
const { asUser, env } = await this.resolveEnvironmentExecutorContext(branch);
|
|
1361
|
+
return {
|
|
1362
|
+
asUser,
|
|
1363
|
+
env,
|
|
1364
|
+
payload: {
|
|
1365
|
+
command: "environment.lifecycle",
|
|
1366
|
+
sessionToken,
|
|
1367
|
+
daemonUrl: getDaemonUrl(),
|
|
1368
|
+
env,
|
|
1369
|
+
params: {
|
|
1370
|
+
branchId: branch.branch_id,
|
|
1371
|
+
branchPath: branch.path,
|
|
1372
|
+
action,
|
|
1373
|
+
startCommand: branch.start_command,
|
|
1374
|
+
stopCommand: branch.stop_command,
|
|
1375
|
+
nukeCommand: branch.nuke_command,
|
|
1376
|
+
appUrl: branch.app_url
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
};
|
|
1380
|
+
}
|
|
1381
|
+
async dispatchEnvironmentExecutor(options) {
|
|
1382
|
+
const { branch, action } = options;
|
|
1383
|
+
const { payload, asUser, env } = await this.createEnvironmentExecutorPayload(options);
|
|
1384
|
+
spawnExecutor(payload, {
|
|
1385
|
+
logPrefix: `[Environment.${action} ${branch.name}]`,
|
|
1386
|
+
asUser,
|
|
1387
|
+
preparedEnv: env,
|
|
1388
|
+
templateVariables: {
|
|
1389
|
+
branch_id: branch.branch_id
|
|
1390
|
+
}
|
|
1391
|
+
});
|
|
1392
|
+
}
|
|
1393
|
+
async runEnvironmentExecutor(options) {
|
|
1394
|
+
const { branch, action } = options;
|
|
1395
|
+
const { payload, asUser, env } = await this.createEnvironmentExecutorPayload(options);
|
|
1396
|
+
const result = await runExecutorCommand(payload, {
|
|
1397
|
+
logPrefix: `[Environment.${action} ${branch.name}]`,
|
|
1398
|
+
asUser,
|
|
1399
|
+
preparedEnv: env,
|
|
1400
|
+
// Mixed webhook/shell restart needs the daemon to wait for shell stop
|
|
1401
|
+
// before it invokes the daemon-owned webhook start. Keep this generous
|
|
1402
|
+
// enough for docker compose down while still bounding the request.
|
|
1403
|
+
timeoutMs: 10 * 6e4,
|
|
1404
|
+
templateVariables: {
|
|
1405
|
+
branch_id: branch.branch_id
|
|
1406
|
+
}
|
|
1407
|
+
});
|
|
1408
|
+
if (!result.success) {
|
|
1409
|
+
const details = result.error?.details;
|
|
1410
|
+
const error = new Error(
|
|
1411
|
+
result.error?.message || "Executor environment command failed"
|
|
1412
|
+
);
|
|
1413
|
+
error.commandOutput = details?.output;
|
|
1414
|
+
throw error;
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
async fetchEnvironmentLogsViaExecutor(branch, logsCommand, params) {
|
|
1418
|
+
const userId = params?.user?.user_id ?? branch.created_by;
|
|
1419
|
+
const appWithToken = this.app;
|
|
1420
|
+
const sessionToken = await appWithToken.sessionTokenService?.generateToken(
|
|
1421
|
+
"environment-logs",
|
|
1422
|
+
userId,
|
|
1423
|
+
{ branchId: branch.branch_id, maxUses: -1 }
|
|
1424
|
+
);
|
|
1425
|
+
if (!sessionToken) {
|
|
1426
|
+
throw new Error("Session token service unavailable; cannot fetch environment logs");
|
|
1427
|
+
}
|
|
1428
|
+
const { asUser, env } = await this.resolveEnvironmentExecutorContext(branch);
|
|
1429
|
+
const result = await runExecutorCommand(
|
|
1430
|
+
{
|
|
1431
|
+
command: "environment.logs",
|
|
1432
|
+
sessionToken,
|
|
1433
|
+
daemonUrl: getDaemonUrl(),
|
|
1434
|
+
env,
|
|
1435
|
+
params: {
|
|
1436
|
+
branchId: branch.branch_id,
|
|
1437
|
+
branchPath: branch.path,
|
|
1438
|
+
logsCommand
|
|
1439
|
+
}
|
|
1440
|
+
},
|
|
1441
|
+
{
|
|
1442
|
+
logPrefix: `[Environment.logs ${branch.name}]`,
|
|
1443
|
+
asUser,
|
|
1444
|
+
preparedEnv: env,
|
|
1445
|
+
timeoutMs: ENVIRONMENT.LOGS_TIMEOUT_MS,
|
|
1446
|
+
templateVariables: {
|
|
1447
|
+
branch_id: branch.branch_id
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
);
|
|
1451
|
+
if (!result.success) {
|
|
1452
|
+
const details = result.error?.details;
|
|
1453
|
+
throw new Error(result.error?.message || details?.output || "Failed to fetch logs");
|
|
1454
|
+
}
|
|
1455
|
+
const data = result.data ?? {};
|
|
1456
|
+
return { stdout: data.logs ?? "", stderr: "", truncated: data.truncated ?? false };
|
|
1457
|
+
}
|
|
1063
1458
|
/**
|
|
1064
1459
|
* Extract caller identity for audit logging. Internal/daemon-initiated
|
|
1065
1460
|
* calls (no params.provider, no user) return undefined which the audit
|
|
@@ -1913,8 +2308,18 @@ var BranchesService = class extends DrizzleService {
|
|
|
1913
2308
|
/**
|
|
1914
2309
|
* Custom method: Update environment status
|
|
1915
2310
|
*/
|
|
1916
|
-
async updateEnvironment(
|
|
1917
|
-
const
|
|
2311
|
+
async updateEnvironment(idOrData, environmentUpdateOrParams, params) {
|
|
2312
|
+
const isRpcEnvelope = typeof idOrData === "object";
|
|
2313
|
+
const id = isRpcEnvelope ? idOrData.branch_id ?? idOrData.branchId : idOrData;
|
|
2314
|
+
const environmentUpdate = isRpcEnvelope ? idOrData.environment_update ?? idOrData.environmentUpdate : environmentUpdateOrParams;
|
|
2315
|
+
const resolvedParams = isRpcEnvelope ? environmentUpdateOrParams : params;
|
|
2316
|
+
if (!id) {
|
|
2317
|
+
throw new Error("Branch ID is required to update environment status");
|
|
2318
|
+
}
|
|
2319
|
+
if (!environmentUpdate) {
|
|
2320
|
+
throw new Error("Environment update is required");
|
|
2321
|
+
}
|
|
2322
|
+
const existing = await this.get(id, resolvedParams);
|
|
1918
2323
|
const updatedEnvironment = {
|
|
1919
2324
|
...existing.environment_instance,
|
|
1920
2325
|
...environmentUpdate
|
|
@@ -1939,7 +2344,7 @@ var BranchesService = class extends DrizzleService {
|
|
|
1939
2344
|
environment_instance: updatedEnvironment,
|
|
1940
2345
|
updated_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
1941
2346
|
},
|
|
1942
|
-
|
|
2347
|
+
resolvedParams
|
|
1943
2348
|
);
|
|
1944
2349
|
return branch;
|
|
1945
2350
|
}
|
|
@@ -1955,6 +2360,9 @@ var BranchesService = class extends DrizzleService {
|
|
|
1955
2360
|
if (branch.environment_instance?.status === "running") {
|
|
1956
2361
|
throw new Error("Environment is already running");
|
|
1957
2362
|
}
|
|
2363
|
+
const command = branch.start_command;
|
|
2364
|
+
const execution = await this.resolveEnvironmentCommand(command, "start");
|
|
2365
|
+
const access_urls = branch.app_url ? [{ name: "App", url: branch.app_url }] : void 0;
|
|
1958
2366
|
await this.updateEnvironment(
|
|
1959
2367
|
id,
|
|
1960
2368
|
{
|
|
@@ -1963,26 +2371,16 @@ var BranchesService = class extends DrizzleService {
|
|
|
1963
2371
|
...branch.environment_instance?.process,
|
|
1964
2372
|
started_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
1965
2373
|
},
|
|
2374
|
+
access_urls,
|
|
1966
2375
|
last_health_check: void 0,
|
|
1967
2376
|
last_error: void 0
|
|
1968
2377
|
},
|
|
1969
2378
|
params
|
|
1970
2379
|
);
|
|
1971
2380
|
try {
|
|
1972
|
-
const command = branch.start_command;
|
|
1973
|
-
const execution = await this.resolveEnvironmentCommand(command, "start");
|
|
1974
2381
|
console.log(
|
|
1975
2382
|
`\u{1F680} Starting environment for branch ${branch.name}: ${execution.kind === "webhook" ? redactManagedEnvWebhookUrlForAudit(execution.url) : execution.command}`
|
|
1976
2383
|
);
|
|
1977
|
-
const logPath = join(
|
|
1978
|
-
homedir(),
|
|
1979
|
-
".agor",
|
|
1980
|
-
"logs",
|
|
1981
|
-
"branches",
|
|
1982
|
-
branch.branch_id,
|
|
1983
|
-
"environment.log"
|
|
1984
|
-
);
|
|
1985
|
-
await mkdir(dirname(logPath), { recursive: true });
|
|
1986
2384
|
if (execution.kind === "webhook") {
|
|
1987
2385
|
await this.executeEnvironmentWebhook({
|
|
1988
2386
|
url: execution.url,
|
|
@@ -1993,61 +2391,9 @@ var BranchesService = class extends DrizzleService {
|
|
|
1993
2391
|
});
|
|
1994
2392
|
console.log(`\u2705 Start webhook completed successfully for ${branch.name}`);
|
|
1995
2393
|
} else {
|
|
1996
|
-
|
|
1997
|
-
command: execution.command,
|
|
1998
|
-
branch,
|
|
1999
|
-
db: this.db,
|
|
2000
|
-
commandType: "start",
|
|
2001
|
-
stdio: "pipe",
|
|
2002
|
-
triggeredBy: this.extractTriggeredBy(params)
|
|
2003
|
-
});
|
|
2004
|
-
const outputChunks = [];
|
|
2005
|
-
const MAX_OUTPUT_LINES = 100;
|
|
2006
|
-
const collectOutput = (stream, prefix) => {
|
|
2007
|
-
if (!stream) return;
|
|
2008
|
-
stream.on("data", (chunk) => {
|
|
2009
|
-
const text = chunk.toString();
|
|
2010
|
-
if (prefix) {
|
|
2011
|
-
process.stderr.write(text);
|
|
2012
|
-
} else {
|
|
2013
|
-
process.stdout.write(text);
|
|
2014
|
-
}
|
|
2015
|
-
outputChunks.push(text);
|
|
2016
|
-
});
|
|
2017
|
-
};
|
|
2018
|
-
collectOutput(childProcess.stdout);
|
|
2019
|
-
collectOutput(childProcess.stderr, "stderr");
|
|
2020
|
-
await new Promise((resolve, reject) => {
|
|
2021
|
-
childProcess.on("exit", (code) => {
|
|
2022
|
-
if (code === 0) {
|
|
2023
|
-
console.log(`\u2705 Start command completed successfully for ${branch.name}`);
|
|
2024
|
-
resolve();
|
|
2025
|
-
} else {
|
|
2026
|
-
const fullOutput = outputChunks.join("");
|
|
2027
|
-
const lines = fullOutput.split("\n");
|
|
2028
|
-
const truncated = lines.length > MAX_OUTPUT_LINES ? `... (truncated ${lines.length - MAX_OUTPUT_LINES} lines)
|
|
2029
|
-
${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
2030
|
-
const output = truncated.trim();
|
|
2031
|
-
const err = new Error(`Start command exited with code ${code}`);
|
|
2032
|
-
err.commandOutput = output || void 0;
|
|
2033
|
-
reject(err);
|
|
2034
|
-
}
|
|
2035
|
-
});
|
|
2036
|
-
childProcess.on("error", (error) => reject(error));
|
|
2037
|
-
});
|
|
2038
|
-
}
|
|
2039
|
-
let access_urls;
|
|
2040
|
-
if (branch.app_url) {
|
|
2041
|
-
access_urls = [{ name: "App", url: branch.app_url }];
|
|
2394
|
+
await this.dispatchEnvironmentExecutor({ branch, action: "start", params });
|
|
2042
2395
|
}
|
|
2043
|
-
return await this.
|
|
2044
|
-
id,
|
|
2045
|
-
{
|
|
2046
|
-
// Don't change status - keep as 'starting' until first successful health check
|
|
2047
|
-
access_urls
|
|
2048
|
-
},
|
|
2049
|
-
params
|
|
2050
|
-
);
|
|
2396
|
+
return await this.get(id, params);
|
|
2051
2397
|
} catch (error) {
|
|
2052
2398
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
2053
2399
|
const commandOutput = error instanceof Error ? error.commandOutput : void 0;
|
|
@@ -2073,17 +2419,10 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
|
2073
2419
|
async stopEnvironment(id, params) {
|
|
2074
2420
|
await this.ensureCanTriggerEnv(id, params, "stop branch environments");
|
|
2075
2421
|
const branch = await this.get(id, params);
|
|
2076
|
-
await this.updateEnvironment(
|
|
2077
|
-
id,
|
|
2078
|
-
{
|
|
2079
|
-
status: "stopping"
|
|
2080
|
-
},
|
|
2081
|
-
params
|
|
2082
|
-
);
|
|
2422
|
+
await this.updateEnvironment(id, { status: "stopping" }, params);
|
|
2083
2423
|
try {
|
|
2084
2424
|
if (branch.stop_command) {
|
|
2085
|
-
const
|
|
2086
|
-
const execution = await this.resolveEnvironmentCommand(command, "stop");
|
|
2425
|
+
const execution = await this.resolveEnvironmentCommand(branch.stop_command, "stop");
|
|
2087
2426
|
console.log(
|
|
2088
2427
|
`\u{1F6D1} Stopping environment for branch ${branch.name}: ${execution.kind === "webhook" ? redactManagedEnvWebhookUrlForAudit(execution.url) : execution.command}`
|
|
2089
2428
|
);
|
|
@@ -2096,23 +2435,8 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
|
2096
2435
|
maxBytes: 16 * 1024
|
|
2097
2436
|
});
|
|
2098
2437
|
} else {
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
branch,
|
|
2102
|
-
db: this.db,
|
|
2103
|
-
commandType: "stop",
|
|
2104
|
-
triggeredBy: this.extractTriggeredBy(params)
|
|
2105
|
-
});
|
|
2106
|
-
await new Promise((resolve, reject) => {
|
|
2107
|
-
stopProcess.on("exit", (code) => {
|
|
2108
|
-
if (code === 0) {
|
|
2109
|
-
resolve();
|
|
2110
|
-
} else {
|
|
2111
|
-
reject(new Error(`Down command exited with code ${code}`));
|
|
2112
|
-
}
|
|
2113
|
-
});
|
|
2114
|
-
stopProcess.on("error", (error) => reject(error));
|
|
2115
|
-
});
|
|
2438
|
+
await this.dispatchEnvironmentExecutor({ branch, action: "stop", params });
|
|
2439
|
+
return await this.get(id, params);
|
|
2116
2440
|
}
|
|
2117
2441
|
} else {
|
|
2118
2442
|
const managedProcess = this.processes.get(id);
|
|
@@ -2164,11 +2488,42 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
|
2164
2488
|
async restartEnvironment(id, params) {
|
|
2165
2489
|
await this.ensureCanTriggerEnv(id, params, "restart branch environments");
|
|
2166
2490
|
const branch = await this.get(id, params);
|
|
2167
|
-
if (branch.
|
|
2491
|
+
if (!branch.start_command) {
|
|
2492
|
+
throw new Error("No start command configured for this branch");
|
|
2493
|
+
}
|
|
2494
|
+
if (branch.environment_instance?.status !== "running") {
|
|
2495
|
+
return await this.startEnvironment(id, params);
|
|
2496
|
+
}
|
|
2497
|
+
const startExecution = await this.resolveEnvironmentCommand(branch.start_command, "start");
|
|
2498
|
+
const stopExecution = branch.stop_command ? await this.resolveEnvironmentCommand(branch.stop_command, "stop") : void 0;
|
|
2499
|
+
if (!branch.stop_command || stopExecution?.kind === "webhook") {
|
|
2168
2500
|
await this.stopEnvironment(id, params);
|
|
2169
|
-
await
|
|
2501
|
+
return await this.startEnvironment(id, params);
|
|
2502
|
+
}
|
|
2503
|
+
if (startExecution.kind === "webhook") {
|
|
2504
|
+
await this.updateEnvironment(id, { status: "stopping" }, params);
|
|
2505
|
+
await this.runEnvironmentExecutor({ branch, action: "stop", params });
|
|
2506
|
+
return await this.startEnvironment(id, params);
|
|
2507
|
+
}
|
|
2508
|
+
await this.updateEnvironment(id, { status: "stopping" }, params);
|
|
2509
|
+
try {
|
|
2510
|
+
await this.dispatchEnvironmentExecutor({ branch, action: "restart", params });
|
|
2511
|
+
return await this.get(id, params);
|
|
2512
|
+
} catch (error) {
|
|
2513
|
+
await this.updateEnvironment(
|
|
2514
|
+
id,
|
|
2515
|
+
{
|
|
2516
|
+
status: "error",
|
|
2517
|
+
last_health_check: {
|
|
2518
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
2519
|
+
status: "unhealthy",
|
|
2520
|
+
message: error instanceof Error ? error.message : "Unknown error during restart"
|
|
2521
|
+
}
|
|
2522
|
+
},
|
|
2523
|
+
params
|
|
2524
|
+
);
|
|
2525
|
+
throw error;
|
|
2170
2526
|
}
|
|
2171
|
-
return await this.startEnvironment(id, params);
|
|
2172
2527
|
}
|
|
2173
2528
|
/**
|
|
2174
2529
|
* Custom method: Nuke environment (destructive operation)
|
|
@@ -2179,16 +2534,9 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
|
2179
2534
|
if (!branch.nuke_command) {
|
|
2180
2535
|
throw new Error("No nuke_command configured for this branch");
|
|
2181
2536
|
}
|
|
2182
|
-
await this.updateEnvironment(
|
|
2183
|
-
id,
|
|
2184
|
-
{
|
|
2185
|
-
status: "stopping"
|
|
2186
|
-
},
|
|
2187
|
-
params
|
|
2188
|
-
);
|
|
2537
|
+
await this.updateEnvironment(id, { status: "stopping" }, params);
|
|
2189
2538
|
try {
|
|
2190
|
-
const
|
|
2191
|
-
const execution = await this.resolveEnvironmentCommand(command, "nuke");
|
|
2539
|
+
const execution = await this.resolveEnvironmentCommand(branch.nuke_command, "nuke");
|
|
2192
2540
|
console.log(
|
|
2193
2541
|
`\u{1F4A3} NUKING environment for branch ${branch.name}: ${execution.kind === "webhook" ? redactManagedEnvWebhookUrlForAudit(execution.url) : execution.command}`
|
|
2194
2542
|
);
|
|
@@ -2202,23 +2550,8 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
|
2202
2550
|
maxBytes: 16 * 1024
|
|
2203
2551
|
});
|
|
2204
2552
|
} else {
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
branch,
|
|
2208
|
-
db: this.db,
|
|
2209
|
-
commandType: "nuke",
|
|
2210
|
-
triggeredBy: this.extractTriggeredBy(params)
|
|
2211
|
-
});
|
|
2212
|
-
await new Promise((resolve, reject) => {
|
|
2213
|
-
nukeProcess.on("exit", (code) => {
|
|
2214
|
-
if (code === 0) {
|
|
2215
|
-
resolve();
|
|
2216
|
-
} else {
|
|
2217
|
-
reject(new Error(`Nuke command exited with code ${code}`));
|
|
2218
|
-
}
|
|
2219
|
-
});
|
|
2220
|
-
nukeProcess.on("error", (error) => reject(error));
|
|
2221
|
-
});
|
|
2553
|
+
await this.dispatchEnvironmentExecutor({ branch, action: "nuke", params });
|
|
2554
|
+
return await this.get(id, params);
|
|
2222
2555
|
}
|
|
2223
2556
|
const managedProcess = this.processes.get(id);
|
|
2224
2557
|
if (managedProcess) {
|
|
@@ -2376,54 +2709,7 @@ ${lines.slice(-MAX_OUTPUT_LINES).join("\n")}` : fullOutput;
|
|
|
2376
2709
|
commandType: "logs",
|
|
2377
2710
|
triggeredBy: this.extractTriggeredBy(params),
|
|
2378
2711
|
maxBytes: ENVIRONMENT.LOGS_MAX_BYTES
|
|
2379
|
-
}).then(({ body, truncated: truncated2 }) => ({ stdout: body, stderr: "", truncated: truncated2 })) : await
|
|
2380
|
-
spawnEnvironmentCommand({
|
|
2381
|
-
command: execution.command,
|
|
2382
|
-
branch,
|
|
2383
|
-
db: this.db,
|
|
2384
|
-
commandType: "logs",
|
|
2385
|
-
stdio: "pipe",
|
|
2386
|
-
// Need to capture output for logs
|
|
2387
|
-
triggeredBy: this.extractTriggeredBy(params)
|
|
2388
|
-
}).then((childProcess) => {
|
|
2389
|
-
let stdout = "";
|
|
2390
|
-
let stderr = "";
|
|
2391
|
-
let truncated2 = false;
|
|
2392
|
-
const timeout = setTimeout(() => {
|
|
2393
|
-
childProcess.kill("SIGTERM");
|
|
2394
|
-
reject(
|
|
2395
|
-
new Error(
|
|
2396
|
-
`Logs command timed out after ${ENVIRONMENT.LOGS_TIMEOUT_MS / 1e3}s`
|
|
2397
|
-
)
|
|
2398
|
-
);
|
|
2399
|
-
}, ENVIRONMENT.LOGS_TIMEOUT_MS);
|
|
2400
|
-
childProcess.stdout?.on("data", (data) => {
|
|
2401
|
-
const chunk = data.toString();
|
|
2402
|
-
if (stdout.length + chunk.length <= ENVIRONMENT.LOGS_MAX_BYTES) {
|
|
2403
|
-
stdout += chunk;
|
|
2404
|
-
} else {
|
|
2405
|
-
stdout += chunk.substring(0, ENVIRONMENT.LOGS_MAX_BYTES - stdout.length);
|
|
2406
|
-
truncated2 = true;
|
|
2407
|
-
childProcess.kill("SIGTERM");
|
|
2408
|
-
}
|
|
2409
|
-
});
|
|
2410
|
-
childProcess.stderr?.on("data", (data) => {
|
|
2411
|
-
stderr += data.toString();
|
|
2412
|
-
});
|
|
2413
|
-
childProcess.on("exit", (code) => {
|
|
2414
|
-
clearTimeout(timeout);
|
|
2415
|
-
if (code === 0 || stdout.length > 0) {
|
|
2416
|
-
resolve({ stdout, stderr, truncated: truncated2 });
|
|
2417
|
-
} else {
|
|
2418
|
-
reject(new Error(stderr || `Logs command exited with code ${code}`));
|
|
2419
|
-
}
|
|
2420
|
-
});
|
|
2421
|
-
childProcess.on("error", (error) => {
|
|
2422
|
-
clearTimeout(timeout);
|
|
2423
|
-
reject(error);
|
|
2424
|
-
});
|
|
2425
|
-
}).catch(reject);
|
|
2426
|
-
});
|
|
2712
|
+
}).then(({ body, truncated: truncated2 }) => ({ stdout: body, stderr: "", truncated: truncated2 })) : await this.fetchEnvironmentLogsViaExecutor(branch, execution.command, params);
|
|
2427
2713
|
const allLines = result.stdout.split("\n");
|
|
2428
2714
|
let finalLines = allLines;
|
|
2429
2715
|
let wasTruncatedByLines = false;
|