@cursor/july 0.1.95 → 0.1.97
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 +3 -4
- package/README.md +3 -2
- package/dist/bin/agent-serve.js +14 -3
- package/dist/channels/deployments/types.d.ts +1 -1
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/deployments/types.js +1 -0
- package/dist/channels/origin/api.d.ts +72 -15
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +185 -28
- package/dist/channels/origin/binding.d.ts +13 -2
- package/dist/channels/origin/binding.d.ts.map +1 -1
- package/dist/channels/origin/binding.js +41 -25
- package/dist/channels/origin/checks.d.ts +6 -6
- package/dist/channels/origin/checks.js +6 -6
- package/dist/channels/origin/cursor-account.d.ts +5 -3
- package/dist/channels/origin/cursor-account.d.ts.map +1 -1
- package/dist/channels/origin/cursor-account.js +5 -3
- 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.map +1 -1
- package/dist/channels/origin/origin-channel.js +3 -0
- 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/api.d.ts +9 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +36 -5
- 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 +110 -81
- package/dist/channels/slack/dispatch.d.ts +7 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +47 -23
- package/dist/channels/slack/inbound.d.ts +8 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +32 -0
- 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 +26 -29
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +172 -73
- package/dist/channels/slack/manifest.d.ts +1 -1
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +6 -2
- package/dist/channels/slack/nudge-carrier.d.ts +2 -0
- package/dist/channels/slack/nudge-carrier.d.ts.map +1 -1
- package/dist/channels/slack/nudge-carrier.js +48 -1
- 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 +3 -2
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
- package/dist/channels/slack/tool-approval-events.js +91 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.BBj0klBO.js → app.B3rWNYE1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BU9nHdnQ.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CUEXpL78.js → VPLocalSearchBox.C1lhqJJR.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DabmQnia.js → theme.B40_SXuv.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/{index.md.BoHaMdeZ.lean.js → index.md.CVeRUOeZ.lean.js} +1 -1
- 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.BsMOxDvh.js → reference_cli.md.RyZf5OTE.js} +10 -6
- package/dist/docs/assets/{reference_cli.md.BsMOxDvh.lean.js → reference_cli.md.RyZf5OTE.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.5zOAbV86.js} +1 -1
- package/dist/docs/assets/reference_sessions.md.NxFP_CAC.js +1 -0
- package/dist/docs/assets/{reference_tools.md.BHeXn2id.js → reference_tools.md.B84gw9Ii.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/templates_code-wiki.md.CDYZIBFN.js +2 -0
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.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/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 +7 -3
- package/dist/docs/llms-full.txt +398 -653
- 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 +14 -10
- package/dist/docs/reference/cli.md +39 -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 +6 -6
- package/dist/docs/reference/http-api.md +2 -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 +6 -6
- package/dist/docs/reference/tools.md +9 -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 +28 -0
- package/dist/docs/templates/code-wiki.md +91 -0
- package/dist/docs/templates/demo.html +5 -5
- 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 +26 -4
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +32 -4
- package/dist/internal/advertise-tools.d.ts +2 -0
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +30 -10
- 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/bounded.d.ts +7 -0
- package/dist/internal/bounded.d.ts.map +1 -0
- package/dist/internal/bounded.js +32 -0
- package/dist/internal/chat-client.js +10 -0
- package/dist/internal/cli-deploy.d.ts +5 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +57 -18
- 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/conversation-mirror.d.ts +11 -8
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +116 -55
- 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/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +22 -48
- package/dist/internal/cursor/session-token.d.ts +45 -0
- package/dist/internal/cursor/session-token.d.ts.map +1 -0
- package/dist/internal/cursor/session-token.js +99 -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 +2 -0
- 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 +61 -0
- package/dist/internal/framework-file-storage.d.ts.map +1 -0
- package/dist/internal/framework-file-storage.js +210 -0
- package/dist/internal/framework-storage-selection.d.ts +11 -5
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +38 -11
- package/dist/internal/hosted-delivery-protocol.d.ts +7 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +7 -0
- package/dist/internal/hosted-delivery.d.ts +13 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +64 -19
- package/dist/internal/hosted-execution-diag.d.ts +48 -0
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -0
- package/dist/internal/hosted-execution-diag.js +150 -0
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +81 -1
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +4 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +1 -3
- 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/managed-delivery.d.ts +80 -0
- package/dist/internal/managed-delivery.d.ts.map +1 -0
- package/dist/internal/managed-delivery.js +86 -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/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +22 -9
- package/dist/internal/runtime-dispatch-runner.d.ts +5 -1
- package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
- package/dist/internal/runtime-dispatch-runner.js +7 -0
- package/dist/internal/sdk-runner.d.ts +11 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +39 -8
- package/dist/internal/server.d.ts +3 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +49 -21
- package/dist/internal/session-engine.d.ts +101 -3
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +577 -46
- 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/steering.d.ts +15 -0
- package/dist/internal/steering.d.ts.map +1 -0
- package/dist/internal/steering.js +18 -0
- package/dist/internal/storage-coordinator.d.ts +7 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +28 -5
- 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 +9 -1
- package/dist/internal/tool-policy.d.ts.map +1 -1
- package/dist/internal/tool-policy.js +13 -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-CZA1uEWA.js → index-DrkI6y5O.js} +51 -51
- package/dist/playground/assets/index-DzNGwm7q.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +9 -6
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +16 -3
- package/dist/storage.d.ts +8 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/types.d.ts +65 -8
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +7 -3
- package/docs/deployment.md +5 -4
- 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 +39 -16
- package/docs/reference/connections.md +6 -3
- package/docs/reference/http-api.md +2 -1
- package/docs/reference/sessions.md +4 -2
- package/docs/reference/tools.md +9 -2
- package/docs/templates/agents-md.md +110 -0
- package/docs/templates/code-wiki.md +96 -0
- package/docs/troubleshooting.md +2 -2
- package/package.json +2 -2
- package/skills/ab/SKILL.md +13 -97
- package/skills/create-agent/SKILL.md +124 -223
- package/skills/debug/SKILL.md +34 -68
- package/skills/evals/SKILL.md +55 -180
- package/skills/framework-map/SKILL.md +83 -145
- package/skills/github/SKILL.md +53 -111
- package/skills/hillclimb/SKILL.md +40 -163
- package/skills/mcp-auth/SKILL.md +51 -107
- package/skills/otel/SKILL.md +22 -68
- package/skills/setup-slack/SKILL.md +91 -212
- package/src/bin/agent-serve.ts +13 -1
- package/src/channels/deployments/types.ts +1 -0
- package/src/channels/origin/api.ts +264 -33
- package/src/channels/origin/binding.ts +57 -28
- package/src/channels/origin/checks.ts +6 -6
- package/src/channels/origin/cursor-account.ts +5 -3
- package/src/channels/origin/index.ts +1 -0
- package/src/channels/origin/origin-channel.ts +4 -0
- package/src/channels/origin/reactions.ts +82 -0
- package/src/channels/origin/types.ts +11 -0
- package/src/channels/slack/api.ts +41 -5
- package/src/channels/slack/approvals.ts +105 -0
- package/src/channels/slack/cli-project.ts +267 -0
- package/src/channels/slack/defaults.ts +122 -93
- package/src/channels/slack/dispatch.ts +56 -22
- package/src/channels/slack/inbound.ts +43 -0
- package/src/channels/slack/init.ts +10 -5
- package/src/channels/slack/interactive.ts +35 -9
- package/src/channels/slack/live-delivery.ts +235 -114
- package/src/channels/slack/manifest.ts +6 -2
- package/src/channels/slack/nudge-carrier.ts +48 -1
- package/src/channels/slack/setup.ts +10 -6
- package/src/channels/slack/slack-channel.ts +3 -0
- package/src/channels/slack/tool-approval-events.ts +93 -0
- package/src/evals/run-facts.ts +32 -0
- package/src/files-backends/cursor-hosted.ts +40 -7
- package/src/internal/advertise-tools.ts +49 -12
- package/src/internal/approval-gate.ts +20 -29
- package/src/internal/bounded.ts +28 -0
- package/src/internal/chat-client.ts +19 -0
- package/src/internal/cli-deploy.ts +91 -9
- 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/conversation-mirror.ts +145 -69
- package/src/internal/cursor/account-mcp.ts +21 -0
- package/src/internal/cursor/backend-client.ts +34 -58
- package/src/internal/cursor/session-token.ts +115 -0
- package/src/internal/cursor-agent-template.ts +2 -0
- package/src/internal/deploy-client.ts +43 -0
- package/src/internal/env-file.ts +84 -0
- package/src/internal/framework-file-storage.ts +228 -0
- package/src/internal/framework-storage-selection.ts +51 -11
- package/src/internal/hosted-delivery-protocol.ts +7 -0
- package/src/internal/hosted-delivery.ts +107 -24
- package/src/internal/hosted-execution-diag.ts +207 -0
- package/src/internal/http-channel.ts +99 -0
- package/src/internal/init-project.ts +4 -0
- package/src/internal/install-cursor-skills.ts +1 -4
- package/src/internal/logs-client.ts +5 -0
- package/src/internal/managed-delivery.ts +125 -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/otel/collector.ts +30 -0
- package/src/internal/runtime-dispatch-runner.ts +10 -0
- package/src/internal/sdk-runner.ts +56 -8
- package/src/internal/server.ts +61 -9
- package/src/internal/session-engine.ts +723 -60
- package/src/internal/sessions-client.ts +17 -8
- package/src/internal/steering.ts +17 -0
- package/src/internal/storage-coordinator.ts +38 -8
- package/src/internal/storage-roles.ts +7 -0
- package/src/internal/stream-progress.ts +19 -0
- package/src/internal/tool-policy.ts +18 -0
- package/src/internal/trajectory.ts +10 -0
- package/src/internal/turn-outbox.ts +85 -0
- package/src/storage-backends/cursor-hosted.ts +22 -8
- package/src/storage.ts +12 -0
- package/src/types.ts +70 -9
- 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/templates/code-wiki/README.md +34 -0
- package/templates/code-wiki/agent/agent.ts +8 -0
- package/templates/code-wiki/agent/channels/github.ts +144 -0
- package/templates/code-wiki/agent/instructions.md +39 -0
- package/templates/code-wiki/agent/lib/repos.ts +5 -0
- package/templates/code-wiki/agent/lib/wiki.ts +22 -0
- package/templates/code-wiki/agent/tools/apply_wiki.ts +219 -0
- package/templates/code-wiki/evals/evals.config.ts +5 -0
- package/templates/code-wiki/evals/wiki.eval.ts +132 -0
- package/templates/code-wiki/init.json +25 -0
- package/templates/code-wiki/package.json +18 -0
- package/templates/code-wiki/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.oqPawjiD.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.BoHaMdeZ.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/internal/deployment-scm-event-stream.d.ts +0 -116
- package/dist/internal/deployment-scm-event-stream.d.ts.map +0 -1
- package/dist/internal/deployment-scm-event-stream.js +0 -474
- package/dist/playground/assets/index-CF7hUDnQ.css +0 -1
- package/docs/design/agsh.md +0 -406
- package/src/internal/deployment-scm-event-stream.ts +0 -593
- /package/dist/docs/assets/{deployment.md.D9msOFOW.lean.js → deployment.md.MFPKqsqI.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.5zOAbV86.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/{reference_tools.md.BHeXn2id.lean.js → reference_tools.md.B84gw9Ii.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.Ctv3T8C2.lean.js → troubleshooting.md.DCiPBhYs.lean.js} +0 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
11
|
+
import { mkdir, rename, unlink, writeFile } from "node:fs/promises";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { HOSTED_EXECUTION_DIAG_FILENAME } from "./hosted-delivery-protocol.js";
|
|
14
|
+
export const HOSTED_EXECUTION_DIAG_VERSION = 1;
|
|
15
|
+
/** Cap so a runaway message cannot fill the guest disk or the host log. */
|
|
16
|
+
export const HOSTED_EXECUTION_DIAG_MAX_BYTES = 4096;
|
|
17
|
+
/**
|
|
18
|
+
* Correlate the on-disk record with the execution that produced it. One pod
|
|
19
|
+
* serves many deliveries of a continuation session, and the file lives at a
|
|
20
|
+
* single fixed path, so without this the host can read a *previous*
|
|
21
|
+
* delivery's terminal record whenever July never reaches its own write —
|
|
22
|
+
* the 9-minute host POST timeout, a 409 on an expired admission token, or a
|
|
23
|
+
* replayed token that short-circuits on the memoized reply.
|
|
24
|
+
*
|
|
25
|
+
* Derived from the admission token (which both sides already hold) rather
|
|
26
|
+
* than carried on the wire. The digest is one-way, so the token itself never
|
|
27
|
+
* reaches the guest disk or the host logs.
|
|
28
|
+
*/
|
|
29
|
+
export function hostedExecutionDiagId(admissionToken) {
|
|
30
|
+
return createHash("sha256").update(admissionToken).digest("hex").slice(0, 16);
|
|
31
|
+
}
|
|
32
|
+
/** Written before the turn starts so a stalled execution still has a record. */
|
|
33
|
+
export const HOSTED_EXECUTION_DIAG_RUNNING_STATUS = "running";
|
|
34
|
+
const DIAG_KEYS = new Set([
|
|
35
|
+
"v",
|
|
36
|
+
"executionId",
|
|
37
|
+
"writtenAt",
|
|
38
|
+
"sessionPublicId",
|
|
39
|
+
"sessionId",
|
|
40
|
+
"turnStatus",
|
|
41
|
+
"durationMs",
|
|
42
|
+
"message",
|
|
43
|
+
"signalAborted",
|
|
44
|
+
"requestId",
|
|
45
|
+
"abortReason",
|
|
46
|
+
]);
|
|
47
|
+
const ABORT_REASONS = new Set([
|
|
48
|
+
"signal_abort",
|
|
49
|
+
"runner_cancelled",
|
|
50
|
+
"runner_error",
|
|
51
|
+
"execute_throw",
|
|
52
|
+
]);
|
|
53
|
+
function boundedOptionalString(value, max) {
|
|
54
|
+
return typeof value === "string" && value.length > 0
|
|
55
|
+
? value.length > max
|
|
56
|
+
? `${value.slice(0, max)}…`
|
|
57
|
+
: value
|
|
58
|
+
: undefined;
|
|
59
|
+
}
|
|
60
|
+
export function hostedExecutionDiagPath(stateRoot) {
|
|
61
|
+
return join(stateRoot, HOSTED_EXECUTION_DIAG_FILENAME);
|
|
62
|
+
}
|
|
63
|
+
export function abortReasonFromTurnStatus(status, message) {
|
|
64
|
+
if (status === "finished") {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
if (status === "cancelled") {
|
|
68
|
+
return message !== undefined && /abort/i.test(message)
|
|
69
|
+
? "signal_abort"
|
|
70
|
+
: "runner_cancelled";
|
|
71
|
+
}
|
|
72
|
+
return "runner_error";
|
|
73
|
+
}
|
|
74
|
+
export function parseHostedExecutionDiag(raw) {
|
|
75
|
+
if (raw.length === 0 || raw.length > HOSTED_EXECUTION_DIAG_MAX_BYTES) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
let parsed;
|
|
79
|
+
try {
|
|
80
|
+
parsed = JSON.parse(raw);
|
|
81
|
+
}
|
|
82
|
+
catch (_a) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
const body = parsed;
|
|
89
|
+
if (Object.keys(body).some((key) => !DIAG_KEYS.has(key))) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
if (body.v !== HOSTED_EXECUTION_DIAG_VERSION ||
|
|
93
|
+
typeof body.executionId !== "string" ||
|
|
94
|
+
body.executionId.length === 0 ||
|
|
95
|
+
body.executionId.length > 64 ||
|
|
96
|
+
typeof body.writtenAt !== "string" ||
|
|
97
|
+
body.writtenAt.length === 0 ||
|
|
98
|
+
body.writtenAt.length > 64 ||
|
|
99
|
+
typeof body.sessionPublicId !== "string" ||
|
|
100
|
+
body.sessionPublicId.length === 0 ||
|
|
101
|
+
body.sessionPublicId.length > 128 ||
|
|
102
|
+
typeof body.sessionId !== "string" ||
|
|
103
|
+
body.sessionId.length > 128 ||
|
|
104
|
+
typeof body.turnStatus !== "string" ||
|
|
105
|
+
body.turnStatus.length === 0 ||
|
|
106
|
+
body.turnStatus.length > 64 ||
|
|
107
|
+
typeof body.durationMs !== "number" ||
|
|
108
|
+
!Number.isFinite(body.durationMs) ||
|
|
109
|
+
body.durationMs < 0) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const message = boundedOptionalString(body.message, 1024);
|
|
113
|
+
const requestId = boundedOptionalString(body.requestId, 128);
|
|
114
|
+
const abortReason = body.abortReason === undefined
|
|
115
|
+
? undefined
|
|
116
|
+
: typeof body.abortReason === "string" &&
|
|
117
|
+
ABORT_REASONS.has(body.abortReason)
|
|
118
|
+
? body.abortReason
|
|
119
|
+
: undefined;
|
|
120
|
+
if (body.abortReason !== undefined && abortReason === undefined) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
if (body.signalAborted !== undefined &&
|
|
124
|
+
typeof body.signalAborted !== "boolean") {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
return Object.assign(Object.assign(Object.assign(Object.assign({ v: HOSTED_EXECUTION_DIAG_VERSION, executionId: body.executionId, writtenAt: body.writtenAt, sessionPublicId: body.sessionPublicId, sessionId: body.sessionId, turnStatus: body.turnStatus, durationMs: body.durationMs }, (message === undefined ? {} : { message })), (body.signalAborted === true ? { signalAborted: true } : {})), (requestId === undefined ? {} : { requestId })), (abortReason === undefined ? {} : { abortReason }));
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Overwrite the per-execution diag file. Soft-fail: a write error must not
|
|
131
|
+
* change the hosted-execution HTTP reply.
|
|
132
|
+
*/
|
|
133
|
+
export function writeHostedExecutionDiag(stateRoot, diag) {
|
|
134
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
const path = hostedExecutionDiagPath(stateRoot);
|
|
136
|
+
const tmp = `${path}.${randomBytes(8).toString("hex")}.tmp`;
|
|
137
|
+
try {
|
|
138
|
+
yield mkdir(stateRoot, { recursive: true });
|
|
139
|
+
const serialized = JSON.stringify(diag);
|
|
140
|
+
const body = serialized.length > HOSTED_EXECUTION_DIAG_MAX_BYTES
|
|
141
|
+
? JSON.stringify(Object.assign(Object.assign({}, diag), { message: boundedOptionalString(diag.message, 256) }))
|
|
142
|
+
: serialized;
|
|
143
|
+
yield writeFile(tmp, body, "utf8");
|
|
144
|
+
yield rename(tmp, path);
|
|
145
|
+
}
|
|
146
|
+
catch (_a) {
|
|
147
|
+
yield unlink(tmp).catch(() => undefined);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CAmfhB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AAoGD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
|
|
@@ -22,7 +22,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
22
22
|
import { samePrincipal } from "./auth.js";
|
|
23
23
|
import { formatContinuationToken, parseContinuationToken } from "./ids.js";
|
|
24
24
|
import { isLoopbackAddress } from "./net.js";
|
|
25
|
-
import { ApprovalInterruptedError, ApprovalNotFoundError, HTTP_CHANNEL_ID, SessionAuthError, } from "./session-engine.js";
|
|
25
|
+
import { ApprovalInterruptedError, ApprovalNotFoundError, AuthInterruptedError, AuthNotFoundError, HTTP_CHANNEL_ID, SessionAuthError, } from "./session-engine.js";
|
|
26
26
|
import { eventsUrlForSession, playgroundUrlForSession, } from "./session-urls.js";
|
|
27
27
|
const SESSION_ID_HEADER = "x-agent-serve-session-id";
|
|
28
28
|
export function buildHttpChannelRoutes(args) {
|
|
@@ -324,6 +324,84 @@ export function buildHttpChannelRoutes(args) {
|
|
|
324
324
|
return jsonResponse({ ok: true, interrupted }, { headers: { [SESSION_ID_HEADER]: sessionId } });
|
|
325
325
|
}),
|
|
326
326
|
};
|
|
327
|
+
const listAuths = {
|
|
328
|
+
method: "GET",
|
|
329
|
+
pattern: `${base}/v1/session/:sessionId/auths`,
|
|
330
|
+
auth,
|
|
331
|
+
handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
332
|
+
var _a;
|
|
333
|
+
const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
|
|
334
|
+
const record = yield engine.getOrRestoreSession(sessionId);
|
|
335
|
+
if (record === undefined) {
|
|
336
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
337
|
+
}
|
|
338
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
339
|
+
relax: relaxSessionReadAuth,
|
|
340
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
341
|
+
requestIp: ctx.requestIp,
|
|
342
|
+
});
|
|
343
|
+
if (ownership !== undefined) {
|
|
344
|
+
return ownership;
|
|
345
|
+
}
|
|
346
|
+
const pending = yield engine.listPendingAuths(sessionId);
|
|
347
|
+
return jsonResponse({ ok: true, sessionId, pending });
|
|
348
|
+
}),
|
|
349
|
+
};
|
|
350
|
+
const resolveAuth = {
|
|
351
|
+
method: "POST",
|
|
352
|
+
pattern: `${base}/v1/session/:sessionId/auths/:callId`,
|
|
353
|
+
auth,
|
|
354
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
355
|
+
var _a;
|
|
356
|
+
var _b, _c;
|
|
357
|
+
const sessionId = (_b = ctx.params.sessionId) !== null && _b !== void 0 ? _b : "";
|
|
358
|
+
const callId = (_c = ctx.params.callId) !== null && _c !== void 0 ? _c : "";
|
|
359
|
+
const record = yield engine.getOrRestoreSession(sessionId);
|
|
360
|
+
if (record === undefined) {
|
|
361
|
+
return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
|
|
362
|
+
}
|
|
363
|
+
const bridgeSlackAuth = relaxSessionApprovalAuth === true &&
|
|
364
|
+
((_a = record.auth) === null || _a === void 0 ? void 0 : _a.authenticator) === "slack" &&
|
|
365
|
+
(relaxSessionReadAuthBeyondLoopback === true ||
|
|
366
|
+
(typeof ctx.requestIp === "string" &&
|
|
367
|
+
isLoopbackAddress(ctx.requestIp)));
|
|
368
|
+
const ownership = requireSessionOwner(record, ctx.auth, {
|
|
369
|
+
relax: bridgeSlackAuth,
|
|
370
|
+
beyondLoopback: relaxSessionReadAuthBeyondLoopback,
|
|
371
|
+
requestIp: ctx.requestIp,
|
|
372
|
+
});
|
|
373
|
+
if (ownership !== undefined) {
|
|
374
|
+
return ownership;
|
|
375
|
+
}
|
|
376
|
+
const body = yield readJsonObject(request);
|
|
377
|
+
const decision = body === null || body === void 0 ? void 0 : body.decision;
|
|
378
|
+
if (decision !== "approve" && decision !== "deny") {
|
|
379
|
+
return errorResponse(400, "invalid_request", 'Expected a JSON body with `decision`: "approve" | "deny".');
|
|
380
|
+
}
|
|
381
|
+
try {
|
|
382
|
+
const pending = yield engine.resolveAuth(sessionId, callId, decision, ctx.auth, bridgeSlackAuth ? { asSessionOwner: true } : undefined);
|
|
383
|
+
return jsonResponse({
|
|
384
|
+
ok: true,
|
|
385
|
+
sessionId,
|
|
386
|
+
callId,
|
|
387
|
+
decision,
|
|
388
|
+
connection: pending.connection,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
if (error instanceof AuthNotFoundError) {
|
|
393
|
+
return errorResponse(404, "auth_not_found", error.message);
|
|
394
|
+
}
|
|
395
|
+
if (error instanceof AuthInterruptedError) {
|
|
396
|
+
return errorResponse(409, "auth_interrupted", error.message);
|
|
397
|
+
}
|
|
398
|
+
if (error instanceof SessionAuthError) {
|
|
399
|
+
return errorResponse(403, "forbidden", error.message);
|
|
400
|
+
}
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}),
|
|
404
|
+
};
|
|
327
405
|
return [
|
|
328
406
|
createSession,
|
|
329
407
|
followUp,
|
|
@@ -333,6 +411,8 @@ export function buildHttpChannelRoutes(args) {
|
|
|
333
411
|
cost,
|
|
334
412
|
listApprovals,
|
|
335
413
|
resolveApproval,
|
|
414
|
+
listAuths,
|
|
415
|
+
resolveAuth,
|
|
336
416
|
];
|
|
337
417
|
}
|
|
338
418
|
export function requireSessionOwner(record, caller, options) {
|
|
@@ -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":"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;AAmBD,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAyBhE;AAWD,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,eAAe,CAgCjB;AAUD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CA6E5B;AAwDD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhD;AAWD,MAAM,WAAW,kCAAkC;IACjD;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;KAC3B,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,kCAAuC,GAC/C,OAAO,CAAC,iCAAiC,CAAC,CAW5C;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;KAC3B,KAAK,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,gEAAgE;IAChE,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,MAAM,KACZ,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAgChC;AAwHD,MAAM,WAAW,0BAA0B;IACzC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,0BAA0B,GACzD,oBAAoB,CAAC;AAMvB;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,0BAA0B,GAClC,MAAM,CAkBR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAgBzE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAErE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAQpB;AA8BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,GAAG,MAAM,EAAE,CAEX;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAmCrC"}
|
|
@@ -22,6 +22,8 @@ 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" },
|
|
26
|
+
"code-wiki": { dir: "code-wiki" },
|
|
25
27
|
demo: { dir: "demo" },
|
|
26
28
|
"pr-autofixer": { dir: "pr-autofixer" },
|
|
27
29
|
"security-help": { dir: "security-help" },
|
|
@@ -497,6 +499,8 @@ export function printInitGuide() {
|
|
|
497
499
|
Scaffold a project, then open the playground:
|
|
498
500
|
npx ${PACKAGE_NAME} init ./my-agent # installs deps + links agent-sdk onto PATH
|
|
499
501
|
npx ${PACKAGE_NAME} init ./my-demo --template demo # record a PR walkthrough
|
|
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
|
|
500
504
|
npx ${PACKAGE_NAME} init ./my-reviewer --template security-reviewer # review PRs for security bugs
|
|
501
505
|
npx ${PACKAGE_NAME} init ./security-help --template security-help # answer security questions in Slack
|
|
502
506
|
npx ${PACKAGE_NAME} init ./my-triage --template triage-linear # comment on Linear issues
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,8 +28,6 @@ import { join } from "node:path";
|
|
|
28
28
|
import { CLI_COMMAND_NAME, packageRootDir } from "./distribution.js";
|
|
29
29
|
import { parseFrontmatter } from "./frontmatter.js";
|
|
30
30
|
import { stdoutPalette } from "./terminal-style.js";
|
|
31
|
-
/** Monorepo-only skill; excluded from the published package. */
|
|
32
|
-
const SKIP_SKILL_DIRS = new Set(["operate"]);
|
|
33
31
|
/** Category folder under ~/.cursor/skills (Cursor discovers nested skills). */
|
|
34
32
|
export const CURSOR_SKILLS_NAMESPACE = "agentsdk";
|
|
35
33
|
/** Pre-rename install folder. Install deletes this so `/agentkit-*` rows disappear. */
|
|
@@ -91,7 +89,7 @@ export function listShippedPackageSkills() {
|
|
|
91
89
|
}
|
|
92
90
|
const skills = [];
|
|
93
91
|
for (const entry of entries) {
|
|
94
|
-
if (!entry.isDirectory()
|
|
92
|
+
if (!entry.isDirectory()) {
|
|
95
93
|
continue;
|
|
96
94
|
}
|
|
97
95
|
const sourceDir = join(skillsRoot, entry.name);
|
|
@@ -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":"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;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GAAG,MAAM,CAiBT;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,YAAY,CAAC,CA0BxB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC7B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC5E"}
|
|
@@ -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 &&
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envelope-carried installation config for managed-product deliveries
|
|
3
|
+
* (plan 0002 Stack H1; envelope shape from Stack B1).
|
|
4
|
+
*
|
|
5
|
+
* On the v2 architecture a managed product (security-reviewer, …) is many
|
|
6
|
+
* single-tenant deployments: the pre-signal trigger gate matches the
|
|
7
|
+
* customer's automation trigger before a workflow starts and stamps the
|
|
8
|
+
* matched automation uuid + an opaque installation-config reference on the
|
|
9
|
+
* attributed session envelope. The delivery activity forwards the matched
|
|
10
|
+
* installation-config document to the fork **inside the webhook payload it
|
|
11
|
+
* POSTs to the channel**, under {@link MANAGED_DELIVERY_PAYLOAD_KEY} — the
|
|
12
|
+
* same embed-in-payload pattern the legacy deployment event stream used
|
|
13
|
+
* for its source marker.
|
|
14
|
+
*
|
|
15
|
+
* This module is the one contract both sides share: the control-plane
|
|
16
|
+
* delivery path embeds with {@link withManagedDeliveryConfig}; the agent's
|
|
17
|
+
* channels detect and read with {@link parseManagedDeliveryConfig}. The
|
|
18
|
+
* document mirrors the sync layer's `ManagedAutomationConfigDoc` **policy**
|
|
19
|
+
* fields that "ride the delivery envelope to the fork" (posting mode,
|
|
20
|
+
* managed config, trigger snapshots for the channel's staleness guard);
|
|
21
|
+
* readers ignore unknown fields so a newer sync can add material without
|
|
22
|
+
* breaking older forks. The automation's MCP server refs deliberately do
|
|
23
|
+
* NOT ride here: they travel on the hosted-admission envelope's
|
|
24
|
+
* `managedAutomation` slice (plan 0002 G2, `hosted-delivery-protocol.ts` /
|
|
25
|
+
* `hosted-managed-automation.ts`) so one mechanism owns MCP attach.
|
|
26
|
+
*
|
|
27
|
+
* INTERNAL: first-party host plumbing shared by agents in `factory/*`,
|
|
28
|
+
* consumed via relative source imports. Deliberately excluded from the
|
|
29
|
+
* published `@cursor/july` npm package (see the `files` whitelist).
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Key inside the delivered webhook payload under which the delivery
|
|
33
|
+
* activity embeds the matched installation config. Chosen to never
|
|
34
|
+
* collide with a provider webhook field (GitHub and Origin payloads have
|
|
35
|
+
* no `cursor*` keys).
|
|
36
|
+
*/
|
|
37
|
+
export declare const MANAGED_DELIVERY_PAYLOAD_KEY: "cursorManagedDelivery";
|
|
38
|
+
/**
|
|
39
|
+
* The matched installation-config document as it rides the delivery to
|
|
40
|
+
* the fork. Required: the matched automation uuid (B1 attribution).
|
|
41
|
+
* Everything else is optional; absent fields keep the channel's default
|
|
42
|
+
* posture (post, all modules enabled, no staleness guard).
|
|
43
|
+
*/
|
|
44
|
+
export interface ManagedDeliveryInstallationConfig {
|
|
45
|
+
/** Source managed automation uuid the pre-signal gate matched. */
|
|
46
|
+
matchedAutomationUuid: string;
|
|
47
|
+
/** Opaque `<installationId>@<resourceVersion>` config reference. */
|
|
48
|
+
installationConfigRef?: string;
|
|
49
|
+
managedType?: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Whether product output (PR comments, …) posts for this installation,
|
|
53
|
+
* or the run stays check/shadow-only. Channels post only on `"post"`
|
|
54
|
+
* (or when the field is absent) — any other value fails closed to
|
|
55
|
+
* shadow, so a newer mode name never posts by accident.
|
|
56
|
+
*/
|
|
57
|
+
postingMode?: string;
|
|
58
|
+
managedConfig?: Record<string, unknown>;
|
|
59
|
+
/**
|
|
60
|
+
* The automation's git triggers as `GitTrigger.toJson()` snapshots.
|
|
61
|
+
* The channel re-checks the delivery against them (staleness guard:
|
|
62
|
+
* the config may have changed between admission and delivery).
|
|
63
|
+
*/
|
|
64
|
+
triggerSnapshots?: unknown[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Read the embedded installation config out of a delivered webhook
|
|
68
|
+
* payload. Returns undefined for payloads without the key (legacy
|
|
69
|
+
* deliveries, host relay, fixtures) and for documents missing the
|
|
70
|
+
* required matched automation uuid — the channel then runs its legacy
|
|
71
|
+
* path unchanged. Malformed optional fields are dropped, not fatal.
|
|
72
|
+
*/
|
|
73
|
+
export declare function parseManagedDeliveryConfig(payload: unknown): ManagedDeliveryInstallationConfig | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Embed one matched installation config into the webhook payload the
|
|
76
|
+
* delivery activity POSTs to the channel. Pure; used by the control-plane
|
|
77
|
+
* delivery path and by channel tests building fixture envelopes.
|
|
78
|
+
*/
|
|
79
|
+
export declare function withManagedDeliveryConfig(payload: Record<string, unknown>, config: ManagedDeliveryInstallationConfig): Record<string, unknown>;
|
|
80
|
+
//# sourceMappingURL=managed-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-delivery.d.ts","sourceRoot":"","sources":["../../src/internal/managed-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,EAAG,uBAAgC,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,WAAW,iCAAiC;IAChD,kEAAkE;IAClE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;CAC9B;AAcD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,GACf,iCAAiC,GAAG,SAAS,CAuB/C;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,iCAAiC,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envelope-carried installation config for managed-product deliveries
|
|
3
|
+
* (plan 0002 Stack H1; envelope shape from Stack B1).
|
|
4
|
+
*
|
|
5
|
+
* On the v2 architecture a managed product (security-reviewer, …) is many
|
|
6
|
+
* single-tenant deployments: the pre-signal trigger gate matches the
|
|
7
|
+
* customer's automation trigger before a workflow starts and stamps the
|
|
8
|
+
* matched automation uuid + an opaque installation-config reference on the
|
|
9
|
+
* attributed session envelope. The delivery activity forwards the matched
|
|
10
|
+
* installation-config document to the fork **inside the webhook payload it
|
|
11
|
+
* POSTs to the channel**, under {@link MANAGED_DELIVERY_PAYLOAD_KEY} — the
|
|
12
|
+
* same embed-in-payload pattern the legacy deployment event stream used
|
|
13
|
+
* for its source marker.
|
|
14
|
+
*
|
|
15
|
+
* This module is the one contract both sides share: the control-plane
|
|
16
|
+
* delivery path embeds with {@link withManagedDeliveryConfig}; the agent's
|
|
17
|
+
* channels detect and read with {@link parseManagedDeliveryConfig}. The
|
|
18
|
+
* document mirrors the sync layer's `ManagedAutomationConfigDoc` **policy**
|
|
19
|
+
* fields that "ride the delivery envelope to the fork" (posting mode,
|
|
20
|
+
* managed config, trigger snapshots for the channel's staleness guard);
|
|
21
|
+
* readers ignore unknown fields so a newer sync can add material without
|
|
22
|
+
* breaking older forks. The automation's MCP server refs deliberately do
|
|
23
|
+
* NOT ride here: they travel on the hosted-admission envelope's
|
|
24
|
+
* `managedAutomation` slice (plan 0002 G2, `hosted-delivery-protocol.ts` /
|
|
25
|
+
* `hosted-managed-automation.ts`) so one mechanism owns MCP attach.
|
|
26
|
+
*
|
|
27
|
+
* INTERNAL: first-party host plumbing shared by agents in `factory/*`,
|
|
28
|
+
* consumed via relative source imports. Deliberately excluded from the
|
|
29
|
+
* published `@cursor/july` npm package (see the `files` whitelist).
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Key inside the delivered webhook payload under which the delivery
|
|
33
|
+
* activity embeds the matched installation config. Chosen to never
|
|
34
|
+
* collide with a provider webhook field (GitHub and Origin payloads have
|
|
35
|
+
* no `cursor*` keys).
|
|
36
|
+
*/
|
|
37
|
+
export const MANAGED_DELIVERY_PAYLOAD_KEY = "cursorManagedDelivery";
|
|
38
|
+
function isRecord(value) {
|
|
39
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
40
|
+
}
|
|
41
|
+
function nonEmptyString(value) {
|
|
42
|
+
if (typeof value !== "string") {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const trimmed = value.trim();
|
|
46
|
+
return trimmed === "" ? undefined : trimmed;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Read the embedded installation config out of a delivered webhook
|
|
50
|
+
* payload. Returns undefined for payloads without the key (legacy
|
|
51
|
+
* deliveries, host relay, fixtures) and for documents missing the
|
|
52
|
+
* required matched automation uuid — the channel then runs its legacy
|
|
53
|
+
* path unchanged. Malformed optional fields are dropped, not fatal.
|
|
54
|
+
*/
|
|
55
|
+
export function parseManagedDeliveryConfig(payload) {
|
|
56
|
+
if (!isRecord(payload)) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const doc = payload[MANAGED_DELIVERY_PAYLOAD_KEY];
|
|
60
|
+
if (!isRecord(doc)) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const matchedAutomationUuid = nonEmptyString(doc.matchedAutomationUuid);
|
|
64
|
+
if (matchedAutomationUuid === undefined) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
matchedAutomationUuid,
|
|
69
|
+
installationConfigRef: nonEmptyString(doc.installationConfigRef),
|
|
70
|
+
managedType: nonEmptyString(doc.managedType),
|
|
71
|
+
name: nonEmptyString(doc.name),
|
|
72
|
+
postingMode: nonEmptyString(doc.postingMode),
|
|
73
|
+
managedConfig: isRecord(doc.managedConfig) ? doc.managedConfig : undefined,
|
|
74
|
+
triggerSnapshots: Array.isArray(doc.triggerSnapshots)
|
|
75
|
+
? doc.triggerSnapshots
|
|
76
|
+
: undefined,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Embed one matched installation config into the webhook payload the
|
|
81
|
+
* delivery activity POSTs to the channel. Pure; used by the control-plane
|
|
82
|
+
* delivery path and by channel tests building fixture envelopes.
|
|
83
|
+
*/
|
|
84
|
+
export function withManagedDeliveryConfig(payload, config) {
|
|
85
|
+
return Object.assign(Object.assign({}, payload), { [MANAGED_DELIVERY_PAYLOAD_KEY]: config });
|
|
86
|
+
}
|
|
@@ -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"}
|