@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,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/channels/*.ts`: HTTP surfaces beyond the session API.
|
|
3
|
+
*/
|
|
4
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { httpChannel } from "../../channels.js";
|
|
15
|
+
import { getDefinitionKind } from "../brand.js";
|
|
16
|
+
import { displayPath, errorMessage } from "./context.js";
|
|
17
|
+
import { isDirectory, isModuleFile, moduleStem, sortedEntries } from "./fs.js";
|
|
18
|
+
import { NAME_PATTERN } from "./names.js";
|
|
19
|
+
export function loadChannels(ctx, channelsDir) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
var _a;
|
|
22
|
+
var _b;
|
|
23
|
+
const channels = [];
|
|
24
|
+
let httpChannelDefinition;
|
|
25
|
+
if (!(yield isDirectory(channelsDir))) {
|
|
26
|
+
return { channels, httpChannelDefinition };
|
|
27
|
+
}
|
|
28
|
+
for (const entry of yield sortedEntries(channelsDir)) {
|
|
29
|
+
const entryPath = join(channelsDir, entry.name);
|
|
30
|
+
if (!entry.isFile() || !isModuleFile(entry.name)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const id = moduleStem(entry.name);
|
|
34
|
+
if (!NAME_PATTERN.test(id)) {
|
|
35
|
+
ctx.diagnostics.push({
|
|
36
|
+
severity: "error",
|
|
37
|
+
path: displayPath(ctx, entryPath),
|
|
38
|
+
message: `Channel id "${id}" must match ${NAME_PATTERN}.`,
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
let mod;
|
|
43
|
+
try {
|
|
44
|
+
mod = yield ctx.importModule(entryPath);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
ctx.diagnostics.push({
|
|
48
|
+
severity: "error",
|
|
49
|
+
path: displayPath(ctx, entryPath),
|
|
50
|
+
message: `Failed to load module: ${errorMessage(error)}`,
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const kind = getDefinitionKind(mod.default);
|
|
55
|
+
if (kind === "http-channel") {
|
|
56
|
+
if (id !== "http") {
|
|
57
|
+
ctx.diagnostics.push({
|
|
58
|
+
severity: "error",
|
|
59
|
+
path: displayPath(ctx, entryPath),
|
|
60
|
+
message: "httpChannel() configures the built-in HTTP channel and must be authored at channels/http.ts.",
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
httpChannelDefinition = mod.default;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (kind !== "channel") {
|
|
68
|
+
ctx.diagnostics.push({
|
|
69
|
+
severity: "error",
|
|
70
|
+
path: displayPath(ctx, entryPath),
|
|
71
|
+
message: id === "http"
|
|
72
|
+
? "channels/http.ts must default-export httpChannel({ ... })."
|
|
73
|
+
: "Channel modules must default-export defineChannel({ ... }).",
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (id === "http") {
|
|
78
|
+
ctx.diagnostics.push({
|
|
79
|
+
severity: "error",
|
|
80
|
+
path: displayPath(ctx, entryPath),
|
|
81
|
+
message: "The channel id `http` is reserved for the built-in HTTP channel; use httpChannel() to configure it.",
|
|
82
|
+
});
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const definition = mod.default;
|
|
86
|
+
for (const notice of (_b = (_a = definition.meta) === null || _a === void 0 ? void 0 : _a.deprecations) !== null && _b !== void 0 ? _b : []) {
|
|
87
|
+
ctx.diagnostics.push({
|
|
88
|
+
severity: "warning",
|
|
89
|
+
path: displayPath(ctx, entryPath),
|
|
90
|
+
message: notice,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
channels.push({ id, definition });
|
|
94
|
+
}
|
|
95
|
+
return { channels, httpChannelDefinition };
|
|
96
|
+
});
|
|
97
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/mcp-connections/*.ts` and `agent/host-connections/*.ts`: MCP servers for the model and the host.
|
|
3
|
+
*/
|
|
4
|
+
import { type ConnectionDefinition, type ConnectionTransport, type DiscoveredConnection } from "../../types.js";
|
|
5
|
+
import { type DiscoveryContext } from "./context.js";
|
|
6
|
+
/** One-line `/v1/info` label for a connection transport. */
|
|
7
|
+
export declare function connectionTransportLabel(transport: ConnectionTransport): string;
|
|
8
|
+
/**
|
|
9
|
+
* Prefer `agent/mcp-connections/`. Keep loading `agent/connections/` with a
|
|
10
|
+
* deprecation warning so existing agents keep working during the rename.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveMcpConnectionsDir(ctx: DiscoveryContext, agentDir: string): Promise<string>;
|
|
13
|
+
export declare function loadHostConnections(ctx: DiscoveryContext, agentDir: string, modelConnections: readonly DiscoveredConnection[]): Promise<DiscoveredConnection[]>;
|
|
14
|
+
export declare function loadConnections(ctx: DiscoveryContext, connectionsDir: string, role?: "model" | "host"): Promise<DiscoveredConnection[]>;
|
|
15
|
+
/** Validate one `defineConnection` and resolve its transport. */
|
|
16
|
+
export declare function compileConnection(ctx: DiscoveryContext, entryPath: string, name: string, connection: ConnectionDefinition, role: "model" | "host"): Promise<DiscoveredConnection | undefined>;
|
|
17
|
+
//# sourceMappingURL=connections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/internal/discovery/connections.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EAExB,KAAK,oBAAoB,EAQ1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,cAAc,CAAC;AAKtB,4DAA4D;AAC5D,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,mBAAmB,GAC7B,MAAM,CAeR;AAkGD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,SAAS,oBAAoB,EAAE,GAChD,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqCjC;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,gBAAgB,EACrB,cAAc,EAAE,MAAM,EACtB,IAAI,GAAE,OAAO,GAAG,MAAgB,GAC/B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAuBjC;AAED,iEAAiE;AACjE,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,gBAAgB,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,EAChC,IAAI,EAAE,OAAO,GAAG,MAAM,GACrB,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAuN3C"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/mcp-connections/*.ts` and `agent/host-connections/*.ts`: MCP servers for the model and the host.
|
|
3
|
+
*/
|
|
4
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { cursorAccountServersHasMixedWildcard, isInlineStdioConnection, isToolEffect, normalizeConnectionEffects, normalizeConnectionTools, normalizeCursorAccountServers, } from "../../types.js";
|
|
15
|
+
import { packageInlineStdioConnection } from "../package-inline-stdio.js";
|
|
16
|
+
import { displayPath, errorMessage, isBlank, } from "./context.js";
|
|
17
|
+
import { isDirectory } from "./fs.js";
|
|
18
|
+
import { importDefault, moduleEntries } from "./modules.js";
|
|
19
|
+
import { NAME_PATTERN } from "./names.js";
|
|
20
|
+
/** One-line `/v1/info` label for a connection transport. */
|
|
21
|
+
export function connectionTransportLabel(transport) {
|
|
22
|
+
if ("cursorAccount" in transport) {
|
|
23
|
+
return transport.servers === undefined
|
|
24
|
+
? "cursor-account"
|
|
25
|
+
: `cursor-account:${transport.servers.join(",")}`;
|
|
26
|
+
}
|
|
27
|
+
if ("agent" in transport) {
|
|
28
|
+
return `agent:${transport.agent}`;
|
|
29
|
+
}
|
|
30
|
+
if ("url" in transport) {
|
|
31
|
+
return transport.oauth === true
|
|
32
|
+
? `${transport.url} (oauth)`
|
|
33
|
+
: transport.url;
|
|
34
|
+
}
|
|
35
|
+
return transport.command;
|
|
36
|
+
}
|
|
37
|
+
function hasAuthorizationHeader(headers) {
|
|
38
|
+
if (headers === undefined) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return Object.keys(headers).some((key) => key.toLowerCase() === "authorization");
|
|
42
|
+
}
|
|
43
|
+
function parseConnectionEffects(effects) {
|
|
44
|
+
if (effects === undefined) {
|
|
45
|
+
return { ok: true, value: undefined };
|
|
46
|
+
}
|
|
47
|
+
const raw = typeof effects === "string" ? [effects] : effects;
|
|
48
|
+
if (!Array.isArray(raw) || raw.length === 0) {
|
|
49
|
+
return { ok: false };
|
|
50
|
+
}
|
|
51
|
+
const parsed = [];
|
|
52
|
+
for (const value of raw) {
|
|
53
|
+
if (!isToolEffect(value)) {
|
|
54
|
+
return { ok: false };
|
|
55
|
+
}
|
|
56
|
+
parsed.push(value);
|
|
57
|
+
}
|
|
58
|
+
return { ok: true, value: normalizeConnectionEffects(parsed) };
|
|
59
|
+
}
|
|
60
|
+
function parseConnectionTools(tools) {
|
|
61
|
+
if (tools === undefined) {
|
|
62
|
+
return { ok: true, value: undefined };
|
|
63
|
+
}
|
|
64
|
+
if (!Array.isArray(tools) || tools.length === 0) {
|
|
65
|
+
return { ok: false };
|
|
66
|
+
}
|
|
67
|
+
if (tools.some((name) => typeof name !== "string")) {
|
|
68
|
+
return { ok: false };
|
|
69
|
+
}
|
|
70
|
+
const normalized = normalizeConnectionTools(tools);
|
|
71
|
+
if (normalized.length === 0) {
|
|
72
|
+
return { ok: false };
|
|
73
|
+
}
|
|
74
|
+
return { ok: true, value: normalized };
|
|
75
|
+
}
|
|
76
|
+
function connectionHasSpawnOrRemote(connection) {
|
|
77
|
+
if ("cursorAccount" in connection && connection.cursorAccount === true) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
if ("agent" in connection && !isBlank(connection.agent)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if ("url" in connection && !isBlank(connection.url)) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
return "command" in connection && !isBlank(connection.command);
|
|
87
|
+
}
|
|
88
|
+
function connectionTransport(connection) {
|
|
89
|
+
if ("cursorAccount" in connection && connection.cursorAccount === true) {
|
|
90
|
+
const servers = normalizeCursorAccountServers(connection.servers);
|
|
91
|
+
return Object.assign({ cursorAccount: true }, (servers === undefined ? {} : { servers }));
|
|
92
|
+
}
|
|
93
|
+
if ("agent" in connection && !isBlank(connection.agent)) {
|
|
94
|
+
return { agent: connection.agent };
|
|
95
|
+
}
|
|
96
|
+
if ("url" in connection && !isBlank(connection.url)) {
|
|
97
|
+
return {
|
|
98
|
+
type: connection.type,
|
|
99
|
+
url: connection.url,
|
|
100
|
+
headers: connection.headers,
|
|
101
|
+
oauth: connection.oauth === true ? true : undefined,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if ("command" in connection && !isBlank(connection.command)) {
|
|
105
|
+
return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, (connection.type === undefined ? {} : { type: connection.type })), { command: connection.command }), (connection.args === undefined ? {} : { args: connection.args })), (connection.env === undefined ? {} : { env: connection.env })), (connection.cwd === undefined ? {} : { cwd: connection.cwd }));
|
|
106
|
+
}
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Prefer `agent/mcp-connections/`. Keep loading `agent/connections/` with a
|
|
111
|
+
* deprecation warning so existing agents keep working during the rename.
|
|
112
|
+
*/
|
|
113
|
+
export function resolveMcpConnectionsDir(ctx, agentDir) {
|
|
114
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
const preferred = join(agentDir, "mcp-connections");
|
|
116
|
+
const legacy = join(agentDir, "connections");
|
|
117
|
+
const hasPreferred = yield isDirectory(preferred);
|
|
118
|
+
const hasLegacy = yield isDirectory(legacy);
|
|
119
|
+
if (hasPreferred && hasLegacy) {
|
|
120
|
+
ctx.diagnostics.push({
|
|
121
|
+
severity: "warning",
|
|
122
|
+
path: displayPath(ctx, legacy),
|
|
123
|
+
message: "Both agent/mcp-connections/ and agent/connections/ exist; using mcp-connections/ and ignoring connections/. Rename or remove the legacy directory.",
|
|
124
|
+
});
|
|
125
|
+
return preferred;
|
|
126
|
+
}
|
|
127
|
+
if (hasLegacy) {
|
|
128
|
+
ctx.diagnostics.push({
|
|
129
|
+
severity: "warning",
|
|
130
|
+
path: displayPath(ctx, legacy),
|
|
131
|
+
message: "agent/connections/ is deprecated; rename it to agent/mcp-connections/. Loading from the legacy path for now.",
|
|
132
|
+
});
|
|
133
|
+
return legacy;
|
|
134
|
+
}
|
|
135
|
+
return preferred;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
export function loadHostConnections(ctx, agentDir, modelConnections) {
|
|
139
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
140
|
+
const hostDir = join(agentDir, "host-connections");
|
|
141
|
+
const loaded = yield loadConnections(ctx, hostDir, "host");
|
|
142
|
+
const modelNames = new Set(modelConnections.map((connection) => connection.name));
|
|
143
|
+
const hostConnections = [];
|
|
144
|
+
for (const connection of loaded) {
|
|
145
|
+
if (modelNames.has(connection.name)) {
|
|
146
|
+
ctx.diagnostics.push({
|
|
147
|
+
severity: "error",
|
|
148
|
+
path: displayPath(ctx, join(hostDir, `${connection.name}.ts`)),
|
|
149
|
+
message: `Host connection "${connection.name}" collides with agent/mcp-connections/${connection.name}. Rename one of them.`,
|
|
150
|
+
});
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (connection.advertiseTools === true) {
|
|
154
|
+
ctx.diagnostics.push({
|
|
155
|
+
severity: "error",
|
|
156
|
+
path: displayPath(ctx, join(hostDir, `${connection.name}.ts`)),
|
|
157
|
+
message: "Host connections are off the model. `advertiseTools` cannot apply. Drop it.",
|
|
158
|
+
});
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (connection.auth !== undefined) {
|
|
162
|
+
ctx.diagnostics.push({
|
|
163
|
+
severity: "error",
|
|
164
|
+
path: displayPath(ctx, join(hostDir, `${connection.name}.ts`)),
|
|
165
|
+
message: "Host connections are off the model. `auth` cannot apply. Use static headers or `oauth: true`.",
|
|
166
|
+
});
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
hostConnections.push(connection);
|
|
170
|
+
}
|
|
171
|
+
return hostConnections;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
export function loadConnections(ctx_1, connectionsDir_1) {
|
|
175
|
+
return __awaiter(this, arguments, void 0, function* (ctx, connectionsDir, role = "model") {
|
|
176
|
+
const connections = [];
|
|
177
|
+
for (const { name, path } of yield moduleEntries(ctx, connectionsDir, "connection")) {
|
|
178
|
+
const definition = yield importDefault(ctx, path, "connection");
|
|
179
|
+
if (definition === undefined) {
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const connection = yield compileConnection(ctx, path, name, definition, role);
|
|
183
|
+
if (connection !== undefined) {
|
|
184
|
+
connections.push(connection);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return connections;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/** Validate one `defineConnection` and resolve its transport. */
|
|
191
|
+
export function compileConnection(ctx, entryPath, name, connection, role) {
|
|
192
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
+
if (Object.hasOwn(connection, "hostOnly")) {
|
|
194
|
+
ctx.diagnostics.push({
|
|
195
|
+
severity: "error",
|
|
196
|
+
path: displayPath(ctx, entryPath),
|
|
197
|
+
message: "MCP connection `hostOnly` was removed. Files under `agent/mcp-connections/` are always visible to the model. Put privileged servers in `agent/host-connections/` so only host tools can call them.",
|
|
198
|
+
});
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
if (isInlineStdioConnection(connection) &&
|
|
202
|
+
connectionHasSpawnOrRemote(connection)) {
|
|
203
|
+
ctx.diagnostics.push({
|
|
204
|
+
severity: "error",
|
|
205
|
+
path: displayPath(ctx, entryPath),
|
|
206
|
+
message: "MCP connection `tools` cannot be combined with `command`, `url`, `agent`, or `cursorAccount`. Author TypeScript tools, or point at an existing server, not both.",
|
|
207
|
+
});
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
if (connection.auth !== undefined && typeof connection.auth !== "function") {
|
|
211
|
+
ctx.diagnostics.push({
|
|
212
|
+
severity: "error",
|
|
213
|
+
path: displayPath(ctx, entryPath),
|
|
214
|
+
message: "MCP connection `auth` must be a function: (session) => { headers }.",
|
|
215
|
+
});
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
if (connection.auth !== undefined && !("url" in connection)) {
|
|
219
|
+
ctx.diagnostics.push({
|
|
220
|
+
severity: "error",
|
|
221
|
+
path: displayPath(ctx, entryPath),
|
|
222
|
+
message: "MCP connection `auth` (per-session headers) is only supported on http/sse connections (`url`).",
|
|
223
|
+
});
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
if (connection.advertiseTools !== undefined &&
|
|
227
|
+
typeof connection.advertiseTools !== "boolean") {
|
|
228
|
+
ctx.diagnostics.push({
|
|
229
|
+
severity: "error",
|
|
230
|
+
path: displayPath(ctx, entryPath),
|
|
231
|
+
message: "MCP connection `advertiseTools` must be a boolean.",
|
|
232
|
+
});
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const parsedEffects = parseConnectionEffects(connection.effects);
|
|
236
|
+
if (!parsedEffects.ok) {
|
|
237
|
+
ctx.diagnostics.push({
|
|
238
|
+
severity: "error",
|
|
239
|
+
path: displayPath(ctx, entryPath),
|
|
240
|
+
message: 'MCP connection `effects` must be "read", "write", or a non-empty array of those.',
|
|
241
|
+
});
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
if (parsedEffects.value !== undefined && connection.advertiseTools !== true) {
|
|
245
|
+
ctx.diagnostics.push({
|
|
246
|
+
severity: "error",
|
|
247
|
+
path: displayPath(ctx, entryPath),
|
|
248
|
+
message: "MCP connection `effects` filters advertised tools; set `advertiseTools: true` or drop `effects`.",
|
|
249
|
+
});
|
|
250
|
+
return undefined;
|
|
251
|
+
}
|
|
252
|
+
const parsedTools = isInlineStdioConnection(connection)
|
|
253
|
+
? { ok: true, value: undefined }
|
|
254
|
+
: parseConnectionTools(connection.tools);
|
|
255
|
+
if (!parsedTools.ok) {
|
|
256
|
+
ctx.diagnostics.push({
|
|
257
|
+
severity: "error",
|
|
258
|
+
path: displayPath(ctx, entryPath),
|
|
259
|
+
message: "MCP connection `tools` allowlist must be a non-empty array of tool names.",
|
|
260
|
+
});
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
if (isInlineStdioConnection(connection) &&
|
|
264
|
+
connection.disallowedTools !== undefined) {
|
|
265
|
+
ctx.diagnostics.push({
|
|
266
|
+
severity: "error",
|
|
267
|
+
path: displayPath(ctx, entryPath),
|
|
268
|
+
message: "MCP connection `disallowedTools` is not supported on inline `tools` connections — author only the tools you want.",
|
|
269
|
+
});
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
const parsedDisallowed = isInlineStdioConnection(connection)
|
|
273
|
+
? { ok: true, value: undefined }
|
|
274
|
+
: parseConnectionTools(connection.disallowedTools);
|
|
275
|
+
if (!parsedDisallowed.ok) {
|
|
276
|
+
ctx.diagnostics.push({
|
|
277
|
+
severity: "error",
|
|
278
|
+
path: displayPath(ctx, entryPath),
|
|
279
|
+
message: "MCP connection `disallowedTools` must be a non-empty array of tool names.",
|
|
280
|
+
});
|
|
281
|
+
return undefined;
|
|
282
|
+
}
|
|
283
|
+
if ((parsedTools.value !== undefined || parsedDisallowed.value !== undefined) &&
|
|
284
|
+
role === "model" &&
|
|
285
|
+
connection.advertiseTools !== true) {
|
|
286
|
+
ctx.diagnostics.push({
|
|
287
|
+
severity: "error",
|
|
288
|
+
path: displayPath(ctx, entryPath),
|
|
289
|
+
message: "MCP connection `tools` / `disallowedTools` filter advertised tools; set `advertiseTools: true` or drop the name list. Put the connection in `agent/host-connections/` to restrict `host.mcp` only.",
|
|
290
|
+
});
|
|
291
|
+
return undefined;
|
|
292
|
+
}
|
|
293
|
+
if (connection.advertiseTools === true &&
|
|
294
|
+
isInlineStdioConnection(connection)) {
|
|
295
|
+
ctx.diagnostics.push({
|
|
296
|
+
severity: "error",
|
|
297
|
+
path: displayPath(ctx, entryPath),
|
|
298
|
+
message: "MCP connection `advertiseTools` is not supported on inline `tools` connections — author those as agent/tools/ server tools instead.",
|
|
299
|
+
});
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
if (connection.auth !== undefined &&
|
|
303
|
+
"url" in connection &&
|
|
304
|
+
connection.oauth === true) {
|
|
305
|
+
ctx.diagnostics.push({
|
|
306
|
+
severity: "error",
|
|
307
|
+
path: displayPath(ctx, entryPath),
|
|
308
|
+
message: "MCP connection `oauth: true` cannot be combined with `auth` (per-session headers): the host OAuth provider owns the Authorization header. Drop one of them.",
|
|
309
|
+
});
|
|
310
|
+
return undefined;
|
|
311
|
+
}
|
|
312
|
+
if (isInlineStdioConnection(connection)) {
|
|
313
|
+
return loadInlineStdioConnection(ctx, name, entryPath, connection);
|
|
314
|
+
}
|
|
315
|
+
if ("url" in connection &&
|
|
316
|
+
connection.oauth === true &&
|
|
317
|
+
hasAuthorizationHeader(connection.headers)) {
|
|
318
|
+
ctx.diagnostics.push({
|
|
319
|
+
severity: "error",
|
|
320
|
+
path: displayPath(ctx, entryPath),
|
|
321
|
+
message: "MCP connection `oauth: true` cannot set an Authorization header. Drop the header or remove `oauth`.",
|
|
322
|
+
});
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
if ("cursorAccount" in connection &&
|
|
326
|
+
connection.cursorAccount === true &&
|
|
327
|
+
cursorAccountServersHasMixedWildcard(connection.servers)) {
|
|
328
|
+
ctx.diagnostics.push({
|
|
329
|
+
severity: "error",
|
|
330
|
+
path: displayPath(ctx, entryPath),
|
|
331
|
+
message: 'Cursor account MCP connection `servers` cannot mix `"*"` with connector names. Use `"*"` / `["*"]` (or omit `servers`) for every connected server, or list only concrete connector names.',
|
|
332
|
+
});
|
|
333
|
+
return undefined;
|
|
334
|
+
}
|
|
335
|
+
const transport = connectionTransport(connection);
|
|
336
|
+
if (transport === undefined) {
|
|
337
|
+
ctx.diagnostics.push({
|
|
338
|
+
severity: "error",
|
|
339
|
+
path: displayPath(ctx, entryPath),
|
|
340
|
+
message: "MCP connections require a `url` (http/sse), a `command` (stdio), `tools` (TypeScript packaged as stdio), an `agent` (peer agent slug on the same serve host), or `cursorAccount: true` (the Cursor account's MCP connectors).",
|
|
341
|
+
});
|
|
342
|
+
return undefined;
|
|
343
|
+
}
|
|
344
|
+
if ("cursorAccount" in transport &&
|
|
345
|
+
transport.servers !== undefined &&
|
|
346
|
+
(transport.servers.length === 0 ||
|
|
347
|
+
transport.servers.some((server) => isBlank(server)))) {
|
|
348
|
+
ctx.diagnostics.push({
|
|
349
|
+
severity: "error",
|
|
350
|
+
path: displayPath(ctx, entryPath),
|
|
351
|
+
message: 'Cursor account MCP connection `servers` must be a non-empty list of connector names, `"*"` / `["*"]` for every connected server, or omitted for the same all-connectors behavior.',
|
|
352
|
+
});
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
if ("agent" in transport && !NAME_PATTERN.test(transport.agent)) {
|
|
356
|
+
ctx.diagnostics.push({
|
|
357
|
+
severity: "error",
|
|
358
|
+
path: displayPath(ctx, entryPath),
|
|
359
|
+
message: `Peer MCP connection agent "${transport.agent}" must be a mount slug matching ${NAME_PATTERN}.`,
|
|
360
|
+
});
|
|
361
|
+
return undefined;
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
name,
|
|
365
|
+
transport,
|
|
366
|
+
description: connection.description,
|
|
367
|
+
auth: connection.auth,
|
|
368
|
+
advertiseTools: connection.advertiseTools,
|
|
369
|
+
effects: parsedEffects.value,
|
|
370
|
+
tools: parsedTools.value,
|
|
371
|
+
disallowedTools: parsedDisallowed.value,
|
|
372
|
+
};
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
function loadInlineStdioConnection(ctx, name, entryPath, connection) {
|
|
376
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
377
|
+
const tools = connection.tools;
|
|
378
|
+
const names = Object.keys(tools);
|
|
379
|
+
if (names.length === 0) {
|
|
380
|
+
ctx.diagnostics.push({
|
|
381
|
+
severity: "error",
|
|
382
|
+
path: displayPath(ctx, entryPath),
|
|
383
|
+
message: "MCP connection `tools` must declare at least one tool.",
|
|
384
|
+
});
|
|
385
|
+
return undefined;
|
|
386
|
+
}
|
|
387
|
+
for (const toolName of names) {
|
|
388
|
+
if (!NAME_PATTERN.test(toolName)) {
|
|
389
|
+
ctx.diagnostics.push({
|
|
390
|
+
severity: "error",
|
|
391
|
+
path: displayPath(ctx, entryPath),
|
|
392
|
+
message: `MCP tool name "${toolName}" must match ${NAME_PATTERN}.`,
|
|
393
|
+
});
|
|
394
|
+
return undefined;
|
|
395
|
+
}
|
|
396
|
+
const tool = tools[toolName];
|
|
397
|
+
if (tool === undefined || isBlank(tool.description)) {
|
|
398
|
+
ctx.diagnostics.push({
|
|
399
|
+
severity: "error",
|
|
400
|
+
path: displayPath(ctx, entryPath),
|
|
401
|
+
message: `MCP tool "${toolName}" requires a non-empty description.`,
|
|
402
|
+
});
|
|
403
|
+
return undefined;
|
|
404
|
+
}
|
|
405
|
+
if (typeof tool.execute !== "function") {
|
|
406
|
+
ctx.diagnostics.push({
|
|
407
|
+
severity: "error",
|
|
408
|
+
path: displayPath(ctx, entryPath),
|
|
409
|
+
message: `MCP tool "${toolName}" requires an execute(input) function.`,
|
|
410
|
+
});
|
|
411
|
+
return undefined;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
try {
|
|
415
|
+
const transport = yield packageInlineStdioConnection({
|
|
416
|
+
name,
|
|
417
|
+
entryPath,
|
|
418
|
+
tools,
|
|
419
|
+
absWorkingDir: ctx.rootDir,
|
|
420
|
+
});
|
|
421
|
+
return {
|
|
422
|
+
name,
|
|
423
|
+
transport,
|
|
424
|
+
description: connection.description,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
ctx.diagnostics.push({
|
|
429
|
+
severity: "error",
|
|
430
|
+
path: displayPath(ctx, entryPath),
|
|
431
|
+
message: `Failed to package inline stdio MCP connection: ${errorMessage(error)}`,
|
|
432
|
+
});
|
|
433
|
+
return undefined;
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared discovery state: the loader options, the per-project context every loader receives, and the diagnostic helpers.
|
|
3
|
+
*/
|
|
4
|
+
import type { Diagnostic } from "../../types.js";
|
|
5
|
+
export interface LoadAgentProjectOptions {
|
|
6
|
+
/** Override the module loader (embedders / tests). */
|
|
7
|
+
importModule?: (absolutePath: string) => Promise<Record<string, unknown>>;
|
|
8
|
+
}
|
|
9
|
+
type ImportModule = (absolutePath: string) => Promise<Record<string, unknown>>;
|
|
10
|
+
export declare function defaultImportModule(absolutePath: string): Promise<Record<string, unknown>>;
|
|
11
|
+
export interface DiscoveryContext {
|
|
12
|
+
rootDir: string;
|
|
13
|
+
diagnostics: Diagnostic[];
|
|
14
|
+
importModule: ImportModule;
|
|
15
|
+
}
|
|
16
|
+
export declare function displayPath(ctx: DiscoveryContext, absolutePath: string): string;
|
|
17
|
+
export declare function errorMessage(error: unknown): string;
|
|
18
|
+
export declare function isBlank(value: unknown): boolean;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/internal/discovery/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3E;AAED,KAAK,YAAY,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/E,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,MAAM,GACnB,MAAM,CAGR;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE/C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared discovery state: the loader options, the per-project context every loader receives, and the diagnostic helpers.
|
|
3
|
+
*/
|
|
4
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
import { relative } from "node:path";
|
|
14
|
+
import { pathToFileURL } from "node:url";
|
|
15
|
+
import { toPosix } from "./fs.js";
|
|
16
|
+
export function defaultImportModule(absolutePath) {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
return (yield import(pathToFileURL(absolutePath).href));
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export function displayPath(ctx, absolutePath) {
|
|
22
|
+
const rel = relative(ctx.rootDir, absolutePath);
|
|
23
|
+
return rel.startsWith("..") ? absolutePath : toPosix(rel);
|
|
24
|
+
}
|
|
25
|
+
export function errorMessage(error) {
|
|
26
|
+
return error instanceof Error ? error.message : String(error);
|
|
27
|
+
}
|
|
28
|
+
export function isBlank(value) {
|
|
29
|
+
return typeof value !== "string" || value.trim() === "";
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A Cursor plugin directory read as an extension tree: skills, commands, agents, and MCP servers under the plugin's own names.
|
|
3
|
+
*/
|
|
4
|
+
import type { DiscoveredConnection, DiscoveredSkill } from "../../types.js";
|
|
5
|
+
import { type DiscoveryContext } from "./context.js";
|
|
6
|
+
/** One `agents/*.md` file: a subagent the plugin ships. */
|
|
7
|
+
export interface CursorPluginAgent {
|
|
8
|
+
name: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
/** Model id; absent inherits the parent agent's model. */
|
|
11
|
+
model?: string;
|
|
12
|
+
prompt: string;
|
|
13
|
+
}
|
|
14
|
+
/** What a plugin contributes, under its own (unprefixed) names. */
|
|
15
|
+
export interface CursorPluginTree {
|
|
16
|
+
description?: string;
|
|
17
|
+
/** `skills/` and `commands/`; a command is a user-invoked skill. */
|
|
18
|
+
skills: DiscoveredSkill[];
|
|
19
|
+
connections: DiscoveredConnection[];
|
|
20
|
+
/** Servers the plugin declares that the mount overlays; left uncompiled. */
|
|
21
|
+
overlaidServers: string[];
|
|
22
|
+
agents: CursorPluginAgent[];
|
|
23
|
+
}
|
|
24
|
+
export declare function readCursorPlugin(ctx: DiscoveryContext, root: string, mountPath: string, variables: Record<string, string>, overlaid: ReadonlySet<string>): Promise<CursorPluginTree | undefined>;
|
|
25
|
+
//# sourceMappingURL=cursor-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-plugin.d.ts","sourceRoot":"","sources":["../../../src/internal/discovery/cursor-plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAEV,oBAAoB,EACpB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,cAAc,CAAC;AAItB,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,4EAA4E;IAC5E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAoGD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAqCvC"}
|