@cursor/july 0.1.100 → 0.1.102
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/README.md +27 -0
- package/dist/bin/agent-serve.js +3 -2
- package/dist/channels/deployments/deployments-channel.d.ts +41 -5
- package/dist/channels/deployments/deployments-channel.d.ts.map +1 -1
- package/dist/channels/deployments/deployments-channel.js +88 -8
- package/dist/channels/deployments/types.d.ts +4 -3
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/origin/defaults.d.ts +43 -0
- package/dist/channels/origin/defaults.d.ts.map +1 -0
- package/dist/channels/origin/defaults.js +111 -0
- package/dist/channels/origin/index.d.ts +2 -0
- package/dist/channels/origin/index.d.ts.map +1 -1
- package/dist/channels/origin/index.js +2 -0
- package/dist/channels/origin/origin-channel.d.ts +2 -1
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +24 -3
- package/dist/channels/origin/state.d.ts +32 -0
- package/dist/channels/origin/state.d.ts.map +1 -0
- package/dist/channels/origin/state.js +23 -0
- package/dist/channels/origin/types.d.ts +23 -1
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/api.d.ts +1 -1
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +5 -2
- package/dist/channels/slack/assistant.d.ts +1 -1
- package/dist/channels/slack/assistant.d.ts.map +1 -1
- package/dist/channels/slack/code-fences.d.ts +17 -0
- package/dist/channels/slack/code-fences.d.ts.map +1 -0
- package/dist/channels/slack/code-fences.js +168 -0
- package/dist/channels/slack/dispatch.d.ts +3 -2
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +28 -8
- 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 +28 -0
- package/dist/channels/slack/index.d.ts +1 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +1 -0
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +11 -4
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +2 -1
- package/dist/connections.d.ts +18 -2
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +18 -2
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.DZ1e0Ycq.js → app.CLA03RCz.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.l8omwc6D.js → VPLocalSearchBox.ifxv-cJV.js} +1 -1
- package/dist/docs/assets/chunks/{theme.JVcD6gel.js → theme.DWCwM6p-.js} +2 -2
- package/dist/docs/assets/concepts.md.rPzW2HZN.js +1 -0
- package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.js +9 -0
- package/dist/docs/assets/guides_cloud-agents.md.DumwWXba.lean.js +1 -0
- package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.js → guides_cloud-runtime.md.BRirbRAN.js} +1 -1
- package/dist/docs/assets/index.md.Kiht7ell.js +5 -0
- package/dist/docs/assets/{index.md.Bb4k8kUm.lean.js → index.md.Kiht7ell.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BiGoBAk2.js → reference_connections.md.Di6jJAXF.js} +12 -2
- package/dist/docs/assets/{reference_connections.md.BiGoBAk2.lean.js → reference_connections.md.Di6jJAXF.lean.js} +1 -1
- package/dist/docs/assets/reference_extensions.md.9WQMZe1l.js +56 -0
- package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +1 -0
- package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.js → reference_http-api.md.oySXBO8o.js} +1 -1
- package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.js → reference_project-layout.md.CA6QP6Lw.js} +2 -2
- package/dist/docs/assets/{reference_project-layout.md.Bv4KOtlB.lean.js → reference_project-layout.md.CA6QP6Lw.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.BFW9retM.js → reference_skills.md.l2ezAcaN.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.CvAHsdSp.js → reference_tools.md.B1up2r9W.js} +1 -1
- package/dist/docs/assets/skills_framework-map.md.DDa4MeEW.js +1 -0
- package/dist/docs/assets/{skills_framework-map.md.BTi817yv.lean.js → skills_framework-map.md.DDa4MeEW.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +5 -5
- package/dist/docs/concepts.md +3 -3
- package/dist/docs/deployment.html +4 -4
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-agents.html +35 -0
- package/dist/docs/guides/cloud-agents.md +93 -0
- package/dist/docs/guides/cloud-runtime.html +6 -6
- package/dist/docs/guides/cloud-runtime.md +2 -0
- 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 +4 -4
- package/dist/docs/guides/opentelemetry.html +5 -5
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +5 -1
- package/dist/docs/llms-full.txt +353 -5
- package/dist/docs/llms.txt +2 -0
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +5 -5
- package/dist/docs/reference/cli.html +4 -4
- package/dist/docs/reference/connections.html +16 -6
- package/dist/docs/reference/connections.md +31 -0
- package/dist/docs/reference/extensions.html +82 -0
- package/dist/docs/reference/extensions.md +200 -0
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/http-api.md +1 -1
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +6 -6
- package/dist/docs/reference/project-layout.md +3 -0
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +6 -6
- package/dist/docs/reference/skills.md +2 -0
- package/dist/docs/reference/subagents.html +5 -5
- package/dist/docs/reference/tools.html +6 -6
- package/dist/docs/reference/tools.md +2 -0
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/skills/ab.html +4 -4
- package/dist/docs/skills/create-agent.html +4 -4
- package/dist/docs/skills/debug.html +4 -4
- package/dist/docs/skills/evals.html +4 -4
- package/dist/docs/skills/framework-map.html +5 -5
- package/dist/docs/skills/framework-map.md +1 -0
- package/dist/docs/skills/github.html +4 -4
- package/dist/docs/skills/hillclimb.html +4 -4
- package/dist/docs/skills/index.html +4 -4
- package/dist/docs/skills/mcp-auth.html +4 -4
- package/dist/docs/skills/otel.html +4 -4
- package/dist/docs/skills/setup-slack.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +4 -4
- package/dist/docs/templates/code-wiki.html +4 -4
- package/dist/docs/templates/demo.html +4 -4
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +4 -4
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/extensions/cursor-cloud-agents/extension.d.ts +57 -0
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/extension.js +66 -0
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +78 -0
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +286 -0
- package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts +25 -0
- package/dist/extensions/cursor-cloud-agents/lib/fleet.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +85 -0
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +5 -0
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/inputs.js +4 -0
- package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts +15 -0
- package/dist/extensions/cursor-cloud-agents/lib/repos.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +55 -0
- package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts +8 -0
- package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +15 -0
- package/dist/extensions/cursor-cloud-agents/skills/handoff.md +41 -0
- package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts +4 -0
- package/dist/extensions/cursor-cloud-agents/tools/cancel.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +26 -0
- package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts +4 -0
- package/dist/extensions/cursor-cloud-agents/tools/dump.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +54 -0
- package/dist/extensions/cursor-cloud-agents/tools/get.d.ts +4 -0
- package/dist/extensions/cursor-cloud-agents/tools/get.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/tools/get.js +25 -0
- package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts +4 -0
- package/dist/extensions/cursor-cloud-agents/tools/launch.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +59 -0
- package/dist/extensions/cursor-cloud-agents/tools/list.d.ts +4 -0
- package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/tools/list.js +36 -0
- package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts +4 -0
- package/dist/extensions/cursor-cloud-agents/tools/reply.d.ts.map +1 -0
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +35 -0
- package/dist/extensions.d.ts +73 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +112 -0
- package/dist/files-backends/cursor-hosted.d.ts +0 -8
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +1 -11
- package/dist/files.d.ts +5 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +22 -18
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/internal/advertise-tools.d.ts +4 -1
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +20 -1
- package/dist/internal/as-of.d.ts +18 -0
- package/dist/internal/as-of.d.ts.map +1 -1
- package/dist/internal/as-of.js +131 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +64 -19
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +3 -1
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +13 -15
- package/dist/internal/cursor/backend-client.d.ts +8 -1
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +25 -9
- package/dist/internal/cursor/hosted-deployment-secrets.d.ts +16 -0
- package/dist/internal/cursor/hosted-deployment-secrets.d.ts.map +1 -0
- package/dist/internal/cursor/hosted-deployment-secrets.js +61 -0
- package/dist/internal/cursor/hosted-store-secrets.d.ts +11 -0
- package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +15 -0
- package/dist/internal/cursor-deployment-relay.d.ts +15 -1
- package/dist/internal/cursor-deployment-relay.d.ts.map +1 -1
- package/dist/internal/cursor-deployment-relay.js +46 -7
- package/dist/internal/deploy-client.d.ts +23 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +54 -12
- package/dist/internal/discovery/ab.d.ts +9 -0
- package/dist/internal/discovery/ab.d.ts.map +1 -0
- package/dist/internal/discovery/ab.js +101 -0
- package/dist/internal/discovery/agent-config.d.ts +35 -0
- package/dist/internal/discovery/agent-config.d.ts.map +1 -0
- package/dist/internal/discovery/agent-config.js +173 -0
- package/dist/internal/discovery/agent.d.ts +11 -0
- package/dist/internal/discovery/agent.d.ts.map +1 -0
- package/dist/internal/discovery/agent.js +306 -0
- package/dist/internal/discovery/channels.d.ts +10 -0
- package/dist/internal/discovery/channels.d.ts.map +1 -0
- package/dist/internal/discovery/channels.js +97 -0
- package/dist/internal/discovery/connections.d.ts +17 -0
- package/dist/internal/discovery/connections.d.ts.map +1 -0
- package/dist/internal/discovery/connections.js +436 -0
- package/dist/internal/discovery/context.d.ts +20 -0
- package/dist/internal/discovery/context.d.ts.map +1 -0
- package/dist/internal/discovery/context.js +30 -0
- package/dist/internal/discovery/cursor-plugin.d.ts +25 -0
- package/dist/internal/discovery/cursor-plugin.d.ts.map +1 -0
- package/dist/internal/discovery/cursor-plugin.js +570 -0
- package/dist/internal/discovery/extensions.d.ts +19 -0
- package/dist/internal/discovery/extensions.d.ts.map +1 -0
- package/dist/internal/discovery/extensions.js +238 -0
- package/dist/internal/discovery/fs.d.ts +15 -0
- package/dist/internal/discovery/fs.d.ts.map +1 -0
- package/dist/internal/discovery/fs.js +115 -0
- package/dist/internal/discovery/hooks.d.ts +7 -0
- package/dist/internal/discovery/hooks.d.ts.map +1 -0
- package/dist/internal/discovery/hooks.js +48 -0
- package/dist/internal/discovery/info.d.ts +6 -0
- package/dist/internal/discovery/info.d.ts.map +1 -0
- package/dist/internal/discovery/info.js +141 -0
- package/dist/internal/discovery/instructions.d.ts +7 -0
- package/dist/internal/discovery/instructions.d.ts.map +1 -0
- package/dist/internal/discovery/instructions.js +95 -0
- package/dist/internal/discovery/modules.d.ts +20 -0
- package/dist/internal/discovery/modules.d.ts.map +1 -0
- package/dist/internal/discovery/modules.js +101 -0
- package/dist/internal/discovery/names.d.ts +12 -0
- package/dist/internal/discovery/names.d.ts.map +1 -0
- package/dist/internal/discovery/names.js +36 -0
- package/dist/internal/discovery/project.d.ts +53 -0
- package/dist/internal/discovery/project.d.ts.map +1 -0
- package/dist/internal/discovery/project.js +239 -0
- package/dist/internal/discovery/runtime.d.ts +34 -0
- package/dist/internal/discovery/runtime.d.ts.map +1 -0
- package/dist/internal/discovery/runtime.js +98 -0
- package/dist/internal/discovery/schedules.d.ts +7 -0
- package/dist/internal/discovery/schedules.d.ts.map +1 -0
- package/dist/internal/discovery/schedules.js +97 -0
- package/dist/internal/discovery/seed-files.d.ts +7 -0
- package/dist/internal/discovery/seed-files.d.ts.map +1 -0
- package/dist/internal/discovery/seed-files.js +41 -0
- package/dist/internal/discovery/services.d.ts +17 -0
- package/dist/internal/discovery/services.d.ts.map +1 -0
- package/dist/internal/discovery/services.js +104 -0
- package/dist/internal/discovery/skills.d.ts +16 -0
- package/dist/internal/discovery/skills.d.ts.map +1 -0
- package/dist/internal/discovery/skills.js +151 -0
- package/dist/internal/discovery/subagent.d.ts +13 -0
- package/dist/internal/discovery/subagent.d.ts.map +1 -0
- package/dist/internal/discovery/subagent.js +19 -0
- package/dist/internal/discovery/tools.d.ts +18 -0
- package/dist/internal/discovery/tools.d.ts.map +1 -0
- package/dist/internal/discovery/tools.js +159 -0
- package/dist/internal/discovery.d.ts +8 -62
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +8 -2210
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +5 -0
- package/dist/internal/framework-file-storage.d.ts +3 -3
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +38 -9
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +8 -7
- package/dist/internal/frontmatter.d.ts +11 -3
- package/dist/internal/frontmatter.d.ts.map +1 -1
- package/dist/internal/frontmatter.js +29 -3
- package/dist/internal/hosted-delivery.d.ts +3 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +19 -32
- package/dist/internal/hosted-execution-diag.d.ts +5 -0
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
- package/dist/internal/hosted-execution-diag.js +5 -0
- package/dist/internal/hosted-execution-flush.d.ts +46 -0
- package/dist/internal/hosted-execution-flush.d.ts.map +1 -0
- package/dist/internal/hosted-execution-flush.js +81 -0
- package/dist/internal/mcp-endpoint.js +1 -0
- package/dist/internal/mcp-host.d.ts +2 -1
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +66 -29
- package/dist/internal/otel/collector.d.ts +13 -0
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +84 -17
- package/dist/internal/otel/http.d.ts.map +1 -1
- package/dist/internal/otel/http.js +2 -10
- package/dist/internal/otel/mcp.d.ts +16 -0
- package/dist/internal/otel/mcp.d.ts.map +1 -0
- package/dist/internal/otel/mcp.js +68 -0
- package/dist/internal/otel/propagation.d.ts +6 -0
- package/dist/internal/otel/propagation.d.ts.map +1 -0
- package/dist/internal/otel/propagation.js +14 -0
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +2 -0
- package/dist/internal/review-comments.d.ts +1 -1
- package/dist/internal/review-comments.d.ts.map +1 -1
- package/dist/internal/review-comments.js +4 -4
- package/dist/internal/server.d.ts +3 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +79 -104
- package/dist/internal/session-engine.d.ts +14 -7
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +113 -66
- package/dist/internal/session-run-log.d.ts +3 -1
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +14 -14
- package/dist/internal/start-log-store.d.ts +60 -0
- package/dist/internal/start-log-store.d.ts.map +1 -0
- package/dist/internal/start-log-store.js +149 -0
- package/dist/internal/storage-coordinator.d.ts +4 -1
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +15 -13
- package/dist/internal/tool-catalog.d.ts.map +1 -1
- package/dist/internal/tool-catalog.js +9 -6
- package/dist/internal/tool-policy.d.ts +8 -0
- package/dist/internal/tool-policy.d.ts.map +1 -1
- package/dist/internal/tool-policy.js +19 -7
- package/dist/internal/turn-cost.d.ts +14 -0
- package/dist/internal/turn-cost.d.ts.map +1 -1
- package/dist/internal/turn-cost.js +41 -9
- package/dist/internal/v2-hosting.d.ts +22 -0
- package/dist/internal/v2-hosting.d.ts.map +1 -0
- package/dist/internal/v2-hosting.js +23 -0
- package/dist/otel.d.ts +16 -0
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +26 -0
- package/dist/playground/assets/index-B6C9S9nG.css +1 -0
- package/dist/playground/assets/{index-DVs98vPL.js → index-ZqNoT8Ie.js} +45 -45
- package/dist/playground/index.html +2 -2
- package/dist/storage-protocol.d.ts +47 -22
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +90 -54
- package/dist/storage.d.ts +2 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/tools.d.ts +9 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +9 -0
- package/dist/types.d.ts +154 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +29 -1
- package/docs/README.md +5 -1
- package/docs/concepts.md +3 -3
- package/docs/guides/cloud-agents.md +98 -0
- package/docs/guides/cloud-runtime.md +2 -0
- package/docs/reference/connections.md +31 -0
- package/docs/reference/extensions.md +205 -0
- package/docs/reference/http-api.md +1 -1
- package/docs/reference/project-layout.md +3 -0
- package/docs/reference/skills.md +2 -0
- package/docs/reference/tools.md +2 -0
- package/package.json +18 -4
- package/skills/framework-map/SKILL.md +1 -0
- package/src/bin/agent-serve.ts +11 -2
- package/src/channels/deployments/deployments-channel.ts +117 -8
- package/src/channels/deployments/types.ts +4 -3
- package/src/channels/origin/defaults.ts +143 -0
- package/src/channels/origin/index.ts +2 -0
- package/src/channels/origin/origin-channel.ts +37 -1
- package/src/channels/origin/state.ts +54 -0
- package/src/channels/origin/types.ts +24 -0
- package/src/channels/slack/api.ts +6 -3
- package/src/channels/slack/assistant.ts +1 -1
- package/src/channels/slack/code-fences.ts +183 -0
- package/src/channels/slack/dispatch.ts +27 -2
- package/src/channels/slack/inbound.ts +37 -0
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/live-delivery.ts +16 -13
- package/src/channels/slack/manifest.ts +2 -1
- package/src/connections.ts +18 -1
- package/src/extensions/cursor-cloud-agents/extension.ts +120 -0
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +395 -0
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +109 -0
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +5 -0
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +81 -0
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +23 -0
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +41 -0
- package/src/extensions/cursor-cloud-agents/tools/cancel.ts +19 -0
- package/src/extensions/cursor-cloud-agents/tools/dump.ts +51 -0
- package/src/extensions/cursor-cloud-agents/tools/get.ts +18 -0
- package/src/extensions/cursor-cloud-agents/tools/launch.ts +64 -0
- package/src/extensions/cursor-cloud-agents/tools/list.ts +31 -0
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +34 -0
- package/src/extensions.ts +141 -0
- package/src/files-backends/cursor-hosted.ts +1 -17
- package/src/files.ts +43 -34
- package/src/index.ts +11 -0
- package/src/internal/advertise-tools.ts +37 -12
- package/src/internal/as-of.ts +163 -0
- package/src/internal/cli-deploy.ts +86 -23
- package/src/internal/continuation-identity.ts +3 -1
- package/src/internal/conversation-mirror.ts +23 -18
- package/src/internal/cursor/backend-client.ts +32 -10
- package/src/internal/cursor/hosted-deployment-secrets.ts +72 -0
- package/src/internal/cursor/hosted-store-secrets.ts +27 -0
- package/src/internal/cursor-deployment-relay.ts +65 -8
- package/src/internal/deploy-client.ts +73 -18
- package/src/internal/discovery/ab.ts +111 -0
- package/src/internal/discovery/agent-config.ts +222 -0
- package/src/internal/discovery/agent.ts +360 -0
- package/src/internal/discovery/channels.ts +103 -0
- package/src/internal/discovery/connections.ts +540 -0
- package/src/internal/discovery/context.ts +46 -0
- package/src/internal/discovery/cursor-plugin.ts +708 -0
- package/src/internal/discovery/extensions.ts +348 -0
- package/src/internal/discovery/fs.ts +108 -0
- package/src/internal/discovery/hooks.ts +45 -0
- package/src/internal/discovery/info.ts +179 -0
- package/src/internal/discovery/instructions.ts +113 -0
- package/src/internal/discovery/modules.ts +107 -0
- package/src/internal/discovery/names.ts +44 -0
- package/src/internal/discovery/project.ts +270 -0
- package/src/internal/discovery/runtime.ts +159 -0
- package/src/internal/discovery/schedules.ts +94 -0
- package/src/internal/discovery/seed-files.ts +37 -0
- package/src/internal/discovery/services.ts +124 -0
- package/src/internal/discovery/skills.ts +176 -0
- package/src/internal/discovery/subagent.ts +29 -0
- package/src/internal/discovery/tools.ts +182 -0
- package/src/internal/discovery.ts +20 -2724
- package/src/internal/distribution.ts +5 -0
- package/src/internal/framework-file-storage.ts +43 -9
- package/src/internal/framework-storage-selection.ts +9 -9
- package/src/internal/frontmatter.ts +36 -3
- package/src/internal/hosted-delivery.ts +38 -63
- package/src/internal/hosted-execution-diag.ts +6 -0
- package/src/internal/hosted-execution-flush.ts +142 -0
- package/src/internal/mcp-endpoint.ts +1 -0
- package/src/internal/mcp-host.ts +116 -37
- package/src/internal/otel/collector.ts +125 -25
- package/src/internal/otel/http.ts +2 -12
- package/src/internal/otel/mcp.ts +69 -0
- package/src/internal/otel/propagation.ts +17 -0
- package/src/internal/otel/runtime.ts +2 -0
- package/src/internal/review-comments.ts +5 -2
- package/src/internal/server.ts +81 -100
- package/src/internal/session-engine.ts +152 -39
- package/src/internal/session-run-log.ts +18 -16
- package/src/internal/start-log-store.ts +174 -0
- package/src/internal/storage-coordinator.ts +19 -16
- package/src/internal/tool-catalog.ts +9 -6
- package/src/internal/tool-policy.ts +39 -9
- package/src/internal/turn-cost.ts +47 -4
- package/src/internal/v2-hosting.ts +38 -0
- package/src/otel.ts +38 -0
- package/src/storage-protocol.ts +126 -79
- package/src/storage.ts +5 -0
- package/src/tools.ts +18 -0
- package/src/types.ts +213 -14
- package/dist/docs/assets/chunks/@localSearchIndexroot.j70vvPL4.js +0 -1
- package/dist/docs/assets/concepts.md.lwAgBIMI.js +0 -1
- package/dist/docs/assets/index.md.Bb4k8kUm.js +0 -5
- package/dist/docs/assets/skills_framework-map.md.BTi817yv.js +0 -1
- package/dist/playground/assets/index-BszoQDc6.css +0 -1
- /package/dist/docs/assets/{concepts.md.lwAgBIMI.lean.js → concepts.md.rPzW2HZN.lean.js} +0 -0
- /package/dist/docs/assets/{guides_cloud-runtime.md.CkYbjnAX.lean.js → guides_cloud-runtime.md.BRirbRAN.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.BEJx9XVj.lean.js → reference_http-api.md.oySXBO8o.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.BFW9retM.lean.js → reference_skills.md.l2ezAcaN.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.CvAHsdSp.lean.js → reference_tools.md.B1up2r9W.lean.js} +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Cursor cloud agents"
|
|
3
|
+
description: "Let an agent-sdk agent hand coding work to Cursor cloud agents and steer them: mount the extension, pick the repositories it may touch, and decide what needs approval."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cursor cloud agents
|
|
7
|
+
|
|
8
|
+
The `cursor-cloud-agents` extension lets an agent delegate coding work
|
|
9
|
+
to Cursor cloud agents and stay in the conversation while they do it.
|
|
10
|
+
The cloud agents work on real repository checkouts and push branches and
|
|
11
|
+
pull requests; your agent hands off the task, reports back, and answers
|
|
12
|
+
questions in the meantime. A Slack triage agent turns a bug report into
|
|
13
|
+
a PR, a planner fans a refactor out across repositories, a reviewer asks
|
|
14
|
+
a cloud agent to address its own comments.
|
|
15
|
+
|
|
16
|
+
This is different from the [cloud runtime](./cloud-runtime.md). The
|
|
17
|
+
runtime moves *this* agent's turns onto a cloud VM. The extension keeps
|
|
18
|
+
the agent where it is and lets it start *other* cloud agents.
|
|
19
|
+
|
|
20
|
+
## Mount it
|
|
21
|
+
|
|
22
|
+
The extension ships with `@cursor/july`. Mount it with one file.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
// agent/extensions/cloud.ts
|
|
26
|
+
import cursorCloudAgents from "@cursor/july/extensions/cursor-cloud-agents";
|
|
27
|
+
|
|
28
|
+
export default cursorCloudAgents({
|
|
29
|
+
cloud: {
|
|
30
|
+
repos: [{ url: "https://github.com/acme/api", startingRef: "main" }],
|
|
31
|
+
autoCreatePR: true,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Launches run under the host's signed-in account (`agent-sdk login` or
|
|
37
|
+
`CURSOR_API_KEY`) and spend its cloud-agent budget. Name the
|
|
38
|
+
repositories the agent may target, and keep approval on when you can't.
|
|
39
|
+
|
|
40
|
+
Mount it on an agent that runs on the local runtime; that is where
|
|
41
|
+
launches park for approval. On the
|
|
42
|
+
[cloud runtime](./cloud-runtime.md#what-changes-on-cloud) approvals
|
|
43
|
+
don't resolve.
|
|
44
|
+
|
|
45
|
+
## What the agent can do
|
|
46
|
+
|
|
47
|
+
With the extension mounted, the agent can hand off coding work and stay
|
|
48
|
+
in the conversation while it happens:
|
|
49
|
+
|
|
50
|
+
- **Hand off a task.** Launch a cloud agent on one of your repositories,
|
|
51
|
+
or on a pull request, with a self-contained brief. It gets back an
|
|
52
|
+
agent id and a URL to share.
|
|
53
|
+
- **Check on it.** See whether the agent is still running, what it
|
|
54
|
+
produced, and which branches or pull requests it pushed.
|
|
55
|
+
- **Read what was done.** Pull the agent's full conversation into the
|
|
56
|
+
workspace, quote its final report, or trace the exact edits before
|
|
57
|
+
summarizing for a person.
|
|
58
|
+
- **Steer or stop.** Send a follow-up to an agent it launched; it queues
|
|
59
|
+
behind the current run, or interrupts it on request. Cancel a run that
|
|
60
|
+
went sideways.
|
|
61
|
+
- **Keep track.** List the agents launched in this conversation, or
|
|
62
|
+
everything it has launched before.
|
|
63
|
+
|
|
64
|
+
A skill teaches the model when to delegate, how to write a brief a cloud
|
|
65
|
+
agent can act on alone, and how to follow up. Everything the extension
|
|
66
|
+
launches stays bound to whoever launched it: an agent started by another
|
|
67
|
+
user, or outside the extension, is out of reach. That separation is only
|
|
68
|
+
as fine as your host's auth; a shared bearer token or `--allow-anonymous`
|
|
69
|
+
makes every caller one principal, so use
|
|
70
|
+
[authored auth](../reference/channels.md#auth-policies) when callers need
|
|
71
|
+
their own.
|
|
72
|
+
|
|
73
|
+
## Configure it
|
|
74
|
+
|
|
75
|
+
| Option | What it controls |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| `cloud` | Launch defaults, in the same shape as the agent's own [cloud options](../reference/agent-config.md#cloud-options). |
|
|
78
|
+
| `cloud.repos` | The repositories the agent may hand work to, with a default branch or pull request for each. Without it, launches run with no repository and the model can't name one, so secrets in `cloud.envVars` never reach a repository you didn't list. |
|
|
79
|
+
| `model` | The model launched agents run. Omit it to use the account default. |
|
|
80
|
+
| `needsApproval` | Park launches and follow-ups for a [human decision](./human-in-the-loop.md). Defaults to `true` when no `cloud.repos` are configured, `false` otherwise. |
|
|
81
|
+
| `apiKey` | A Cursor API key to launch with instead of the host's own. |
|
|
82
|
+
|
|
83
|
+
## Adjust it
|
|
84
|
+
|
|
85
|
+
To take a capability away, such as sending follow-ups, mount as a
|
|
86
|
+
directory and disable that tool; see
|
|
87
|
+
[overlays](../reference/extensions.md#adjust-a-mounted-extension).
|
|
88
|
+
|
|
89
|
+
## What's next
|
|
90
|
+
|
|
91
|
+
Continue with these pages:
|
|
92
|
+
|
|
93
|
+
- [Extensions](../reference/extensions.md): how mounts, namespaces, and
|
|
94
|
+
overrides work
|
|
95
|
+
- [Human-in-the-loop approvals](./human-in-the-loop.md): where parked
|
|
96
|
+
launches get approved
|
|
97
|
+
- [Cloud runtime](./cloud-runtime.md): run the agent's own turns on
|
|
98
|
+
cloud agents instead
|
|
@@ -124,6 +124,37 @@ be called through the direct tool API.
|
|
|
124
124
|
In a dry-run session, MCP tools marked read-only run normally. Tools marked
|
|
125
125
|
as writes are stubbed. Tools without effect annotations are unavailable.
|
|
126
126
|
|
|
127
|
+
## Restrict which tools a connection serves
|
|
128
|
+
|
|
129
|
+
Use `tools` the same way you allowlist harness tools on the agent. When
|
|
130
|
+
set, the connection serves only those names. Use `disallowedTools` to
|
|
131
|
+
drop names instead. The two combine as deny-wins, same as the Cursor
|
|
132
|
+
SDK. The model and `host.mcp` only see what remains. On a model-visible
|
|
133
|
+
connection, set `advertiseTools: true` so the raw server is not attached.
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
export default defineConnection({
|
|
137
|
+
url: "https://mcp.example.com/inventory",
|
|
138
|
+
advertiseTools: true,
|
|
139
|
+
tools: ["search_skus", "get_stock"],
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
export default defineConnection({
|
|
143
|
+
url: "https://mcp.example.com/inventory",
|
|
144
|
+
advertiseTools: true,
|
|
145
|
+
disallowedTools: ["place_order", "delete_sku"],
|
|
146
|
+
});
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Names are the server's `tools/list` names. Unknown names are omitted. A
|
|
150
|
+
filter that matches nothing on the server fails the turn. Combine with
|
|
151
|
+
`effects: "read"` to keep only the listed tools the server classifies as
|
|
152
|
+
reads.
|
|
153
|
+
|
|
154
|
+
A list of names is an allowlist. An object of handlers authors TypeScript
|
|
155
|
+
tools. On `host-connections/`, a name list restricts `host.mcp` without
|
|
156
|
+
advertising.
|
|
157
|
+
|
|
127
158
|
## Local stdio MCP server
|
|
128
159
|
|
|
129
160
|
Run a local MCP server as a child process with `command`.
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Extensions"
|
|
3
|
+
description: "Mount a package of tools and skills or a Cursor plugin under a namespace with one file, adjust what it contributes, and author your own as a directory laid out like agent/."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Extensions
|
|
7
|
+
|
|
8
|
+
An extension packages tools and skills an agent installs as one unit. You
|
|
9
|
+
mount it with a single file under `agent/extensions/`, and its
|
|
10
|
+
contributions join the agent under a namespace. The package updates
|
|
11
|
+
like any other dependency; nothing is copied into your project. A Cursor
|
|
12
|
+
plugin mounts the same way; see [Mount a Cursor plugin](#mount-a-cursor-plugin).
|
|
13
|
+
|
|
14
|
+
## Mount an extension
|
|
15
|
+
|
|
16
|
+
Install the package, then add one file. The filename is the namespace.
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
// agent/extensions/ci.ts
|
|
20
|
+
import ci from "@acme/ci-triage";
|
|
21
|
+
|
|
22
|
+
export default ci({ org: "acme", token: process.env.BUILDKITE_TOKEN! });
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Every contribution is exposed as `<namespace>__<name>`. A `failed_jobs`
|
|
26
|
+
tool from this mount runs in the agent as `ci__failed_jobs`, and a
|
|
27
|
+
`triage` skill loads as `ci__triage`. `agent-sdk info` lists each mount
|
|
28
|
+
with what it contributed, and `GET /v1/info` returns the same under
|
|
29
|
+
`extensions`.
|
|
30
|
+
|
|
31
|
+
Pass the configuration the extension asks for. The extension validates it
|
|
32
|
+
when the agent loads, so a missing or mistyped field fails
|
|
33
|
+
`agent-sdk validate` instead of a tool call later.
|
|
34
|
+
|
|
35
|
+
Namespaces follow the tool-name rule, and `__` is reserved: an authored
|
|
36
|
+
`agent/tools/ci__failed_jobs.ts` fails discovery, so nothing outside a
|
|
37
|
+
mount can pose as one of its tools.
|
|
38
|
+
|
|
39
|
+
## Adjust a mounted extension
|
|
40
|
+
|
|
41
|
+
To replace or remove a contribution, mount the extension as a directory
|
|
42
|
+
and overlay the slot you want to change.
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
agent/extensions/ci/
|
|
46
|
+
├── extension.ts # the mount: export default ci({ ... })
|
|
47
|
+
├── tools/
|
|
48
|
+
│ ├── job_log.ts # replaces ci__job_log with your own defineTool
|
|
49
|
+
│ └── retry_job.ts # export default disableTool() removes ci__retry_job
|
|
50
|
+
└── skills/
|
|
51
|
+
└── triage.md # replaces ci__triage
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Use the extension's own names inside the directory, without the
|
|
55
|
+
namespace. A file with a name the extension doesn't contribute adds a
|
|
56
|
+
new tool or skill under the namespace. `disableTool()` comes from
|
|
57
|
+
`@cursor/july/extensions` and fails discovery when it names a tool the
|
|
58
|
+
extension doesn't have, so a typo can't silently keep a tool alive.
|
|
59
|
+
A Cursor plugin mount overlays its MCP servers the same way; see below.
|
|
60
|
+
|
|
61
|
+
## Mount a Cursor plugin
|
|
62
|
+
|
|
63
|
+
A Cursor plugin is a directory with `.cursor-plugin/plugin.json` (or
|
|
64
|
+
`.claude-plugin/plugin.json`, or `plugin.json`) and any of `skills/`,
|
|
65
|
+
`commands/`, `agents/`, and `mcp.json`. Copy the plugin into your project
|
|
66
|
+
and mount it with `cursorPlugin`. The filename is the namespace, as with
|
|
67
|
+
any extension.
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
// agent/extensions/notion.ts
|
|
71
|
+
import { cursorPlugin } from "@cursor/july/extensions";
|
|
72
|
+
|
|
73
|
+
export default cursorPlugin({
|
|
74
|
+
path: "plugins/notion-workspace", // relative to the project root
|
|
75
|
+
variables: { NOTION_TOKEN: process.env.NOTION_TOKEN! },
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The plugin joins the agent under that namespace:
|
|
80
|
+
|
|
81
|
+
| Plugin content | Becomes |
|
|
82
|
+
| --- | --- |
|
|
83
|
+
| `skills/<name>/SKILL.md` | skill `notion__<name>` |
|
|
84
|
+
| `commands/<name>.md` | skill `notion__<name>`, since a command is a procedure the model runs on request |
|
|
85
|
+
| `agents/<name>.md` | subagent `notion__<name>` |
|
|
86
|
+
| MCP servers in `mcp.json` or the manifest | connection `notion__<server>` |
|
|
87
|
+
|
|
88
|
+
`variables` fills the `${NAME}` placeholders the plugin's MCP config
|
|
89
|
+
declares; names you leave out come from the environment by exact name. A
|
|
90
|
+
placeholder nothing fills fails `agent-sdk validate`, so a server never
|
|
91
|
+
attaches half configured. A server that declares an OAuth client
|
|
92
|
+
authorizes through [host MCP OAuth](../guides/mcp-oauth.md) as
|
|
93
|
+
`agent-sdk mcp oauth notion__<server>`; its secret names collapse the
|
|
94
|
+
namespace separator, so `notion__notion` stores `MCP_OAUTH_NOTION_NOTION_*`.
|
|
95
|
+
A server that lists `enabledTools` mounts as an advertised connection with
|
|
96
|
+
that allowlist and requires the local runtime; `agent-sdk validate` fails
|
|
97
|
+
otherwise.
|
|
98
|
+
|
|
99
|
+
Mounting a plugin trusts it like authored code: its servers run the
|
|
100
|
+
commands and read the environment variables its config names. Review a
|
|
101
|
+
plugin before you vendor it.
|
|
102
|
+
|
|
103
|
+
Plugin rules and hooks are not mounted; `agent-sdk validate` warns when a
|
|
104
|
+
plugin carries them. To drop or reconfigure one of the plugin's servers,
|
|
105
|
+
mount as a directory and overlay `mcp-connections/<server>.ts`. An
|
|
106
|
+
overlaid server is never read from the plugin, so it needs no variables.
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
agent/extensions/cloudflare/
|
|
110
|
+
├── extension.ts # export default cursorPlugin({ path: "plugins/cloudflare" })
|
|
111
|
+
└── mcp-connections/
|
|
112
|
+
├── cloudflare-docs.ts # replaces cloudflare__cloudflare-docs with your defineConnection
|
|
113
|
+
└── cloudflare-bindings.ts # export default disableConnection() drops it
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`disableConnection()` comes from `@cursor/july/extensions` and fails
|
|
117
|
+
discovery when it names a server the plugin doesn't declare.
|
|
118
|
+
|
|
119
|
+
## Build an extension
|
|
120
|
+
|
|
121
|
+
An extension is a directory laid out like `agent/`. `extension.ts`
|
|
122
|
+
declares it; `tools/` and `skills/` hold the contributions in the same
|
|
123
|
+
authoring forms as [Tools](./tools.md) and [Skills](./skills.md).
|
|
124
|
+
|
|
125
|
+
```text
|
|
126
|
+
@acme/ci-triage/
|
|
127
|
+
├── package.json
|
|
128
|
+
├── extension.ts # defineExtension
|
|
129
|
+
├── tools/
|
|
130
|
+
│ ├── failed_jobs.ts
|
|
131
|
+
│ ├── job_log.ts
|
|
132
|
+
│ └── retry_job.ts
|
|
133
|
+
├── skills/
|
|
134
|
+
│ └── triage.md
|
|
135
|
+
└── lib/
|
|
136
|
+
└── buildkite.ts # shared code, never discovered
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Declare the extension with its root and, when consumers must configure
|
|
140
|
+
it, a schema for their settings.
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
// extension.ts
|
|
144
|
+
import { defineExtension } from "@cursor/july/extensions";
|
|
145
|
+
import { z } from "zod";
|
|
146
|
+
|
|
147
|
+
export default defineExtension({
|
|
148
|
+
root: import.meta.dirname,
|
|
149
|
+
description: "Investigate failing CI builds on Buildkite.",
|
|
150
|
+
config: z.object({
|
|
151
|
+
org: z.string(),
|
|
152
|
+
token: z.string(),
|
|
153
|
+
logTailLines: z.number().int().positive().default(200),
|
|
154
|
+
}),
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The default export is what consumers call to mount the extension, and it
|
|
159
|
+
is also how your own modules read the consumer's settings. Import it and
|
|
160
|
+
read `extension.config`; the value is validated and has defaults applied.
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
// tools/job_log.ts
|
|
164
|
+
import { defineTool } from "@cursor/july/tools";
|
|
165
|
+
import { z } from "zod";
|
|
166
|
+
import extension from "../extension.js";
|
|
167
|
+
import { jobLogTail } from "../lib/buildkite.js";
|
|
168
|
+
|
|
169
|
+
export default defineTool({
|
|
170
|
+
description: "Read the tail of a CI job's log.",
|
|
171
|
+
effect: "read",
|
|
172
|
+
inputSchema: z.object({ pipeline: z.string(), build: z.number(), job: z.string() }),
|
|
173
|
+
async execute({ pipeline, build, job }) {
|
|
174
|
+
const { org, token, logTailLines } = extension.config;
|
|
175
|
+
return jobLogTail({ org, token, pipeline, build, job, lines: logTailLines });
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Because the consumer picks the namespace, have skills and tool
|
|
181
|
+
descriptions refer to sibling tools by their short names and say they
|
|
182
|
+
appear under the mount's namespace (`<namespace>__job_log`).
|
|
183
|
+
|
|
184
|
+
Publish the built `extension.js` as the package entry point with
|
|
185
|
+
`tools/` and `skills/` beside it. `root` is read from the built file, so
|
|
186
|
+
copy `skills/*.md` into the build output or author skills as `.ts` with
|
|
187
|
+
`defineSkill`.
|
|
188
|
+
|
|
189
|
+
Only `tools/` and `skills/` are mounted from an extension tree.
|
|
190
|
+
Instructions, connections, hooks, channels, and the runtime
|
|
191
|
+
configuration belong to the agent that mounts the extension;
|
|
192
|
+
`agent-sdk validate` warns when a tree carries agent slots such as
|
|
193
|
+
`instructions.md`, `connections/`, `hooks/`, `channels/`, or
|
|
194
|
+
`schedules/`.
|
|
195
|
+
|
|
196
|
+
## What's next
|
|
197
|
+
|
|
198
|
+
Continue with these pages:
|
|
199
|
+
|
|
200
|
+
- [Cursor cloud agents](../guides/cloud-agents.md): the extension that
|
|
201
|
+
lets an agent launch and steer cloud agents
|
|
202
|
+
- [Tools](./tools.md): the tool contract extensions contribute to
|
|
203
|
+
- [Skills](./skills.md): the skill forms an extension can carry
|
|
204
|
+
- [Project layout](./project-layout.md): where `agent/extensions/` sits
|
|
205
|
+
in the tree
|
|
@@ -53,7 +53,7 @@ and `playgroundUrl` deep-links the session in the playground.
|
|
|
53
53
|
| `message` | Required user message |
|
|
54
54
|
| `title` | Session title |
|
|
55
55
|
| `dryRun` | Run read tools and stub write tools |
|
|
56
|
-
| `asOf` | ISO-8601 instant with a timezone, frozen at create; the prompt states it, `ctx.now()` returns it, and
|
|
56
|
+
| `asOf` | ISO-8601 instant with a timezone, frozen at create; the prompt states it, `ctx.now()` returns it, and tool calls with relative, later-than-`asOf`, or omitted schema-declared time bounds are refused. `400` when unusable |
|
|
57
57
|
| `workspaceFiles` | UTF-8 files written into the session workspace |
|
|
58
58
|
| `cloud` | Per-session cloud options merged over the agent defaults |
|
|
59
59
|
|
|
@@ -21,6 +21,8 @@ experiments can override their file-derived name.
|
|
|
21
21
|
| `agent/host-connections/anytool.ts` | Host MCP connection `anytool` (host + `mcp oauth` only) |
|
|
22
22
|
| `agent/skills/pr-review.md` | skill `pr-review` |
|
|
23
23
|
| `agent/subagents/reviewer/` | subagent `reviewer` |
|
|
24
|
+
| `agent/extensions/ci.ts` | extension mount `ci`; its tools and skills become `ci__<name>` |
|
|
25
|
+
| `agent/extensions/notion.ts` | Cursor plugin mount `notion` (`cursorPlugin`); its skills, agents, and MCP servers become `notion__<name>` |
|
|
24
26
|
| `agent/channels/drive.ts` | channel `drive`, routes under `/v1/channels/drive` |
|
|
25
27
|
| `agent/ab.ts` | A/B experiment `ab` unless `name` overrides it |
|
|
26
28
|
| `agent/ab/concise.ts` | A/B experiment `concise` unless `name` overrides it |
|
|
@@ -71,6 +73,7 @@ Each path maps to a capability and a reference page.
|
|
|
71
73
|
| `agent/mcp-connections/<name>.ts` | MCP servers, available to the model, to server tools (`ctx.host.mcp`), and to channel/schedule handlers (`args.host.mcp`) | [MCP connections](./connections.md) |
|
|
72
74
|
| `agent/host-connections/<name>.ts` | Privileged MCP servers for `ctx.host.mcp` and `mcp oauth`. The model never sees them. | [MCP connections](./connections.md) |
|
|
73
75
|
| `agent/subagents/<id>/` | Child agent directory; `description` required | [Subagents](./subagents.md) |
|
|
76
|
+
| `agent/extensions/<ns>.ts` or `agent/extensions/<ns>/` | A mounted extension or Cursor plugin; its contributions become `<ns>__<name>` | [Extensions](./extensions.md) |
|
|
74
77
|
| `agent/channels/*.ts` | HTTP surfaces beyond the built-in session API; `slack.ts` and `github.ts` use the platform packs | [Channels](./channels.md) |
|
|
75
78
|
| `agent/hooks/*.ts` | Observe-only event subscribers, never fatal | [Hooks](./hooks.md) |
|
|
76
79
|
| `agent/otel.ts` | `defineOtel` OTLP export (traces, metrics, optional logs) | [OpenTelemetry](../guides/opentelemetry.md) |
|
package/docs/reference/skills.md
CHANGED
|
@@ -85,4 +85,6 @@ Continue with these pages:
|
|
|
85
85
|
|
|
86
86
|
- [Instructions](./instructions.md): what stays always-on
|
|
87
87
|
- [Tools](./tools.md): when prose needs to become code
|
|
88
|
+
- [Extensions](./extensions.md): skills installed as a package under a
|
|
89
|
+
namespace
|
|
88
90
|
- [Project layout](./project-layout.md): where skills sit in the tree
|
package/docs/reference/tools.md
CHANGED
|
@@ -343,4 +343,6 @@ Continue with these pages:
|
|
|
343
343
|
lifecycle in full
|
|
344
344
|
- [MCP connections](./connections.md): tools that come from MCP servers
|
|
345
345
|
instead
|
|
346
|
+
- [Extensions](./extensions.md): tools installed as a package under a
|
|
347
|
+
namespace
|
|
346
348
|
- [Evals](../evals.md): gating tool decisions with `calledTool`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cursor/july",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.102",
|
|
4
4
|
"description": "(early alpha) Filesystem-first framework for defining Cursor agents as markdown and TypeScript and serving them over channels with the Cursor SDK.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"repository": {
|
|
@@ -95,6 +95,20 @@
|
|
|
95
95
|
"import": "./dist/skills.js",
|
|
96
96
|
"default": "./dist/skills.js"
|
|
97
97
|
},
|
|
98
|
+
"./extensions": {
|
|
99
|
+
"anysphere-source": "./src/extensions.ts",
|
|
100
|
+
"bun": "./dist/extensions.js",
|
|
101
|
+
"types": "./dist/extensions.d.ts",
|
|
102
|
+
"import": "./dist/extensions.js",
|
|
103
|
+
"default": "./dist/extensions.js"
|
|
104
|
+
},
|
|
105
|
+
"./extensions/cursor-cloud-agents": {
|
|
106
|
+
"anysphere-source": "./src/extensions/cursor-cloud-agents/extension.ts",
|
|
107
|
+
"bun": "./dist/extensions/cursor-cloud-agents/extension.js",
|
|
108
|
+
"types": "./dist/extensions/cursor-cloud-agents/extension.d.ts",
|
|
109
|
+
"import": "./dist/extensions/cursor-cloud-agents/extension.js",
|
|
110
|
+
"default": "./dist/extensions/cursor-cloud-agents/extension.js"
|
|
111
|
+
},
|
|
98
112
|
"./schedules": {
|
|
99
113
|
"anysphere-source": "./src/schedules.ts",
|
|
100
114
|
"types": "./dist/schedules.d.ts",
|
|
@@ -215,7 +229,7 @@
|
|
|
215
229
|
}
|
|
216
230
|
},
|
|
217
231
|
"scripts": {
|
|
218
|
-
"build": "tsgo -p tsconfig.build.json && node scripts/bundle-publish-shims.mjs && pnpm run build:playground && pnpm run docs:build",
|
|
232
|
+
"build": "tsgo -p tsconfig.build.json && node scripts/bundle-publish-shims.mjs && node scripts/copy-extension-assets.mjs && pnpm run build:playground && pnpm run docs:build",
|
|
219
233
|
"build:dist": "node scripts/build-hosted-dist.mjs",
|
|
220
234
|
"postinstall": "node -e \"try{const p='./scripts/install-cursor-skills.mjs';if(require('fs').existsSync(p))require('child_process').execFileSync(process.execPath,[p],{stdio:'inherit'})}catch{}\"",
|
|
221
235
|
"build:playground": "vite build --config playground/vite.config.ts",
|
|
@@ -240,7 +254,7 @@
|
|
|
240
254
|
},
|
|
241
255
|
"dependencies": {
|
|
242
256
|
"@bazel/runfiles": "6.5.0",
|
|
243
|
-
"@cursor/sdk": "1.0.
|
|
257
|
+
"@cursor/sdk": "1.0.31",
|
|
244
258
|
"@modelcontextprotocol/sdk": "1.25.1",
|
|
245
259
|
"@octokit/auth-app": "^7.2.0",
|
|
246
260
|
"@octokit/rest": "^21.1.1",
|
|
@@ -303,4 +317,4 @@
|
|
|
303
317
|
"yaml": "^2.4.2",
|
|
304
318
|
"zustand": "^5.0.9"
|
|
305
319
|
}
|
|
306
|
-
}
|
|
320
|
+
}
|
|
@@ -44,6 +44,7 @@ Path is identity. Full list: README "Folder structure".
|
|
|
44
44
|
| `agent/mcp-connections/<name>.ts` | MCP. Never name an account file `cursor.ts`. `advertiseTools: true` for named local tools |
|
|
45
45
|
| `agent/host-connections/<name>.ts` | Privileged MCP for `ctx.host.mcp` / `mcp oauth` |
|
|
46
46
|
| `agent/subagents/<id>/` | Child agent (`description` required) |
|
|
47
|
+
| `agent/extensions/<ns>.ts` | Mounted extension or Cursor plugin (`cursorPlugin({ path })`); contributions are `<ns>__<name>` |
|
|
47
48
|
| `agent/channels/*.ts` | Slack / GitHub / custom HTTP |
|
|
48
49
|
| `agent/hooks/*.ts` | Observe-only |
|
|
49
50
|
| `agent/ab.ts` or `agent/ab/*.ts` | Live A/B (`defineAB`) |
|
package/src/bin/agent-serve.ts
CHANGED
|
@@ -426,8 +426,8 @@ Options:
|
|
|
426
426
|
--all deploy: every child agent under a multi-agent --dir
|
|
427
427
|
(skips the interactive picker; mutually exclusive with
|
|
428
428
|
--slug).
|
|
429
|
-
--cursor-events-repo deploy: repo (owner/name)
|
|
430
|
-
|
|
429
|
+
--cursor-events-repo deploy: repo (owner/name) the deployed agent
|
|
430
|
+
watches (repeatable).
|
|
431
431
|
--allow-domain deploy: egress domain the engine pod may reach
|
|
432
432
|
(repeatable; unioned with hosting.egressDomains from the
|
|
433
433
|
agent manifest). Repo-backed deploys only.
|
|
@@ -1160,6 +1160,15 @@ async function main(argv: string[]): Promise<number> {
|
|
|
1160
1160
|
info.skills.map((s) => `${s.name} — ${s.description}`)
|
|
1161
1161
|
)
|
|
1162
1162
|
);
|
|
1163
|
+
lines.push(
|
|
1164
|
+
section(
|
|
1165
|
+
"extensions",
|
|
1166
|
+
info.extensions.map(
|
|
1167
|
+
(e) =>
|
|
1168
|
+
`${e.name} — ${[...e.tools, ...e.skills].join(", ") || "(nothing contributed)"}`
|
|
1169
|
+
)
|
|
1170
|
+
)
|
|
1171
|
+
);
|
|
1163
1172
|
lines.push(
|
|
1164
1173
|
section(
|
|
1165
1174
|
"MCP connections",
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
3
|
import { defineChannel, localDevStrict, POST } from "../../channels.js";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
deploymentEventMatches,
|
|
6
|
+
resolveDeploymentSubscriptions,
|
|
7
|
+
} from "../../internal/cursor-deployment-relay.js";
|
|
8
|
+
import { attachHostedAdmissionAdapter } from "../../internal/hosted-admission-adapter.js";
|
|
5
9
|
import { bindLocalIngressSend } from "../../internal/local-ingress.js";
|
|
6
10
|
import type { ChannelDefinition, ChannelHandlerArgs } from "../../types.js";
|
|
7
11
|
import {
|
|
@@ -43,14 +47,28 @@ export function getDeploymentsChannelOptions(
|
|
|
43
47
|
/**
|
|
44
48
|
* Events a {@link deploymentsChannel} dispatches on, unioned from its
|
|
45
49
|
* subscriptions. Published as `meta.deploymentEventTypes` so the deploy
|
|
46
|
-
* manifest can extract `eventTypes`.
|
|
47
|
-
*
|
|
50
|
+
* manifest can extract `eventTypes`.
|
|
51
|
+
*
|
|
52
|
+
* A channel with no resolved subscriptions declares the full event set:
|
|
53
|
+
* deploy sources usually come from env vars read at module load, and the
|
|
54
|
+
* hosted freeze bakes hermetically (no customer env/secrets), so deriving
|
|
55
|
+
* `[]` there would leave the manifest without event types and no
|
|
56
|
+
* subscription edge could ever materialize (invariant 26). Capability is
|
|
57
|
+
* the channel's code shape — `onEvent` handles any deployment event —
|
|
58
|
+
* while sources/environments/event narrowing are runtime subscription
|
|
59
|
+
* config; the hosted-admission adapter re-applies them before authored
|
|
60
|
+
* code runs. Inertness is still guaranteed by scope: a deploy that names
|
|
61
|
+
* no deploy sources binds no edges.
|
|
48
62
|
*/
|
|
49
63
|
export function deriveDeploymentEventTypes(
|
|
50
64
|
options: Pick<DeploymentsChannelOptions, "deploySourceUris" | "events">
|
|
51
65
|
): string[] {
|
|
66
|
+
const subscriptions = resolveDeploymentSubscriptions(options);
|
|
67
|
+
if (subscriptions.length === 0) {
|
|
68
|
+
return [...DEPLOYMENT_EVENT_TYPES].sort();
|
|
69
|
+
}
|
|
52
70
|
const events = new Set<string>();
|
|
53
|
-
for (const subscription of
|
|
71
|
+
for (const subscription of subscriptions) {
|
|
54
72
|
for (const event of subscription.events) {
|
|
55
73
|
events.add(event);
|
|
56
74
|
}
|
|
@@ -59,9 +77,9 @@ export function deriveDeploymentEventTypes(
|
|
|
59
77
|
}
|
|
60
78
|
|
|
61
79
|
/**
|
|
62
|
-
* Core deployment-event dispatch, used by the channel's replay route
|
|
63
|
-
*
|
|
64
|
-
* subscriptions is the caller's decision.
|
|
80
|
+
* Core deployment-event dispatch, used by the channel's replay route, the
|
|
81
|
+
* serve host's relay fan-out, and the hosted-admission adapter. Whether the
|
|
82
|
+
* event matches this channel's subscriptions is the caller's decision.
|
|
65
83
|
*/
|
|
66
84
|
export async function dispatchDeploymentEvent(input: {
|
|
67
85
|
options: DeploymentsChannelOptions;
|
|
@@ -77,7 +95,61 @@ export async function dispatchDeploymentEvent(input: {
|
|
|
77
95
|
payload: input.event,
|
|
78
96
|
})
|
|
79
97
|
);
|
|
80
|
-
|
|
98
|
+
// "task": authored `onEvent` ran to completion without a captured send.
|
|
99
|
+
// Hosted admission only consults this when no send was captured.
|
|
100
|
+
return withDispatchOutcome(Response.json({ ok: true }), "task");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type DeploymentsDispatchOutcome = "skip" | "task";
|
|
104
|
+
|
|
105
|
+
const dispatchOutcomeByResponse = new WeakMap<
|
|
106
|
+
Response,
|
|
107
|
+
DeploymentsDispatchOutcome
|
|
108
|
+
>();
|
|
109
|
+
|
|
110
|
+
function withDispatchOutcome(
|
|
111
|
+
response: Response,
|
|
112
|
+
outcome: DeploymentsDispatchOutcome
|
|
113
|
+
): Response {
|
|
114
|
+
dispatchOutcomeByResponse.set(response, outcome);
|
|
115
|
+
return response;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export function getDeploymentsDispatchOutcome(
|
|
119
|
+
response: Response
|
|
120
|
+
): DeploymentsDispatchOutcome | undefined {
|
|
121
|
+
return dispatchOutcomeByResponse.get(response);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Whether this channel admits the event on a hosted pod. The hosted
|
|
126
|
+
* control plane fans out on `(deploy_source, eventType, team)` edges only —
|
|
127
|
+
* environments are not edge identity — so this is where the environment
|
|
128
|
+
* filter (and a stale-edge guard for sources/events) lives, mirroring what
|
|
129
|
+
* the v1 relay does before `onEvent`.
|
|
130
|
+
*
|
|
131
|
+
* A channel with NO resolved subscriptions admits everything the control
|
|
132
|
+
* plane delivered: deploy sources usually come from env vars read at
|
|
133
|
+
* module load, and the hosted freeze bakes hermetically (no customer env),
|
|
134
|
+
* so on a restored pod an env-configured channel resolves empty — the
|
|
135
|
+
* deploy-time edges (bound from the watched repositories) already carry
|
|
136
|
+
* the customer's scope, and refusing here would silently drop every
|
|
137
|
+
* delivery. Same posture as {@link deriveDeploymentEventTypes}: authored
|
|
138
|
+
* subscriptions narrow; an unconfigured channel defers to the deploy scope.
|
|
139
|
+
*/
|
|
140
|
+
export function deploymentEventMatchesChannel(
|
|
141
|
+
options: DeploymentsChannelOptions,
|
|
142
|
+
event: DeploymentEvent
|
|
143
|
+
): boolean {
|
|
144
|
+
const subscriptions = resolveDeploymentSubscriptions(options);
|
|
145
|
+
if (subscriptions.length === 0) {
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
return subscriptions.some(
|
|
149
|
+
(subscription) =>
|
|
150
|
+
subscription.deploySourceUri === event.deploySourceUri.toLowerCase() &&
|
|
151
|
+
deploymentEventMatches(subscription, event)
|
|
152
|
+
);
|
|
81
153
|
}
|
|
82
154
|
|
|
83
155
|
/**
|
|
@@ -102,6 +174,13 @@ export async function dispatchDeploymentEvent(input: {
|
|
|
102
174
|
* have. Nothing is pushed to this deployment and no shared secret exists on
|
|
103
175
|
* either side.
|
|
104
176
|
*
|
|
177
|
+
* Hosted v2 deployments do not poll: the control plane fans verified factory
|
|
178
|
+
* deployment events out on `deploy_source` subscription edges — derived from
|
|
179
|
+
* the deploy's watched `repositories`, since factory records deploy sources
|
|
180
|
+
* as Origin repo URLs — and delivers through hosted admission. The attached
|
|
181
|
+
* adapter re-applies this channel's subscription filter — environments are
|
|
182
|
+
* not edge identity — and skips before authored code runs.
|
|
183
|
+
*
|
|
105
184
|
* The route on this channel exists for local replay (`agent-sdk` and tests):
|
|
106
185
|
* POST an event body and it runs the same `onEvent`.
|
|
107
186
|
*/
|
|
@@ -136,5 +215,35 @@ export function deploymentsChannel(
|
|
|
136
215
|
],
|
|
137
216
|
});
|
|
138
217
|
deploymentsChannelOptionsByDefinition.set(definition, options);
|
|
218
|
+
// Hosted v2 delivery: the control plane admits a deployments mailbox item
|
|
219
|
+
// (deploy_source edge match) and posts the claim-checked factory envelope
|
|
220
|
+
// here. Environments are not edge identity, so non-matching environments
|
|
221
|
+
// (and stale-edge sources/events) are filtered to `skip` before authored
|
|
222
|
+
// code runs — the same pre-`onEvent` filter the v1 relay applies.
|
|
223
|
+
attachHostedAdmissionAdapter(definition, {
|
|
224
|
+
kind: DEPLOYMENTS_CHANNEL_KIND,
|
|
225
|
+
dispatch: async ({ payload, args }) => {
|
|
226
|
+
const parsed = deploymentEventSchema.safeParse(payload);
|
|
227
|
+
if (!parsed.success) {
|
|
228
|
+
return Response.json(
|
|
229
|
+
{ ok: false, error: "invalid_deployment_event" },
|
|
230
|
+
{ status: 400 }
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
const event = parsed.data as DeploymentEvent;
|
|
234
|
+
if (!deploymentEventMatchesChannel(options, event)) {
|
|
235
|
+
return withDispatchOutcome(
|
|
236
|
+
Response.json({
|
|
237
|
+
ok: true,
|
|
238
|
+
skipped: true,
|
|
239
|
+
reason: "subscription_mismatch",
|
|
240
|
+
}),
|
|
241
|
+
"skip"
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
return dispatchDeploymentEvent({ options, event, args });
|
|
245
|
+
},
|
|
246
|
+
getOutcome: (response) => getDeploymentsDispatchOutcome(response),
|
|
247
|
+
});
|
|
139
248
|
return definition;
|
|
140
249
|
}
|
|
@@ -54,9 +54,10 @@ export interface DeploymentsChannelOptions {
|
|
|
54
54
|
* and then receives nothing. A bare string takes the default environment and
|
|
55
55
|
* event filters.
|
|
56
56
|
*
|
|
57
|
-
* There is no team-wide subscription: every deploy source is named.
|
|
58
|
-
*
|
|
59
|
-
*
|
|
57
|
+
* There is no team-wide subscription: every deploy source is named. An
|
|
58
|
+
* empty list is how a consumer *deregisters*, so it cannot also mean
|
|
59
|
+
* "everything". A live array that starts empty and is filled later is
|
|
60
|
+
* re-read on each registration heartbeat.
|
|
60
61
|
*/
|
|
61
62
|
deploySourceUris: readonly (string | DeploymentSubscription)[];
|
|
62
63
|
/**
|