@cursor/july 0.1.101 → 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/channels/slack/api.d.ts +1 -1
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +3 -1
- package/dist/channels/slack/assistant.d.ts +1 -1
- package/dist/channels/slack/assistant.d.ts.map +1 -1
- 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/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +2 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.BASO9Kih.js → app.CLA03RCz.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.FAqdWIXo.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.DwkqxoE0.js → VPLocalSearchBox.ifxv-cJV.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CCil_13e.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_extensions.md.9WQMZe1l.js +56 -0
- package/dist/docs/assets/reference_extensions.md.9WQMZe1l.lean.js +1 -0
- 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 +321 -4
- 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 +4 -4
- 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 +4 -4
- 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 +9 -7
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +9 -7
- 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/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/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 +21 -7
- 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.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +14 -38
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- 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/{follow_up.js → reply.js} +12 -14
- package/dist/extensions.d.ts +38 -14
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +49 -12
- 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 +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- 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-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/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 -2505
- package/dist/internal/framework-file-storage.js +6 -6
- 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/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +37 -20
- 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/session-engine.d.ts +5 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +68 -32
- package/dist/internal/session-run-log.d.ts +2 -1
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +13 -14
- package/dist/internal/start-log-store.d.ts +1 -1
- package/dist/internal/start-log-store.d.ts.map +1 -1
- package/dist/internal/start-log-store.js +12 -14
- 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/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/index.html +2 -2
- package/dist/storage-protocol.d.ts +24 -23
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +68 -65
- 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 +39 -3
- package/dist/types.d.ts.map +1 -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/extensions.md +205 -0
- 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 +1 -1
- package/skills/framework-map/SKILL.md +1 -0
- package/src/channels/slack/api.ts +4 -2
- package/src/channels/slack/assistant.ts +1 -1
- package/src/channels/slack/dispatch.ts +27 -2
- package/src/channels/slack/inbound.ts +37 -0
- package/src/channels/slack/manifest.ts +2 -1
- package/src/extensions/cursor-cloud-agents/extension.ts +9 -7
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +395 -0
- package/src/extensions/cursor-cloud-agents/lib/inputs.ts +5 -0
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +23 -0
- package/src/extensions/cursor-cloud-agents/skills/handoff.md +21 -7
- 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 +22 -42
- package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
- package/src/extensions/cursor-cloud-agents/tools/reply.ts +34 -0
- package/src/extensions.ts +55 -12
- package/src/files-backends/cursor-hosted.ts +1 -17
- package/src/files.ts +43 -34
- package/src/index.ts +10 -1
- package/src/internal/conversation-mirror.ts +23 -18
- package/src/internal/cursor/backend-client.ts +32 -10
- package/src/internal/cursor/hosted-store-secrets.ts +27 -0
- 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 -3081
- package/src/internal/framework-file-storage.ts +6 -6
- package/src/internal/framework-storage-selection.ts +9 -9
- package/src/internal/frontmatter.ts +36 -3
- package/src/internal/mcp-host.ts +84 -31
- 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/session-engine.ts +96 -11
- package/src/internal/session-run-log.ts +17 -16
- package/src/internal/start-log-store.ts +13 -16
- package/src/internal/storage-coordinator.ts +19 -16
- package/src/internal/tool-catalog.ts +9 -6
- 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 +101 -91
- package/src/storage.ts +4 -0
- package/src/tools.ts +18 -0
- package/src/types.ts +43 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.DbFXINq2.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/extensions/cursor-cloud-agents/lib/cloud.d.ts +0 -30
- package/dist/extensions/cursor-cloud-agents/lib/cloud.d.ts.map +0 -1
- package/dist/extensions/cursor-cloud-agents/lib/cloud.js +0 -45
- package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts +0 -4
- package/dist/extensions/cursor-cloud-agents/tools/follow_up.d.ts.map +0 -1
- package/dist/extensions/cursor-cloud-agents/tools/status.d.ts +0 -4
- package/dist/extensions/cursor-cloud-agents/tools/status.d.ts.map +0 -1
- package/dist/extensions/cursor-cloud-agents/tools/status.js +0 -41
- package/dist/playground/assets/index-DBQCwFp0.css +0 -1
- package/src/extensions/cursor-cloud-agents/lib/cloud.ts +0 -79
- package/src/extensions/cursor-cloud-agents/tools/follow_up.ts +0 -29
- package/src/extensions/cursor-cloud-agents/tools/status.ts +0 -39
- /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_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
- /package/dist/playground/assets/{index-BnNN1-EK.js → index-ZqNoT8Ie.js} +0 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Minimal Connect-JSON client for the handful of `aiserver.v1.DashboardService`
|
|
3
3
|
* RPCs agent-serve needs — `GetMe`, `ListSandMcpTools`, `ExecuteSandMcpTool`,
|
|
4
4
|
* and the login-time key lifecycle (`CreateUserApiKey`, `ListUserApiKeys`,
|
|
5
|
-
* `RevokeUserApiKey`).
|
|
5
|
+
* `RevokeUserApiKey`) — plus {@link CursorBackendClient.serviceRpc} for the
|
|
6
|
+
* odd unary call on another `aiserver.v1` service under the same token.
|
|
6
7
|
*
|
|
7
8
|
* Plain `fetch` POSTs with proto-JSON bodies and zod-validated responses:
|
|
8
9
|
* agent-serve is a published package and should not pull the generated
|
|
@@ -25,7 +26,7 @@ import {
|
|
|
25
26
|
} from "./session-token.js";
|
|
26
27
|
|
|
27
28
|
const CLIENT_VERSION = "agent-serve-0.1.0";
|
|
28
|
-
const
|
|
29
|
+
const DASHBOARD_SERVICE = "DashboardService";
|
|
29
30
|
const LIST_TIMEOUT_MS = 60_000;
|
|
30
31
|
/** Backend-executed tools call out to third-party servers; be generous. */
|
|
31
32
|
const EXECUTE_TIMEOUT_MS = 120_000;
|
|
@@ -235,9 +236,10 @@ export interface AccountMcpCallResult {
|
|
|
235
236
|
// ============================================================================
|
|
236
237
|
|
|
237
238
|
/** One DashboardService Connect-JSON POST; auth is the caller's bearer. */
|
|
238
|
-
async function
|
|
239
|
+
async function connectRpc(args: {
|
|
239
240
|
fetchImpl: typeof fetch;
|
|
240
241
|
backendUrl: string;
|
|
242
|
+
service: string;
|
|
241
243
|
method: string;
|
|
242
244
|
bearer: string;
|
|
243
245
|
body: unknown;
|
|
@@ -246,7 +248,7 @@ async function dashboardRpc(args: {
|
|
|
246
248
|
}): Promise<Response> {
|
|
247
249
|
try {
|
|
248
250
|
return await args.fetchImpl(
|
|
249
|
-
`${args.backendUrl}
|
|
251
|
+
`${args.backendUrl}/aiserver.v1.${args.service}/${args.method}`,
|
|
250
252
|
{
|
|
251
253
|
method: "POST",
|
|
252
254
|
headers: {
|
|
@@ -485,20 +487,36 @@ export class CursorBackendClient {
|
|
|
485
487
|
return githubTokenResponseSchema.parse(parsed);
|
|
486
488
|
}
|
|
487
489
|
|
|
490
|
+
/**
|
|
491
|
+
* One unary Connect-JSON call on `aiserver.v1.<service>` with the same
|
|
492
|
+
* token exchange and 401 retry as the dashboard RPCs. Callers parse the
|
|
493
|
+
* proto-JSON response themselves.
|
|
494
|
+
*/
|
|
495
|
+
serviceRpc(
|
|
496
|
+
service: string,
|
|
497
|
+
method: string,
|
|
498
|
+
body: unknown,
|
|
499
|
+
timeoutMs: number = LIST_TIMEOUT_MS
|
|
500
|
+
): Promise<unknown> {
|
|
501
|
+
return this.rpc(method, body, timeoutMs, { service });
|
|
502
|
+
}
|
|
503
|
+
|
|
488
504
|
private async rpc(
|
|
489
505
|
method: string,
|
|
490
506
|
body: unknown,
|
|
491
507
|
timeoutMs = LIST_TIMEOUT_MS,
|
|
492
|
-
options?: { teamId?: number }
|
|
508
|
+
options?: { teamId?: number; service?: string }
|
|
493
509
|
): Promise<unknown> {
|
|
510
|
+
const service = options?.service ?? DASHBOARD_SERVICE;
|
|
494
511
|
const extraHeaders =
|
|
495
512
|
options?.teamId === undefined
|
|
496
513
|
? undefined
|
|
497
514
|
: { "x-cursor-team-id": String(options.teamId) };
|
|
498
515
|
const bearer = await this.getAccessToken();
|
|
499
|
-
const first = await
|
|
516
|
+
const first = await connectRpc({
|
|
500
517
|
fetchImpl: this.fetchImpl,
|
|
501
518
|
backendUrl: this.backendUrl,
|
|
519
|
+
service,
|
|
502
520
|
method,
|
|
503
521
|
bearer,
|
|
504
522
|
body,
|
|
@@ -516,9 +534,10 @@ export class CursorBackendClient {
|
|
|
516
534
|
this.token = undefined;
|
|
517
535
|
}
|
|
518
536
|
const retryBearer = await this.getAccessToken();
|
|
519
|
-
const second = await
|
|
537
|
+
const second = await connectRpc({
|
|
520
538
|
fetchImpl: this.fetchImpl,
|
|
521
539
|
backendUrl: this.backendUrl,
|
|
540
|
+
service,
|
|
522
541
|
method,
|
|
523
542
|
bearer: retryBearer,
|
|
524
543
|
body,
|
|
@@ -612,11 +631,12 @@ export async function createUserApiKeyWithSessionToken(args: {
|
|
|
612
631
|
keyName: string;
|
|
613
632
|
fetchImpl?: typeof fetch;
|
|
614
633
|
}): Promise<string> {
|
|
615
|
-
const response = await
|
|
634
|
+
const response = await connectRpc({
|
|
616
635
|
fetchImpl: args.fetchImpl ?? fetch,
|
|
617
636
|
backendUrl: args.backendUrl.endsWith("/")
|
|
618
637
|
? args.backendUrl.slice(0, -1)
|
|
619
638
|
: args.backendUrl,
|
|
639
|
+
service: DASHBOARD_SERVICE,
|
|
620
640
|
method: "CreateUserApiKey",
|
|
621
641
|
bearer: args.sessionToken,
|
|
622
642
|
body: { name: args.keyName },
|
|
@@ -666,9 +686,10 @@ export async function revokeMintedUserApiKey(args: {
|
|
|
666
686
|
? args.backendUrl.slice(0, -1)
|
|
667
687
|
: args.backendUrl;
|
|
668
688
|
|
|
669
|
-
const listResponse = await
|
|
689
|
+
const listResponse = await connectRpc({
|
|
670
690
|
fetchImpl,
|
|
671
691
|
backendUrl,
|
|
692
|
+
service: DASHBOARD_SERVICE,
|
|
672
693
|
method: "ListUserApiKeys",
|
|
673
694
|
bearer: args.sessionToken,
|
|
674
695
|
body: {},
|
|
@@ -686,9 +707,10 @@ export async function revokeMintedUserApiKey(args: {
|
|
|
686
707
|
// lagging replica — skip rather than touch any other key.
|
|
687
708
|
return;
|
|
688
709
|
}
|
|
689
|
-
const revokeResponse = await
|
|
710
|
+
const revokeResponse = await connectRpc({
|
|
690
711
|
fetchImpl,
|
|
691
712
|
backendUrl,
|
|
713
|
+
service: DASHBOARD_SERVICE,
|
|
692
714
|
method: "RevokeUserApiKey",
|
|
693
715
|
bearer: args.sessionToken,
|
|
694
716
|
body: { id: match.id },
|
|
@@ -70,3 +70,30 @@ export function resolveFrameworkStoreSourceIdSync(
|
|
|
70
70
|
env
|
|
71
71
|
);
|
|
72
72
|
}
|
|
73
|
+
|
|
74
|
+
export type CursorManagedV2StoreIds = {
|
|
75
|
+
deploymentStoreSourceId: string;
|
|
76
|
+
frameworkStoreSourceId: string;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Resolve the complete managed-v2 store identity at the process boundary.
|
|
81
|
+
*
|
|
82
|
+
* Freeze snapshots construct storage before task bind, so callers keep this
|
|
83
|
+
* resolver lazy. Once an operation needs storage, both ids are mandatory.
|
|
84
|
+
*/
|
|
85
|
+
export function requireCursorManagedV2StoreIdsSync(
|
|
86
|
+
env: NodeJS.ProcessEnv = process.env
|
|
87
|
+
): CursorManagedV2StoreIds {
|
|
88
|
+
const deploymentStoreSourceId = resolveDeploymentStoreSourceIdSync(env);
|
|
89
|
+
const frameworkStoreSourceId = resolveFrameworkStoreSourceIdSync(env);
|
|
90
|
+
if (
|
|
91
|
+
deploymentStoreSourceId === undefined ||
|
|
92
|
+
frameworkStoreSourceId === undefined
|
|
93
|
+
) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
"Cursor-managed AgentSDK v2 requires AGENT_SERVE_STORE_SOURCE_ID and AGENT_SERVE_FRAMEWORK_STORE_SOURCE_ID"
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
return { deploymentStoreSourceId, frameworkStoreSourceId };
|
|
99
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/ab.ts` or `agent/ab/*.ts` plus `agent/ab.config.ts`: live A/B experiments.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { basename, extname, join, relative } from "node:path";
|
|
6
|
+
import type { ABConfigFile } from "../../ab.js";
|
|
7
|
+
import type { DiscoveredAB } from "../../types.js";
|
|
8
|
+
import { type DiscoveryContext, displayPath } from "./context.js";
|
|
9
|
+
import {
|
|
10
|
+
findModuleFile,
|
|
11
|
+
isDirectory,
|
|
12
|
+
isModuleFile,
|
|
13
|
+
toPosix,
|
|
14
|
+
walkFiles,
|
|
15
|
+
} from "./fs.js";
|
|
16
|
+
import { importDefault } from "./modules.js";
|
|
17
|
+
|
|
18
|
+
export async function loadABs(
|
|
19
|
+
ctx: DiscoveryContext,
|
|
20
|
+
agentDir: string
|
|
21
|
+
): Promise<DiscoveredAB[]> {
|
|
22
|
+
const abs: DiscoveredAB[] = [];
|
|
23
|
+
const seen = new Set<string>();
|
|
24
|
+
|
|
25
|
+
const single = await findModuleFile(agentDir, "ab");
|
|
26
|
+
if (single !== undefined) {
|
|
27
|
+
const definition = await importDefault(ctx, single, "ab");
|
|
28
|
+
if (definition !== undefined) {
|
|
29
|
+
const name = resolveABName(definition, "ab");
|
|
30
|
+
seen.add(name);
|
|
31
|
+
abs.push({
|
|
32
|
+
name,
|
|
33
|
+
definition: definition as DiscoveredAB["definition"],
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const absDir = join(agentDir, "ab");
|
|
39
|
+
if (await isDirectory(absDir)) {
|
|
40
|
+
for (const filePath of await walkFiles(absDir)) {
|
|
41
|
+
if (!isModuleFile(basename(filePath))) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const rel = toPosix(relative(absDir, filePath));
|
|
45
|
+
const stem = rel.slice(0, -extname(rel).length);
|
|
46
|
+
const definition = await importDefault(ctx, filePath, "ab");
|
|
47
|
+
if (definition === undefined) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const name = resolveABName(definition, stem);
|
|
51
|
+
if (seen.has(name)) {
|
|
52
|
+
ctx.diagnostics.push({
|
|
53
|
+
severity: "error",
|
|
54
|
+
path: displayPath(ctx, filePath),
|
|
55
|
+
message: `Duplicate A/B experiment name ${JSON.stringify(name)}.`,
|
|
56
|
+
});
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
seen.add(name);
|
|
60
|
+
abs.push({
|
|
61
|
+
name,
|
|
62
|
+
definition: definition as DiscoveredAB["definition"],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return abs;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function loadABConfig(
|
|
71
|
+
ctx: DiscoveryContext,
|
|
72
|
+
agentDir: string
|
|
73
|
+
): Promise<ABConfigFile | undefined> {
|
|
74
|
+
const path = await findModuleFile(agentDir, "ab.config");
|
|
75
|
+
if (path === undefined) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const mod = await ctx.importModule(path);
|
|
80
|
+
if (mod.default === null || typeof mod.default !== "object") {
|
|
81
|
+
ctx.diagnostics.push({
|
|
82
|
+
severity: "error",
|
|
83
|
+
path: displayPath(ctx, path),
|
|
84
|
+
message:
|
|
85
|
+
"ab.config.ts must default-export defineABConfig({ ... }) from @cursor/july/ab.",
|
|
86
|
+
});
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
return mod.default as ABConfigFile;
|
|
90
|
+
} catch (error) {
|
|
91
|
+
ctx.diagnostics.push({
|
|
92
|
+
severity: "error",
|
|
93
|
+
path: displayPath(ctx, path),
|
|
94
|
+
message: `Failed to load ab.config: ${error instanceof Error ? error.message : String(error)}`,
|
|
95
|
+
});
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function resolveABName(definition: unknown, fallback: string): string {
|
|
101
|
+
if (
|
|
102
|
+
typeof definition === "object" &&
|
|
103
|
+
definition !== null &&
|
|
104
|
+
"name" in definition &&
|
|
105
|
+
typeof (definition as { name: unknown }).name === "string" &&
|
|
106
|
+
(definition as { name: string }).name.length > 0
|
|
107
|
+
) {
|
|
108
|
+
return (definition as { name: string }).name;
|
|
109
|
+
}
|
|
110
|
+
return fallback;
|
|
111
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent/agent.ts`: model, runtime architecture, working directory, hosting, and concurrency.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { basename, isAbsolute, join, resolve } from "node:path";
|
|
6
|
+
import {
|
|
7
|
+
type AgentArchitecture,
|
|
8
|
+
type AgentConcurrencyOptions,
|
|
9
|
+
type AgentConfigDefinition,
|
|
10
|
+
type AgentHostingOptions,
|
|
11
|
+
type AgentRuntime,
|
|
12
|
+
MAX_RUNNING_TURNS_LIMIT,
|
|
13
|
+
type ModelSetting,
|
|
14
|
+
} from "../../types.js";
|
|
15
|
+
import { normalizePositiveInt } from "../bounded-int.js";
|
|
16
|
+
import {
|
|
17
|
+
isReservedSecretName,
|
|
18
|
+
MAX_EGRESS_DOMAINS,
|
|
19
|
+
validateEgressDomain,
|
|
20
|
+
validateSecretName,
|
|
21
|
+
} from "../hosting.js";
|
|
22
|
+
import { defaultLocalHarnessCwd, isNestedInGitRepo } from "../workspace.js";
|
|
23
|
+
import { type DiscoveryContext, displayPath, isBlank } from "./context.js";
|
|
24
|
+
import { findModuleFile } from "./fs.js";
|
|
25
|
+
import { importDefault } from "./modules.js";
|
|
26
|
+
|
|
27
|
+
export function runtimeArchitectureCompatibilityError(agent: {
|
|
28
|
+
runtime: AgentRuntime;
|
|
29
|
+
architecture?: AgentArchitecture;
|
|
30
|
+
}): string | undefined {
|
|
31
|
+
return agent.architecture === "v2" && agent.runtime === "grokbot"
|
|
32
|
+
? 'architecture: "v2" cannot use runtime: "grokbot": the grokbot runtime executes through the signed-in account\'s hosted /v0/grokbot box, not a deployment-scoped v2 runtime.'
|
|
33
|
+
: undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function resolveArchitecture(
|
|
37
|
+
ctx: DiscoveryContext,
|
|
38
|
+
agentDir: string,
|
|
39
|
+
architecture: AgentArchitecture | undefined
|
|
40
|
+
): AgentArchitecture | undefined {
|
|
41
|
+
if (
|
|
42
|
+
architecture === undefined ||
|
|
43
|
+
architecture === "v1" ||
|
|
44
|
+
architecture === "v2"
|
|
45
|
+
) {
|
|
46
|
+
return architecture;
|
|
47
|
+
}
|
|
48
|
+
ctx.diagnostics.push({
|
|
49
|
+
severity: "error",
|
|
50
|
+
path: displayPath(ctx, join(agentDir, "agent.ts")),
|
|
51
|
+
message: `architecture must be "v1" or "v2"; got ${JSON.stringify(architecture)}.`,
|
|
52
|
+
});
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Absolute harness cwd parent, or undefined when unset / blank. */
|
|
57
|
+
export function resolveAgentCwd(
|
|
58
|
+
ctx: DiscoveryContext,
|
|
59
|
+
authored: string | undefined
|
|
60
|
+
): string | undefined {
|
|
61
|
+
if (authored === undefined) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const trimmed = authored.trim();
|
|
65
|
+
if (trimmed === "") {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
return isAbsolute(trimmed) ? trimmed : resolve(ctx.rootDir, trimmed);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Nested git checkouts inherit ancestor AGENTS.md / .cursor rules and MCP.
|
|
73
|
+
* Point those harnesses at ~/.cache/agent-serve/<dir> unless the agent
|
|
74
|
+
* already set cwd or workspaceDir.
|
|
75
|
+
*/
|
|
76
|
+
export async function resolveLocalCwd(
|
|
77
|
+
ctx: DiscoveryContext,
|
|
78
|
+
authoredCwd: string | undefined,
|
|
79
|
+
authoredWorkspaceDir: string | undefined
|
|
80
|
+
): Promise<string | undefined> {
|
|
81
|
+
const cwd = resolveAgentCwd(ctx, authoredCwd);
|
|
82
|
+
if (cwd !== undefined) {
|
|
83
|
+
return cwd;
|
|
84
|
+
}
|
|
85
|
+
if (resolveAgentCwd(ctx, authoredWorkspaceDir) !== undefined) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
if (!(await isNestedInGitRepo(ctx.rootDir))) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
return defaultLocalHarnessCwd(basename(ctx.rootDir));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Validate the authored `hosting` block against the same grammar the
|
|
96
|
+
* backend enforces on deploy. Violations are warning diagnostics (reported
|
|
97
|
+
* by `agent-sdk validate`), not hard failures: the backend stays
|
|
98
|
+
* authoritative and `agent-sdk deploy` re-checks before any network call.
|
|
99
|
+
*/
|
|
100
|
+
export function resolveHosting(
|
|
101
|
+
ctx: DiscoveryContext,
|
|
102
|
+
agentDir: string,
|
|
103
|
+
hosting: AgentHostingOptions | undefined
|
|
104
|
+
): AgentHostingOptions | undefined {
|
|
105
|
+
if (hosting === undefined) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
const agentPath = displayPath(ctx, join(agentDir, "agent.ts"));
|
|
109
|
+
const warn = (message: string): void => {
|
|
110
|
+
ctx.diagnostics.push({ severity: "warning", path: agentPath, message });
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const egressDomains = hosting.egressDomains ?? [];
|
|
114
|
+
for (const domain of egressDomains) {
|
|
115
|
+
const domainError = validateEgressDomain(domain);
|
|
116
|
+
if (domainError !== undefined) {
|
|
117
|
+
warn(`hosting.egressDomains: ${domainError}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (egressDomains.length > MAX_EGRESS_DOMAINS) {
|
|
121
|
+
warn(
|
|
122
|
+
`hosting.egressDomains lists ${egressDomains.length} domains; deploys are capped at ${MAX_EGRESS_DOMAINS}.`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
for (const name of hosting.secretNames ?? []) {
|
|
127
|
+
const nameError = validateSecretName(name);
|
|
128
|
+
if (nameError !== undefined) {
|
|
129
|
+
warn(`hosting.secretNames: ${nameError}`);
|
|
130
|
+
} else if (isReservedSecretName(name)) {
|
|
131
|
+
warn(
|
|
132
|
+
`hosting.secretNames: ${JSON.stringify(name)} is platform-managed (CURSOR_* / reserved hosted-storage names); omit it from secretNames.`
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
...(hosting.egressDomains === undefined
|
|
139
|
+
? {}
|
|
140
|
+
: { egressDomains: [...hosting.egressDomains] }),
|
|
141
|
+
...(hosting.secretNames === undefined
|
|
142
|
+
? {}
|
|
143
|
+
: { secretNames: [...hosting.secretNames] }),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Validate the authored `concurrency` block. Invalid values are **error**
|
|
149
|
+
* diagnostics (serve refuses to start): silently dropping a turn ceiling
|
|
150
|
+
* would fail open to unlimited parallelism, the opposite of what the
|
|
151
|
+
* author asked for.
|
|
152
|
+
*/
|
|
153
|
+
export function resolveConcurrency(
|
|
154
|
+
ctx: DiscoveryContext,
|
|
155
|
+
agentDir: string,
|
|
156
|
+
concurrency: AgentConcurrencyOptions | undefined
|
|
157
|
+
): AgentConcurrencyOptions | undefined {
|
|
158
|
+
if (concurrency === undefined || concurrency.maxRunningTurns === undefined) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
return {
|
|
163
|
+
maxRunningTurns: normalizePositiveInt(concurrency.maxRunningTurns, {
|
|
164
|
+
label: "concurrency.maxRunningTurns",
|
|
165
|
+
max: MAX_RUNNING_TURNS_LIMIT,
|
|
166
|
+
}),
|
|
167
|
+
};
|
|
168
|
+
} catch (error) {
|
|
169
|
+
ctx.diagnostics.push({
|
|
170
|
+
severity: "error",
|
|
171
|
+
path: displayPath(ctx, join(agentDir, "agent.ts")),
|
|
172
|
+
message: error instanceof Error ? error.message : String(error),
|
|
173
|
+
});
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export async function loadAgentConfig(
|
|
179
|
+
ctx: DiscoveryContext,
|
|
180
|
+
agentDir: string,
|
|
181
|
+
isRoot: boolean
|
|
182
|
+
): Promise<AgentConfigDefinition | undefined> {
|
|
183
|
+
const configPath = await findModuleFile(agentDir, "agent");
|
|
184
|
+
if (configPath === undefined) {
|
|
185
|
+
ctx.diagnostics.push({
|
|
186
|
+
severity: "error",
|
|
187
|
+
path: displayPath(ctx, join(agentDir, "agent.ts")),
|
|
188
|
+
message: isRoot
|
|
189
|
+
? "agent.ts is required on the root agent: default-export defineAgent({ ... })"
|
|
190
|
+
: "agent.ts is required on a subagent: default-export defineAgent({ description: ... })",
|
|
191
|
+
});
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const definition = await importDefault(ctx, configPath, "agent");
|
|
196
|
+
if (definition === undefined) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
const config = definition as AgentConfigDefinition;
|
|
200
|
+
|
|
201
|
+
if (!isRoot && isBlank(config.description)) {
|
|
202
|
+
ctx.diagnostics.push({
|
|
203
|
+
severity: "error",
|
|
204
|
+
path: displayPath(ctx, configPath),
|
|
205
|
+
message:
|
|
206
|
+
"Subagents require a description; the parent model reads it to decide when to delegate.",
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return config;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function isValidModelSetting(model: unknown): model is ModelSetting {
|
|
213
|
+
if (typeof model === "string") {
|
|
214
|
+
return model.trim() !== "";
|
|
215
|
+
}
|
|
216
|
+
return (
|
|
217
|
+
typeof model === "object" &&
|
|
218
|
+
model !== null &&
|
|
219
|
+
typeof (model as { id?: unknown }).id === "string" &&
|
|
220
|
+
(model as { id: string }).id.trim() !== ""
|
|
221
|
+
);
|
|
222
|
+
}
|