@cursor/july 0.1.102 → 0.1.103
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/AGENTS.md +34 -32
- package/README.md +10 -12
- package/dist/ab.d.ts +1 -1
- package/dist/ab.js +1 -1
- package/dist/bin/agent-serve.d.ts +12 -12
- package/dist/bin/agent-serve.js +114 -36
- package/dist/channels/bitbucket/api.d.ts +176 -0
- package/dist/channels/bitbucket/api.d.ts.map +1 -0
- package/dist/channels/bitbucket/api.js +419 -0
- package/dist/channels/bitbucket/binding.d.ts +71 -0
- package/dist/channels/bitbucket/binding.d.ts.map +1 -0
- package/dist/channels/bitbucket/binding.js +269 -0
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +33 -0
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -0
- package/dist/channels/bitbucket/bitbucket-channel.js +120 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +61 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -0
- package/dist/channels/bitbucket/bitbucket-webhook.js +394 -0
- package/dist/channels/bitbucket/checks.d.ts +67 -0
- package/dist/channels/bitbucket/checks.d.ts.map +1 -0
- package/dist/channels/bitbucket/checks.js +102 -0
- package/dist/channels/bitbucket/cursor-account.d.ts +37 -0
- package/dist/channels/bitbucket/cursor-account.d.ts.map +1 -0
- package/dist/channels/bitbucket/cursor-account.js +65 -0
- package/dist/channels/bitbucket/defaults.d.ts +26 -0
- package/dist/channels/bitbucket/defaults.d.ts.map +1 -0
- package/dist/channels/bitbucket/defaults.js +73 -0
- package/dist/channels/bitbucket/events.d.ts +22 -0
- package/dist/channels/bitbucket/events.d.ts.map +1 -0
- package/dist/channels/bitbucket/events.js +64 -0
- package/dist/channels/bitbucket/index.d.ts +34 -0
- package/dist/channels/bitbucket/index.d.ts.map +1 -0
- package/dist/channels/bitbucket/index.js +33 -0
- package/dist/channels/bitbucket/replay.d.ts +63 -0
- package/dist/channels/bitbucket/replay.d.ts.map +1 -0
- package/dist/channels/bitbucket/replay.js +304 -0
- package/dist/channels/bitbucket/state.d.ts +35 -0
- package/dist/channels/bitbucket/state.d.ts.map +1 -0
- package/dist/channels/bitbucket/state.js +21 -0
- package/dist/channels/bitbucket/types.d.ts +229 -0
- package/dist/channels/bitbucket/types.d.ts.map +1 -0
- package/dist/channels/bitbucket/types.js +1 -0
- package/dist/channels/deployments/deployments-channel.d.ts +22 -14
- package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.js +25 -27
- package/dist/channels/deployments/types.d.ts +12 -6
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/github/binding.d.ts +6 -0
- package/dist/channels/github/binding.d.ts.map +1 -1
- package/dist/channels/github/binding.js +3 -3
- package/dist/channels/github/cursor-account.d.ts +7 -3
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +10 -6
- package/dist/channels/github/events.d.ts +1 -1
- package/dist/channels/github/events.js +1 -1
- package/dist/channels/github/forward.d.ts +1 -1
- package/dist/channels/github/forward.d.ts.map +1 -1
- package/dist/channels/github/forward.js +3 -2
- package/dist/channels/github/github-channel.d.ts +29 -39
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +68 -101
- package/dist/channels/github/replay.d.ts +1 -1
- package/dist/channels/github/replay.js +1 -1
- package/dist/channels/github/state.d.ts +2 -0
- package/dist/channels/github/state.d.ts.map +1 -1
- package/dist/channels/github/state.js +14 -11
- package/dist/channels/github/types.d.ts +2 -4
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.d.ts +91 -0
- package/dist/channels/gitlab/api.d.ts.map +1 -0
- package/dist/channels/gitlab/api.js +150 -0
- package/dist/channels/gitlab/binding.d.ts +58 -0
- package/dist/channels/gitlab/binding.d.ts.map +1 -0
- package/dist/channels/gitlab/binding.js +139 -0
- package/dist/channels/gitlab/checks.d.ts +110 -0
- package/dist/channels/gitlab/checks.d.ts.map +1 -0
- package/dist/channels/gitlab/checks.js +126 -0
- package/dist/channels/gitlab/cursor-account.d.ts +36 -0
- package/dist/channels/gitlab/cursor-account.d.ts.map +1 -0
- package/dist/channels/gitlab/cursor-account.js +65 -0
- package/dist/channels/gitlab/defaults.d.ts +25 -0
- package/dist/channels/gitlab/defaults.d.ts.map +1 -0
- package/dist/channels/gitlab/defaults.js +60 -0
- package/dist/channels/gitlab/events.d.ts +12 -0
- package/dist/channels/gitlab/events.d.ts.map +1 -0
- package/dist/channels/gitlab/events.js +28 -0
- package/dist/channels/gitlab/gitlab-channel.d.ts +33 -0
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -0
- package/dist/channels/gitlab/gitlab-channel.js +120 -0
- package/dist/channels/gitlab/gitlab-webhook.d.ts +45 -0
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -0
- package/dist/channels/gitlab/gitlab-webhook.js +397 -0
- package/dist/channels/gitlab/index.d.ts +31 -0
- package/dist/channels/gitlab/index.d.ts.map +1 -0
- package/dist/channels/gitlab/index.js +30 -0
- package/dist/channels/gitlab/replay.d.ts +105 -0
- package/dist/channels/gitlab/replay.d.ts.map +1 -0
- package/dist/channels/gitlab/replay.js +206 -0
- package/dist/channels/gitlab/state.d.ts +33 -0
- package/dist/channels/gitlab/state.d.ts.map +1 -0
- package/dist/channels/gitlab/state.js +23 -0
- package/dist/channels/gitlab/types.d.ts +214 -0
- package/dist/channels/gitlab/types.d.ts.map +1 -0
- package/dist/channels/gitlab/types.js +1 -0
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +4 -2
- package/dist/channels/origin/origin-channel.d.ts +4 -9
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +8 -48
- package/dist/channels/origin/types.d.ts +20 -2
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/eval-directive.d.ts.map +1 -1
- package/dist/channels/slack/eval-directive.js +1 -7
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +3 -3
- package/dist/channels/slack/setup.d.ts +1 -1
- package/dist/channels/slack/setup.d.ts.map +1 -1
- package/dist/channels/slack/setup.js +6 -13
- package/dist/channels/slack/types.d.ts +1 -1
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels.d.ts +1 -1
- package/dist/channels.d.ts.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +1 -1
- package/dist/connections.d.ts +1 -1
- package/dist/connections.js +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.CLA03RCz.js → app.DW9pXkpL.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.nrl1ifBq.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.ifxv-cJV.js → VPLocalSearchBox.CdEIUwDg.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DWCwM6p-.js → theme.YZMHgPgg.js} +2 -2
- package/dist/docs/assets/concepts.md.DgEcZOfT.js +1 -0
- package/dist/docs/assets/{concepts.md.rPzW2HZN.lean.js → concepts.md.DgEcZOfT.lean.js} +1 -1
- package/dist/docs/assets/{evals.md.CPzDAwoH.js → evals.md.CbMoebP1.js} +1 -1
- package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +9 -0
- package/dist/docs/assets/{guides_github.md.BtPr9GaP.js → guides_github.md.DKYiT9do.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.js → guides_opentelemetry.md.COh9jFVg.js} +7 -8
- package/dist/docs/assets/{guides_opentelemetry.md.BVTXDCRg.lean.js → guides_opentelemetry.md.COh9jFVg.lean.js} +1 -1
- package/dist/docs/assets/{index.md.Kiht7ell.js → index.md.D75GWhPl.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.js → reference_agent-config.md.CHNpiyp4.js} +3 -3
- package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.js → reference_channels.md.Dz8Cnudp.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.Cd2f2iyV.lean.js → reference_channels.md.Dz8Cnudp.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.DfoeyvL0.js → reference_cli.md.CJNc_xYK.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.9WQMZe1l.js → reference_extensions.md.DykHW3qL.js} +11 -5
- package/dist/docs/assets/reference_extensions.md.DykHW3qL.lean.js +1 -0
- package/dist/docs/assets/reference_hooks.md.Ddt5DdgJ.js +73 -0
- package/dist/docs/assets/{reference_hooks.md.a8BJxMR5.lean.js → reference_hooks.md.Ddt5DdgJ.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.DnX5nL-B.js → reference_playground.md.4myJPxrf.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.js → reference_project-layout.md.DuBu9a96.js} +2 -2
- package/dist/docs/assets/reference_result.md.BK5SxDrf.js +19 -0
- package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +1 -0
- package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.js → reference_sessions.md.CueyOHSL.js} +1 -1
- package/dist/docs/assets/{reference_sessions.md.NxFP_CAC.lean.js → reference_sessions.md.CueyOHSL.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.B1up2r9W.js → reference_tools.md.aGrn99hP.js} +1 -1
- package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +1 -0
- package/dist/docs/assets/{skills_otel.md.CgiZryR3.js → skills_otel.md.CqhobH3B.js} +3 -3
- package/dist/docs/assets/{skills_otel.md.CgiZryR3.lean.js → skills_otel.md.CqhobH3B.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.js → templates_pr-autofixer.md.Bds_XWcV.js} +2 -2
- package/dist/docs/assets/{templates_pr-autofixer.md.x5zl6-GT.lean.js → templates_pr-autofixer.md.Bds_XWcV.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/concepts.md +2 -4
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/design/runtime-abstraction.md +2 -3
- package/dist/docs/evals.html +6 -6
- package/dist/docs/evals.md +9 -7
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-agents.html +6 -6
- package/dist/docs/guides/cloud-agents.md +4 -6
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +6 -6
- package/dist/docs/guides/github.md +0 -1
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +5 -5
- package/dist/docs/guides/opentelemetry.html +10 -11
- package/dist/docs/guides/opentelemetry.md +41 -17
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +2 -2
- package/dist/docs/llms-full.txt +501 -262
- package/dist/docs/llms.txt +2 -2
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +8 -8
- package/dist/docs/reference/agent-config.md +6 -10
- package/dist/docs/reference/artifacts.html +5 -5
- package/dist/docs/reference/channels.html +6 -6
- package/dist/docs/reference/channels.md +18 -8
- package/dist/docs/reference/cli.html +5 -5
- package/dist/docs/reference/cli.md +3 -4
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/extensions.html +16 -10
- package/dist/docs/reference/extensions.md +86 -22
- package/dist/docs/reference/hooks.html +69 -10
- package/dist/docs/reference/hooks.md +215 -46
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +5 -5
- package/dist/docs/reference/playground.md +3 -0
- package/dist/docs/reference/project-layout.html +6 -6
- package/dist/docs/reference/project-layout.md +2 -1
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/result.html +45 -0
- package/dist/docs/reference/result.md +89 -0
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/sessions.md +3 -1
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +5 -5
- package/dist/docs/reference/tools.md +1 -2
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/skills/ab.html +4 -4
- package/dist/docs/skills/create-agent.html +4 -4
- package/dist/docs/skills/debug.html +4 -4
- package/dist/docs/skills/evals.html +4 -4
- package/dist/docs/skills/framework-map.html +5 -5
- package/dist/docs/skills/framework-map.md +3 -1
- package/dist/docs/skills/github.html +4 -4
- package/dist/docs/skills/hillclimb.html +4 -4
- package/dist/docs/skills/index.html +4 -4
- package/dist/docs/skills/mcp-auth.html +4 -4
- package/dist/docs/skills/otel.html +7 -7
- package/dist/docs/skills/otel.md +8 -3
- package/dist/docs/skills/setup-slack.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +4 -4
- package/dist/docs/templates/code-wiki.html +4 -4
- package/dist/docs/templates/demo.html +4 -4
- package/dist/docs/templates/pr-autofixer.html +6 -6
- package/dist/docs/templates/pr-autofixer.md +0 -3
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +4 -4
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/evals.d.ts +1 -1
- package/dist/evals.d.ts.map +1 -1
- package/dist/extensions.d.ts +20 -7
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +36 -5
- package/dist/files.d.ts +16 -3
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +16 -3
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/internal/ab-snapshot.d.ts.map +1 -1
- package/dist/internal/ab-snapshot.js +0 -1
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +1 -3
- package/dist/internal/authored-alias-hooks.d.ts +4 -13
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
- package/dist/internal/authored-alias-hooks.js +4 -20
- package/dist/internal/authored-loaders.d.ts +2 -3
- package/dist/internal/authored-loaders.d.ts.map +1 -1
- package/dist/internal/authored-loaders.js +6 -20
- package/dist/internal/channel-dispatch.d.ts +43 -0
- package/dist/internal/channel-dispatch.d.ts.map +1 -0
- package/dist/internal/channel-dispatch.js +77 -0
- package/dist/internal/chat-client.d.ts +1 -1
- package/dist/internal/chat-client.js +1 -1
- package/dist/internal/cli-ax.d.ts +5 -5
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +5 -5
- package/dist/internal/cli-bitbucket.d.ts +33 -0
- package/dist/internal/cli-bitbucket.d.ts.map +1 -0
- package/dist/internal/cli-bitbucket.js +359 -0
- package/dist/internal/cli-convert-automation.d.ts +1 -1
- package/dist/internal/cli-convert-automation.js +2 -2
- package/dist/internal/cli-cursor.d.ts +1 -1
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +2 -4
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +2 -6
- package/dist/internal/cli-github.d.ts +1 -1
- package/dist/internal/cli-github.js +3 -3
- package/dist/internal/cli-gitlab.d.ts +37 -0
- package/dist/internal/cli-gitlab.d.ts.map +1 -0
- package/dist/internal/cli-gitlab.js +380 -0
- package/dist/internal/cli-mcp.d.ts.map +1 -1
- package/dist/internal/cli-mcp.js +2 -6
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +2 -4
- package/dist/internal/continuation-channel.d.ts +14 -0
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +56 -3
- package/dist/internal/continuation-identity.d.ts +14 -15
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +182 -7
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +4 -3
- package/dist/internal/convert-automation/types.d.ts +1 -1
- package/dist/internal/convert-automation/types.js +1 -1
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +1 -3
- package/dist/internal/cursor/backend-client.d.ts +5 -4
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +5 -6
- package/dist/internal/cursor/bound-secret-file.d.ts +56 -0
- package/dist/internal/cursor/bound-secret-file.d.ts.map +1 -0
- package/dist/internal/cursor/bound-secret-file.js +88 -0
- package/dist/internal/cursor/credentials.d.ts +39 -5
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +58 -8
- package/dist/internal/cursor/hosted-bound-secrets.d.ts +41 -0
- package/dist/internal/cursor/hosted-bound-secrets.d.ts.map +1 -0
- package/dist/internal/cursor/hosted-bound-secrets.js +54 -0
- package/dist/internal/cursor/hosted-deployment-secrets.d.ts +19 -5
- package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-deployment-secrets.js +29 -9
- package/dist/internal/cursor/hosted-store-secrets.d.ts +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +1 -1
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +2 -4
- package/dist/internal/cursor-deployment-relay.d.ts +6 -2
- package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
- package/dist/internal/cursor-deployment-relay.js +13 -9
- package/dist/internal/deploy-manifest.d.ts +1 -1
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +1 -1
- package/dist/internal/discovery/ab.d.ts +1 -1
- package/dist/internal/discovery/ab.d.ts.map +1 -1
- package/dist/internal/discovery/ab.js +21 -9
- package/dist/internal/discovery/agent.d.ts +6 -1
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +65 -116
- package/dist/internal/discovery/channels.d.ts +1 -1
- package/dist/internal/discovery/channels.d.ts.map +1 -1
- package/dist/internal/discovery/channels.js +14 -14
- package/dist/internal/discovery/connections.d.ts +1 -5
- package/dist/internal/discovery/connections.d.ts.map +1 -1
- package/dist/internal/discovery/connections.js +30 -44
- package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -1
- package/dist/internal/discovery/cursor-plugin.js +1 -3
- package/dist/internal/discovery/extension-overlay.d.ts +32 -0
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -0
- package/dist/internal/discovery/extension-overlay.js +191 -0
- package/dist/internal/discovery/extensions.d.ts +11 -2
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +211 -74
- package/dist/internal/discovery/hooks.d.ts +1 -1
- package/dist/internal/discovery/hooks.d.ts.map +1 -1
- package/dist/internal/discovery/hooks.js +15 -2
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +7 -1
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +8 -2
- package/dist/internal/discovery/names.d.ts +1 -1
- package/dist/internal/discovery/names.d.ts.map +1 -1
- package/dist/internal/discovery/names.js +1 -0
- package/dist/internal/discovery/project.d.ts +0 -2
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +64 -10
- package/dist/internal/discovery/runtime.d.ts.map +1 -1
- package/dist/internal/discovery/runtime.js +1 -2
- package/dist/internal/discovery/schedules.d.ts +1 -1
- package/dist/internal/discovery/schedules.d.ts.map +1 -1
- package/dist/internal/discovery/schedules.js +23 -2
- package/dist/internal/discovery/services.d.ts +6 -2
- package/dist/internal/discovery/services.d.ts.map +1 -1
- package/dist/internal/discovery/services.js +31 -1
- package/dist/internal/discovery/skills.d.ts +1 -6
- package/dist/internal/discovery/skills.d.ts.map +1 -1
- package/dist/internal/discovery/skills.js +8 -3
- package/dist/internal/discovery/subagent.d.ts +3 -0
- package/dist/internal/discovery/subagent.d.ts.map +1 -1
- package/dist/internal/discovery/subagent.js +109 -0
- package/dist/internal/discovery.d.ts +1 -2
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +1 -2
- package/dist/internal/distribution.d.ts +10 -27
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +25 -73
- package/dist/internal/docs-site.js +1 -1
- package/dist/internal/eval-run-store.d.ts +0 -1
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.d.ts +8 -0
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +8 -8
- package/dist/internal/github-fanout.d.ts +1 -1
- package/dist/internal/github-fanout.js +1 -1
- package/dist/internal/guest-network.d.ts +101 -0
- package/dist/internal/guest-network.d.ts.map +1 -0
- package/dist/internal/guest-network.js +304 -0
- package/dist/internal/host-otel.d.ts +3 -3
- package/dist/internal/host-otel.d.ts.map +1 -1
- package/dist/internal/host-otel.js +8 -4
- package/dist/internal/hosted-admission-adapter.d.ts +8 -7
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.d.ts +6 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +18 -5
- package/dist/internal/hosted-delivery.d.ts +18 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +248 -118
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +1 -3
- package/dist/internal/init-interview.d.ts.map +1 -1
- package/dist/internal/init-interview.js +1 -3
- package/dist/internal/init-project.d.ts +2 -2
- package/dist/internal/init-project.js +2 -2
- package/dist/internal/inline-stdio-define-stub.d.ts +1 -1
- package/dist/internal/inline-stdio-define-stub.d.ts.map +1 -1
- package/dist/internal/inline-stdio-define-stub.js +1 -1
- package/dist/internal/is-record.d.ts +2 -0
- package/dist/internal/is-record.d.ts.map +1 -0
- package/dist/internal/is-record.js +3 -0
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +18 -10
- package/dist/internal/local-control-plane.d.ts +1 -2
- package/dist/internal/local-control-plane.d.ts.map +1 -1
- package/dist/internal/local-control-plane.js +3 -20
- package/dist/internal/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +1 -3
- package/dist/internal/otel/collector.d.ts +12 -3
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +77 -125
- package/dist/internal/otel/config.d.ts +0 -2
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +17 -20
- package/dist/internal/otel/http.d.ts +2 -0
- package/dist/internal/otel/http.d.ts.map +1 -1
- package/dist/internal/otel/http.js +7 -1
- package/dist/internal/otel/mcp.d.ts.map +1 -1
- package/dist/internal/otel/mcp.js +3 -16
- package/dist/internal/otel/runtime.d.ts +26 -1
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +164 -15
- package/dist/internal/package-inline-stdio.d.ts.map +1 -1
- package/dist/internal/package-inline-stdio.js +3 -11
- package/dist/internal/playground/toolchain.d.ts +1 -1
- package/dist/internal/playground/toolchain.d.ts.map +1 -1
- package/dist/internal/playground/toolchain.js +1 -1
- package/dist/internal/request-error-status.d.ts +12 -0
- package/dist/internal/request-error-status.d.ts.map +1 -0
- package/dist/internal/request-error-status.js +52 -0
- package/dist/internal/resolve-prod-target.d.ts +1 -1
- package/dist/internal/resolve-prod-target.d.ts.map +1 -1
- package/dist/internal/resolve-prod-target.js +3 -7
- package/dist/internal/result-output.d.ts +18 -0
- package/dist/internal/result-output.d.ts.map +1 -0
- package/dist/internal/result-output.js +33 -0
- package/dist/internal/run-client.d.ts +2 -2
- package/dist/internal/run-client.js +2 -2
- package/dist/internal/runtime-dispatch-runner.d.ts +1 -11
- package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
- package/dist/internal/runtime-dispatch-runner.js +2 -15
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +3 -6
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +110 -35
- package/dist/internal/session-cost.d.ts +3 -3
- package/dist/internal/session-cost.d.ts.map +1 -1
- package/dist/internal/session-cost.js +3 -3
- package/dist/internal/session-engine.d.ts +26 -11
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +146 -76
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +1 -3
- package/dist/internal/skills-sync.d.ts +1 -4
- package/dist/internal/skills-sync.d.ts.map +1 -1
- package/dist/internal/skills-sync.js +10 -50
- package/dist/internal/sleep.d.ts +2 -0
- package/dist/internal/sleep.d.ts.map +1 -0
- package/dist/internal/sleep.js +3 -0
- package/dist/internal/store-mirror.d.ts +29 -0
- package/dist/internal/store-mirror.d.ts.map +1 -0
- package/dist/internal/store-mirror.js +70 -0
- package/dist/internal/tenant-slack/relay.d.ts +73 -0
- package/dist/internal/tenant-slack/relay.d.ts.map +1 -0
- package/dist/internal/tenant-slack/relay.js +138 -0
- package/dist/internal/testing/scm-continuation-fixtures.d.ts +33 -0
- package/dist/internal/testing/scm-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/scm-continuation-fixtures.js +253 -0
- package/dist/internal/workspace-sync.d.ts +22 -0
- package/dist/internal/workspace-sync.d.ts.map +1 -0
- package/dist/internal/workspace-sync.js +49 -0
- package/dist/internal/workspace.d.ts +7 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +13 -0
- package/dist/otel.d.ts +23 -1
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +93 -2
- package/dist/playground/assets/index-59KvgREd.js +67 -0
- package/dist/playground/assets/index-MbMxXg-y.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/result.d.ts +24 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +27 -0
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +7 -4
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +1 -3
- package/dist/types.d.ts +90 -23
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +2 -2
- package/docs/concepts.md +2 -4
- package/docs/design/runtime-abstraction.md +2 -3
- package/docs/evals.md +9 -7
- package/docs/guides/cloud-agents.md +4 -6
- package/docs/guides/github.md +0 -1
- package/docs/guides/opentelemetry.md +41 -17
- package/docs/reference/agent-config.md +6 -10
- package/docs/reference/channels.md +18 -8
- package/docs/reference/cli.md +3 -4
- package/docs/reference/extensions.md +87 -23
- package/docs/reference/hooks.md +215 -46
- package/docs/reference/playground.md +3 -0
- package/docs/reference/project-layout.md +2 -1
- package/docs/reference/result.md +94 -0
- package/docs/reference/sessions.md +3 -1
- package/docs/reference/tools.md +1 -2
- package/docs/templates/pr-autofixer.md +0 -3
- package/package.json +29 -10
- package/skills/framework-map/SKILL.md +3 -1
- package/skills/otel/SKILL.md +8 -3
- package/src/ab.ts +1 -1
- package/src/bin/agent-serve.ts +121 -21
- package/src/channels/bitbucket/api.ts +623 -0
- package/src/channels/bitbucket/binding.ts +414 -0
- package/src/channels/bitbucket/bitbucket-channel.ts +182 -0
- package/src/channels/bitbucket/bitbucket-webhook.ts +576 -0
- package/src/channels/bitbucket/checks.ts +154 -0
- package/src/channels/bitbucket/cursor-account.ts +117 -0
- package/src/channels/bitbucket/defaults.ts +110 -0
- package/src/channels/bitbucket/events.ts +84 -0
- package/src/channels/bitbucket/index.ts +49 -0
- package/src/channels/bitbucket/replay.ts +439 -0
- package/src/channels/bitbucket/state.ts +59 -0
- package/src/channels/bitbucket/types.ts +266 -0
- package/src/channels/deployments/deployments-channel.ts +25 -43
- package/src/channels/deployments/types.ts +12 -6
- package/src/channels/github/binding.ts +8 -1
- package/src/channels/github/cursor-account.ts +17 -6
- package/src/channels/github/events.ts +1 -1
- package/src/channels/github/forward.ts +3 -2
- package/src/channels/github/github-channel.ts +74 -221
- package/src/channels/github/replay.ts +1 -1
- package/src/channels/github/state.ts +6 -0
- package/src/channels/github/types.ts +2 -5
- package/src/channels/gitlab/api.ts +228 -0
- package/src/channels/gitlab/binding.ts +233 -0
- package/src/channels/gitlab/checks.ts +243 -0
- package/src/channels/gitlab/cursor-account.ts +114 -0
- package/src/channels/gitlab/defaults.ts +93 -0
- package/src/channels/gitlab/events.ts +44 -0
- package/src/channels/gitlab/gitlab-channel.ts +176 -0
- package/src/channels/gitlab/gitlab-webhook.ts +555 -0
- package/src/channels/gitlab/index.ts +43 -0
- package/src/channels/gitlab/replay.ts +347 -0
- package/src/channels/gitlab/state.ts +55 -0
- package/src/channels/gitlab/types.ts +263 -0
- package/src/channels/origin/api.ts +4 -2
- package/src/channels/origin/origin-channel.ts +19 -94
- package/src/channels/origin/types.ts +23 -2
- package/src/channels/slack/eval-directive.ts +1 -6
- package/src/channels/slack/init.ts +6 -3
- package/src/channels/slack/setup.ts +7 -6
- package/src/channels/slack/types.ts +1 -1
- package/src/channels.ts +0 -1
- package/src/client.ts +1 -1
- package/src/connections.ts +1 -1
- package/src/evals.ts +1 -1
- package/src/extensions.ts +47 -5
- package/src/files.ts +21 -3
- package/src/index.ts +20 -28
- package/src/internal/ab-snapshot.ts +0 -3
- package/src/internal/advertise-tools.ts +1 -4
- package/src/internal/authored-alias-hooks.ts +4 -21
- package/src/internal/authored-loaders.ts +6 -23
- package/src/internal/channel-dispatch.ts +160 -0
- package/src/internal/chat-client.ts +1 -1
- package/src/internal/cli-ax.ts +5 -5
- package/src/internal/cli-bitbucket.ts +477 -0
- package/src/internal/cli-convert-automation.ts +7 -7
- package/src/internal/cli-cursor.ts +2 -5
- package/src/internal/cli-deploy.ts +2 -8
- package/src/internal/cli-github.ts +3 -3
- package/src/internal/cli-gitlab.ts +485 -0
- package/src/internal/cli-mcp.ts +2 -7
- package/src/internal/cli-slack.ts +2 -5
- package/src/internal/continuation-channel.ts +82 -1
- package/src/internal/continuation-identity.ts +229 -11
- package/src/internal/conversation-mirror.ts +4 -3
- package/src/internal/convert-automation/types.ts +1 -1
- package/src/internal/cursor/account-mcp.ts +1 -4
- package/src/internal/cursor/backend-client.ts +9 -10
- package/src/internal/cursor/bound-secret-file.ts +108 -0
- package/src/internal/cursor/credentials.ts +75 -10
- package/src/internal/cursor/hosted-bound-secrets.ts +75 -0
- package/src/internal/cursor/hosted-deployment-secrets.ts +42 -11
- package/src/internal/cursor/hosted-store-secrets.ts +1 -1
- package/src/internal/cursor-account-mcp-auth.ts +2 -5
- package/src/internal/cursor-deployment-relay.ts +11 -7
- package/src/internal/deploy-manifest.ts +4 -2
- package/src/internal/discovery/ab.ts +29 -9
- package/src/internal/discovery/agent.ts +94 -135
- package/src/internal/discovery/channels.ts +15 -13
- package/src/internal/discovery/connections.ts +55 -50
- package/src/internal/discovery/cursor-plugin.ts +1 -4
- package/src/internal/discovery/extension-overlay.ts +274 -0
- package/src/internal/discovery/extensions.ts +330 -105
- package/src/internal/discovery/hooks.ts +20 -2
- package/src/internal/discovery/info.ts +7 -0
- package/src/internal/discovery/modules.ts +8 -2
- package/src/internal/discovery/names.ts +2 -1
- package/src/internal/discovery/project.ts +80 -9
- package/src/internal/discovery/runtime.ts +1 -2
- package/src/internal/discovery/schedules.ts +28 -2
- package/src/internal/discovery/services.ts +37 -1
- package/src/internal/discovery/skills.ts +13 -3
- package/src/internal/discovery/subagent.ts +107 -0
- package/src/internal/discovery.ts +0 -2
- package/src/internal/distribution.ts +35 -83
- package/src/internal/docs-site.ts +1 -1
- package/src/internal/eval-run-store.ts +0 -7
- package/src/internal/eval-runner.ts +0 -1
- package/src/internal/framework-file-storage.ts +8 -8
- package/src/internal/github-fanout.ts +1 -1
- package/src/internal/guest-network.ts +383 -0
- package/src/internal/host-otel.ts +8 -4
- package/src/internal/hosted-admission-adapter.ts +8 -8
- package/src/internal/hosted-delivery-protocol.ts +26 -1
- package/src/internal/hosted-delivery.ts +376 -192
- package/src/internal/http-channel.ts +1 -4
- package/src/internal/init-interview.ts +1 -4
- package/src/internal/init-project.ts +2 -2
- package/src/internal/inline-stdio-define-stub.ts +1 -1
- package/src/internal/is-record.ts +3 -0
- package/src/internal/json-schema.ts +19 -10
- package/src/internal/local-control-plane.ts +5 -24
- package/src/internal/mcp-endpoint.ts +1 -4
- package/src/internal/otel/collector.ts +94 -159
- package/src/internal/otel/config.ts +10 -14
- package/src/internal/otel/http.ts +14 -1
- package/src/internal/otel/mcp.ts +3 -16
- package/src/internal/otel/runtime.ts +240 -25
- package/src/internal/package-inline-stdio.ts +3 -12
- package/src/internal/playground/toolchain.ts +1 -1
- package/src/internal/request-error-status.ts +72 -0
- package/src/internal/resolve-prod-target.ts +3 -8
- package/src/internal/result-output.ts +34 -0
- package/src/internal/run-client.ts +2 -2
- package/src/internal/runtime-dispatch-runner.ts +3 -21
- package/src/internal/sdk-runner.ts +3 -7
- package/src/internal/server.ts +153 -44
- package/src/internal/session-cost.ts +3 -3
- package/src/internal/session-engine.ts +182 -74
- package/src/internal/session-run-log.ts +1 -4
- package/src/internal/skills-sync.ts +13 -63
- package/src/internal/sleep.ts +3 -0
- package/src/internal/store-mirror.ts +86 -0
- package/src/internal/tenant-slack/relay.ts +179 -0
- package/src/internal/testing/scm-continuation-fixtures.ts +286 -0
- package/src/internal/workspace-sync.ts +55 -0
- package/src/internal/workspace.ts +14 -0
- package/src/otel.ts +143 -3
- package/src/result.ts +36 -0
- package/src/storage-backends/cursor-hosted.ts +7 -4
- package/src/storage-protocol.ts +1 -4
- package/src/types.ts +105 -34
- package/templates/triage/agent/lib/types.ts +0 -2
- package/dist/continuation.d.ts +0 -20
- package/dist/continuation.d.ts.map +0 -1
- package/dist/continuation.js +0 -18
- package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +0 -1
- package/dist/docs/assets/concepts.md.rPzW2HZN.js +0 -1
- package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +0 -9
- package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.js +0 -9
- package/dist/docs/assets/guides_cloud-runtime.md.BRirbRAN.lean.js +0 -1
- package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +0 -1
- package/dist/docs/assets/reference_hooks.md.a8BJxMR5.js +0 -14
- package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +0 -1
- package/dist/docs/guides/cloud-runtime.html +0 -35
- package/dist/docs/guides/cloud-runtime.md +0 -117
- package/dist/internal/convert-automation/index.d.ts +0 -3
- package/dist/internal/convert-automation/index.d.ts.map +0 -1
- package/dist/internal/convert-automation/index.js +0 -1
- package/dist/internal/grokbot/runner.d.ts +0 -64
- package/dist/internal/grokbot/runner.d.ts.map +0 -1
- package/dist/internal/grokbot/runner.js +0 -282
- package/dist/internal/managed-delivery.d.ts +0 -80
- package/dist/internal/managed-delivery.d.ts.map +0 -1
- package/dist/internal/managed-delivery.js +0 -86
- package/dist/internal/review-comments.d.ts +0 -370
- package/dist/internal/review-comments.d.ts.map +0 -1
- package/dist/internal/review-comments.js +0 -921
- package/dist/internal/shallow-clone.d.ts +0 -176
- package/dist/internal/shallow-clone.d.ts.map +0 -1
- package/dist/internal/shallow-clone.js +0 -419
- package/dist/playground/assets/index-B6C9S9nG.css +0 -1
- package/dist/playground/assets/index-ZqNoT8Ie.js +0 -69
- package/docs/guides/cloud-runtime.md +0 -122
- package/src/continuation.ts +0 -49
- package/src/internal/convert-automation/index.ts +0 -10
- package/src/internal/grokbot/runner.ts +0 -370
- package/src/internal/managed-delivery.ts +0 -125
- package/src/internal/review-comments.ts +0 -1363
- package/src/internal/shallow-clone.ts +0 -609
- /package/dist/docs/assets/{evals.md.CPzDAwoH.lean.js → evals.md.CbMoebP1.lean.js} +0 -0
- /package/dist/docs/assets/{guides_cloud-agents.md.DumwWXba.lean.js → guides_cloud-agents.md.DS8RIjwx.lean.js} +0 -0
- /package/dist/docs/assets/{guides_github.md.BtPr9GaP.lean.js → guides_github.md.DKYiT9do.lean.js} +0 -0
- /package/dist/docs/assets/{index.md.Kiht7ell.lean.js → index.md.D75GWhPl.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.BHeYMgme.lean.js → reference_agent-config.md.CHNpiyp4.lean.js} +0 -0
- /package/dist/docs/assets/{reference_cli.md.DfoeyvL0.lean.js → reference_cli.md.CJNc_xYK.lean.js} +0 -0
- /package/dist/docs/assets/{reference_playground.md.DnX5nL-B.lean.js → reference_playground.md.4myJPxrf.lean.js} +0 -0
- /package/dist/docs/assets/{reference_project-layout.md.CA6QP6Lw.lean.js → reference_project-layout.md.DuBu9a96.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.B1up2r9W.lean.js → reference_tools.md.aGrn99hP.lean.js} +0 -0
- /package/dist/docs/assets/{skills_framework-map.md.DDa4MeEW.lean.js → skills_framework-map.md.haibFyoB.lean.js} +0 -0
|
@@ -71,14 +71,6 @@ export type FileSinkStorageCore = Required<
|
|
|
71
71
|
Pick<StorageConfig, "put" | "get" | "delete" | "list">
|
|
72
72
|
>;
|
|
73
73
|
|
|
74
|
-
/**
|
|
75
|
-
* Adapt a {@link FileSink} to the `defineStorage` KV core. Storage keys are
|
|
76
|
-
* framework-minted (URI-encoded, length-bounded segments — see
|
|
77
|
-
* {@link storageKeys}), so they are used as file keys verbatim; values are
|
|
78
|
-
* stored as JSON bytes. Parse failures throw: on the lazy-restore path a
|
|
79
|
-
* corrupt document must fail the follow-up rather than read as a miss, and
|
|
80
|
-
* the startup bulk restore already logs-and-skips a throwing `list`.
|
|
81
|
-
*/
|
|
82
74
|
/** Parallel per-key reads backing `list` (each is presign + object GET). */
|
|
83
75
|
const LIST_READ_CONCURRENCY = 8;
|
|
84
76
|
|
|
@@ -95,6 +87,14 @@ function isUnrepresentableFileKey(key: string): boolean {
|
|
|
95
87
|
.some((segment) => segment === "" || segment === "." || segment === "..");
|
|
96
88
|
}
|
|
97
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Adapt a {@link FileSink} to the `defineStorage` KV core. Storage keys are
|
|
92
|
+
* framework-minted (URI-encoded, length-bounded segments — see
|
|
93
|
+
* {@link storageKeys}), so they are used as file keys verbatim; values are
|
|
94
|
+
* stored as JSON bytes. Parse failures throw: on the lazy-restore path a
|
|
95
|
+
* corrupt document must fail the follow-up rather than read as a miss, and
|
|
96
|
+
* the startup bulk restore already logs-and-skips a throwing `list`.
|
|
97
|
+
*/
|
|
98
98
|
export function fileSinkStorageCore(sink: FileSink): FileSinkStorageCore {
|
|
99
99
|
return {
|
|
100
100
|
async put(key, value): Promise<void> {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Local fan-out proxy for `agent-
|
|
2
|
+
* Local fan-out proxy for `agent-sdk github forward`.
|
|
3
3
|
*
|
|
4
4
|
* `gh webhook forward` can only target a single URL, and GitHub allows just one
|
|
5
5
|
* forwarder per repo/org. To feed several GitHub channels at once, we run one
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guest egress readiness for hosted v2.
|
|
3
|
+
*
|
|
4
|
+
* `waitForEngineReady` only polls July `/v1/health` (process listening). After
|
|
5
|
+
* a freeze restore the guest network (DNS, egress programming, dead sockets)
|
|
6
|
+
* often comes up later. Authored admission/execution that `fetch`es in that
|
|
7
|
+
* window throws undici `TypeError: fetch failed`, which used to become a
|
|
8
|
+
* redacted HTTP 500 `internal_error` and a minutes-long Temporal retry.
|
|
9
|
+
*
|
|
10
|
+
* TAS waits on GET `/v1/guest-network` (90s, Sand's resume bar) before
|
|
11
|
+
* opening the hosted POST. The in-POST wait stays a short last-line check
|
|
12
|
+
* so leftover races still return 503 `guest_network_unavailable` instead of
|
|
13
|
+
* a redacted 500.
|
|
14
|
+
*
|
|
15
|
+
* Quiet guest Connect (`TypeError: fetch failed` with no errno, Connect
|
|
16
|
+
* `[unknown]`/`[canceled]`/`[unavailable]`, headers/body timeout) is a
|
|
17
|
+
* stall, not a dead NIC. Those become `guest_connect_stalled` so TAS does
|
|
18
|
+
* not treat them as restore-window mystery 503s.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
export const GUEST_NETWORK_UNAVAILABLE = "guest_network_unavailable";
|
|
22
|
+
export const GUEST_CONNECT_STALLED = "guest_connect_stalled";
|
|
23
|
+
|
|
24
|
+
/** Control-plane readiness probe. Auth none, same as `/v1/health`. */
|
|
25
|
+
export const GUEST_NETWORK_PATH = "/v1/guest-network";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Sand `READY_TIMEOUT_MS` / resume reachability bar. The in-POST wait stays
|
|
29
|
+
* at {@link DEFAULT_WAIT_TIMEOUT_MS}; this budget is for GET `/v1/guest-network`
|
|
30
|
+
* so TAS does not open a hosted turn on a dead NIC.
|
|
31
|
+
*/
|
|
32
|
+
export const GUEST_NETWORK_READY_WAIT_TIMEOUT_MS = 90_000;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Node/undici codes that mean the request never produced an HTTP response.
|
|
36
|
+
* `ENOTFOUND`/`EAI_AGAIN` cover restored-pod DNS races.
|
|
37
|
+
*/
|
|
38
|
+
const TRANSIENT_NETWORK_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
39
|
+
"ECONNREFUSED",
|
|
40
|
+
"ECONNRESET",
|
|
41
|
+
"EAI_AGAIN",
|
|
42
|
+
"EHOSTUNREACH",
|
|
43
|
+
"ENETDOWN",
|
|
44
|
+
"ENETUNREACH",
|
|
45
|
+
"ENOTFOUND",
|
|
46
|
+
"EPIPE",
|
|
47
|
+
"ETIMEDOUT",
|
|
48
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
49
|
+
"UND_ERR_SOCKET",
|
|
50
|
+
"UND_ERR_CLOSED",
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
const MAX_CAUSE_DEPTH = 8;
|
|
54
|
+
|
|
55
|
+
export class GuestNetworkUnavailableError extends Error {
|
|
56
|
+
readonly code: typeof GUEST_NETWORK_UNAVAILABLE = GUEST_NETWORK_UNAVAILABLE;
|
|
57
|
+
readonly waitMs: number;
|
|
58
|
+
readonly probeAttempts: number;
|
|
59
|
+
|
|
60
|
+
constructor(
|
|
61
|
+
message = "Guest network is not ready for outbound requests.",
|
|
62
|
+
extras: { waitMs?: number; probeAttempts?: number } = {}
|
|
63
|
+
) {
|
|
64
|
+
super(message);
|
|
65
|
+
this.name = "GuestNetworkUnavailableError";
|
|
66
|
+
this.waitMs = extras.waitMs ?? 0;
|
|
67
|
+
this.probeAttempts = extras.probeAttempts ?? 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* True when the error (or anything on its `cause` chain, or inside an
|
|
73
|
+
* `AggregateError`) is a network-level fetch failure. Connect-web wraps
|
|
74
|
+
* undici's `TypeError: fetch failed` as `ConnectError` and keeps the
|
|
75
|
+
* original on `cause`.
|
|
76
|
+
*/
|
|
77
|
+
export function isTransientGuestNetworkError(error: unknown): boolean {
|
|
78
|
+
return isTransientAtDepth(error, 0);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Connect/undici codes that mean the socket was up but the RPC went quiet
|
|
83
|
+
* (headers never arrived, body stalled, caller aborted). Not a DNS/egress
|
|
84
|
+
* miss — those live in the network errno set.
|
|
85
|
+
*/
|
|
86
|
+
const QUIET_CONNECT_ERROR_CODES: ReadonlySet<string> = new Set([
|
|
87
|
+
"ABORT_ERR",
|
|
88
|
+
"UND_ERR_BODY_TIMEOUT",
|
|
89
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
90
|
+
]);
|
|
91
|
+
|
|
92
|
+
const QUIET_CONNECT_MESSAGE =
|
|
93
|
+
/^(?:\[(?:unknown|canceled|unavailable)\])|connection stalled|this operation was aborted/i;
|
|
94
|
+
|
|
95
|
+
export function hasGuestNetworkErrno(error: unknown): boolean {
|
|
96
|
+
return hasCodeAtDepth(error, 0, TRANSIENT_NETWORK_ERROR_CODES);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Quiet guest Connect: the request left the guest but never produced a
|
|
101
|
+
* useful RPC outcome. Distinct from {@link isTransientGuestNetworkError}
|
|
102
|
+
* so the in-POST wait still retries bare `fetch failed`, while the HTTP
|
|
103
|
+
* mapper can return `guest_connect_stalled` instead of a mystery 503.
|
|
104
|
+
*/
|
|
105
|
+
export function isQuietGuestConnectStall(error: unknown): boolean {
|
|
106
|
+
if (error instanceof GuestNetworkUnavailableError) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
if (hasGuestNetworkErrno(error)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return isQuietSignatureAtDepth(error, 0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function errorCode(error: Error): string | undefined {
|
|
116
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
117
|
+
return typeof code === "string" && code.length > 0 ? code : undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function hasCodeAtDepth(
|
|
121
|
+
error: unknown,
|
|
122
|
+
depth: number,
|
|
123
|
+
codes: ReadonlySet<string>
|
|
124
|
+
): boolean {
|
|
125
|
+
if (depth >= MAX_CAUSE_DEPTH || !(error instanceof Error)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const code = errorCode(error);
|
|
129
|
+
if (code !== undefined && codes.has(code)) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
if (
|
|
133
|
+
error instanceof AggregateError &&
|
|
134
|
+
error.errors.some((inner) => hasCodeAtDepth(inner, depth + 1, codes))
|
|
135
|
+
) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return hasCodeAtDepth(error.cause, depth + 1, codes);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function isQuietSignatureAtDepth(error: unknown, depth: number): boolean {
|
|
142
|
+
if (depth >= MAX_CAUSE_DEPTH || !(error instanceof Error)) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
if (error instanceof TypeError && error.message === "fetch failed") {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
const code = errorCode(error);
|
|
149
|
+
if (code !== undefined && QUIET_CONNECT_ERROR_CODES.has(code)) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
if (QUIET_CONNECT_MESSAGE.test(error.message)) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
if (
|
|
156
|
+
error instanceof AggregateError &&
|
|
157
|
+
error.errors.some((inner) => isQuietSignatureAtDepth(inner, depth + 1))
|
|
158
|
+
) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
return isQuietSignatureAtDepth(error.cause, depth + 1);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function isTransientAtDepth(error: unknown, depth: number): boolean {
|
|
165
|
+
if (depth >= MAX_CAUSE_DEPTH || !(error instanceof Error)) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
if (error instanceof TypeError && error.message === "fetch failed") {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
if (error instanceof GuestNetworkUnavailableError) {
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
const code = errorCode(error);
|
|
175
|
+
if (
|
|
176
|
+
code !== undefined &&
|
|
177
|
+
(TRANSIENT_NETWORK_ERROR_CODES.has(code) ||
|
|
178
|
+
QUIET_CONNECT_ERROR_CODES.has(code))
|
|
179
|
+
) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
if (
|
|
183
|
+
error instanceof AggregateError &&
|
|
184
|
+
error.errors.some((inner) => isTransientAtDepth(inner, depth + 1))
|
|
185
|
+
) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
return isTransientAtDepth(error.cause, depth + 1);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const DEFAULT_PROBE_TIMEOUT_MS = 2_000;
|
|
192
|
+
/** Last-line wait inside an already-open hosted POST. */
|
|
193
|
+
export const DEFAULT_WAIT_TIMEOUT_MS = 8_000;
|
|
194
|
+
const DEFAULT_POLL_MS = 250;
|
|
195
|
+
|
|
196
|
+
export type GuestNetworkWaitOptions = {
|
|
197
|
+
/**
|
|
198
|
+
* When omitted, wait is enabled only on hosted engines (probe URL set and
|
|
199
|
+
* not running under Vitest). Tests pass `true` plus a mock `probe`.
|
|
200
|
+
*/
|
|
201
|
+
enabled?: boolean;
|
|
202
|
+
/** Override the allowlisted probe URL. */
|
|
203
|
+
probeUrl?: string;
|
|
204
|
+
waitTimeoutMs?: number;
|
|
205
|
+
pollMs?: number;
|
|
206
|
+
probeTimeoutMs?: number;
|
|
207
|
+
probe?: () => Promise<void>;
|
|
208
|
+
now?: () => number;
|
|
209
|
+
sleep?: (ms: number) => Promise<void>;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
function defaultSleep(ms: number): Promise<void> {
|
|
213
|
+
return new Promise((resolve) => {
|
|
214
|
+
setTimeout(resolve, ms);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function resolveProbeUrl(explicit?: string): string | undefined {
|
|
219
|
+
const raw =
|
|
220
|
+
explicit ??
|
|
221
|
+
process.env.AGENT_SERVE_EGRESS_PROBE_URL ??
|
|
222
|
+
process.env.AGENT_SERVE_CURSOR_BACKEND_URL;
|
|
223
|
+
const trimmed = raw?.trim() ?? "";
|
|
224
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function waitEnabled(options: GuestNetworkWaitOptions): boolean {
|
|
228
|
+
if (options.enabled !== undefined) {
|
|
229
|
+
return options.enabled;
|
|
230
|
+
}
|
|
231
|
+
if (process.env.VITEST === "true") {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
if (process.env.AGENT_SERVE_SKIP_GUEST_NETWORK_WAIT === "1") {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
return resolveProbeUrl(options.probeUrl) !== undefined;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async function defaultProbe(
|
|
241
|
+
probeUrl: string,
|
|
242
|
+
probeTimeoutMs: number
|
|
243
|
+
): Promise<void> {
|
|
244
|
+
// Any HTTP response means egress and DNS work. 401/404 are ready.
|
|
245
|
+
const response = await fetch(probeUrl, {
|
|
246
|
+
method: "GET",
|
|
247
|
+
redirect: "manual",
|
|
248
|
+
signal: AbortSignal.timeout(probeTimeoutMs),
|
|
249
|
+
});
|
|
250
|
+
void response.body?.cancel();
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export type GuestNetworkWaitOutcome = "ready" | "skipped" | "unavailable";
|
|
254
|
+
|
|
255
|
+
export type GuestNetworkWaitResult = {
|
|
256
|
+
outcome: Exclude<GuestNetworkWaitOutcome, "unavailable">;
|
|
257
|
+
waitMs: number;
|
|
258
|
+
probeAttempts: number;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export type GuestNetworkWaitStats = {
|
|
262
|
+
outcome: GuestNetworkWaitOutcome;
|
|
263
|
+
waitMs: number;
|
|
264
|
+
probeAttempts: number;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* `Server-Timing` metric the control plane scrapes for Datadog
|
|
269
|
+
* `hosted_*.guest_network_wait_ms`. Any HTTP response (ok or 503) can
|
|
270
|
+
* carry it so restore time-to-egress is visible on both paths.
|
|
271
|
+
*/
|
|
272
|
+
export function formatGuestNetworkServerTiming(
|
|
273
|
+
stats: GuestNetworkWaitStats
|
|
274
|
+
): string {
|
|
275
|
+
return `guest_net;desc="${stats.outcome}";dur=${Math.max(0, stats.waitMs).toFixed(1)};probes=${String(stats.probeAttempts)}`;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Poll until a cheap allowlisted GET succeeds or the wait budget expires.
|
|
280
|
+
* Throws {@link GuestNetworkUnavailableError} on timeout so hosted routes
|
|
281
|
+
* can return 503 without running authored code.
|
|
282
|
+
*/
|
|
283
|
+
export async function waitForGuestNetworkReady(
|
|
284
|
+
options: GuestNetworkWaitOptions = {}
|
|
285
|
+
): Promise<GuestNetworkWaitResult> {
|
|
286
|
+
if (!waitEnabled(options)) {
|
|
287
|
+
return { outcome: "skipped", waitMs: 0, probeAttempts: 0 };
|
|
288
|
+
}
|
|
289
|
+
const probeUrl = resolveProbeUrl(options.probeUrl);
|
|
290
|
+
const probe =
|
|
291
|
+
options.probe ??
|
|
292
|
+
(probeUrl === undefined
|
|
293
|
+
? undefined
|
|
294
|
+
: () =>
|
|
295
|
+
defaultProbe(
|
|
296
|
+
probeUrl,
|
|
297
|
+
options.probeTimeoutMs ?? DEFAULT_PROBE_TIMEOUT_MS
|
|
298
|
+
));
|
|
299
|
+
if (probe === undefined) {
|
|
300
|
+
return { outcome: "skipped", waitMs: 0, probeAttempts: 0 };
|
|
301
|
+
}
|
|
302
|
+
const waitTimeoutMs = options.waitTimeoutMs ?? DEFAULT_WAIT_TIMEOUT_MS;
|
|
303
|
+
const pollMs = options.pollMs ?? DEFAULT_POLL_MS;
|
|
304
|
+
const now = options.now ?? Date.now;
|
|
305
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
306
|
+
const startedAt = now();
|
|
307
|
+
let lastError: unknown;
|
|
308
|
+
let probeAttempts = 0;
|
|
309
|
+
for (;;) {
|
|
310
|
+
probeAttempts += 1;
|
|
311
|
+
try {
|
|
312
|
+
await probe();
|
|
313
|
+
return {
|
|
314
|
+
outcome: "ready",
|
|
315
|
+
waitMs: Math.max(0, now() - startedAt),
|
|
316
|
+
probeAttempts,
|
|
317
|
+
};
|
|
318
|
+
} catch (error) {
|
|
319
|
+
lastError = error;
|
|
320
|
+
if (!isTransientGuestNetworkError(error)) {
|
|
321
|
+
throw error;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
const elapsedMs = now() - startedAt;
|
|
325
|
+
if (elapsedMs >= waitTimeoutMs) {
|
|
326
|
+
const detail =
|
|
327
|
+
lastError instanceof Error ? lastError.message : String(lastError);
|
|
328
|
+
throw new GuestNetworkUnavailableError(
|
|
329
|
+
`Guest network did not become ready within ${String(waitTimeoutMs)}ms (${detail}).`,
|
|
330
|
+
{ waitMs: Math.max(0, elapsedMs), probeAttempts }
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
await sleep(pollMs);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* GET `/v1/guest-network`: wait up to
|
|
339
|
+
* {@link GUEST_NETWORK_READY_WAIT_TIMEOUT_MS} and return 200 (ready/skipped)
|
|
340
|
+
* or 503 `guest_network_unavailable`. Server-Timing matches the hosted POST
|
|
341
|
+
* so TAS can scrape the same `guest_net` metric before `postHosted`.
|
|
342
|
+
*/
|
|
343
|
+
export async function guestNetworkReadinessResponse(
|
|
344
|
+
options: GuestNetworkWaitOptions = {}
|
|
345
|
+
): Promise<Response> {
|
|
346
|
+
try {
|
|
347
|
+
const result = await waitForGuestNetworkReady({
|
|
348
|
+
waitTimeoutMs: GUEST_NETWORK_READY_WAIT_TIMEOUT_MS,
|
|
349
|
+
...options,
|
|
350
|
+
});
|
|
351
|
+
return new Response(JSON.stringify({ ok: true, ...result }), {
|
|
352
|
+
status: 200,
|
|
353
|
+
headers: {
|
|
354
|
+
"content-type": "application/json; charset=utf-8",
|
|
355
|
+
"server-timing": formatGuestNetworkServerTiming(result),
|
|
356
|
+
},
|
|
357
|
+
});
|
|
358
|
+
} catch (error) {
|
|
359
|
+
if (!(error instanceof GuestNetworkUnavailableError)) {
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
return new Response(
|
|
363
|
+
JSON.stringify({
|
|
364
|
+
ok: false,
|
|
365
|
+
error: GUEST_NETWORK_UNAVAILABLE,
|
|
366
|
+
message: error.message,
|
|
367
|
+
waitMs: error.waitMs,
|
|
368
|
+
probeAttempts: error.probeAttempts,
|
|
369
|
+
}),
|
|
370
|
+
{
|
|
371
|
+
status: 503,
|
|
372
|
+
headers: {
|
|
373
|
+
"content-type": "application/json; charset=utf-8",
|
|
374
|
+
"server-timing": formatGuestNetworkServerTiming({
|
|
375
|
+
outcome: "unavailable",
|
|
376
|
+
waitMs: error.waitMs,
|
|
377
|
+
probeAttempts: error.probeAttempts,
|
|
378
|
+
}),
|
|
379
|
+
},
|
|
380
|
+
}
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Author-facing OpenTelemetry surface for {@link HostContext.otel}.
|
|
3
3
|
*
|
|
4
4
|
* Always present on `ctx.host`. Counters and histograms no-op when no meter
|
|
5
|
-
* is running. `setAttributes` still tags
|
|
6
|
-
* is attached. `forSession` is engine-only so a tool cannot
|
|
7
|
-
* conversation's tags.
|
|
5
|
+
* is running. `setAttributes` still tags open turn/tool spans when a
|
|
6
|
+
* collector is attached. `forSession` is engine-only so a tool cannot
|
|
7
|
+
* retarget another conversation's tags.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { Counter, Histogram, Meter } from "@opentelemetry/api";
|
|
@@ -27,6 +27,7 @@ const RESERVED_METRICS = new Set([
|
|
|
27
27
|
|
|
28
28
|
const RESERVED_ATTRIBUTES = new Set([
|
|
29
29
|
"cursor.conversation.id",
|
|
30
|
+
"agent_sdk.session_id",
|
|
30
31
|
"agent_sdk.agent",
|
|
31
32
|
"agent_sdk.turn_id",
|
|
32
33
|
"agent_sdk.framework",
|
|
@@ -157,7 +158,10 @@ function emitAttributes(
|
|
|
157
158
|
"agent_sdk.agent": state.shared.agentName,
|
|
158
159
|
...(state.sessionId === undefined
|
|
159
160
|
? {}
|
|
160
|
-
: {
|
|
161
|
+
: {
|
|
162
|
+
"cursor.conversation.id": state.sessionId,
|
|
163
|
+
"agent_sdk.session_id": state.sessionId,
|
|
164
|
+
}),
|
|
161
165
|
});
|
|
162
166
|
}
|
|
163
167
|
|
|
@@ -4,17 +4,18 @@ import type { ChannelHandlerArgs } from "../types.js";
|
|
|
4
4
|
* Hosted-admission hook a channel pack attaches to its definition.
|
|
5
5
|
*
|
|
6
6
|
* Hosted delivery looks this up from the mounted definition — it does not
|
|
7
|
-
* switch on `channelKind`. A new forge implements `dispatch`
|
|
8
|
-
*
|
|
9
|
-
* from
|
|
7
|
+
* switch on `channelKind`. A new forge implements `dispatch` next to its
|
|
8
|
+
* webhook handler and calls {@link attachHostedAdmissionAdapter} from the
|
|
9
|
+
* channel constructor. Every 2xx from `dispatch` must carry a tag from
|
|
10
|
+
* `internal/channel-dispatch`; an untagged one is answered with 502
|
|
11
|
+
* `channel_outcome_missing`.
|
|
10
12
|
*/
|
|
11
|
-
export type HostedAdmissionDispatchOutcome = "skip" | "task";
|
|
12
|
-
|
|
13
13
|
export type HostedAdmissionAdapter = {
|
|
14
14
|
kind: string;
|
|
15
15
|
/**
|
|
16
|
-
* Optional wrap of the capturing `send` / `waitUntil` args (
|
|
17
|
-
* this to propagate background-task errors). Identity when
|
|
16
|
+
* Optional wrap of the capturing `send` / `waitUntil` args (the PR
|
|
17
|
+
* channels use this to propagate background-task errors). Identity when
|
|
18
|
+
* omitted.
|
|
18
19
|
*/
|
|
19
20
|
prepareArgs?(args: ChannelHandlerArgs): ChannelHandlerArgs;
|
|
20
21
|
dispatch(input: {
|
|
@@ -23,7 +24,6 @@ export type HostedAdmissionAdapter = {
|
|
|
23
24
|
deliveryId: string;
|
|
24
25
|
args: ChannelHandlerArgs;
|
|
25
26
|
}): Promise<Response>;
|
|
26
|
-
getOutcome(response: Response): HostedAdmissionDispatchOutcome | undefined;
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
const adapters = new WeakMap<object, HostedAdmissionAdapter>();
|
|
@@ -13,6 +13,12 @@ export const HOSTED_EXECUTION_DIAG_FILENAME = "hosted-execution.json";
|
|
|
13
13
|
export type HostedAdmissionManagedAutomation = {
|
|
14
14
|
automationUuid: string;
|
|
15
15
|
mcpServerNames: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Slack channel ids the automation's "Send to Slack" action targets,
|
|
18
|
+
* posted through the control-plane Slack relay. Omitted when the action
|
|
19
|
+
* is toggled off (never empty).
|
|
20
|
+
*/
|
|
21
|
+
slackChannels?: string[];
|
|
16
22
|
};
|
|
17
23
|
|
|
18
24
|
export type HostedAdmission = {
|
|
@@ -59,9 +65,15 @@ const DELIVERY_KEYS = new Set([
|
|
|
59
65
|
"payload",
|
|
60
66
|
"managedAutomation",
|
|
61
67
|
]);
|
|
62
|
-
const MANAGED_AUTOMATION_KEYS = new Set([
|
|
68
|
+
const MANAGED_AUTOMATION_KEYS = new Set([
|
|
69
|
+
"automationUuid",
|
|
70
|
+
"mcpServerNames",
|
|
71
|
+
"slackChannels",
|
|
72
|
+
]);
|
|
63
73
|
/** More names than any real automation configures is a malformed envelope. */
|
|
64
74
|
const MANAGED_AUTOMATION_MAX_SERVERS = 64;
|
|
75
|
+
/** More channels than the dashboard picker allows is a malformed envelope. */
|
|
76
|
+
const MANAGED_AUTOMATION_MAX_SLACK_CHANNELS = 64;
|
|
65
77
|
const EXECUTION_KEYS = new Set(["v", "admissionToken", "sessionPublicId"]);
|
|
66
78
|
|
|
67
79
|
function boundedString(value: unknown, max: number): value is string {
|
|
@@ -92,10 +104,23 @@ function parseManagedAutomation(
|
|
|
92
104
|
) {
|
|
93
105
|
return undefined;
|
|
94
106
|
}
|
|
107
|
+
if (body.slackChannels !== undefined) {
|
|
108
|
+
if (
|
|
109
|
+
!Array.isArray(body.slackChannels) ||
|
|
110
|
+
body.slackChannels.length === 0 ||
|
|
111
|
+
body.slackChannels.length > MANAGED_AUTOMATION_MAX_SLACK_CHANNELS ||
|
|
112
|
+
!body.slackChannels.every((channel) => boundedString(channel, 64))
|
|
113
|
+
) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
95
117
|
return {
|
|
96
118
|
managedAutomation: {
|
|
97
119
|
automationUuid: body.automationUuid,
|
|
98
120
|
mcpServerNames: body.mcpServerNames,
|
|
121
|
+
...(body.slackChannels === undefined
|
|
122
|
+
? {}
|
|
123
|
+
: { slackChannels: body.slackChannels as string[] }),
|
|
99
124
|
},
|
|
100
125
|
};
|
|
101
126
|
}
|