@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
|
@@ -22,8 +22,19 @@ export type ConversationType =
|
|
|
22
22
|
| "issue"
|
|
23
23
|
| "thread"
|
|
24
24
|
| "origin-pr"
|
|
25
|
+
| "gitlab-mr"
|
|
26
|
+
| "bitbucket-pr"
|
|
25
27
|
| "deployment";
|
|
26
28
|
|
|
29
|
+
export type ContinuationKind =
|
|
30
|
+
| "github"
|
|
31
|
+
| "slack"
|
|
32
|
+
| "origin"
|
|
33
|
+
| "gitlab"
|
|
34
|
+
| "bitbucket"
|
|
35
|
+
| "deployments"
|
|
36
|
+
| "http";
|
|
37
|
+
|
|
27
38
|
export const CONTINUATION_SELECTORS = [
|
|
28
39
|
"github.pr/v1",
|
|
29
40
|
"github.pr/v2",
|
|
@@ -36,6 +47,10 @@ export const CONTINUATION_SELECTORS = [
|
|
|
36
47
|
"origin.pr/v1",
|
|
37
48
|
"origin.pr/v2",
|
|
38
49
|
"origin.none/v2",
|
|
50
|
+
"gitlab.mr/v2",
|
|
51
|
+
"gitlab.none/v2",
|
|
52
|
+
"bitbucket.pr/v2",
|
|
53
|
+
"bitbucket.none/v2",
|
|
39
54
|
"deployments.none/v1",
|
|
40
55
|
"deployments.none/v2",
|
|
41
56
|
"deployments.deployment/v2",
|
|
@@ -52,7 +67,7 @@ export type ParsedContinuation = {
|
|
|
52
67
|
selector: ContinuationSelector;
|
|
53
68
|
version: 1 | 2;
|
|
54
69
|
type: ConversationType | "none";
|
|
55
|
-
kind:
|
|
70
|
+
kind: ContinuationKind;
|
|
56
71
|
};
|
|
57
72
|
|
|
58
73
|
export type ContinuationClaim = {
|
|
@@ -70,7 +85,7 @@ export type MailboxContinuation = {
|
|
|
70
85
|
|
|
71
86
|
export type ContinuationBuiltin = {
|
|
72
87
|
type: ConversationType;
|
|
73
|
-
kind:
|
|
88
|
+
kind: Exclude<ContinuationKind, "http">;
|
|
74
89
|
events: readonly string[];
|
|
75
90
|
format: string;
|
|
76
91
|
};
|
|
@@ -104,6 +119,9 @@ export const BUILTINS: readonly ContinuationBuiltin[] = [
|
|
|
104
119
|
{
|
|
105
120
|
type: "origin-pr",
|
|
106
121
|
kind: "origin",
|
|
122
|
+
// Public webhook deliveries carry `pullRequest.number` + repository
|
|
123
|
+
// (`owner.slug` / `name`); keep in lockstep with the control plane's
|
|
124
|
+
// `conversation/origin.ts`.
|
|
107
125
|
events: [
|
|
108
126
|
"pull_request.created",
|
|
109
127
|
"pull_request.published",
|
|
@@ -113,9 +131,34 @@ export const BUILTINS: readonly ContinuationBuiltin[] = [
|
|
|
113
131
|
"pull_request.merged",
|
|
114
132
|
"pull_request.comment.created",
|
|
115
133
|
"pull_request.review.submitted",
|
|
134
|
+
"pull_request.metadata.updated",
|
|
116
135
|
],
|
|
117
136
|
format: "origin-pr:{fullName}#{number}",
|
|
118
137
|
},
|
|
138
|
+
{
|
|
139
|
+
type: "gitlab-mr",
|
|
140
|
+
kind: "gitlab",
|
|
141
|
+
// GitLab `object_kind`s that carry a merge request: `note` only when
|
|
142
|
+
// `noteable_type` is MergeRequest, `pipeline` only with `merge_request`.
|
|
143
|
+
events: ["merge_request", "note", "pipeline"],
|
|
144
|
+
format: "gitlab-mr:{fullName}!{number}",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: "bitbucket-pr",
|
|
148
|
+
kind: "bitbucket",
|
|
149
|
+
// Cloud vocabulary; Data Center keys are normalized before the stamp.
|
|
150
|
+
events: [
|
|
151
|
+
"pullrequest:created",
|
|
152
|
+
"pullrequest:updated",
|
|
153
|
+
"pullrequest:approved",
|
|
154
|
+
"pullrequest:unapproved",
|
|
155
|
+
"pullrequest:changes_request_created",
|
|
156
|
+
"pullrequest:fulfilled",
|
|
157
|
+
"pullrequest:rejected",
|
|
158
|
+
"pullrequest:comment_created",
|
|
159
|
+
],
|
|
160
|
+
format: "bitbucket-pr:{fullName}#{number}",
|
|
161
|
+
},
|
|
119
162
|
{
|
|
120
163
|
type: "deployment",
|
|
121
164
|
kind: "deployments",
|
|
@@ -147,6 +190,10 @@ const SELECTOR_FIELDS: {
|
|
|
147
190
|
"origin.pr/v1": { version: 1, type: "origin-pr", kind: "origin" },
|
|
148
191
|
"origin.pr/v2": { version: 2, type: "origin-pr", kind: "origin" },
|
|
149
192
|
"origin.none/v2": { version: 2, type: "none", kind: "origin" },
|
|
193
|
+
"gitlab.mr/v2": { version: 2, type: "gitlab-mr", kind: "gitlab" },
|
|
194
|
+
"gitlab.none/v2": { version: 2, type: "none", kind: "gitlab" },
|
|
195
|
+
"bitbucket.pr/v2": { version: 2, type: "bitbucket-pr", kind: "bitbucket" },
|
|
196
|
+
"bitbucket.none/v2": { version: 2, type: "none", kind: "bitbucket" },
|
|
150
197
|
"deployments.none/v1": { version: 1, type: "none", kind: "deployments" },
|
|
151
198
|
"deployments.none/v2": { version: 2, type: "none", kind: "deployments" },
|
|
152
199
|
"deployments.deployment/v2": {
|
|
@@ -158,9 +205,7 @@ const SELECTOR_FIELDS: {
|
|
|
158
205
|
"none/v2": { version: 2, type: "none", kind: "http" },
|
|
159
206
|
};
|
|
160
207
|
|
|
161
|
-
|
|
162
|
-
value: string
|
|
163
|
-
): value is ContinuationSelector {
|
|
208
|
+
function isContinuationSelector(value: string): value is ContinuationSelector {
|
|
164
209
|
return Object.hasOwn(SELECTOR_FIELDS, value);
|
|
165
210
|
}
|
|
166
211
|
|
|
@@ -190,6 +235,20 @@ export function defaultContinuationSelector(
|
|
|
190
235
|
return "slack.thread/v2";
|
|
191
236
|
case "origin":
|
|
192
237
|
return originV2Default(eventTypes);
|
|
238
|
+
case "gitlab":
|
|
239
|
+
return membershipOrNone(
|
|
240
|
+
eventTypes,
|
|
241
|
+
"gitlab-mr",
|
|
242
|
+
"gitlab.mr/v2",
|
|
243
|
+
"gitlab.none/v2"
|
|
244
|
+
);
|
|
245
|
+
case "bitbucket":
|
|
246
|
+
return membershipOrNone(
|
|
247
|
+
eventTypes,
|
|
248
|
+
"bitbucket-pr",
|
|
249
|
+
"bitbucket.pr/v2",
|
|
250
|
+
"bitbucket.none/v2"
|
|
251
|
+
);
|
|
193
252
|
case "deployments":
|
|
194
253
|
return deploymentsV2Default(eventTypes);
|
|
195
254
|
default:
|
|
@@ -197,6 +256,20 @@ export function defaultContinuationSelector(
|
|
|
197
256
|
}
|
|
198
257
|
}
|
|
199
258
|
|
|
259
|
+
/** Typed selector when every declared event is in the type's membership. */
|
|
260
|
+
function membershipOrNone(
|
|
261
|
+
eventTypes: readonly string[] | undefined,
|
|
262
|
+
type: ConversationType,
|
|
263
|
+
typed: ContinuationSelector,
|
|
264
|
+
none: ContinuationSelector
|
|
265
|
+
): ContinuationSelector {
|
|
266
|
+
const allowed = new Set(builtinForType(type)?.events ?? []);
|
|
267
|
+
if ((eventTypes ?? []).some((event) => !allowed.has(event))) {
|
|
268
|
+
return none;
|
|
269
|
+
}
|
|
270
|
+
return typed;
|
|
271
|
+
}
|
|
272
|
+
|
|
200
273
|
function githubV2Default(eventTypes?: readonly string[]): ContinuationSelector {
|
|
201
274
|
const events = eventTypes ?? [];
|
|
202
275
|
const issueEvents = new Set(builtinForType("issue")?.events ?? []);
|
|
@@ -219,6 +292,45 @@ function originV2Default(eventTypes?: readonly string[]): ContinuationSelector {
|
|
|
219
292
|
return "origin.pr/v2";
|
|
220
293
|
}
|
|
221
294
|
|
|
295
|
+
/**
|
|
296
|
+
* Omitted `/v2` default became type `none` because a declared event sits
|
|
297
|
+
* outside the kind's typed membership. Validate warns; handshake stays
|
|
298
|
+
* silent on omitted selectors (type `none` is always admitted).
|
|
299
|
+
*/
|
|
300
|
+
export function omittedV2MembershipDowngrade(
|
|
301
|
+
kind: string,
|
|
302
|
+
eventTypes?: readonly string[]
|
|
303
|
+
):
|
|
304
|
+
| { selector: ContinuationSelector; unexpected: readonly string[] }
|
|
305
|
+
| undefined {
|
|
306
|
+
const events = eventTypes ?? [];
|
|
307
|
+
if (events.length === 0) {
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
const selector = defaultContinuationSelector(kind, "v2", events);
|
|
311
|
+
const parsed = parseContinuationSelector(selector);
|
|
312
|
+
if (parsed === undefined || parsed.type !== "none") {
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
const typed =
|
|
316
|
+
kind === "github"
|
|
317
|
+
? builtinForType("pr")
|
|
318
|
+
: kind === "origin"
|
|
319
|
+
? builtinForType("origin-pr")
|
|
320
|
+
: kind === "deployments"
|
|
321
|
+
? builtinForType("deployment")
|
|
322
|
+
: undefined;
|
|
323
|
+
if (typed === undefined) {
|
|
324
|
+
return undefined;
|
|
325
|
+
}
|
|
326
|
+
const allowed = new Set(typed.events);
|
|
327
|
+
const unexpected = events.filter((event) => !allowed.has(event));
|
|
328
|
+
if (unexpected.length === 0) {
|
|
329
|
+
return undefined;
|
|
330
|
+
}
|
|
331
|
+
return { selector, unexpected };
|
|
332
|
+
}
|
|
333
|
+
|
|
222
334
|
function deploymentsV2Default(
|
|
223
335
|
eventTypes?: readonly string[]
|
|
224
336
|
): ContinuationSelector {
|
|
@@ -239,7 +351,7 @@ export function parseContinuationSelector(
|
|
|
239
351
|
return { selector, ...SELECTOR_FIELDS[selector] };
|
|
240
352
|
}
|
|
241
353
|
|
|
242
|
-
|
|
354
|
+
function resolveContinuation(
|
|
243
355
|
raw?: ContinuationIdentity,
|
|
244
356
|
kind?: string
|
|
245
357
|
): ParsedContinuation {
|
|
@@ -273,17 +385,17 @@ export function isV2DurableContinuationKey(key: string): boolean {
|
|
|
273
385
|
return key.startsWith("cont:") || key.startsWith("evt:");
|
|
274
386
|
}
|
|
275
387
|
|
|
276
|
-
|
|
388
|
+
function newEvtKey(): string {
|
|
277
389
|
return `evt:${randomBytes(16).toString("hex")}`;
|
|
278
390
|
}
|
|
279
391
|
|
|
280
|
-
|
|
392
|
+
function builtinForType(
|
|
281
393
|
type: ConversationType
|
|
282
394
|
): ContinuationBuiltin | undefined {
|
|
283
395
|
return BUILTINS.find((builtin) => builtin.type === type);
|
|
284
396
|
}
|
|
285
397
|
|
|
286
|
-
|
|
398
|
+
function formatConversationKey(
|
|
287
399
|
type: ConversationType,
|
|
288
400
|
fields: {
|
|
289
401
|
fullName?: string;
|
|
@@ -300,6 +412,10 @@ export function formatConversationKey(
|
|
|
300
412
|
return `github-issue:${fields.fullName}#${fields.number}`;
|
|
301
413
|
case "origin-pr":
|
|
302
414
|
return `origin-pr:${fields.fullName}#${fields.number}`;
|
|
415
|
+
case "gitlab-mr":
|
|
416
|
+
return `gitlab-mr:${fields.fullName}!${fields.number}`;
|
|
417
|
+
case "bitbucket-pr":
|
|
418
|
+
return `bitbucket-pr:${fields.fullName}#${fields.number}`;
|
|
303
419
|
case "thread":
|
|
304
420
|
return `${fields.channelId}:${fields.threadTs}`;
|
|
305
421
|
case "deployment":
|
|
@@ -327,7 +443,9 @@ export function mintClaim(claim: ContinuationClaim): string {
|
|
|
327
443
|
}
|
|
328
444
|
case "pr":
|
|
329
445
|
case "issue":
|
|
330
|
-
case "origin-pr":
|
|
446
|
+
case "origin-pr":
|
|
447
|
+
case "gitlab-mr":
|
|
448
|
+
case "bitbucket-pr": {
|
|
331
449
|
const resource = claim.resource;
|
|
332
450
|
const fullName =
|
|
333
451
|
"fullName" in resource
|
|
@@ -341,8 +459,15 @@ export function mintClaim(claim: ContinuationClaim): string {
|
|
|
341
459
|
`v2: ${claim.type} claim requires repository and number`
|
|
342
460
|
);
|
|
343
461
|
}
|
|
462
|
+
// GitLab paths and Bitbucket project keys arrive in API-native casing;
|
|
463
|
+
// the webhook extractors lowercase them, so the claim must too or the
|
|
464
|
+
// two mint different keys for the same MR / PR.
|
|
465
|
+
const caseFolded =
|
|
466
|
+
claim.type === "gitlab-mr" || claim.type === "bitbucket-pr"
|
|
467
|
+
? fullName.toLowerCase()
|
|
468
|
+
: fullName;
|
|
344
469
|
return `cont:${formatConversationKey(claim.type, {
|
|
345
|
-
fullName,
|
|
470
|
+
fullName: caseFolded,
|
|
346
471
|
number,
|
|
347
472
|
})}`;
|
|
348
473
|
}
|
|
@@ -421,6 +546,10 @@ export function extractContinuation(
|
|
|
421
546
|
return extractSlack(payload);
|
|
422
547
|
case "origin-pr":
|
|
423
548
|
return extractOrigin(payload);
|
|
549
|
+
case "gitlab-mr":
|
|
550
|
+
return extractGitlab(eventName, payload);
|
|
551
|
+
case "bitbucket-pr":
|
|
552
|
+
return extractBitbucket(payload);
|
|
424
553
|
case "deployment":
|
|
425
554
|
return extractDeployment(payload);
|
|
426
555
|
}
|
|
@@ -629,6 +758,95 @@ function originExtractRecord(
|
|
|
629
758
|
return record;
|
|
630
759
|
}
|
|
631
760
|
|
|
761
|
+
/**
|
|
762
|
+
* GitLab merge request identity: `project.path_with_namespace` (nested
|
|
763
|
+
* groups keep their slashes; lowercased like the scope key) plus the MR
|
|
764
|
+
* `iid`. `merge_request` reads `object_attributes.iid`; `note` binds only
|
|
765
|
+
* MR notes (`noteable_type: "MergeRequest"`); `pipeline` binds only when
|
|
766
|
+
* the payload carries a `merge_request`.
|
|
767
|
+
*/
|
|
768
|
+
function extractGitlab(
|
|
769
|
+
eventName: string,
|
|
770
|
+
payload: unknown
|
|
771
|
+
): string | undefined {
|
|
772
|
+
const record = asRecord(payload);
|
|
773
|
+
if (record === undefined) {
|
|
774
|
+
return undefined;
|
|
775
|
+
}
|
|
776
|
+
const fullName = nonEmpty(
|
|
777
|
+
asRecord(record.project)?.path_with_namespace
|
|
778
|
+
)?.toLowerCase();
|
|
779
|
+
if (fullName === undefined) {
|
|
780
|
+
return undefined;
|
|
781
|
+
}
|
|
782
|
+
let number: number | undefined;
|
|
783
|
+
switch (eventName) {
|
|
784
|
+
case "merge_request":
|
|
785
|
+
number = positiveInt(asRecord(record.object_attributes)?.iid);
|
|
786
|
+
break;
|
|
787
|
+
case "note":
|
|
788
|
+
if (
|
|
789
|
+
asRecord(record.object_attributes)?.noteable_type !== "MergeRequest"
|
|
790
|
+
) {
|
|
791
|
+
return undefined;
|
|
792
|
+
}
|
|
793
|
+
number = positiveInt(asRecord(record.merge_request)?.iid);
|
|
794
|
+
break;
|
|
795
|
+
case "pipeline":
|
|
796
|
+
number = positiveInt(asRecord(record.merge_request)?.iid);
|
|
797
|
+
break;
|
|
798
|
+
default:
|
|
799
|
+
return undefined;
|
|
800
|
+
}
|
|
801
|
+
if (number === undefined) {
|
|
802
|
+
return undefined;
|
|
803
|
+
}
|
|
804
|
+
return `cont:${formatConversationKey("gitlab-mr", { fullName, number })}`;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/**
|
|
808
|
+
* Bitbucket pull request identity from either dialect. Cloud payloads carry
|
|
809
|
+
* `repository.full_name` + `pullrequest.id`; Data Center payloads carry
|
|
810
|
+
* `pullRequest.id` and the repo under `pullRequest.toRef.repository`
|
|
811
|
+
* (`project.key/slug`). Lowercased so a Cloud/DC pair for one logical PR
|
|
812
|
+
* shares a key.
|
|
813
|
+
*/
|
|
814
|
+
function extractBitbucket(payload: unknown): string | undefined {
|
|
815
|
+
const record = asRecord(payload);
|
|
816
|
+
if (record === undefined) {
|
|
817
|
+
return undefined;
|
|
818
|
+
}
|
|
819
|
+
const pullRequest =
|
|
820
|
+
asRecord(record.pullrequest) ?? asRecord(record.pullRequest);
|
|
821
|
+
const number = positiveInt(pullRequest?.id);
|
|
822
|
+
const fullName = bitbucketFullName(
|
|
823
|
+
asRecord(record.repository) ??
|
|
824
|
+
asRecord(asRecord(pullRequest?.toRef)?.repository)
|
|
825
|
+
);
|
|
826
|
+
if (number === undefined || fullName === undefined) {
|
|
827
|
+
return undefined;
|
|
828
|
+
}
|
|
829
|
+
return `cont:${formatConversationKey("bitbucket-pr", { fullName, number })}`;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
function bitbucketFullName(
|
|
833
|
+
repository: Record<string, unknown> | undefined
|
|
834
|
+
): string | undefined {
|
|
835
|
+
if (repository === undefined) {
|
|
836
|
+
return undefined;
|
|
837
|
+
}
|
|
838
|
+
const cloud = nonEmpty(repository.full_name);
|
|
839
|
+
if (cloud !== undefined) {
|
|
840
|
+
return cloud.toLowerCase();
|
|
841
|
+
}
|
|
842
|
+
const projectKey = nonEmpty(asRecord(repository.project)?.key);
|
|
843
|
+
const slug = nonEmpty(repository.slug);
|
|
844
|
+
if (projectKey === undefined || slug === undefined) {
|
|
845
|
+
return undefined;
|
|
846
|
+
}
|
|
847
|
+
return `${projectKey}/${slug}`.toLowerCase();
|
|
848
|
+
}
|
|
849
|
+
|
|
632
850
|
function extractDeployment(payload: unknown): string | undefined {
|
|
633
851
|
const record = asRecord(payload);
|
|
634
852
|
const deploymentId = nonEmpty(record?.deploymentId);
|
|
@@ -395,9 +395,10 @@ export function selectConversationMirror(input: {
|
|
|
395
395
|
sink: cursorHostedFiles({
|
|
396
396
|
resolveStoreSourceId: () =>
|
|
397
397
|
hosting.resolveStoreIds().frameworkStoreSourceId,
|
|
398
|
-
// Full chain (env → key file → stored login): frozen
|
|
399
|
-
// unsigned and
|
|
400
|
-
// is constructed.
|
|
398
|
+
// Full chain (env → key file → stored login), resolved lazily: frozen
|
|
399
|
+
// engines listen unsigned and only gain a credential at task time,
|
|
400
|
+
// after this sink is constructed. Hosted deliveries have consumed the
|
|
401
|
+
// bind file into CURSOR_API_KEY by then, so this resolves from env.
|
|
401
402
|
resolveApiKey: () => resolveApiKeySync()?.apiKey,
|
|
402
403
|
}),
|
|
403
404
|
agentName: input.project.name,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Types for `convertWorkflow` — the pure automation → agentsdk project
|
|
3
|
-
* converter behind `agent-
|
|
3
|
+
* converter behind `agent-sdk convert-automation`.
|
|
4
4
|
*
|
|
5
5
|
* The workflow arrives as generic proto3 JSON (lowerCamelCase field names,
|
|
6
6
|
* enum value names as strings) produced by the backend export endpoint
|
|
@@ -28,6 +28,7 @@ import type {
|
|
|
28
28
|
} from "../../types.js";
|
|
29
29
|
import { isCursorAccountTransport } from "../../types.js";
|
|
30
30
|
import { probeConnectorAuthUrls } from "../cursor-account-mcp-auth.js";
|
|
31
|
+
import { describeError } from "../describe-error.js";
|
|
31
32
|
import { LOG_PREFIX } from "../distribution.js";
|
|
32
33
|
import { handleStatelessMcpRequest } from "../mcp-endpoint.js";
|
|
33
34
|
import { isLoopbackAddress } from "../net.js";
|
|
@@ -560,10 +561,6 @@ function trimTrailingSlash(url: string): string {
|
|
|
560
561
|
return url.endsWith("/") ? url.slice(0, -1) : url;
|
|
561
562
|
}
|
|
562
563
|
|
|
563
|
-
function describeError(error: unknown): string {
|
|
564
|
-
return error instanceof Error ? error.message : String(error);
|
|
565
|
-
}
|
|
566
|
-
|
|
567
564
|
export interface CursorAccountMcpWarningServer {
|
|
568
565
|
serverIdentifier: string;
|
|
569
566
|
status: string;
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
import { randomUUID } from "node:crypto";
|
|
18
18
|
import { z } from "zod";
|
|
19
19
|
import type { McpToolAnnotations } from "../../types.js";
|
|
20
|
+
import { describeError } from "../describe-error.js";
|
|
21
|
+
import { CLI_COMMAND_NAME as CLI } from "../distribution.js";
|
|
20
22
|
import { boundedToolAnnotations } from "../mcp-host.js";
|
|
21
23
|
import {
|
|
22
24
|
CURSOR_SESSION_EXCHANGE_PATH,
|
|
@@ -300,9 +302,10 @@ export interface CursorBackendClientOptions {
|
|
|
300
302
|
backendUrl: string;
|
|
301
303
|
apiKey: string;
|
|
302
304
|
/**
|
|
303
|
-
* Re-
|
|
304
|
-
* unsigned and
|
|
305
|
-
*
|
|
305
|
+
* Re-resolve the key on each authenticated call. Hosted freeze listens
|
|
306
|
+
* unsigned and only gains a credential at task time (hosted deliveries
|
|
307
|
+
* consume the bind file into `CURSOR_API_KEY` before authored work); a
|
|
308
|
+
* constructor-frozen key would miss that bind.
|
|
306
309
|
*/
|
|
307
310
|
getApiKey?: () => string;
|
|
308
311
|
logger?: (line: string) => void;
|
|
@@ -607,7 +610,7 @@ export class CursorBackendClient {
|
|
|
607
610
|
}
|
|
608
611
|
throw new CursorBackendError(
|
|
609
612
|
error.status === 401
|
|
610
|
-
?
|
|
613
|
+
? `The Cursor API key was rejected. Run \`${CLI} login\` again or update CURSOR_API_KEY.`
|
|
611
614
|
: `Cursor API key exchange failed (${error.status}).`,
|
|
612
615
|
error.status
|
|
613
616
|
);
|
|
@@ -623,7 +626,7 @@ export class CursorBackendClient {
|
|
|
623
626
|
|
|
624
627
|
/**
|
|
625
628
|
* Mint a named user API key from a short-lived login session token. Used
|
|
626
|
-
* exactly once per `agent-
|
|
629
|
+
* exactly once per `agent-sdk login`; the session token is then discarded.
|
|
627
630
|
*/
|
|
628
631
|
export async function createUserApiKeyWithSessionToken(args: {
|
|
629
632
|
backendUrl: string;
|
|
@@ -867,7 +870,7 @@ function describeGithubTokenHttpFailure(
|
|
|
867
870
|
if (status === 401) {
|
|
868
871
|
return `The Cursor API key was rejected${
|
|
869
872
|
detail === undefined ? "" : `: ${detail}`
|
|
870
|
-
}. Run
|
|
873
|
+
}. Run \`${CLI} login\` again or update CURSOR_API_KEY.`;
|
|
871
874
|
}
|
|
872
875
|
if (detail !== undefined) {
|
|
873
876
|
return detail;
|
|
@@ -899,10 +902,6 @@ function retryAfterMsFromResponse(response: Response): number | undefined {
|
|
|
899
902
|
return Math.min(retryAfter * 1000, MAX_GITHUB_TOKEN_RETRY_AFTER_MS);
|
|
900
903
|
}
|
|
901
904
|
|
|
902
|
-
function describeError(error: unknown): string {
|
|
903
|
-
return error instanceof Error ? error.message : String(error);
|
|
904
|
-
}
|
|
905
|
-
|
|
906
905
|
/** Release undici/fetch connection slots on responses we will not parse. */
|
|
907
906
|
async function drainResponseBody(response: Response): Promise<void> {
|
|
908
907
|
try {
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Destroying a hosted v2 task-bind secret file after its value is in
|
|
3
|
+
* `process.env`.
|
|
4
|
+
*
|
|
5
|
+
* The bind files under `/run/cursor/secrets/` are an IPC channel, not a
|
|
6
|
+
* credential store: the control plane cannot set another process's
|
|
7
|
+
* environment, so it drops the value on tmpfs and July copies it into
|
|
8
|
+
* `process.env` before anything authored runs. Once that copy succeeds the
|
|
9
|
+
* on-disk value is pure liability — authored agent code runs in this pod and
|
|
10
|
+
* can read any world-readable path.
|
|
11
|
+
*
|
|
12
|
+
* Unlink is preferred. It is not always available: pod-daemon writes the
|
|
13
|
+
* files as root, and removing a directory entry needs write permission on
|
|
14
|
+
* `/run/cursor/secrets`, which is root-owned. Making that directory writable
|
|
15
|
+
* by the guest is not the fix — untrusted guest code could then plant a
|
|
16
|
+
* symlink that the next root-side bind write would follow. The binder instead
|
|
17
|
+
* relaxes the two secret files themselves so the guest can truncate them, and
|
|
18
|
+
* this module falls back to a zero-length overwrite. Both readers treat an
|
|
19
|
+
* empty bind file as unsigned.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
closeSync,
|
|
24
|
+
fsyncSync,
|
|
25
|
+
ftruncateSync,
|
|
26
|
+
openSync,
|
|
27
|
+
readFileSync,
|
|
28
|
+
unlinkSync,
|
|
29
|
+
} from "node:fs";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* What happened to a bind file. Only `readable` is a failure: the secret
|
|
33
|
+
* survived the consume and callers must not run authored code.
|
|
34
|
+
*/
|
|
35
|
+
export type BoundSecretFileDisposal =
|
|
36
|
+
/** Nothing recoverable was there — missing, empty, or unreadable already. */
|
|
37
|
+
| { state: "absent" }
|
|
38
|
+
/** Directory entry removed. */
|
|
39
|
+
| { state: "unlinked" }
|
|
40
|
+
/** Truncated to zero length and fsynced; an empty file remains. */
|
|
41
|
+
| { state: "wiped" }
|
|
42
|
+
/** Still recoverable by a later `readFile`. */
|
|
43
|
+
| { state: "readable"; reason: string };
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Whether a later `readFile` of this path could still recover a secret.
|
|
47
|
+
* A read failure counts as unrecoverable: this process just read the file
|
|
48
|
+
* during hydrate, so losing access to it means the content is gone.
|
|
49
|
+
*/
|
|
50
|
+
export function boundSecretFileIsReadable(path: string): boolean {
|
|
51
|
+
try {
|
|
52
|
+
return readFileSync(path, "utf8").trim() !== "";
|
|
53
|
+
} catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function errorReason(error: unknown): string {
|
|
59
|
+
const code = (error as { code?: unknown } | undefined)?.code;
|
|
60
|
+
return typeof code === "string" ? code : "unknown";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Remove a bind file's contents from disk, preferring unlink over an empty
|
|
65
|
+
* leftover. Callers must have already copied the value into `process.env`:
|
|
66
|
+
* this is destructive and there is no second bind until the control plane
|
|
67
|
+
* rewrites the file before the next hosted request.
|
|
68
|
+
*/
|
|
69
|
+
export function destroyBoundSecretFile(path: string): BoundSecretFileDisposal {
|
|
70
|
+
if (!boundSecretFileIsReadable(path)) {
|
|
71
|
+
// Nothing recoverable, so nothing to fail over. Still try to clear the
|
|
72
|
+
// empty leftover: whether that succeeds does not change the disposal,
|
|
73
|
+
// because there is no secret here either way.
|
|
74
|
+
try {
|
|
75
|
+
unlinkSync(path);
|
|
76
|
+
} catch {
|
|
77
|
+
// Already gone, or a directory the guest cannot write. Both are fine.
|
|
78
|
+
}
|
|
79
|
+
return { state: "absent" };
|
|
80
|
+
}
|
|
81
|
+
let unlinkReason: string | undefined;
|
|
82
|
+
try {
|
|
83
|
+
unlinkSync(path);
|
|
84
|
+
if (!boundSecretFileIsReadable(path)) {
|
|
85
|
+
return { state: "unlinked" };
|
|
86
|
+
}
|
|
87
|
+
unlinkReason = "recreated";
|
|
88
|
+
} catch (error) {
|
|
89
|
+
unlinkReason = errorReason(error);
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const fd = openSync(path, "r+");
|
|
93
|
+
try {
|
|
94
|
+
ftruncateSync(fd, 0);
|
|
95
|
+
fsyncSync(fd);
|
|
96
|
+
} finally {
|
|
97
|
+
closeSync(fd);
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
return {
|
|
101
|
+
state: "readable",
|
|
102
|
+
reason: `unlink ${unlinkReason}, truncate ${errorReason(error)}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return boundSecretFileIsReadable(path)
|
|
106
|
+
? { state: "readable", reason: `unlink ${unlinkReason}, truncate no-op` }
|
|
107
|
+
: { state: "wiped" };
|
|
108
|
+
}
|