@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,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/schedules/*.ts`: cron-driven runs.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { basename, extname, relative } from "node:path";
|
|
7
|
+
import type { DiscoveredSchedule, ScheduleDefinition } from "../../types.js";
|
|
8
|
+
import { isValidCron } from "../cron.js";
|
|
9
|
+
import { parseFrontmatter } from "../frontmatter.js";
|
|
10
|
+
import { type DiscoveryContext, displayPath } from "./context.js";
|
|
11
|
+
import { isDirectory, isModuleFile, toPosix, walkFiles } from "./fs.js";
|
|
12
|
+
import { importDefault } from "./modules.js";
|
|
13
|
+
|
|
14
|
+
export async function loadSchedules(
|
|
15
|
+
ctx: DiscoveryContext,
|
|
16
|
+
schedulesDir: string
|
|
17
|
+
): Promise<DiscoveredSchedule[]> {
|
|
18
|
+
if (!(await isDirectory(schedulesDir))) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const schedules: DiscoveredSchedule[] = [];
|
|
22
|
+
for (const filePath of await walkFiles(schedulesDir)) {
|
|
23
|
+
const rel = toPosix(relative(schedulesDir, filePath));
|
|
24
|
+
if (rel.endsWith(".md")) {
|
|
25
|
+
const name = rel.slice(0, -".md".length);
|
|
26
|
+
const { data, body } = parseFrontmatter(await readFile(filePath, "utf8"));
|
|
27
|
+
const cron = data.cron;
|
|
28
|
+
if (cron === undefined || !isValidCron(cron)) {
|
|
29
|
+
ctx.diagnostics.push({
|
|
30
|
+
severity: "error",
|
|
31
|
+
path: displayPath(ctx, filePath),
|
|
32
|
+
message:
|
|
33
|
+
cron === undefined
|
|
34
|
+
? "Markdown schedules require `cron` frontmatter."
|
|
35
|
+
: `Invalid cron expression: "${cron}".`,
|
|
36
|
+
});
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const markdown = body.trim();
|
|
40
|
+
if (markdown === "") {
|
|
41
|
+
ctx.diagnostics.push({
|
|
42
|
+
severity: "error",
|
|
43
|
+
path: displayPath(ctx, filePath),
|
|
44
|
+
message: "Markdown schedules require a non-empty prompt body.",
|
|
45
|
+
});
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
schedules.push({
|
|
49
|
+
name,
|
|
50
|
+
cron,
|
|
51
|
+
kind: "markdown",
|
|
52
|
+
definition: {
|
|
53
|
+
__agentServe: "schedule",
|
|
54
|
+
cron,
|
|
55
|
+
markdown,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (!isModuleFile(basename(filePath))) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const name = rel.slice(0, -extname(rel).length);
|
|
65
|
+
const definition = await importDefault(ctx, filePath, "schedule");
|
|
66
|
+
if (definition === undefined) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const schedule = definition as ScheduleDefinition;
|
|
70
|
+
if ((schedule.markdown === undefined) === (schedule.run === undefined)) {
|
|
71
|
+
ctx.diagnostics.push({
|
|
72
|
+
severity: "error",
|
|
73
|
+
path: displayPath(ctx, filePath),
|
|
74
|
+
message: "Schedules require exactly one of `markdown` or `run`.",
|
|
75
|
+
});
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!isValidCron(schedule.cron)) {
|
|
79
|
+
ctx.diagnostics.push({
|
|
80
|
+
severity: "error",
|
|
81
|
+
path: displayPath(ctx, filePath),
|
|
82
|
+
message: `Invalid cron expression: "${schedule.cron}".`,
|
|
83
|
+
});
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
schedules.push({
|
|
87
|
+
name,
|
|
88
|
+
cron: schedule.cron,
|
|
89
|
+
kind: schedule.run === undefined ? "markdown" : "run",
|
|
90
|
+
definition: schedule,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return schedules;
|
|
94
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/sandbox/workspace/**`: files seeded into each local session workspace.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { join, relative } from "node:path";
|
|
6
|
+
import type { SeedFile } from "../../types.js";
|
|
7
|
+
import { type DiscoveryContext, displayPath } from "./context.js";
|
|
8
|
+
import { isDirectory, isFile, toPosix, walkFiles } from "./fs.js";
|
|
9
|
+
|
|
10
|
+
export async function loadSeedFiles(
|
|
11
|
+
ctx: DiscoveryContext,
|
|
12
|
+
agentDir: string
|
|
13
|
+
): Promise<SeedFile[]> {
|
|
14
|
+
const sandboxDir = join(agentDir, "sandbox");
|
|
15
|
+
for (const candidate of ["sandbox.ts", join("sandbox", "sandbox.ts")]) {
|
|
16
|
+
if (await isFile(join(agentDir, candidate))) {
|
|
17
|
+
ctx.diagnostics.push({
|
|
18
|
+
severity: "warning",
|
|
19
|
+
path: displayPath(ctx, join(agentDir, candidate)),
|
|
20
|
+
message:
|
|
21
|
+
"Custom sandbox backends are not supported; the agent runs in the session workspace directory. Ignoring.",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const workspaceDir = join(sandboxDir, "workspace");
|
|
26
|
+
if (!(await isDirectory(workspaceDir))) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const seedFiles: SeedFile[] = [];
|
|
30
|
+
for (const filePath of await walkFiles(workspaceDir)) {
|
|
31
|
+
seedFiles.push({
|
|
32
|
+
relativePath: toPosix(relative(workspaceDir, filePath)),
|
|
33
|
+
sourcePath: filePath,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return seedFiles;
|
|
37
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/storage.ts`, `agent/otel.ts`, `agent/artifacts.ts`: host services the agent configures.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import type { OtelDefinition } from "../../otel.js";
|
|
7
|
+
import type { StorageDefinition } from "../../storage.js";
|
|
8
|
+
import type {
|
|
9
|
+
AgentArchitecture,
|
|
10
|
+
ArtifactsDefinition,
|
|
11
|
+
ResolvedAgent,
|
|
12
|
+
} from "../../types.js";
|
|
13
|
+
import {
|
|
14
|
+
artifactBuiltinTool,
|
|
15
|
+
TAG_ARTIFACT_TOOL_NAME,
|
|
16
|
+
} from "../builtin-tools/index.js";
|
|
17
|
+
import { type DiscoveryContext, displayPath } from "./context.js";
|
|
18
|
+
import { findModuleFile } from "./fs.js";
|
|
19
|
+
import { importDefault } from "./modules.js";
|
|
20
|
+
|
|
21
|
+
export async function loadStorage(
|
|
22
|
+
ctx: DiscoveryContext,
|
|
23
|
+
agentDir: string,
|
|
24
|
+
architecture: AgentArchitecture | undefined
|
|
25
|
+
): Promise<StorageDefinition | undefined> {
|
|
26
|
+
const path = await findModuleFile(agentDir, "storage");
|
|
27
|
+
if (path === undefined) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
if (architecture === "v2") {
|
|
31
|
+
// Storage is a hosting-mode decision on v2, made by
|
|
32
|
+
// framework-storage-selection.ts: the state root when self-hosted,
|
|
33
|
+
// Cursor-managed storage on Cursor hosting. Fail early (error
|
|
34
|
+
// diagnostics refuse serve and deploy) rather than silently running
|
|
35
|
+
// with storage the author believes they configured. Not imported.
|
|
36
|
+
ctx.diagnostics.push({
|
|
37
|
+
severity: "error",
|
|
38
|
+
path: displayPath(ctx, path),
|
|
39
|
+
message:
|
|
40
|
+
'agent/storage.ts is not supported on architecture "v2": the platform selects storage (the local state root when self-hosted; Cursor-managed storage on Cursor hosting). Delete the file.',
|
|
41
|
+
});
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
// v1 keeps loading the authored sink, with notice: defineStorage is going
|
|
45
|
+
// away with the v1 control plane.
|
|
46
|
+
ctx.diagnostics.push({
|
|
47
|
+
severity: "warning",
|
|
48
|
+
path: displayPath(ctx, path),
|
|
49
|
+
message:
|
|
50
|
+
'agent/storage.ts (defineStorage) is deprecated and going away: architecture "v2" selects storage automatically (the local state root when self-hosted; Cursor-managed storage on Cursor hosting). Still honored on v1.',
|
|
51
|
+
});
|
|
52
|
+
const definition = await importDefault(ctx, path, "storage");
|
|
53
|
+
return definition as StorageDefinition | undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function loadOtel(
|
|
57
|
+
ctx: DiscoveryContext,
|
|
58
|
+
agentDir: string
|
|
59
|
+
): Promise<OtelDefinition | undefined> {
|
|
60
|
+
const path = await findModuleFile(agentDir, "otel");
|
|
61
|
+
if (path === undefined) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const definition = await importDefault(ctx, path, "otel");
|
|
65
|
+
return definition as OtelDefinition | undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export async function loadArtifacts(
|
|
69
|
+
ctx: DiscoveryContext,
|
|
70
|
+
agentDir: string
|
|
71
|
+
): Promise<ArtifactsDefinition | undefined> {
|
|
72
|
+
const path = await findModuleFile(agentDir, "artifacts");
|
|
73
|
+
if (path === undefined) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const imported = await importDefault(ctx, path, "artifacts");
|
|
77
|
+
if (imported === undefined) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
const definition = imported as ArtifactsDefinition;
|
|
81
|
+
if (
|
|
82
|
+
definition.agentTool === true &&
|
|
83
|
+
Object.keys(definition.kinds ?? {}).length === 0
|
|
84
|
+
) {
|
|
85
|
+
ctx.diagnostics.push({
|
|
86
|
+
severity: "error",
|
|
87
|
+
path: displayPath(ctx, path),
|
|
88
|
+
message:
|
|
89
|
+
"artifacts.agentTool requires kinds: the tag_artifact tool needs at least one declared kind; its descriptions are the tool prompt.",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return definition;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Materialize the `tag_artifact` built-in when `defineArtifacts` set
|
|
97
|
+
* `agentTool: true`. Appended after `loadAgent` because the tool is
|
|
98
|
+
* generated from the artifacts kinds registry, not `AgentConfig.builtinTools`.
|
|
99
|
+
*/
|
|
100
|
+
export async function appendArtifactTool(
|
|
101
|
+
ctx: DiscoveryContext,
|
|
102
|
+
agentDir: string,
|
|
103
|
+
agent: ResolvedAgent,
|
|
104
|
+
artifacts: ArtifactsDefinition | undefined
|
|
105
|
+
): Promise<void> {
|
|
106
|
+
const tool = artifactBuiltinTool(artifacts);
|
|
107
|
+
if (tool === undefined) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const artifactsPath = displayPath(
|
|
111
|
+
ctx,
|
|
112
|
+
(await findModuleFile(agentDir, "artifacts")) ??
|
|
113
|
+
join(agentDir, "artifacts.ts")
|
|
114
|
+
);
|
|
115
|
+
if (agent.tools.some((t) => t.name === TAG_ARTIFACT_TOOL_NAME)) {
|
|
116
|
+
ctx.diagnostics.push({
|
|
117
|
+
severity: "warning",
|
|
118
|
+
path: artifactsPath,
|
|
119
|
+
message: `Authored tool "${TAG_ARTIFACT_TOOL_NAME}" shadows the built-in tool of the same name; the authored tool wins.`,
|
|
120
|
+
});
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
agent.tools.push(tool);
|
|
124
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/skills/*`: markdown, packaged, and `defineSkill` skills.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { join, relative } from "node:path";
|
|
7
|
+
import type {
|
|
8
|
+
DiscoveredSkill,
|
|
9
|
+
SkillConfig,
|
|
10
|
+
SkillDefinition,
|
|
11
|
+
SkillFileSource,
|
|
12
|
+
} from "../../types.js";
|
|
13
|
+
import { parseFrontmatter } from "../frontmatter.js";
|
|
14
|
+
import { type DiscoveryContext, displayPath, isBlank } from "./context.js";
|
|
15
|
+
import {
|
|
16
|
+
isDirectory,
|
|
17
|
+
isFile,
|
|
18
|
+
isModuleFile,
|
|
19
|
+
moduleStem,
|
|
20
|
+
sortedEntries,
|
|
21
|
+
toPosix,
|
|
22
|
+
walkFiles,
|
|
23
|
+
} from "./fs.js";
|
|
24
|
+
import { importDefault } from "./modules.js";
|
|
25
|
+
import { validateName } from "./names.js";
|
|
26
|
+
|
|
27
|
+
/** Declared frontmatter, else the body's first line, else a generic line. */
|
|
28
|
+
export function skillDescription(
|
|
29
|
+
name: string,
|
|
30
|
+
declared: string | undefined,
|
|
31
|
+
body: string
|
|
32
|
+
): string {
|
|
33
|
+
return (
|
|
34
|
+
declared ??
|
|
35
|
+
deriveSkillDescription(body) ??
|
|
36
|
+
`Instructions for the ${name} skill.`
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** A packaged skill's sibling files, keyed by path relative to the skill dir. */
|
|
41
|
+
export async function skillFiles(
|
|
42
|
+
skillDir: string
|
|
43
|
+
): Promise<Record<string, SkillFileSource>> {
|
|
44
|
+
const files: Record<string, SkillFileSource> = {};
|
|
45
|
+
for (const filePath of await walkFiles(skillDir)) {
|
|
46
|
+
const rel = toPosix(relative(skillDir, filePath));
|
|
47
|
+
if (rel !== "SKILL.md") {
|
|
48
|
+
files[rel] = { sourcePath: filePath };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function loadSkills(
|
|
55
|
+
ctx: DiscoveryContext,
|
|
56
|
+
skillsDir: string
|
|
57
|
+
): Promise<DiscoveredSkill[]> {
|
|
58
|
+
if (!(await isDirectory(skillsDir))) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const skills: DiscoveredSkill[] = [];
|
|
62
|
+
for (const entry of await sortedEntries(skillsDir)) {
|
|
63
|
+
const entryPath = join(skillsDir, entry.name);
|
|
64
|
+
if (entry.isDirectory()) {
|
|
65
|
+
const skill = await loadPackagedSkill(ctx, entryPath, entry.name);
|
|
66
|
+
if (skill !== undefined) {
|
|
67
|
+
skills.push(skill);
|
|
68
|
+
}
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!entry.isFile()) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (entry.name.endsWith(".md")) {
|
|
75
|
+
const name = entry.name.slice(0, -".md".length);
|
|
76
|
+
if (!validateName(ctx, "skill", name, entryPath)) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const { data, body } = parseFrontmatter(
|
|
80
|
+
await readFile(entryPath, "utf8")
|
|
81
|
+
);
|
|
82
|
+
skills.push({
|
|
83
|
+
name,
|
|
84
|
+
description: skillDescription(name, data.description, body),
|
|
85
|
+
markdown: body.trim(),
|
|
86
|
+
files: {},
|
|
87
|
+
});
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (isModuleFile(entry.name)) {
|
|
91
|
+
const name = moduleStem(entry.name);
|
|
92
|
+
if (!validateName(ctx, "skill", name, entryPath)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const definition = await importDefault(ctx, entryPath, "skill");
|
|
96
|
+
if (definition === undefined) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
skills.push(compileSkill(name, definition as SkillDefinition));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return skills;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** A skill whose body and sibling files are in memory (`defineSkill`, extensions). */
|
|
106
|
+
function compileSkill(name: string, skill: SkillConfig): DiscoveredSkill {
|
|
107
|
+
const files: Record<string, SkillFileSource> = {};
|
|
108
|
+
for (const [rel, contents] of Object.entries(skill.files ?? {})) {
|
|
109
|
+
files[rel] = { contents };
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
name,
|
|
113
|
+
description: skillDescription(name, skill.description, skill.markdown),
|
|
114
|
+
markdown: skill.markdown.trim(),
|
|
115
|
+
files,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function loadPackagedSkill(
|
|
120
|
+
ctx: DiscoveryContext,
|
|
121
|
+
skillDir: string,
|
|
122
|
+
name: string
|
|
123
|
+
): Promise<DiscoveredSkill | undefined> {
|
|
124
|
+
const skillMdPath = join(skillDir, "SKILL.md");
|
|
125
|
+
if (!(await isFile(skillMdPath))) {
|
|
126
|
+
ctx.diagnostics.push({
|
|
127
|
+
severity: "warning",
|
|
128
|
+
path: displayPath(ctx, skillDir),
|
|
129
|
+
message: "Skill directories must contain a SKILL.md; ignoring.",
|
|
130
|
+
});
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
if (!validateName(ctx, "skill", name, skillDir)) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
const { data, body } = parseFrontmatter(await readFile(skillMdPath, "utf8"));
|
|
137
|
+
if (data.description === undefined || isBlank(data.description)) {
|
|
138
|
+
ctx.diagnostics.push({
|
|
139
|
+
severity: "error",
|
|
140
|
+
path: displayPath(ctx, skillMdPath),
|
|
141
|
+
message:
|
|
142
|
+
"Packaged skills require `description` frontmatter in SKILL.md (there is no filename slug to fall back on).",
|
|
143
|
+
});
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
name,
|
|
149
|
+
description: data.description,
|
|
150
|
+
markdown: body.trim(),
|
|
151
|
+
files: await skillFiles(skillDir),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Advertise the first non-empty, non-code-fence line of the body, with any
|
|
157
|
+
* leading `#`, `>`, `*`, or `-` markers stripped.
|
|
158
|
+
*/
|
|
159
|
+
export function deriveSkillDescription(markdown: string): string | undefined {
|
|
160
|
+
let inFence = false;
|
|
161
|
+
for (const rawLine of markdown.split(/\r?\n/)) {
|
|
162
|
+
const line = rawLine.trim();
|
|
163
|
+
if (line.startsWith("```")) {
|
|
164
|
+
inFence = !inFence;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (inFence || line === "") {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const stripped = line.replace(/^[#>*\s-]+/, "").trim();
|
|
171
|
+
if (stripped !== "") {
|
|
172
|
+
return stripped.length > 200 ? `${stripped.slice(0, 197)}...` : stripped;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A subagent as the Cursor harness runs it: description, model, and prompt. Its other slots are inert.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ModelSetting, ResolvedAgent } from "../../types.js";
|
|
6
|
+
import { withIdentityPreamble } from "../workspace.js";
|
|
7
|
+
|
|
8
|
+
interface SubagentFields {
|
|
9
|
+
description?: string;
|
|
10
|
+
model?: ModelSetting;
|
|
11
|
+
/** Authored prompt; the identity preamble is prepended. */
|
|
12
|
+
prompt?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function subagent(name: string, fields: SubagentFields): ResolvedAgent {
|
|
16
|
+
return {
|
|
17
|
+
name,
|
|
18
|
+
description: fields.description,
|
|
19
|
+
model: fields.model,
|
|
20
|
+
instructions: withIdentityPreamble(name, fields.prompt),
|
|
21
|
+
runtime: "local",
|
|
22
|
+
tools: [],
|
|
23
|
+
skills: [],
|
|
24
|
+
connections: [],
|
|
25
|
+
hostConnections: [],
|
|
26
|
+
subagents: [],
|
|
27
|
+
seedFiles: [],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/tools/*.ts`: typed tools and the built-in tools appended after them.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import type {
|
|
7
|
+
BuiltinToolsConfig,
|
|
8
|
+
DiscoveredTool,
|
|
9
|
+
ToolDefinition,
|
|
10
|
+
ToolEffect,
|
|
11
|
+
} from "../../types.js";
|
|
12
|
+
import { builtinTools } from "../builtin-tools/index.js";
|
|
13
|
+
import { toolInputJsonSchema, toolOutputJsonSchema } from "../json-schema.js";
|
|
14
|
+
import {
|
|
15
|
+
type DiscoveryContext,
|
|
16
|
+
displayPath,
|
|
17
|
+
errorMessage,
|
|
18
|
+
isBlank,
|
|
19
|
+
} from "./context.js";
|
|
20
|
+
import { importDefault, moduleEntries } from "./modules.js";
|
|
21
|
+
|
|
22
|
+
export async function loadTools(
|
|
23
|
+
ctx: DiscoveryContext,
|
|
24
|
+
toolsDir: string
|
|
25
|
+
): Promise<DiscoveredTool[]> {
|
|
26
|
+
const tools: DiscoveredTool[] = [];
|
|
27
|
+
for (const { name, path } of await moduleEntries(ctx, toolsDir, "tool")) {
|
|
28
|
+
const definition = await importDefault(ctx, path, "tool");
|
|
29
|
+
if (definition === undefined) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const tool = compileTool(ctx, path, name, definition as ToolDefinition);
|
|
33
|
+
if (tool !== undefined) {
|
|
34
|
+
tools.push(tool);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return tools;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Validate one tool definition against the tool contract and convert its
|
|
42
|
+
* schemas. Diagnostics point at `entryPath` (the authored file, or the
|
|
43
|
+
* extension mount that contributed the tool).
|
|
44
|
+
*/
|
|
45
|
+
export function compileTool(
|
|
46
|
+
ctx: DiscoveryContext,
|
|
47
|
+
entryPath: string,
|
|
48
|
+
name: string,
|
|
49
|
+
tool: ToolDefinition
|
|
50
|
+
): DiscoveredTool | undefined {
|
|
51
|
+
if (isBlank(tool.description)) {
|
|
52
|
+
ctx.diagnostics.push({
|
|
53
|
+
severity: "error",
|
|
54
|
+
path: displayPath(ctx, entryPath),
|
|
55
|
+
message: "Tools require a non-empty description.",
|
|
56
|
+
});
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const execution = tool.execution === "agent" ? "agent" : "server";
|
|
60
|
+
const needsApprovalConfigured =
|
|
61
|
+
tool.needsApproval === true || typeof tool.needsApproval === "function";
|
|
62
|
+
const effect = declaredEffect(tool);
|
|
63
|
+
if (execution === "agent") {
|
|
64
|
+
if (isBlank(tool.script)) {
|
|
65
|
+
ctx.diagnostics.push({
|
|
66
|
+
severity: "error",
|
|
67
|
+
path: displayPath(ctx, entryPath),
|
|
68
|
+
message:
|
|
69
|
+
'Tools with execution: "agent" require a non-empty `script` (shell body; JSON on stdin, result on stdout).',
|
|
70
|
+
});
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
if (typeof tool.execute === "function") {
|
|
74
|
+
ctx.diagnostics.push({
|
|
75
|
+
severity: "warning",
|
|
76
|
+
path: displayPath(ctx, entryPath),
|
|
77
|
+
message:
|
|
78
|
+
'`execute` is ignored when execution is "agent"; the Cursor agent runs `script` instead.',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (needsApprovalConfigured) {
|
|
82
|
+
ctx.diagnostics.push({
|
|
83
|
+
severity: "error",
|
|
84
|
+
path: displayPath(ctx, entryPath),
|
|
85
|
+
message:
|
|
86
|
+
'`needsApproval` is only supported for execution: "server" tools (in-process).',
|
|
87
|
+
});
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
} else if (typeof tool.execute !== "function") {
|
|
91
|
+
ctx.diagnostics.push({
|
|
92
|
+
severity: "error",
|
|
93
|
+
path: displayPath(ctx, entryPath),
|
|
94
|
+
message:
|
|
95
|
+
'Tools require an execute(input, ctx) function (or set execution: "agent" with a script).',
|
|
96
|
+
});
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
let inputSchema: DiscoveredTool["inputSchema"];
|
|
100
|
+
try {
|
|
101
|
+
inputSchema = toolInputJsonSchema(tool.inputSchema);
|
|
102
|
+
} catch (error) {
|
|
103
|
+
ctx.diagnostics.push({
|
|
104
|
+
severity: "error",
|
|
105
|
+
path: displayPath(ctx, entryPath),
|
|
106
|
+
message: `Failed to convert inputSchema to JSON Schema: ${errorMessage(error)}`,
|
|
107
|
+
});
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
let outputSchema: DiscoveredTool["outputSchema"];
|
|
111
|
+
try {
|
|
112
|
+
outputSchema = toolOutputJsonSchema(tool.outputSchema);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
ctx.diagnostics.push({
|
|
115
|
+
severity: "error",
|
|
116
|
+
path: displayPath(ctx, entryPath),
|
|
117
|
+
message: `Failed to convert outputSchema to JSON Schema: ${errorMessage(error)}`,
|
|
118
|
+
});
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
name,
|
|
123
|
+
description: tool.description,
|
|
124
|
+
inputSchema,
|
|
125
|
+
outputSchema,
|
|
126
|
+
execution,
|
|
127
|
+
needsApproval: needsApprovalConfigured,
|
|
128
|
+
effect,
|
|
129
|
+
script: execution === "agent" ? tool.script : undefined,
|
|
130
|
+
definition: tool,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Static view of a tool's `effect` for the manifest: the literal when it is
|
|
136
|
+
* one, `"dynamic"` for a per-call predicate, `undefined` when undeclared. A
|
|
137
|
+
* malformed value is left undeclared rather than guessed — undeclared is the
|
|
138
|
+
* safe state (a dry run stubs it), where a guess could be the unsafe one.
|
|
139
|
+
*/
|
|
140
|
+
function declaredEffect(
|
|
141
|
+
tool: ToolDefinition
|
|
142
|
+
): ToolEffect | "dynamic" | undefined {
|
|
143
|
+
if (typeof tool.effect === "function") {
|
|
144
|
+
return "dynamic";
|
|
145
|
+
}
|
|
146
|
+
return tool.effect === "read" || tool.effect === "write"
|
|
147
|
+
? tool.effect
|
|
148
|
+
: undefined;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Append enabled built-in tools after authored tools. Authored tools with
|
|
153
|
+
* the same name win.
|
|
154
|
+
*/
|
|
155
|
+
export function appendBuiltinTools(
|
|
156
|
+
ctx: DiscoveryContext,
|
|
157
|
+
agentDir: string,
|
|
158
|
+
tools: DiscoveredTool[],
|
|
159
|
+
config: BuiltinToolsConfig | undefined
|
|
160
|
+
): void {
|
|
161
|
+
const builtin = builtinTools(config);
|
|
162
|
+
if (builtin.length === 0) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const agentPath = displayPath(ctx, join(agentDir, "agent.ts"));
|
|
166
|
+
for (const tool of builtin) {
|
|
167
|
+
const existing = tools.find((t) => t.name === tool.name);
|
|
168
|
+
if (existing !== undefined) {
|
|
169
|
+
const owner =
|
|
170
|
+
existing.extension === undefined
|
|
171
|
+
? "Authored"
|
|
172
|
+
: `Extension "${existing.extension}"`;
|
|
173
|
+
ctx.diagnostics.push({
|
|
174
|
+
severity: "warning",
|
|
175
|
+
path: agentPath,
|
|
176
|
+
message: `${owner} tool "${tool.name}" shadows the built-in tool of the same name; the built-in is skipped.`,
|
|
177
|
+
});
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
tools.push(tool);
|
|
181
|
+
}
|
|
182
|
+
}
|