@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH,OAAO,EAKL,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"init-project.d.ts","sourceRoot":"","sources":["../../src/internal/init-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ import { agentsMd, GITIGNORE, writeDefaultScaffold } from "./init-scaffold.js";
|
|
|
22
22
|
import { makePalette, stdoutPalette, } from "./terminal-style.js";
|
|
23
23
|
const TEMPLATES = {
|
|
24
24
|
"agentic-owners": { dir: "agentic-owners" },
|
|
25
|
+
"agents-md": { dir: "agents-md" },
|
|
25
26
|
"code-wiki": { dir: "code-wiki" },
|
|
26
27
|
demo: { dir: "demo" },
|
|
27
28
|
"pr-autofixer": { dir: "pr-autofixer" },
|
|
@@ -499,6 +500,7 @@ Scaffold a project, then open the playground:
|
|
|
499
500
|
npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
|
|
500
501
|
npx ${PACKAGE_NAME} init ./my-demo --template demo # record a PR walkthrough
|
|
501
502
|
npx ${PACKAGE_NAME} init ./code-wiki --template code-wiki # keep wiki pages current after merge
|
|
503
|
+
npx ${PACKAGE_NAME} init ./agents-md --template agents-md # keep AGENTS.md current from last week's PRs and Slack
|
|
502
504
|
npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
|
|
503
505
|
npx ${PACKAGE_NAME} init ./security-help --template security-help # answer security questions in Slack
|
|
504
506
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
|
|
@@ -26,6 +26,11 @@ export declare function sanitizeCustomerError(message: string): string;
|
|
|
26
26
|
/**
|
|
27
27
|
* One-line label for `agent-sdk deploy` polling (TTY spinner / non-TTY
|
|
28
28
|
* transitions). Uses statusMessage → progress → raw status.
|
|
29
|
+
*
|
|
30
|
+
* Deliberately does NOT include `lastError`. The spinner redraws with
|
|
31
|
+
* `\r\x1b[2K`, which clears one physical row, so a reason long enough to
|
|
32
|
+
* soft-wrap would leave the earlier rows on screen. Callers print the
|
|
33
|
+
* reason once on the final line instead.
|
|
29
34
|
*/
|
|
30
35
|
export declare function deployProgressLabel(detail: {
|
|
31
36
|
status: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-client.d.ts","sourceRoot":"","sources":["../../src/internal/logs-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAW7E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GACpB,kBAAkB,GAClB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,UAAU,GACV,UAAU,GACV,YAAY,GACZ,SAAS,GACT,QAAQ,GACR,UAAU,GACV,SAAS,GACT,UAAU,GACV,UAAU,CAAC;AAiBf;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,MAAM,CAuBR;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAa7D;AAED
|
|
1
|
+
{"version":3,"file":"logs-client.d.ts","sourceRoot":"","sources":["../../src/internal/logs-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -78,6 +78,11 @@ export function sanitizeCustomerError(message) {
|
|
|
78
78
|
/**
|
|
79
79
|
* One-line label for `agent-sdk deploy` polling (TTY spinner / non-TTY
|
|
80
80
|
* transitions). Uses statusMessage → progress → raw status.
|
|
81
|
+
*
|
|
82
|
+
* Deliberately does NOT include `lastError`. The spinner redraws with
|
|
83
|
+
* `\r\x1b[2K`, which clears one physical row, so a reason long enough to
|
|
84
|
+
* soft-wrap would leave the earlier rows on screen. Callers print the
|
|
85
|
+
* reason once on the final line instead.
|
|
81
86
|
*/
|
|
82
87
|
export function deployProgressLabel(detail) {
|
|
83
88
|
if (detail.statusMessage !== null &&
|
|
@@ -200,7 +200,7 @@ function buildConnectionBridgeMcpServer(engine, sessionId, connectionName) {
|
|
|
200
200
|
if (reason !== undefined) {
|
|
201
201
|
throw new Error(reason);
|
|
202
202
|
}
|
|
203
|
-
const tools = yield engine.host.mcp.listTools(connectionName);
|
|
203
|
+
const tools = yield engine.runWithMcpPark(sessionId !== null && sessionId !== void 0 ? sessionId : "", "tools/list", () => engine.host.mcp.listTools(connectionName));
|
|
204
204
|
return {
|
|
205
205
|
tools: tools.map((tool) => { var _a; return (Object.assign(Object.assign(Object.assign(Object.assign({ name: tool.name }, (tool.description === undefined
|
|
206
206
|
? {}
|
|
@@ -212,7 +212,6 @@ function buildConnectionBridgeMcpServer(engine, sessionId, connectionName) {
|
|
|
212
212
|
};
|
|
213
213
|
}));
|
|
214
214
|
server.setRequestHandler(CallToolRequestSchema, (request) => __awaiter(this, void 0, void 0, function* () {
|
|
215
|
-
var _a;
|
|
216
215
|
const reason = rejected();
|
|
217
216
|
if (reason !== undefined) {
|
|
218
217
|
return errorResult(reason);
|
|
@@ -228,7 +227,7 @@ function buildConnectionBridgeMcpServer(engine, sessionId, connectionName) {
|
|
|
228
227
|
return sdkResultToMcpResult(answer.result);
|
|
229
228
|
}
|
|
230
229
|
try {
|
|
231
|
-
const result = yield engine.host.mcp.callTool(connectionName, request.params.name, (_a = request.params.arguments) !== null && _a !== void 0 ? _a : {});
|
|
230
|
+
const result = yield engine.runWithMcpPark(sessionId !== null && sessionId !== void 0 ? sessionId : "", request.params.name, () => { var _a; return engine.host.mcp.callTool(connectionName, request.params.name, (_a = request.params.arguments) !== null && _a !== void 0 ? _a : {}); });
|
|
232
231
|
return Object.assign(Object.assign({
|
|
233
232
|
// The host client already speaks MCP, so the content array is valid
|
|
234
233
|
// CallToolResult content; HostMcpCallResult just types the tail of
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
* and stay on `host.mcp` plus `mcp oauth`.
|
|
11
11
|
*/
|
|
12
12
|
import type { DiscoveredConnection, HostMcpCallResult, HostMcpRegistry, HostMcpToolInfo, McpToolAnnotations } from "../types.js";
|
|
13
|
+
export declare class McpNeedsAuthError extends Error {
|
|
14
|
+
readonly connection: string;
|
|
15
|
+
constructor(connection: string, cause?: unknown);
|
|
16
|
+
}
|
|
17
|
+
export declare function isMcpNeedsAuthError(error: unknown): error is McpNeedsAuthError;
|
|
18
|
+
export declare function hostMcpCallNeedsAuth(result: HostMcpCallResult): boolean;
|
|
13
19
|
/**
|
|
14
20
|
* A non-caching view of one connection: every operation opens a fresh
|
|
15
21
|
* client and closes it afterwards. See {@link McpHost.oneOff}.
|
|
@@ -21,7 +27,10 @@ export interface HostMcpOneOff {
|
|
|
21
27
|
export declare class McpHost implements HostMcpRegistry {
|
|
22
28
|
private readonly byName;
|
|
23
29
|
private readonly clients;
|
|
30
|
+
private oauthRedirectUrl;
|
|
24
31
|
constructor(connections: DiscoveredConnection[]);
|
|
32
|
+
/** Public serve callback for host OAuth (not the CLI loopback port on pods). */
|
|
33
|
+
setOAuthRedirectUrl(url: string): void;
|
|
25
34
|
/**
|
|
26
35
|
* Register a connection after construction (serve-time resolved peers).
|
|
27
36
|
* Clients open lazily on first use, so adding before first call is safe.
|
|
@@ -40,6 +49,7 @@ export declare class McpHost implements HostMcpRegistry {
|
|
|
40
49
|
*/
|
|
41
50
|
oneOff(connection: DiscoveredConnection): HostMcpOneOff;
|
|
42
51
|
callTool(connectionName: string, toolName: string, args?: Record<string, unknown>): Promise<HostMcpCallResult>;
|
|
52
|
+
dropClient(name: string): Promise<void>;
|
|
43
53
|
close(): Promise<void>;
|
|
44
54
|
/**
|
|
45
55
|
* Run against a cached host MCP client, reconnecting once when the remote
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEf,kBAAkB,EACnB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEf,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAIrB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAS9C;CACF;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,iBAAiB,CAE5B;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAQvE;AAiBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxC,QAAQ,CACN,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/B;AAED,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IACxE,OAAO,CAAC,gBAAgB,CAAqB;IAE7C,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED,gFAAgF;IAChF,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAKlE;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,aAAa,CA8BtD;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;IAEK,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5C;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED;;;;;;;;OAQG;YACW,UAAU;IAiBxB,OAAO,CAAC,SAAS;YAYH,gBAAgB;YAiBhB,OAAO;CAUtB;AAED,+BAA+B;AAC/B,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU9D;AAKD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,OAAO,GACnB,kBAAkB,GAAG,SAAS,CAyBhC"}
|
|
@@ -25,6 +25,34 @@ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
|
|
|
25
25
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
26
26
|
import { CLI_COMMAND_NAME as CLI } from "./distribution.js";
|
|
27
27
|
import { createHostMcpOAuthProvider } from "./mcp-oauth.js";
|
|
28
|
+
export class McpNeedsAuthError extends Error {
|
|
29
|
+
constructor(connection, cause) {
|
|
30
|
+
super(`MCP connection "${connection}" needs authorization. Run \`${CLI} mcp oauth ${connection}\`.`);
|
|
31
|
+
this.name = "McpNeedsAuthError";
|
|
32
|
+
this.connection = connection;
|
|
33
|
+
if (cause !== undefined) {
|
|
34
|
+
this.cause = cause;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function isMcpNeedsAuthError(error) {
|
|
39
|
+
return error instanceof McpNeedsAuthError;
|
|
40
|
+
}
|
|
41
|
+
export function hostMcpCallNeedsAuth(result) {
|
|
42
|
+
if (result.isError !== true) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const text = result.content
|
|
46
|
+
.map((part) => (part.type === "text" ? part.text : ""))
|
|
47
|
+
.join("\n");
|
|
48
|
+
return text.includes("needsAuth") || text.includes("needs authorization");
|
|
49
|
+
}
|
|
50
|
+
function throwIfCallNeedsAuth(connection, result) {
|
|
51
|
+
if (hostMcpCallNeedsAuth(result)) {
|
|
52
|
+
throw new McpNeedsAuthError(connection);
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
28
56
|
export class McpHost {
|
|
29
57
|
constructor(connections) {
|
|
30
58
|
this.byName = new Map();
|
|
@@ -33,6 +61,10 @@ export class McpHost {
|
|
|
33
61
|
this.byName.set(connection.name, connection);
|
|
34
62
|
}
|
|
35
63
|
}
|
|
64
|
+
/** Public serve callback for host OAuth (not the CLI loopback port on pods). */
|
|
65
|
+
setOAuthRedirectUrl(url) {
|
|
66
|
+
this.oauthRedirectUrl = url;
|
|
67
|
+
}
|
|
36
68
|
/**
|
|
37
69
|
* Register a connection after construction (serve-time resolved peers).
|
|
38
70
|
* Clients open lazily on first use, so adding before first call is safe.
|
|
@@ -61,8 +93,9 @@ export class McpHost {
|
|
|
61
93
|
* mapping as registry calls.
|
|
62
94
|
*/
|
|
63
95
|
oneOff(connection) {
|
|
96
|
+
const redirectUrl = this.oauthRedirectUrl;
|
|
64
97
|
const withFreshClient = (run) => __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
const opened = yield openConnection(connection);
|
|
98
|
+
const opened = yield openConnection(connection, redirectUrl);
|
|
66
99
|
try {
|
|
67
100
|
return yield run(opened.client);
|
|
68
101
|
}
|
|
@@ -80,7 +113,7 @@ export class McpHost {
|
|
|
80
113
|
name: toolName,
|
|
81
114
|
arguments: args,
|
|
82
115
|
});
|
|
83
|
-
return normalizeCallResult(result);
|
|
116
|
+
return throwIfCallNeedsAuth(connection.name, normalizeCallResult(result));
|
|
84
117
|
})),
|
|
85
118
|
};
|
|
86
119
|
}
|
|
@@ -91,10 +124,25 @@ export class McpHost {
|
|
|
91
124
|
name: toolName,
|
|
92
125
|
arguments: args,
|
|
93
126
|
});
|
|
94
|
-
return normalizeCallResult(result);
|
|
127
|
+
return throwIfCallNeedsAuth(connectionName, normalizeCallResult(result));
|
|
95
128
|
}));
|
|
96
129
|
});
|
|
97
130
|
}
|
|
131
|
+
dropClient(name) {
|
|
132
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
+
const pending = this.clients.get(name);
|
|
134
|
+
this.clients.delete(name);
|
|
135
|
+
if (pending === undefined) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
yield (yield pending).close();
|
|
140
|
+
}
|
|
141
|
+
catch (_a) {
|
|
142
|
+
// Best-effort teardown.
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
98
146
|
close() {
|
|
99
147
|
return __awaiter(this, void 0, void 0, function* () {
|
|
100
148
|
const opened = yield Promise.allSettled([...this.clients.values()]);
|
|
@@ -165,7 +213,7 @@ export class McpHost {
|
|
|
165
213
|
const known = this.names().join(", ") || "(none)";
|
|
166
214
|
throw new Error(`Unknown MCP connection "${name}". Authored MCP connections: ${known}.`);
|
|
167
215
|
}
|
|
168
|
-
return openConnection(connection);
|
|
216
|
+
return openConnection(connection, this.oauthRedirectUrl);
|
|
169
217
|
});
|
|
170
218
|
}
|
|
171
219
|
}
|
|
@@ -229,20 +277,20 @@ function toToolInfo(tool) {
|
|
|
229
277
|
? {}
|
|
230
278
|
: { outputSchema: tool.outputSchema })), (annotations === undefined ? {} : { annotations }));
|
|
231
279
|
}
|
|
232
|
-
function openConnection(connection) {
|
|
280
|
+
function openConnection(connection, oauthRedirectUrl) {
|
|
233
281
|
return __awaiter(this, void 0, void 0, function* () {
|
|
234
282
|
const client = new Client({
|
|
235
283
|
name: "agent-serve",
|
|
236
284
|
version: "0.1.0",
|
|
237
285
|
});
|
|
238
|
-
const transport = yield createTransport(connection);
|
|
286
|
+
const transport = yield createTransport(connection, oauthRedirectUrl);
|
|
239
287
|
try {
|
|
240
288
|
yield client.connect(transport);
|
|
241
289
|
}
|
|
242
290
|
catch (error) {
|
|
243
291
|
if (error instanceof UnauthorizedError &&
|
|
244
292
|
isOauthHttpTransport(connection.transport)) {
|
|
245
|
-
throw new
|
|
293
|
+
throw new McpNeedsAuthError(connection.name, error);
|
|
246
294
|
}
|
|
247
295
|
throw error;
|
|
248
296
|
}
|
|
@@ -266,7 +314,7 @@ function openConnection(connection) {
|
|
|
266
314
|
};
|
|
267
315
|
});
|
|
268
316
|
}
|
|
269
|
-
function createTransport(connection) {
|
|
317
|
+
function createTransport(connection, oauthRedirectUrl) {
|
|
270
318
|
return __awaiter(this, void 0, void 0, function* () {
|
|
271
319
|
var _a;
|
|
272
320
|
const transport = connection.transport;
|
|
@@ -292,6 +340,7 @@ function createTransport(connection) {
|
|
|
292
340
|
? yield createHostMcpOAuthProvider({
|
|
293
341
|
identifier: connection.name,
|
|
294
342
|
resourceUrl: transport.url,
|
|
343
|
+
redirectUrl: oauthRedirectUrl,
|
|
295
344
|
})
|
|
296
345
|
: undefined;
|
|
297
346
|
if (transport.type === "sse") {
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mid-run host MCP OAuth: mint an authUrl, finish on the public serve
|
|
3
|
+
* callback (file tokens). Deployment secrets persist from the
|
|
4
|
+
* authenticated park, not from that callback.
|
|
5
|
+
*
|
|
6
|
+
* CLI `mcp oauth` still uses the loopback callback. This path is recovery
|
|
7
|
+
* and first-use without a separate `--store` step.
|
|
8
|
+
*/
|
|
9
|
+
import { FileMcpOAuthStore } from "./mcp-oauth.js";
|
|
10
|
+
import { type McpOauthSecretsTarget, type ResolveHostedMcpOauthSecretsArgs } from "./mcp-oauth-persist.js";
|
|
11
|
+
export declare function mcpOauthServeCallbackPath(basePath?: string): string;
|
|
12
|
+
export declare function mcpOauthServeCallbackUrl(origin: string, basePath?: string): string;
|
|
13
|
+
export type BeginHostMcpOauthResult = {
|
|
14
|
+
status: "authorized";
|
|
15
|
+
} | {
|
|
16
|
+
status: "needs_auth";
|
|
17
|
+
authUrl: string;
|
|
18
|
+
state: string;
|
|
19
|
+
finish: (code: string) => Promise<void>;
|
|
20
|
+
abort: () => Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export declare function beginHostMcpOauth(args: {
|
|
23
|
+
connection: string;
|
|
24
|
+
url: string;
|
|
25
|
+
type?: "http" | "sse";
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
redirectUrl: string;
|
|
28
|
+
store?: FileMcpOAuthStore;
|
|
29
|
+
}): Promise<BeginHostMcpOauthResult>;
|
|
30
|
+
export type McpOauthCompleteResult = {
|
|
31
|
+
connection: string;
|
|
32
|
+
sessionId?: string;
|
|
33
|
+
callId?: string;
|
|
34
|
+
};
|
|
35
|
+
export declare class McpOauthOnDemandHub {
|
|
36
|
+
private readonly attempts;
|
|
37
|
+
private readonly completed;
|
|
38
|
+
private readonly finishing;
|
|
39
|
+
private readonly aborted;
|
|
40
|
+
callbackUrl: string | undefined;
|
|
41
|
+
secrets?: McpOauthSecretsTarget;
|
|
42
|
+
secretsBind?: ResolveHostedMcpOauthSecretsArgs;
|
|
43
|
+
logger?: (line: string) => void;
|
|
44
|
+
private store?;
|
|
45
|
+
mint(args: {
|
|
46
|
+
connection: string;
|
|
47
|
+
url: string;
|
|
48
|
+
type?: "http" | "sse";
|
|
49
|
+
headers?: Record<string, string>;
|
|
50
|
+
sessionId?: string;
|
|
51
|
+
}): Promise<{
|
|
52
|
+
authUrl: string;
|
|
53
|
+
state: string;
|
|
54
|
+
} | {
|
|
55
|
+
authorized: true;
|
|
56
|
+
}>;
|
|
57
|
+
abortCall(sessionId: string, callId: string): Promise<void>;
|
|
58
|
+
abortSession(sessionId: string): Promise<void>;
|
|
59
|
+
close(): Promise<void>;
|
|
60
|
+
private dropWhere;
|
|
61
|
+
bind(state: string, sessionId: string, callId: string): "pending" | "already_done" | "unknown";
|
|
62
|
+
complete(state: string, code: string): Promise<McpOauthCompleteResult>;
|
|
63
|
+
private finishAttempt;
|
|
64
|
+
private fileStore;
|
|
65
|
+
persistFor(connection: string, resourceUrl: string): Promise<void>;
|
|
66
|
+
handleCallback(request: Request): Promise<Response>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=mcp-oauth-on-demand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth-on-demand.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-oauth-on-demand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mid-run host MCP OAuth: mint an authUrl, finish on the public serve
|
|
3
|
+
* callback (file tokens). Deployment secrets persist from the
|
|
4
|
+
* authenticated park, not from that callback.
|
|
5
|
+
*
|
|
6
|
+
* CLI `mcp oauth` still uses the loopback callback. This path is recovery
|
|
7
|
+
* and first-use without a separate `--store` step.
|
|
8
|
+
*/
|
|
9
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
10
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
11
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
12
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
13
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
14
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
15
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
19
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
20
|
+
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
21
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
22
|
+
import { describeError } from "./describe-error.js";
|
|
23
|
+
import { LOG_PREFIX } from "./distribution.js";
|
|
24
|
+
import { createHostMcpOAuthProvider, FileMcpOAuthStore, MCP_OAUTH_CALLBACK_URL, } from "./mcp-oauth.js";
|
|
25
|
+
import { resolveHostedMcpOauthSecretsTarget, upsertHostMcpOauthSecrets, } from "./mcp-oauth-persist.js";
|
|
26
|
+
export function mcpOauthServeCallbackPath(basePath = "") {
|
|
27
|
+
return `${basePath}/v1/mcp-oauth/callback`;
|
|
28
|
+
}
|
|
29
|
+
export function mcpOauthServeCallbackUrl(origin, basePath = "") {
|
|
30
|
+
return `${origin.replace(/\/$/, "")}${mcpOauthServeCallbackPath(basePath)}`;
|
|
31
|
+
}
|
|
32
|
+
export function beginHostMcpOauth(args) {
|
|
33
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
var _a;
|
|
35
|
+
let authorizationUrl;
|
|
36
|
+
const provider = yield createHostMcpOAuthProvider({
|
|
37
|
+
identifier: args.connection,
|
|
38
|
+
resourceUrl: args.url,
|
|
39
|
+
store: args.store,
|
|
40
|
+
redirectUrl: args.redirectUrl,
|
|
41
|
+
onRedirect: (url) => {
|
|
42
|
+
authorizationUrl = url;
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
const client = new Client({ name: "agent-sdk-mcp-oauth", version: "0.1.0" });
|
|
46
|
+
const url = new URL(args.url);
|
|
47
|
+
const requestInit = args.headers === undefined ? undefined : { headers: args.headers };
|
|
48
|
+
const makeTransport = () => {
|
|
49
|
+
if (args.type === "sse") {
|
|
50
|
+
return new SSEClientTransport(url, {
|
|
51
|
+
authProvider: provider,
|
|
52
|
+
requestInit,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return new StreamableHTTPClientTransport(url, {
|
|
56
|
+
authProvider: provider,
|
|
57
|
+
requestInit,
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const transport = makeTransport();
|
|
61
|
+
try {
|
|
62
|
+
yield client.connect(transport);
|
|
63
|
+
yield client.close().catch(() => undefined);
|
|
64
|
+
return { status: "authorized" };
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (!(error instanceof UnauthorizedError)) {
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const redirect = authorizationUrl !== null && authorizationUrl !== void 0 ? authorizationUrl : provider.lastRedirectUrl;
|
|
72
|
+
if (redirect === undefined) {
|
|
73
|
+
throw new Error(`Auth required for "${args.connection}" but no authorization URL was provided.`);
|
|
74
|
+
}
|
|
75
|
+
const state = (_a = redirect.searchParams.get("state")) !== null && _a !== void 0 ? _a : "";
|
|
76
|
+
if (state === "") {
|
|
77
|
+
throw new Error(`Auth required for "${args.connection}" but the authorization URL had no state.`);
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
status: "needs_auth",
|
|
81
|
+
authUrl: redirect.toString(),
|
|
82
|
+
state,
|
|
83
|
+
finish: (code) => __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
var _a;
|
|
85
|
+
yield transport.finishAuth(code);
|
|
86
|
+
yield (_a = transport.close) === null || _a === void 0 ? void 0 : _a.call(transport).catch(() => undefined);
|
|
87
|
+
}),
|
|
88
|
+
abort: () => __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
var _a;
|
|
90
|
+
yield (_a = transport.close) === null || _a === void 0 ? void 0 : _a.call(transport).catch(() => undefined);
|
|
91
|
+
}),
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export class McpOauthOnDemandHub {
|
|
96
|
+
constructor() {
|
|
97
|
+
this.attempts = new Map();
|
|
98
|
+
this.completed = new Map();
|
|
99
|
+
this.finishing = new Map();
|
|
100
|
+
this.aborted = new Set();
|
|
101
|
+
}
|
|
102
|
+
mint(args) {
|
|
103
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
104
|
+
var _a;
|
|
105
|
+
const redirectUrl = (_a = this.callbackUrl) !== null && _a !== void 0 ? _a : MCP_OAUTH_CALLBACK_URL;
|
|
106
|
+
const store = this.fileStore();
|
|
107
|
+
const started = yield beginHostMcpOauth({
|
|
108
|
+
connection: args.connection,
|
|
109
|
+
url: args.url,
|
|
110
|
+
type: args.type,
|
|
111
|
+
headers: args.headers,
|
|
112
|
+
redirectUrl,
|
|
113
|
+
store,
|
|
114
|
+
});
|
|
115
|
+
if (started.status === "authorized") {
|
|
116
|
+
return { authorized: true };
|
|
117
|
+
}
|
|
118
|
+
this.attempts.set(started.state, {
|
|
119
|
+
connection: args.connection,
|
|
120
|
+
resourceUrl: args.url,
|
|
121
|
+
finish: started.finish,
|
|
122
|
+
abort: started.abort,
|
|
123
|
+
sessionId: args.sessionId,
|
|
124
|
+
});
|
|
125
|
+
return { authUrl: started.authUrl, state: started.state };
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
abortCall(sessionId, callId) {
|
|
129
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
yield this.dropWhere((attempt) => attempt.sessionId === sessionId && attempt.callId === callId, true);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
abortSession(sessionId) {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
yield this.dropWhere((attempt) => attempt.sessionId === sessionId, false);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
close() {
|
|
139
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
140
|
+
yield this.dropWhere(() => true, true);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
dropWhere(match, includeCompleted) {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
const jobs = [];
|
|
146
|
+
for (const [state, attempt] of this.attempts) {
|
|
147
|
+
if (!match(attempt)) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
this.aborted.add(state);
|
|
151
|
+
this.attempts.delete(state);
|
|
152
|
+
jobs.push(attempt.abort().catch(() => undefined));
|
|
153
|
+
}
|
|
154
|
+
if (includeCompleted) {
|
|
155
|
+
for (const [state, attempt] of this.completed) {
|
|
156
|
+
if (!match(attempt)) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
this.aborted.add(state);
|
|
160
|
+
this.completed.delete(state);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
yield Promise.all(jobs);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
bind(state, sessionId, callId) {
|
|
167
|
+
const live = this.attempts.get(state);
|
|
168
|
+
if (live !== undefined) {
|
|
169
|
+
live.sessionId = sessionId;
|
|
170
|
+
live.callId = callId;
|
|
171
|
+
return "pending";
|
|
172
|
+
}
|
|
173
|
+
const done = this.completed.get(state);
|
|
174
|
+
if (done !== undefined) {
|
|
175
|
+
done.sessionId = sessionId;
|
|
176
|
+
done.callId = callId;
|
|
177
|
+
return "already_done";
|
|
178
|
+
}
|
|
179
|
+
return "unknown";
|
|
180
|
+
}
|
|
181
|
+
complete(state, code) {
|
|
182
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
183
|
+
if (this.aborted.has(state)) {
|
|
184
|
+
throw new Error("Unknown OAuth state.");
|
|
185
|
+
}
|
|
186
|
+
const pending = this.finishing.get(state);
|
|
187
|
+
if (pending !== undefined) {
|
|
188
|
+
return yield pending;
|
|
189
|
+
}
|
|
190
|
+
const attempt = this.attempts.get(state);
|
|
191
|
+
if (attempt === undefined) {
|
|
192
|
+
throw new Error("Unknown OAuth state.");
|
|
193
|
+
}
|
|
194
|
+
const run = this.finishAttempt(state, attempt, code);
|
|
195
|
+
this.finishing.set(state, run);
|
|
196
|
+
return yield run;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
finishAttempt(state, attempt, code) {
|
|
200
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
201
|
+
try {
|
|
202
|
+
yield attempt.finish(code);
|
|
203
|
+
this.attempts.delete(state);
|
|
204
|
+
if (!this.aborted.has(state)) {
|
|
205
|
+
this.completed.set(state, attempt);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
connection: attempt.connection,
|
|
209
|
+
sessionId: attempt.sessionId,
|
|
210
|
+
callId: attempt.callId,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
this.finishing.delete(state);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
fileStore() {
|
|
219
|
+
var _a;
|
|
220
|
+
(_a = this.store) !== null && _a !== void 0 ? _a : (this.store = new FileMcpOAuthStore());
|
|
221
|
+
return this.store;
|
|
222
|
+
}
|
|
223
|
+
persistFor(connection, resourceUrl) {
|
|
224
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
225
|
+
var _a, _b;
|
|
226
|
+
var _c, _d;
|
|
227
|
+
const target = (_c = this.secrets) !== null && _c !== void 0 ? _c : resolveHostedMcpOauthSecretsTarget((_d = this.secretsBind) !== null && _d !== void 0 ? _d : {});
|
|
228
|
+
if (target === undefined) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const store = this.fileStore();
|
|
232
|
+
const tokens = yield store.loadTokens(connection, resourceUrl);
|
|
233
|
+
if (tokens === undefined || tokens.access_token.trim() === "") {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const client = yield store.loadClientInformation(connection, resourceUrl);
|
|
237
|
+
try {
|
|
238
|
+
const names = yield upsertHostMcpOauthSecrets({
|
|
239
|
+
connection,
|
|
240
|
+
tokens,
|
|
241
|
+
clientId: client === null || client === void 0 ? void 0 : client.client_id,
|
|
242
|
+
target,
|
|
243
|
+
});
|
|
244
|
+
(_a = this.logger) === null || _a === void 0 ? void 0 : _a.call(this, `${LOG_PREFIX} MCP OAuth tokens stored on the deployment (${names.join(", ")}).`);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
(_b = this.logger) === null || _b === void 0 ? void 0 : _b.call(this, `${LOG_PREFIX} MCP OAuth persist failed for "${connection}": ${describeError(error)}`);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
handleCallback(request) {
|
|
252
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
253
|
+
var _a;
|
|
254
|
+
const url = new URL(request.url);
|
|
255
|
+
const code = url.searchParams.get("code");
|
|
256
|
+
const state = (_a = url.searchParams.get("state")) !== null && _a !== void 0 ? _a : "";
|
|
257
|
+
if (this.aborted.has(state)) {
|
|
258
|
+
return oauthHtml(404, "<h1>Not found</h1>");
|
|
259
|
+
}
|
|
260
|
+
if (this.completed.has(state)) {
|
|
261
|
+
return oauthHtml(200, "<h1>Authorized</h1><p>Return to the agent.</p>");
|
|
262
|
+
}
|
|
263
|
+
if (!this.attempts.has(state)) {
|
|
264
|
+
return oauthHtml(404, "<h1>Not found</h1>");
|
|
265
|
+
}
|
|
266
|
+
if (code !== null && code !== "") {
|
|
267
|
+
try {
|
|
268
|
+
yield this.complete(state, code);
|
|
269
|
+
}
|
|
270
|
+
catch (_b) {
|
|
271
|
+
return oauthHtml(400, "<h1>Authorization failed</h1>");
|
|
272
|
+
}
|
|
273
|
+
if (this.aborted.has(state)) {
|
|
274
|
+
return oauthHtml(404, "<h1>Not found</h1>");
|
|
275
|
+
}
|
|
276
|
+
return oauthHtml(200, "<h1>Authorized</h1><p>Return to the agent.</p>");
|
|
277
|
+
}
|
|
278
|
+
return oauthHtml(400, "<h1>Authorization failed</h1>");
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
function oauthHtml(status, body) {
|
|
283
|
+
return new Response(`<!doctype html><html><body>${body}</body></html>`, {
|
|
284
|
+
status,
|
|
285
|
+
headers: { "content-type": "text/html; charset=utf-8" },
|
|
286
|
+
});
|
|
287
|
+
}
|