@cursor/july 0.1.96 → 0.1.99
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 +1 -1
- package/README.md +3 -2
- package/dist/bin/agent-serve.js +13 -3
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +16 -0
- package/dist/channels/origin/api.d.ts +15 -4
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +19 -3
- package/dist/channels/origin/binding.d.ts +11 -0
- package/dist/channels/origin/binding.d.ts.map +1 -1
- package/dist/channels/origin/binding.js +41 -25
- package/dist/channels/origin/index.d.ts +1 -0
- package/dist/channels/origin/index.d.ts.map +1 -1
- package/dist/channels/origin/index.js +1 -0
- package/dist/channels/origin/origin-channel.d.ts +2 -0
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +40 -4
- package/dist/channels/origin/reactions.d.ts +56 -0
- package/dist/channels/origin/reactions.d.ts.map +1 -0
- package/dist/channels/origin/reactions.js +67 -0
- package/dist/channels/origin/types.d.ts +11 -0
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/approvals.d.ts +16 -0
- package/dist/channels/slack/approvals.d.ts.map +1 -1
- package/dist/channels/slack/approvals.js +86 -0
- package/dist/channels/slack/cli-project.d.ts +19 -0
- package/dist/channels/slack/cli-project.d.ts.map +1 -0
- package/dist/channels/slack/cli-project.js +234 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +142 -63
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +1 -1
- package/dist/channels/slack/init.d.ts +3 -2
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +5 -5
- package/dist/channels/slack/interactive.d.ts +2 -1
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +15 -4
- package/dist/channels/slack/live-delivery.d.ts +1 -1
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +4 -2
- package/dist/channels/slack/manifest.d.ts +1 -1
- package/dist/channels/slack/manifest.js +1 -1
- package/dist/channels/slack/progress-delivery.d.ts +28 -0
- package/dist/channels/slack/progress-delivery.d.ts.map +1 -0
- package/dist/channels/slack/progress-delivery.js +115 -0
- 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 +10 -6
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +1 -0
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
- package/dist/channels/slack/tool-approval-events.js +91 -1
- package/dist/channels/slack/types.d.ts +9 -1
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.jXleCmOc.js → app.BplEAZ3S.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DpuI4i7Z.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.8LhyglIT.js → VPLocalSearchBox.CHXyv4wP.js} +1 -1
- package/dist/docs/assets/chunks/{theme.9ged-pr2.js → theme.BTcsZmjQ.js} +2 -2
- package/dist/docs/assets/{deployment.md.D9msOFOW.js → deployment.md.MFPKqsqI.js} +2 -2
- package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.js → guides_mcp-oauth.md.CN-6YmTJ.js} +4 -4
- package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.lean.js → guides_mcp-oauth.md.CN-6YmTJ.lean.js} +1 -1
- package/dist/docs/assets/guides_slack.md.VDXQV3ja.js +22 -0
- package/dist/docs/assets/guides_slack.md.VDXQV3ja.lean.js +1 -0
- package/dist/docs/assets/index.md.CVeRUOeZ.js +5 -0
- package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.js → reference_agent-config.md.BHeYMgme.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.CCnG-nJx.js → reference_cli.md.DfoeyvL0.js} +9 -6
- package/dist/docs/assets/{reference_cli.md.CCnG-nJx.lean.js → reference_cli.md.DfoeyvL0.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.js → reference_connections.md.DxldvyIB.js} +4 -3
- package/dist/docs/assets/{reference_http-api.md.D89k1mdm.js → reference_http-api.md.BEJx9XVj.js} +2 -2
- package/dist/docs/assets/reference_sessions.md.NxFP_CAC.js +1 -0
- package/dist/docs/assets/{reference_tools.md.BHeXn2id.js → reference_tools.md.CvAHsdSp.js} +10 -2
- package/dist/docs/assets/{reference_tools.md.BHeXn2id.lean.js → reference_tools.md.CvAHsdSp.lean.js} +1 -1
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +2 -0
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +1 -0
- package/dist/docs/assets/troubleshooting.md.DCiPBhYs.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +7 -7
- package/dist/docs/deployment.md +5 -4
- package/dist/docs/design/runtime-abstraction.md +1757 -0
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +8 -8
- package/dist/docs/guides/mcp-oauth.md +26 -8
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +17 -33
- package/dist/docs/guides/slack.md +92 -201
- 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 +5 -3
- package/dist/docs/llms-full.txt +2065 -637
- package/dist/docs/llms.txt +3 -2
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +6 -6
- package/dist/docs/reference/agent-config.md +2 -2
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +13 -10
- package/dist/docs/reference/cli.md +32 -16
- package/dist/docs/reference/connections.html +9 -8
- package/dist/docs/reference/connections.md +6 -3
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +7 -7
- package/dist/docs/reference/http-api.md +3 -1
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/sessions.md +4 -2
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +15 -7
- package/dist/docs/reference/tools.md +34 -2
- package/dist/docs/scaffolding-agents.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 +28 -0
- package/dist/docs/templates/agents-md.md +105 -0
- package/dist/docs/templates/code-wiki.html +5 -5
- package/dist/docs/templates/demo.html +4 -4
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +5 -5
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/docs/troubleshooting.md +2 -2
- package/dist/evals/run-facts.d.ts.map +1 -1
- package/dist/evals/run-facts.js +27 -0
- package/dist/files-backends/cursor-hosted.d.ts +3 -2
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +3 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +15 -9
- package/dist/internal/approval-gate.d.ts +12 -13
- package/dist/internal/approval-gate.d.ts.map +1 -1
- package/dist/internal/approval-gate.js +16 -21
- package/dist/internal/as-of.d.ts +19 -0
- package/dist/internal/as-of.d.ts.map +1 -0
- package/dist/internal/as-of.js +82 -0
- package/dist/internal/chat-client.js +10 -0
- package/dist/internal/cli-deploy.d.ts +6 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +149 -21
- package/dist/internal/cli-mcp-oauth.js +8 -18
- package/dist/internal/cli-slack-manual.d.ts +24 -2
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +251 -20
- package/dist/internal/cli-slack.d.ts +9 -2
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +29 -82
- package/dist/internal/cursor/account-mcp.d.ts +1 -0
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +17 -0
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +1 -0
- package/dist/internal/cursor-event-relay.d.ts.map +1 -1
- package/dist/internal/cursor-event-relay.js +5 -6
- package/dist/internal/deploy-client.d.ts +17 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +31 -10
- package/dist/internal/env-file.d.ts +19 -0
- package/dist/internal/env-file.d.ts.map +1 -0
- package/dist/internal/env-file.js +90 -0
- package/dist/internal/framework-file-storage.d.ts +11 -17
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +17 -40
- package/dist/internal/framework-storage-selection.d.ts +13 -11
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +37 -26
- package/dist/internal/hosted-admission-adapter.d.ts +28 -0
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -0
- package/dist/internal/hosted-admission-adapter.js +7 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +13 -1
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +8 -1
- package/dist/internal/hosted-delivery.d.ts +21 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +101 -34
- package/dist/internal/hosted-execution-diag.d.ts +59 -0
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -0
- package/dist/internal/hosted-execution-diag.js +187 -0
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +85 -2
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +2 -0
- package/dist/internal/logs-client.d.ts +5 -0
- package/dist/internal/logs-client.d.ts.map +1 -1
- package/dist/internal/logs-client.js +5 -0
- package/dist/internal/mcp-endpoint.js +2 -3
- package/dist/internal/mcp-host.d.ts +10 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +57 -8
- package/dist/internal/mcp-oauth-on-demand.d.ts +68 -0
- package/dist/internal/mcp-oauth-on-demand.d.ts.map +1 -0
- package/dist/internal/mcp-oauth-on-demand.js +287 -0
- package/dist/internal/mcp-oauth-persist.d.ts +42 -0
- package/dist/internal/mcp-oauth-persist.d.ts.map +1 -0
- package/dist/internal/mcp-oauth-persist.js +92 -0
- package/dist/internal/mcp-oauth.d.ts +1 -0
- package/dist/internal/mcp-oauth.d.ts.map +1 -1
- package/dist/internal/mcp-oauth.js +10 -2
- package/dist/internal/null-kv-storage.d.ts +48 -0
- package/dist/internal/null-kv-storage.d.ts.map +1 -0
- package/dist/internal/null-kv-storage.js +58 -0
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +22 -9
- package/dist/internal/server.d.ts +6 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +123 -33
- package/dist/internal/session-engine.d.ts +88 -3
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +538 -46
- package/dist/internal/session-run-log.d.ts +120 -0
- package/dist/internal/session-run-log.d.ts.map +1 -0
- package/dist/internal/session-run-log.js +359 -0
- package/dist/internal/sessions-client.d.ts +9 -7
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +3 -1
- package/dist/internal/storage-coordinator.d.ts +13 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +37 -6
- package/dist/internal/storage-roles.d.ts +5 -0
- package/dist/internal/storage-roles.d.ts.map +1 -1
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +10 -0
- package/dist/internal/tool-policy.d.ts +29 -9
- package/dist/internal/tool-policy.d.ts.map +1 -1
- package/dist/internal/tool-policy.js +24 -0
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +10 -0
- package/dist/internal/turn-outbox.d.ts +24 -0
- package/dist/internal/turn-outbox.d.ts.map +1 -0
- package/dist/internal/turn-outbox.js +80 -0
- package/dist/playground/assets/index-D7rGZNjy.css +1 -0
- package/dist/playground/assets/index-jzNbJENa.js +69 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +1 -1
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +12 -0
- package/dist/storage-protocol.d.ts +8 -0
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +8 -0
- package/dist/storage.d.ts +8 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/tools.d.ts +12 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/types.d.ts +88 -7
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +5 -3
- package/docs/deployment.md +5 -4
- package/docs/design/runtime-abstraction.md +1757 -0
- package/docs/guides/mcp-oauth.md +26 -8
- package/docs/guides/slack.md +93 -202
- package/docs/reference/agent-config.md +2 -2
- package/docs/reference/cli.md +32 -16
- package/docs/reference/connections.md +6 -3
- package/docs/reference/http-api.md +3 -1
- package/docs/reference/sessions.md +4 -2
- package/docs/reference/tools.md +34 -2
- package/docs/templates/agents-md.md +110 -0
- package/docs/troubleshooting.md +2 -2
- package/package.json +1 -1
- package/skills/create-agent/SKILL.md +2 -1
- package/skills/mcp-auth/SKILL.md +6 -3
- package/skills/setup-slack/SKILL.md +23 -13
- package/src/bin/agent-serve.ts +12 -1
- package/src/channels/github/github-channel.ts +17 -0
- package/src/channels/origin/api.ts +24 -5
- package/src/channels/origin/binding.ts +55 -26
- package/src/channels/origin/index.ts +1 -0
- package/src/channels/origin/origin-channel.ts +78 -10
- package/src/channels/origin/reactions.ts +82 -0
- package/src/channels/origin/types.ts +11 -0
- package/src/channels/slack/approvals.ts +105 -0
- package/src/channels/slack/cli-project.ts +267 -0
- package/src/channels/slack/defaults.ts +165 -74
- package/src/channels/slack/dispatch.ts +2 -0
- package/src/channels/slack/init.ts +10 -5
- package/src/channels/slack/interactive.ts +35 -9
- package/src/channels/slack/live-delivery.ts +5 -3
- package/src/channels/slack/manifest.ts +1 -1
- package/src/channels/slack/progress-delivery.ts +133 -0
- package/src/channels/slack/setup.ts +10 -6
- package/src/channels/slack/slack-channel.ts +1 -0
- package/src/channels/slack/tool-approval-events.ts +93 -0
- package/src/channels/slack/types.ts +9 -1
- package/src/evals/run-facts.ts +32 -0
- package/src/files-backends/cursor-hosted.ts +3 -2
- package/src/index.ts +4 -0
- package/src/internal/advertise-tools.ts +31 -10
- package/src/internal/approval-gate.ts +20 -29
- package/src/internal/as-of.ts +107 -0
- package/src/internal/chat-client.ts +19 -0
- package/src/internal/cli-deploy.ts +203 -13
- package/src/internal/cli-mcp-oauth.ts +7 -21
- package/src/internal/cli-slack-manual.ts +350 -18
- package/src/internal/cli-slack.ts +40 -84
- package/src/internal/cursor/account-mcp.ts +21 -0
- package/src/internal/cursor-agent-template.ts +1 -0
- package/src/internal/cursor-event-relay.ts +5 -6
- package/src/internal/deploy-client.ts +43 -0
- package/src/internal/env-file.ts +84 -0
- package/src/internal/framework-file-storage.ts +18 -46
- package/src/internal/framework-storage-selection.ts +41 -25
- package/src/internal/hosted-admission-adapter.ts +42 -0
- package/src/internal/hosted-delivery-protocol.ts +14 -2
- package/src/internal/hosted-delivery.ts +169 -44
- package/src/internal/hosted-execution-diag.ts +252 -0
- package/src/internal/http-channel.ts +107 -0
- package/src/internal/init-project.ts +2 -0
- package/src/internal/logs-client.ts +5 -0
- package/src/internal/mcp-endpoint.ts +13 -4
- package/src/internal/mcp-host.ts +77 -11
- package/src/internal/mcp-oauth-on-demand.ts +352 -0
- package/src/internal/mcp-oauth-persist.ts +127 -0
- package/src/internal/mcp-oauth.ts +17 -1
- package/src/internal/null-kv-storage.ts +74 -0
- package/src/internal/otel/collector.ts +30 -0
- package/src/internal/server.ts +159 -11
- package/src/internal/session-engine.ts +691 -57
- package/src/internal/session-run-log.ts +584 -0
- package/src/internal/sessions-client.ts +17 -8
- package/src/internal/storage-coordinator.ts +49 -9
- package/src/internal/storage-roles.ts +7 -0
- package/src/internal/stream-progress.ts +19 -0
- package/src/internal/tool-policy.ts +49 -9
- package/src/internal/trajectory.ts +10 -0
- package/src/internal/turn-outbox.ts +85 -0
- package/src/storage-backends/cursor-hosted.ts +13 -1
- package/src/storage-protocol.ts +10 -0
- package/src/storage.ts +12 -0
- package/src/tools.ts +12 -2
- package/src/types.ts +93 -8
- package/templates/agents-md/README.md +39 -0
- package/templates/agents-md/agent/agent.ts +8 -0
- package/templates/agents-md/agent/channels/github.ts +10 -0
- package/templates/agents-md/agent/channels/queue.ts +28 -0
- package/templates/agents-md/agent/channels/slack.ts +9 -0
- package/templates/agents-md/agent/instructions.md +39 -0
- package/templates/agents-md/agent/lib/collect.ts +439 -0
- package/templates/agents-md/agent/lib/config.ts +8 -0
- package/templates/agents-md/agent/lib/paths.ts +51 -0
- package/templates/agents-md/agent/schedules/weekly.ts +17 -0
- package/templates/agents-md/agent/tools/apply_agents.ts +226 -0
- package/templates/agents-md/evals/agents.eval.ts +135 -0
- package/templates/agents-md/evals/evals.config.ts +5 -0
- package/templates/agents-md/init.json +38 -0
- package/templates/agents-md/package.json +18 -0
- package/templates/agents-md/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +0 -1
- package/dist/docs/assets/guides_slack.md.C32HsdKk.js +0 -38
- package/dist/docs/assets/guides_slack.md.C32HsdKk.lean.js +0 -1
- package/dist/docs/assets/index.md.CI93Ltlb.js +0 -5
- package/dist/docs/assets/reference_sessions.md.D0mIh4KK.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Ctv3T8C2.js +0 -1
- package/dist/docs/design/agsh.md +0 -406
- package/dist/playground/assets/index-B1DDvBeC.css +0 -1
- package/dist/playground/assets/index-Cx9CclK_.js +0 -88
- package/docs/design/agsh.md +0 -406
- /package/dist/docs/assets/{deployment.md.D9msOFOW.lean.js → deployment.md.MFPKqsqI.lean.js} +0 -0
- /package/dist/docs/assets/{index.md.CI93Ltlb.lean.js → index.md.CVeRUOeZ.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.lean.js → reference_agent-config.md.BHeYMgme.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.lean.js → reference_connections.md.DxldvyIB.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.D89k1mdm.lean.js → reference_http-api.md.BEJx9XVj.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.D0mIh4KK.lean.js → reference_sessions.md.NxFP_CAC.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.Ctv3T8C2.lean.js → troubleshooting.md.DCiPBhYs.lean.js} +0 -0
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* In-memory gate for human-in-the-loop
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* {@link ApprovalGate.resolve}.
|
|
2
|
+
* In-memory gate for human-in-the-loop parks. The session engine parks
|
|
3
|
+
* inside a server-tool `execute` by awaiting {@link ApprovalGate.wait};
|
|
4
|
+
* HTTP (or the playground) unblocks via {@link ApprovalGate.resolve}.
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
* durability of the *list* across
|
|
9
|
-
* in-flight SDK tool callback is gone,
|
|
10
|
-
* the host treats the
|
|
6
|
+
* Used for `needsApproval` and MCP on-demand auth. Pending rows are also
|
|
7
|
+
* mirrored onto {@link SessionRecord} for durability of the *list* across
|
|
8
|
+
* reloads. After a process restart the in-flight SDK tool callback is gone,
|
|
9
|
+
* so resolve returns false and the host treats the park as interrupted.
|
|
11
10
|
*/
|
|
12
11
|
function approvalKey(sessionId, callId) {
|
|
13
12
|
return `${sessionId}\0${callId}`;
|
|
@@ -16,21 +15,15 @@ export class ApprovalGate {
|
|
|
16
15
|
constructor() {
|
|
17
16
|
this.waiters = new Map();
|
|
18
17
|
}
|
|
19
|
-
wait(meta) {
|
|
20
|
-
const key = approvalKey(
|
|
18
|
+
wait(sessionId, meta) {
|
|
19
|
+
const key = approvalKey(sessionId, meta.callId);
|
|
21
20
|
const existing = this.waiters.get(key);
|
|
22
21
|
if (existing !== undefined) {
|
|
23
|
-
throw new Error(`Approval already pending for session ${
|
|
22
|
+
throw new Error(`Approval already pending for session ${sessionId} call ${meta.callId}`);
|
|
24
23
|
}
|
|
25
24
|
return new Promise((resolveDecision) => {
|
|
26
25
|
this.waiters.set(key, {
|
|
27
|
-
meta
|
|
28
|
-
callId: meta.callId,
|
|
29
|
-
turnId: meta.turnId,
|
|
30
|
-
toolName: meta.toolName,
|
|
31
|
-
args: meta.args,
|
|
32
|
-
requestedAt: meta.requestedAt,
|
|
33
|
-
},
|
|
26
|
+
meta,
|
|
34
27
|
resolve: resolveDecision,
|
|
35
28
|
});
|
|
36
29
|
});
|
|
@@ -46,9 +39,11 @@ export class ApprovalGate {
|
|
|
46
39
|
return false;
|
|
47
40
|
}
|
|
48
41
|
this.waiters.delete(key);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
const by = resolvedBy === undefined || resolvedBy === "" ? undefined : resolvedBy;
|
|
43
|
+
waiter.resolve({
|
|
44
|
+
decision,
|
|
45
|
+
by,
|
|
46
|
+
});
|
|
52
47
|
return true;
|
|
53
48
|
}
|
|
54
49
|
has(sessionId, callId) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare class InvalidAsOfError extends Error {
|
|
2
|
+
constructor(value: string);
|
|
3
|
+
}
|
|
4
|
+
export declare function normalizeAsOf(value: string | undefined): string | undefined;
|
|
5
|
+
export declare function sessionClock(asOf: string | undefined): () => Date;
|
|
6
|
+
export declare class VacuousTimeArgsError extends Error {
|
|
7
|
+
constructor(toolName: string, missing: readonly string[]);
|
|
8
|
+
}
|
|
9
|
+
export declare function assertTimeArgs(tools: readonly {
|
|
10
|
+
name: string;
|
|
11
|
+
definition: {
|
|
12
|
+
timeArgs?: readonly string[];
|
|
13
|
+
};
|
|
14
|
+
inputSchema?: {
|
|
15
|
+
properties?: Record<string, unknown>;
|
|
16
|
+
};
|
|
17
|
+
}[], asOf: string | undefined): void;
|
|
18
|
+
export declare function timeArgViolation(input: unknown, timeArgs: readonly string[], asOf: string): string | undefined;
|
|
19
|
+
//# sourceMappingURL=as-of.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"as-of.d.ts","sourceRoot":"","sources":["../../src/internal/as-of.ts"],"names":[],"mappings":"AAEA,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,KAAK,EAAE,MAAM,EAMxB;CACF;AAWD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAS3E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,IAAI,CAMjE;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,EAQvD;CACF;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC7C,WAAW,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CACxD,EAAE,EACH,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,IAAI,CAeN;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CA0BpB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const TIMEZONE_SUFFIX = /(?:Z|[+-]\d{2}:?\d{2})$/i;
|
|
2
|
+
export class InvalidAsOfError extends Error {
|
|
3
|
+
constructor(value) {
|
|
4
|
+
super(`asOf must be an ISO-8601 instant with a timezone (e.g. ` +
|
|
5
|
+
`2026-08-31T12:00:00Z); received ${JSON.stringify(value)}.`);
|
|
6
|
+
this.name = "InvalidAsOfError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function parseInstant(value) {
|
|
10
|
+
const trimmed = value.trim();
|
|
11
|
+
if (trimmed === "" || !TIMEZONE_SUFFIX.test(trimmed)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const instant = new Date(trimmed);
|
|
15
|
+
return Number.isNaN(instant.getTime()) ? undefined : instant;
|
|
16
|
+
}
|
|
17
|
+
export function normalizeAsOf(value) {
|
|
18
|
+
if (value === undefined) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const instant = parseInstant(value);
|
|
22
|
+
if (instant === undefined) {
|
|
23
|
+
throw new InvalidAsOfError(value);
|
|
24
|
+
}
|
|
25
|
+
return instant.toISOString();
|
|
26
|
+
}
|
|
27
|
+
export function sessionClock(asOf) {
|
|
28
|
+
if (asOf === undefined) {
|
|
29
|
+
return () => new Date();
|
|
30
|
+
}
|
|
31
|
+
const frozen = new Date(asOf).getTime();
|
|
32
|
+
return () => new Date(frozen);
|
|
33
|
+
}
|
|
34
|
+
export class VacuousTimeArgsError extends Error {
|
|
35
|
+
constructor(toolName, missing) {
|
|
36
|
+
super(`Tool "${toolName}" declares timeArgs ` +
|
|
37
|
+
`${JSON.stringify(missing)} that its input schema does not define, ` +
|
|
38
|
+
`so bounding would silently check nothing. Make the declaration ` +
|
|
39
|
+
`match the schema's property names.`);
|
|
40
|
+
this.name = "VacuousTimeArgsError";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function assertTimeArgs(tools, asOf) {
|
|
44
|
+
var _a;
|
|
45
|
+
var _b;
|
|
46
|
+
if (asOf === undefined) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
for (const tool of tools) {
|
|
50
|
+
const declared = tool.definition.timeArgs;
|
|
51
|
+
if (declared === undefined || declared.length === 0) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const properties = (_b = (_a = tool.inputSchema) === null || _a === void 0 ? void 0 : _a.properties) !== null && _b !== void 0 ? _b : {};
|
|
55
|
+
const missing = declared.filter((name) => !(name in properties));
|
|
56
|
+
if (missing.length > 0) {
|
|
57
|
+
throw new VacuousTimeArgsError(tool.name, missing);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function timeArgViolation(input, timeArgs, asOf) {
|
|
62
|
+
const record = typeof input === "object" && input !== null
|
|
63
|
+
? input
|
|
64
|
+
: {};
|
|
65
|
+
const frozen = new Date(asOf).getTime();
|
|
66
|
+
for (const name of timeArgs) {
|
|
67
|
+
const value = record[name];
|
|
68
|
+
const instant = typeof value === "string" ? parseInstant(value) : undefined;
|
|
69
|
+
if (instant === undefined) {
|
|
70
|
+
return (`Time argument "${name}" must be an absolute ISO-8601 instant with ` +
|
|
71
|
+
`a timezone (e.g. ${asOf}); received ${JSON.stringify(value)}. This ` +
|
|
72
|
+
`session reads the world as of ${asOf} — supply absolute bounds at ` +
|
|
73
|
+
`or before that instant and retry.`);
|
|
74
|
+
}
|
|
75
|
+
if (instant.getTime() > frozen) {
|
|
76
|
+
return (`Time argument "${name}" (${JSON.stringify(value)}) is later than ` +
|
|
77
|
+
`the instant this session reads the world as of (${asOf}). Supply ` +
|
|
78
|
+
`bounds at or before that instant and retry.`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
@@ -364,6 +364,16 @@ function streamTurn(args) {
|
|
|
364
364
|
write(` ${mark} ${c.bold(event.data.toolName)} ${c.dim(event.data.decision === "approve" ? "approved" : "denied")}\n`);
|
|
365
365
|
continue;
|
|
366
366
|
}
|
|
367
|
+
if (event.type === "action.auth_requested") {
|
|
368
|
+
closeAssistant();
|
|
369
|
+
write(` ${c.yellow("⏸")} ${c.bold(event.data.connection)} ${c.dim("awaiting MCP authorization")}\n`);
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (event.type === "action.auth_resolved") {
|
|
373
|
+
const mark = event.data.decision === "approve" ? c.green("✓") : c.red("✗");
|
|
374
|
+
write(` ${mark} ${c.bold(event.data.connection)} ${c.dim(event.data.decision === "approve" ? "connected" : "denied")}\n`);
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
367
377
|
if (event.type === "action.result") {
|
|
368
378
|
if (event.data.toolName === "task" &&
|
|
369
379
|
event.data.parentCallId === undefined) {
|
|
@@ -53,6 +53,12 @@ export interface DeployCliOptions {
|
|
|
53
53
|
cursorEventsRepos?: string[];
|
|
54
54
|
/** deploy `--allow-domain <domain>` (repeatable; unioned with the manifest). */
|
|
55
55
|
allowDomains?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* deploy `--multi-tenant`: add a release to an existing Cursor-managed
|
|
58
|
+
* (multi-tenant) product. Hidden Anysphere-only flag. Cannot create a
|
|
59
|
+
* new multi-tenant application.
|
|
60
|
+
*/
|
|
61
|
+
multiTenant?: boolean;
|
|
56
62
|
/** Test seams. */
|
|
57
63
|
fetchImpl?: typeof fetch;
|
|
58
64
|
/** Inject the connector-auth browser opener (tests; also forces interactive). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH,OAAO,EAKL,sBAAsB,EAevB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,KAAK,aAAa,EAMnB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-deploy.d.ts","sourceRoot":"","sources":["../../src/internal/cli-deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,8 @@ import { deployProgressLabel, sanitizeCustomerError } from "./logs-client.js";
|
|
|
34
34
|
import { stderrPalette } from "./terminal-style.js";
|
|
35
35
|
const DEFAULT_POLL_INTERVAL_MS = 3000;
|
|
36
36
|
const DEFAULT_DEPLOY_TIMEOUT_MS = 10 * 60 * 1000;
|
|
37
|
+
/** `--multi-tenant` HTTP deploy is Anysphere-only (team id 1). */
|
|
38
|
+
const MULTI_TENANT_HTTP_DEPLOY_TEAM_ID = 1;
|
|
37
39
|
/**
|
|
38
40
|
* Credentials → deploy client → team id. Shared by deploy commands and
|
|
39
41
|
* `--prod` AX routing. Returns an exit code (error already rendered) on
|
|
@@ -135,6 +137,11 @@ export function cmdDeploy(options) {
|
|
|
135
137
|
if (typeof ctx === "number") {
|
|
136
138
|
return ctx;
|
|
137
139
|
}
|
|
140
|
+
if (options.multiTenant === true &&
|
|
141
|
+
ctx.teamId !== MULTI_TENANT_HTTP_DEPLOY_TEAM_ID) {
|
|
142
|
+
ctx.err("--multi-tenant is not available for this team.\n");
|
|
143
|
+
return 1;
|
|
144
|
+
}
|
|
138
145
|
const targets = yield resolveDeployTargets(options, ctx);
|
|
139
146
|
if (typeof targets === "number") {
|
|
140
147
|
return targets;
|
|
@@ -152,7 +159,9 @@ export function cmdDeploy(options) {
|
|
|
152
159
|
manifests.push(yield readDeployManifest(target.dir));
|
|
153
160
|
}
|
|
154
161
|
if (manifests.every((manifest) => manifest.architecture === "v2")) {
|
|
155
|
-
return deployAgentsdkApplication(ctx, options, targets
|
|
162
|
+
return deployAgentsdkApplication(ctx, options, targets, {
|
|
163
|
+
hasScmChannels: manifests.some((manifest) => manifest.hasScmChannels),
|
|
164
|
+
});
|
|
156
165
|
}
|
|
157
166
|
if (!ctx.json &&
|
|
158
167
|
manifests.some((manifest) => manifest.architecture === "v2")) {
|
|
@@ -488,8 +497,14 @@ function deployOne(ctx, options, target, extras) {
|
|
|
488
497
|
gitRef,
|
|
489
498
|
agentPath,
|
|
490
499
|
repositories: options.cursorEventsRepos,
|
|
500
|
+
hasScmChannels: manifest.hasScmChannels,
|
|
501
|
+
multiTenant: options.multiTenant === true,
|
|
491
502
|
});
|
|
492
503
|
}
|
|
504
|
+
if (options.multiTenant === true) {
|
|
505
|
+
ctx.err("--multi-tenant is only valid for architecture: v2 deploys (Cursor-managed products).\n");
|
|
506
|
+
return 1;
|
|
507
|
+
}
|
|
493
508
|
// Today's only source shape: the control plane builds from a git ref.
|
|
494
509
|
// See DeploySource for the artifact seam.
|
|
495
510
|
const source = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ kind: "git-ref", gitRepoUrl }, (gitRef === undefined ? {} : { gitRef })), (agentPath === undefined ? {} : { agentPath })), (options.cursorEventsRepos === undefined ||
|
|
@@ -546,10 +561,7 @@ function deployOne(ctx, options, target, extras) {
|
|
|
546
561
|
return detail.status === "running" ? 0 : 1;
|
|
547
562
|
}
|
|
548
563
|
if (detail.status !== "running") {
|
|
549
|
-
|
|
550
|
-
? ""
|
|
551
|
-
: `: ${sanitizeCustomerError(detail.lastError)}`;
|
|
552
|
-
ctx.err(`Deployment ${slug} ended ${detail.status}${errorDetail}\n`);
|
|
564
|
+
ctx.err(`Deployment ${slug} ended ${detail.status}${deployFailureDetail(detail.lastError)}\n`);
|
|
553
565
|
return 1;
|
|
554
566
|
}
|
|
555
567
|
const deployedPublicRoutes = (_h = detail.publicRoutePaths) !== null && _h !== void 0 ? _h : [];
|
|
@@ -580,7 +592,7 @@ function deployOne(ctx, options, target, extras) {
|
|
|
580
592
|
* key is the child's slug and its path is the child directory relative to
|
|
581
593
|
* the repo root (a shared --path names the parent's directory in the repo).
|
|
582
594
|
*/
|
|
583
|
-
function deployAgentsdkApplication(ctx, options, targets) {
|
|
595
|
+
function deployAgentsdkApplication(ctx, options, targets, declarations) {
|
|
584
596
|
return __awaiter(this, void 0, void 0, function* () {
|
|
585
597
|
var _a, _b, _c, _d, _e;
|
|
586
598
|
const parentDir = resolve((_a = options.dir) !== null && _a !== void 0 ? _a : ".");
|
|
@@ -640,6 +652,8 @@ function deployAgentsdkApplication(ctx, options, targets) {
|
|
|
640
652
|
agentPath: undefined,
|
|
641
653
|
components,
|
|
642
654
|
repositories: options.cursorEventsRepos,
|
|
655
|
+
hasScmChannels: declarations.hasScmChannels,
|
|
656
|
+
multiTenant: options.multiTenant === true,
|
|
643
657
|
});
|
|
644
658
|
});
|
|
645
659
|
}
|
|
@@ -650,26 +664,25 @@ function deployAgentsdkApplication(ctx, options, targets) {
|
|
|
650
664
|
*/
|
|
651
665
|
function deployOneAgentsdk(ctx, extras, args) {
|
|
652
666
|
return __awaiter(this, void 0, void 0, function* () {
|
|
667
|
+
var _a;
|
|
653
668
|
const { slug } = args;
|
|
654
669
|
const componentsLine = args.components === undefined
|
|
655
670
|
? ""
|
|
656
671
|
: ` components: ${args.components
|
|
657
672
|
.map((component) => component.componentKey)
|
|
658
673
|
.join(", ")}\n`;
|
|
674
|
+
if (args.multiTenant && !ctx.json) {
|
|
675
|
+
ctx.err(" multi-tenant: existing product\n");
|
|
676
|
+
}
|
|
659
677
|
let accepted;
|
|
660
678
|
try {
|
|
661
|
-
accepted = yield ctx.client.deployAgentkit({
|
|
662
|
-
teamId: ctx.teamId,
|
|
663
|
-
slug,
|
|
664
|
-
gitRepoUrl: args.gitRepoUrl,
|
|
665
|
-
gitRef: args.gitRef,
|
|
666
|
-
agentPath: args.agentPath,
|
|
667
|
-
components: args.components,
|
|
668
|
-
repositories: args.repositories,
|
|
669
|
-
});
|
|
679
|
+
accepted = yield ctx.client.deployAgentkit(Object.assign({ teamId: ctx.teamId, slug, gitRepoUrl: args.gitRepoUrl, gitRef: args.gitRef, agentPath: args.agentPath, components: args.components, repositories: args.repositories }, (args.multiTenant ? { multiTenant: true } : {})));
|
|
670
680
|
}
|
|
671
681
|
catch (error) {
|
|
672
|
-
return renderApiError(error, ctx.err
|
|
682
|
+
return renderApiError(error, ctx.err, {
|
|
683
|
+
multiTenant: args.multiTenant,
|
|
684
|
+
teamId: ctx.teamId,
|
|
685
|
+
});
|
|
673
686
|
}
|
|
674
687
|
if (ctx.noWait) {
|
|
675
688
|
if ((extras === null || extras === void 0 ? void 0 : extras.jsonCollect) !== undefined) {
|
|
@@ -702,7 +715,7 @@ function deployOneAgentsdk(ctx, extras, args) {
|
|
|
702
715
|
return detail.status === "running" ? 0 : 1;
|
|
703
716
|
}
|
|
704
717
|
if (detail.status !== "running") {
|
|
705
|
-
ctx.err(`Deployment ${slug} ended ${detail.status}\n`);
|
|
718
|
+
ctx.err(`Deployment ${slug} ended ${detail.status}${deployFailureDetail(detail.lastError)}\n`);
|
|
706
719
|
return 1;
|
|
707
720
|
}
|
|
708
721
|
ctx.out(`Deployed ${slug} (team ${ctx.teamId})\n` +
|
|
@@ -714,7 +727,16 @@ function deployOneAgentsdk(ctx, extras, args) {
|
|
|
714
727
|
? ""
|
|
715
728
|
: ` components: ${args.components
|
|
716
729
|
.map((component) => component.componentKey)
|
|
717
|
-
.join(", ")}\n`)
|
|
730
|
+
.join(", ")}\n`) +
|
|
731
|
+
(detail.repositories === undefined || !args.hasScmChannels
|
|
732
|
+
? ""
|
|
733
|
+
: ` watching: ${detail.repositories.length === 0 ? "(nothing)" : detail.repositories.join(", ")}\n`));
|
|
734
|
+
// An agent with GitHub/Origin channels bound to no repository scope gets
|
|
735
|
+
// no deliveries at all, which is otherwise invisible in this output.
|
|
736
|
+
if (args.hasScmChannels && ((_a = detail.repositories) === null || _a === void 0 ? void 0 : _a.length) === 0) {
|
|
737
|
+
ctx.err(`warning: ${slug} watches no repositories, so its GitHub/Origin channels receive no events.\n` +
|
|
738
|
+
` Redeploy with --cursor-events-repo <owner>/<name> to set the scope.\n`);
|
|
739
|
+
}
|
|
718
740
|
return 0;
|
|
719
741
|
});
|
|
720
742
|
}
|
|
@@ -806,6 +828,11 @@ function readDeployManifest(dir) {
|
|
|
806
828
|
.filter((channel) => { var _a; return ((_a = channel.definition.auth) !== null && _a !== void 0 ? _a : []).some(isPublicEndpointPolicy); })
|
|
807
829
|
.map((channel) => channel.id),
|
|
808
830
|
httpChannelPublicEndpoint: ((_a = project.httpChannel.auth) !== null && _a !== void 0 ? _a : []).some(isPublicEndpointPolicy),
|
|
831
|
+
hasScmChannels: project.channels.some((channel) => {
|
|
832
|
+
var _a;
|
|
833
|
+
const kind = (_a = channel.definition.meta) === null || _a === void 0 ? void 0 : _a.kind;
|
|
834
|
+
return kind === "github" || kind === "origin";
|
|
835
|
+
}),
|
|
809
836
|
};
|
|
810
837
|
});
|
|
811
838
|
}
|
|
@@ -875,6 +902,22 @@ export function cmdDeploymentStatus(slug, options) {
|
|
|
875
902
|
if (typeof ctx === "number") {
|
|
876
903
|
return ctx;
|
|
877
904
|
}
|
|
905
|
+
// Same dispatch as `stop`: v1 409s architecture-v2 slugs, so the v2
|
|
906
|
+
// GET goes first. A v2 404 (missing slug, or an older backend) falls
|
|
907
|
+
// through to the v1 agent-serve detail.
|
|
908
|
+
try {
|
|
909
|
+
const detail = yield ctx.client.getAgentkitDeploy({
|
|
910
|
+
teamId: ctx.teamId,
|
|
911
|
+
slug,
|
|
912
|
+
});
|
|
913
|
+
renderAgentkitDeploymentStatus(ctx, detail);
|
|
914
|
+
return 0;
|
|
915
|
+
}
|
|
916
|
+
catch (error) {
|
|
917
|
+
if (!(error instanceof DeployApiError) || error.status !== 404) {
|
|
918
|
+
return renderApiError(error, ctx.err);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
878
921
|
let detail;
|
|
879
922
|
try {
|
|
880
923
|
detail = yield ctx.client.getDeployment({ teamId: ctx.teamId, slug });
|
|
@@ -949,6 +992,32 @@ export function cmdDeploymentStatus(slug, options) {
|
|
|
949
992
|
return 0;
|
|
950
993
|
});
|
|
951
994
|
}
|
|
995
|
+
function renderAgentkitDeploymentStatus(ctx, detail) {
|
|
996
|
+
if (ctx.json) {
|
|
997
|
+
ctx.out(`${JSON.stringify(detail, null, 2)}\n`);
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
const lines = [
|
|
1001
|
+
`${detail.slug} (team ${detail.teamId})`,
|
|
1002
|
+
` status: ${detail.status}`,
|
|
1003
|
+
` architecture: v2`,
|
|
1004
|
+
` application: ${detail.applicationId}`,
|
|
1005
|
+
` release: ${detail.releaseId}`,
|
|
1006
|
+
` progress: ${detail.progress}`,
|
|
1007
|
+
];
|
|
1008
|
+
if (detail.statusMessage !== null && detail.statusMessage.trim() !== "") {
|
|
1009
|
+
lines.push(` step: ${detail.statusMessage}`);
|
|
1010
|
+
}
|
|
1011
|
+
if (detail.repositories !== undefined) {
|
|
1012
|
+
lines.push(` watching: ${detail.repositories.length === 0
|
|
1013
|
+
? "(nothing)"
|
|
1014
|
+
: detail.repositories.join(", ")}`);
|
|
1015
|
+
}
|
|
1016
|
+
if (detail.lastError !== null && detail.lastError !== undefined) {
|
|
1017
|
+
lines.push(` last error: ${sanitizeCustomerError(detail.lastError)}`);
|
|
1018
|
+
}
|
|
1019
|
+
ctx.out(`${lines.join("\n")}\n`);
|
|
1020
|
+
}
|
|
952
1021
|
// ============================================================================
|
|
953
1022
|
// stop <slug>
|
|
954
1023
|
// ============================================================================
|
|
@@ -1389,10 +1458,35 @@ function pollUntil(ctx, slug, terminal, fetchDetail) {
|
|
|
1389
1458
|
}
|
|
1390
1459
|
};
|
|
1391
1460
|
for (;;) {
|
|
1392
|
-
|
|
1461
|
+
let detail;
|
|
1462
|
+
try {
|
|
1463
|
+
detail = yield fetchDetail();
|
|
1464
|
+
}
|
|
1465
|
+
catch (error) {
|
|
1466
|
+
// Capacity / rate-limit on GET is not a bake failure. The v2 accept
|
|
1467
|
+
// already started freeze; keep polling until the wait budget expires.
|
|
1468
|
+
if (isTransientDeployStatusError(error) &&
|
|
1469
|
+
Date.now() - startedAt < ctx.timeoutMs) {
|
|
1470
|
+
if (!ctx.json) {
|
|
1471
|
+
const elapsed = Math.round((Date.now() - startedAt) / 1000);
|
|
1472
|
+
const label = "Waiting for status (server busy)";
|
|
1473
|
+
if (tty) {
|
|
1474
|
+
ctx.err(`\r\x1b[2K${slug}: ${label} (${elapsed}s)`);
|
|
1475
|
+
sawProgress = true;
|
|
1476
|
+
}
|
|
1477
|
+
else if (label !== lastLabel) {
|
|
1478
|
+
ctx.err(`${slug}: ${label}\n`);
|
|
1479
|
+
}
|
|
1480
|
+
lastLabel = label;
|
|
1481
|
+
}
|
|
1482
|
+
const waitMs = transientDeployStatusWaitMs(error, ctx.pollIntervalMs);
|
|
1483
|
+
const remaining = ctx.timeoutMs - (Date.now() - startedAt);
|
|
1484
|
+
yield sleep(Math.max(0, Math.min(waitMs, remaining)));
|
|
1485
|
+
continue;
|
|
1486
|
+
}
|
|
1393
1487
|
finishProgressLine();
|
|
1394
1488
|
throw error;
|
|
1395
|
-
}
|
|
1489
|
+
}
|
|
1396
1490
|
report(detail);
|
|
1397
1491
|
if (terminal.has(detail.status)) {
|
|
1398
1492
|
finishProgressLine();
|
|
@@ -1407,6 +1501,19 @@ function pollUntil(ctx, slug, terminal, fetchDetail) {
|
|
|
1407
1501
|
}
|
|
1408
1502
|
});
|
|
1409
1503
|
}
|
|
1504
|
+
/** Load-shed / rate-limit on status GET — the deploy itself may still be baking. */
|
|
1505
|
+
function isTransientDeployStatusError(error) {
|
|
1506
|
+
return (error instanceof DeployApiError &&
|
|
1507
|
+
(error.status === 503 || error.status === 429));
|
|
1508
|
+
}
|
|
1509
|
+
function transientDeployStatusWaitMs(error, pollIntervalMs) {
|
|
1510
|
+
if (error.status === 429 &&
|
|
1511
|
+
error.retryAfterSeconds !== undefined &&
|
|
1512
|
+
error.retryAfterSeconds > 0) {
|
|
1513
|
+
return Math.max(pollIntervalMs, error.retryAfterSeconds * 1000);
|
|
1514
|
+
}
|
|
1515
|
+
return pollIntervalMs;
|
|
1516
|
+
}
|
|
1410
1517
|
/**
|
|
1411
1518
|
* Wait until GET 404s (the delete reconciler purged the record). Treats
|
|
1412
1519
|
* other errors as failures. Throws DeployApiError on timeout.
|
|
@@ -1462,9 +1569,30 @@ function aliasTokenBlock(aliasToken) {
|
|
|
1462
1569
|
` or paste it into the hosted playground (<alias>/playground) sign-in gate.\n` +
|
|
1463
1570
|
` Lost tokens: \`${CLI} rotate-token <slug>\` mints a replacement.\n\n`);
|
|
1464
1571
|
}
|
|
1465
|
-
|
|
1572
|
+
/**
|
|
1573
|
+
* `: <reason>` suffix for a deploy that ended in a non-running state, or
|
|
1574
|
+
* empty when the control plane recorded no reason.
|
|
1575
|
+
*/
|
|
1576
|
+
function deployFailureDetail(lastError) {
|
|
1577
|
+
if (lastError === null ||
|
|
1578
|
+
lastError === undefined ||
|
|
1579
|
+
lastError.trim() === "") {
|
|
1580
|
+
return "";
|
|
1581
|
+
}
|
|
1582
|
+
return `: ${sanitizeCustomerError(lastError.trim())}`;
|
|
1583
|
+
}
|
|
1584
|
+
function renderApiError(error, err, context) {
|
|
1466
1585
|
if (error instanceof DeployApiError) {
|
|
1467
1586
|
err(`${error.message}\n`);
|
|
1587
|
+
if (error.status === 409 &&
|
|
1588
|
+
error.message.includes("application multiTenant does not match")) {
|
|
1589
|
+
if ((context === null || context === void 0 ? void 0 : context.multiTenant) === true) {
|
|
1590
|
+
err("This slug is a single-tenant application. Redeploy it without --multi-tenant.\n");
|
|
1591
|
+
}
|
|
1592
|
+
else if ((context === null || context === void 0 ? void 0 : context.teamId) === MULTI_TENANT_HTTP_DEPLOY_TEAM_ID) {
|
|
1593
|
+
err("This slug is a Cursor-managed (multi-tenant) product. Redeploy it with --multi-tenant.\n");
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1468
1596
|
return 1;
|
|
1469
1597
|
}
|
|
1470
1598
|
throw error;
|
|
@@ -27,7 +27,8 @@ import { authorizeCursorAccountConnectors } from "./cursor-account-mcp-auth.js";
|
|
|
27
27
|
import { deploymentServiceAccountId } from "./deploy-client.js";
|
|
28
28
|
import { loadAgentProject } from "./discovery.js";
|
|
29
29
|
import { CLI_COMMAND_NAME as CLI, LOG_PREFIX } from "./distribution.js";
|
|
30
|
-
import { createHostMcpOAuthProvider, MCP_OAUTH_CALLBACK_URL,
|
|
30
|
+
import { createHostMcpOAuthProvider, MCP_OAUTH_CALLBACK_URL, openBrowser, waitForMcpOAuthCallback, } from "./mcp-oauth.js";
|
|
31
|
+
import { upsertHostMcpOauthSecrets } from "./mcp-oauth-persist.js";
|
|
31
32
|
import { resolveProdSlug } from "./resolve-prod-target.js";
|
|
32
33
|
function describe(error) {
|
|
33
34
|
if (!(error instanceof Error)) {
|
|
@@ -287,25 +288,14 @@ function storeOauthSecrets(args) {
|
|
|
287
288
|
if (typeof auth === "number") {
|
|
288
289
|
return auth;
|
|
289
290
|
}
|
|
290
|
-
const names = mcpOauthSecretNames(args.connection);
|
|
291
|
-
const secrets = [
|
|
292
|
-
{ name: names.accessToken, value: tokens.access_token },
|
|
293
|
-
];
|
|
294
|
-
if (tokens.refresh_token !== undefined &&
|
|
295
|
-
tokens.refresh_token.trim() !== "") {
|
|
296
|
-
secrets.push({ name: names.refreshToken, value: tokens.refresh_token });
|
|
297
|
-
}
|
|
298
|
-
if (args.clientId !== undefined && args.clientId.trim() !== "") {
|
|
299
|
-
secrets.push({ name: names.clientId, value: args.clientId });
|
|
300
|
-
}
|
|
301
291
|
try {
|
|
302
|
-
const secretNames = yield
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
292
|
+
const secretNames = yield upsertHostMcpOauthSecrets({
|
|
293
|
+
connection: args.connection,
|
|
294
|
+
tokens,
|
|
295
|
+
clientId: args.clientId,
|
|
296
|
+
target: { client: auth.client, teamId: auth.teamId, slug },
|
|
306
297
|
});
|
|
307
|
-
args.out(`${LOG_PREFIX} Stored on ${slug}: ${
|
|
308
|
-
`${LOG_PREFIX} Secrets now: ${secretNames.join(", ")}. Next deploy picks them up.\n`);
|
|
298
|
+
args.out(`${LOG_PREFIX} Stored on ${slug}. Secrets now: ${secretNames.join(", ")}. Next deploy picks them up.\n`);
|
|
309
299
|
return 0;
|
|
310
300
|
}
|
|
311
301
|
catch (error) {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `slack init --manual` and `slack manifest` —
|
|
3
|
-
*
|
|
2
|
+
* `slack init --manual` and `slack manifest` — unmanaged Slack app.
|
|
3
|
+
* Slack CLI create+install when `~/.slack/bin/slack` is present;
|
|
4
|
+
* paste-at-api.slack.com is the fallback. Create/destroy/icon stay
|
|
5
|
+
* in `cli-slack.ts`.
|
|
4
6
|
*/
|
|
5
7
|
export interface SlackManualCliOptions {
|
|
6
8
|
dir: string;
|
|
@@ -12,9 +14,29 @@ export interface SlackManualCliOptions {
|
|
|
12
14
|
channelPosts?: boolean;
|
|
13
15
|
/** Gate for `slack init`; ignored by `slack manifest`. */
|
|
14
16
|
manual?: boolean;
|
|
17
|
+
/** Require Slack CLI install (fail if missing or install fails). */
|
|
18
|
+
install?: boolean;
|
|
19
|
+
/** Skip Slack CLI install even when the CLI is present. */
|
|
20
|
+
noInstall?: boolean;
|
|
21
|
+
slackTeam?: string;
|
|
22
|
+
prod?: boolean;
|
|
23
|
+
detectSlackCli?: () => string | undefined;
|
|
24
|
+
runSlackCli?: SlackCliExec;
|
|
15
25
|
out?: (text: string) => void;
|
|
16
26
|
err?: (text: string) => void;
|
|
17
27
|
}
|
|
28
|
+
export interface SlackCliExecRequest {
|
|
29
|
+
bin: string;
|
|
30
|
+
argv: string[];
|
|
31
|
+
cwd: string;
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
}
|
|
34
|
+
export interface SlackCliExecResult {
|
|
35
|
+
code: number;
|
|
36
|
+
stdout: string;
|
|
37
|
+
stderr: string;
|
|
38
|
+
}
|
|
39
|
+
export type SlackCliExec = (request: SlackCliExecRequest) => Promise<SlackCliExecResult>;
|
|
18
40
|
export declare function cmdSlackInit(options: SlackManualCliOptions): Promise<number>;
|
|
19
41
|
export declare function runSlackManifest(options: SlackManualCliOptions): Promise<number>;
|
|
20
42
|
//# sourceMappingURL=cli-slack-manual.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-slack-manual.d.ts","sourceRoot":"","sources":["../../src/internal/cli-slack-manual.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli-slack-manual.d.ts","sourceRoot":"","sources":["../../src/internal/cli-slack-manual.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,mBAAmB,KACzB,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAoGjC,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAoFjB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
|