@cursor/july 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +290 -0
- package/LICENSE.md +3 -0
- package/README.md +1233 -0
- package/dist/ab.d.ts +290 -0
- package/dist/ab.d.ts.map +1 -0
- package/dist/ab.js +386 -0
- package/dist/bin/agent-serve.d.ts +15 -0
- package/dist/bin/agent-serve.d.ts.map +1 -0
- package/dist/bin/agent-serve.js +754 -0
- package/dist/channels/github/api.d.ts +101 -0
- package/dist/channels/github/api.d.ts.map +1 -0
- package/dist/channels/github/api.js +229 -0
- package/dist/channels/github/auth.d.ts +67 -0
- package/dist/channels/github/auth.d.ts.map +1 -0
- package/dist/channels/github/auth.js +239 -0
- package/dist/channels/github/binding.d.ts +73 -0
- package/dist/channels/github/binding.d.ts.map +1 -0
- package/dist/channels/github/binding.js +114 -0
- package/dist/channels/github/defaults.d.ts +24 -0
- package/dist/channels/github/defaults.d.ts.map +1 -0
- package/dist/channels/github/defaults.js +100 -0
- package/dist/channels/github/events.d.ts +18 -0
- package/dist/channels/github/events.d.ts.map +1 -0
- package/dist/channels/github/events.js +59 -0
- package/dist/channels/github/forward.d.ts +137 -0
- package/dist/channels/github/forward.d.ts.map +1 -0
- package/dist/channels/github/forward.js +271 -0
- package/dist/channels/github/github-channel.d.ts +127 -0
- package/dist/channels/github/github-channel.d.ts.map +1 -0
- package/dist/channels/github/github-channel.js +1688 -0
- package/dist/channels/github/index.d.ts +52 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +51 -0
- package/dist/channels/github/replay.d.ts +115 -0
- package/dist/channels/github/replay.d.ts.map +1 -0
- package/dist/channels/github/replay.js +282 -0
- package/dist/channels/github/state.d.ts +26 -0
- package/dist/channels/github/state.d.ts.map +1 -0
- package/dist/channels/github/state.js +50 -0
- package/dist/channels/github/types.d.ts +385 -0
- package/dist/channels/github/types.d.ts.map +1 -0
- package/dist/channels/github/types.js +1 -0
- package/dist/channels/slack/api.d.ts +117 -0
- package/dist/channels/slack/api.d.ts.map +1 -0
- package/dist/channels/slack/api.js +437 -0
- package/dist/channels/slack/approvals.d.ts +32 -0
- package/dist/channels/slack/approvals.d.ts.map +1 -0
- package/dist/channels/slack/approvals.js +157 -0
- package/dist/channels/slack/assistant.d.ts +23 -0
- package/dist/channels/slack/assistant.d.ts.map +1 -0
- package/dist/channels/slack/assistant.js +67 -0
- package/dist/channels/slack/auth.d.ts +40 -0
- package/dist/channels/slack/auth.d.ts.map +1 -0
- package/dist/channels/slack/auth.js +71 -0
- package/dist/channels/slack/channel-watch.d.ts +46 -0
- package/dist/channels/slack/channel-watch.d.ts.map +1 -0
- package/dist/channels/slack/channel-watch.js +180 -0
- package/dist/channels/slack/constants.d.ts +17 -0
- package/dist/channels/slack/constants.d.ts.map +1 -0
- package/dist/channels/slack/constants.js +27 -0
- package/dist/channels/slack/credentials.d.ts +35 -0
- package/dist/channels/slack/credentials.d.ts.map +1 -0
- package/dist/channels/slack/credentials.js +88 -0
- package/dist/channels/slack/cursor-account.d.ts +76 -0
- package/dist/channels/slack/cursor-account.d.ts.map +1 -0
- package/dist/channels/slack/cursor-account.js +88 -0
- package/dist/channels/slack/defaults.d.ts +32 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -0
- package/dist/channels/slack/defaults.js +380 -0
- package/dist/channels/slack/dispatch.d.ts +43 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -0
- package/dist/channels/slack/dispatch.js +185 -0
- package/dist/channels/slack/doctor.d.ts +24 -0
- package/dist/channels/slack/doctor.d.ts.map +1 -0
- package/dist/channels/slack/doctor.js +115 -0
- package/dist/channels/slack/event-id-dedupe.d.ts +10 -0
- package/dist/channels/slack/event-id-dedupe.d.ts.map +1 -0
- package/dist/channels/slack/event-id-dedupe.js +23 -0
- package/dist/channels/slack/inbound.d.ts +41 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -0
- package/dist/channels/slack/inbound.js +166 -0
- package/dist/channels/slack/index.d.ts +45 -0
- package/dist/channels/slack/index.d.ts.map +1 -0
- package/dist/channels/slack/index.js +44 -0
- package/dist/channels/slack/init.d.ts +32 -0
- package/dist/channels/slack/init.d.ts.map +1 -0
- package/dist/channels/slack/init.js +82 -0
- package/dist/channels/slack/interactive.d.ts +19 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -0
- package/dist/channels/slack/interactive.js +142 -0
- package/dist/channels/slack/links.d.ts +10 -0
- package/dist/channels/slack/links.d.ts.map +1 -0
- package/dist/channels/slack/links.js +19 -0
- package/dist/channels/slack/live-delivery.d.ts +75 -0
- package/dist/channels/slack/live-delivery.d.ts.map +1 -0
- package/dist/channels/slack/live-delivery.js +143 -0
- package/dist/channels/slack/log.d.ts +25 -0
- package/dist/channels/slack/log.d.ts.map +1 -0
- package/dist/channels/slack/log.js +47 -0
- package/dist/channels/slack/manifest.d.ts +57 -0
- package/dist/channels/slack/manifest.d.ts.map +1 -0
- package/dist/channels/slack/manifest.js +110 -0
- package/dist/channels/slack/pr-ref.d.ts +18 -0
- package/dist/channels/slack/pr-ref.d.ts.map +1 -0
- package/dist/channels/slack/pr-ref.js +36 -0
- package/dist/channels/slack/setup.d.ts +14 -0
- package/dist/channels/slack/setup.d.ts.map +1 -0
- package/dist/channels/slack/setup.js +86 -0
- package/dist/channels/slack/slack-channel.d.ts +15 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -0
- package/dist/channels/slack/slack-channel.js +281 -0
- package/dist/channels/slack/socket-mode.d.ts +26 -0
- package/dist/channels/slack/socket-mode.d.ts.map +1 -0
- package/dist/channels/slack/socket-mode.js +116 -0
- package/dist/channels/slack/stream.d.ts +26 -0
- package/dist/channels/slack/stream.d.ts.map +1 -0
- package/dist/channels/slack/stream.js +39 -0
- package/dist/channels/slack/tool-approval-events.d.ts +33 -0
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -0
- package/dist/channels/slack/tool-approval-events.js +129 -0
- package/dist/channels/slack/types.d.ts +326 -0
- package/dist/channels/slack/types.d.ts.map +1 -0
- package/dist/channels/slack/types.js +4 -0
- package/dist/channels.d.ts +116 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +294 -0
- package/dist/connections.d.ts +75 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +75 -0
- package/dist/docs/404.html +22 -0
- package/dist/docs/ab.html +87 -0
- package/dist/docs/assets/ab.md.COdXkces.js +63 -0
- package/dist/docs/assets/ab.md.COdXkces.lean.js +1 -0
- package/dist/docs/assets/app.DqfFEmJd.js +1 -0
- package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +13 -0
- package/dist/docs/assets/building-with-agents.md.CJCtZCyi.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +1 -0
- package/dist/docs/assets/chunks/VPLocalSearchBox.BaLEdS15.js +9 -0
- package/dist/docs/assets/chunks/framework.CAZyNGu9.js +19 -0
- package/dist/docs/assets/chunks/theme.CZRvu_0q.js +2 -0
- package/dist/docs/assets/concepts.md.Cfb9b-k1.js +4 -0
- package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +1 -0
- package/dist/docs/assets/deployment.md.Dx1TYNk5.js +14 -0
- package/dist/docs/assets/deployment.md.Dx1TYNk5.lean.js +1 -0
- package/dist/docs/assets/evals.md.DPZ_MAnI.js +85 -0
- package/dist/docs/assets/evals.md.DPZ_MAnI.lean.js +1 -0
- package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.js +10 -0
- package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.lean.js +1 -0
- package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.js +9 -0
- package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.lean.js +1 -0
- package/dist/docs/assets/guides_github.md.DwbKhCeS.js +20 -0
- package/dist/docs/assets/guides_github.md.DwbKhCeS.lean.js +1 -0
- package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.js +28 -0
- package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.lean.js +1 -0
- package/dist/docs/assets/guides_slack.md.bv41fHfW.js +37 -0
- package/dist/docs/assets/guides_slack.md.bv41fHfW.lean.js +1 -0
- package/dist/docs/assets/guides_webhooks.md.hFTik3lf.js +50 -0
- package/dist/docs/assets/guides_webhooks.md.hFTik3lf.lean.js +1 -0
- package/dist/docs/assets/hillclimbing.md.DHNast08.js +4 -0
- package/dist/docs/assets/hillclimbing.md.DHNast08.lean.js +1 -0
- package/dist/docs/assets/index.md.BPKcj5AI.js +20 -0
- package/dist/docs/assets/index.md.BPKcj5AI.lean.js +1 -0
- package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/dist/docs/assets/quickstart.md.tVPiGK_L.js +35 -0
- package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +1 -0
- package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.js +34 -0
- package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.lean.js +1 -0
- package/dist/docs/assets/reference_channels.md.D7JTR03W.js +53 -0
- package/dist/docs/assets/reference_channels.md.D7JTR03W.lean.js +1 -0
- package/dist/docs/assets/reference_cli.md.DA730zCu.js +33 -0
- package/dist/docs/assets/reference_cli.md.DA730zCu.lean.js +1 -0
- package/dist/docs/assets/reference_connections.md.C3vNH_DE.js +26 -0
- package/dist/docs/assets/reference_connections.md.C3vNH_DE.lean.js +1 -0
- package/dist/docs/assets/reference_hooks.md.BCEc3MyM.js +12 -0
- package/dist/docs/assets/reference_hooks.md.BCEc3MyM.lean.js +1 -0
- package/dist/docs/assets/reference_http-api.md.DBAahtdz.js +11 -0
- package/dist/docs/assets/reference_http-api.md.DBAahtdz.lean.js +1 -0
- package/dist/docs/assets/reference_instructions.md.BC05LEQ8.js +12 -0
- package/dist/docs/assets/reference_instructions.md.BC05LEQ8.lean.js +1 -0
- package/dist/docs/assets/reference_playground.md.CPZhfYaO.js +1 -0
- package/dist/docs/assets/reference_playground.md.CPZhfYaO.lean.js +1 -0
- package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.js +31 -0
- package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.lean.js +1 -0
- package/dist/docs/assets/reference_schedules.md.D7qijxLk.js +82 -0
- package/dist/docs/assets/reference_schedules.md.D7qijxLk.lean.js +1 -0
- package/dist/docs/assets/reference_sessions.md.DdjWabnN.js +8 -0
- package/dist/docs/assets/reference_sessions.md.DdjWabnN.lean.js +1 -0
- package/dist/docs/assets/reference_skills.md.VQnlBT3Q.js +15 -0
- package/dist/docs/assets/reference_skills.md.VQnlBT3Q.lean.js +1 -0
- package/dist/docs/assets/reference_subagents.md.CIRAVcPK.js +10 -0
- package/dist/docs/assets/reference_subagents.md.CIRAVcPK.lean.js +1 -0
- package/dist/docs/assets/reference_tools.md.DF5kwlt0.js +46 -0
- package/dist/docs/assets/reference_tools.md.DF5kwlt0.lean.js +1 -0
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +1 -0
- package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +1 -0
- package/dist/docs/assets/style.Bj-IXa5W.css +1 -0
- package/dist/docs/assets/troubleshooting.md.DkovjS7h.js +1 -0
- package/dist/docs/assets/troubleshooting.md.DkovjS7h.lean.js +1 -0
- package/dist/docs/building-with-agents.html +37 -0
- package/dist/docs/concepts.html +28 -0
- package/dist/docs/deployment.html +38 -0
- package/dist/docs/evals.html +109 -0
- package/dist/docs/guides/agent-to-agent.html +34 -0
- package/dist/docs/guides/cloud-runtime.html +33 -0
- package/dist/docs/guides/github.html +44 -0
- package/dist/docs/guides/human-in-the-loop.html +52 -0
- package/dist/docs/guides/slack.html +61 -0
- package/dist/docs/guides/webhooks.html +74 -0
- package/dist/docs/hashmap.json +1 -0
- package/dist/docs/hillclimbing.html +28 -0
- package/dist/docs/index.html +44 -0
- package/dist/docs/quickstart.html +59 -0
- package/dist/docs/reference/agent-config.html +58 -0
- package/dist/docs/reference/channels.html +77 -0
- package/dist/docs/reference/cli.html +57 -0
- package/dist/docs/reference/connections.html +50 -0
- package/dist/docs/reference/hooks.html +36 -0
- package/dist/docs/reference/http-api.html +35 -0
- package/dist/docs/reference/instructions.html +36 -0
- package/dist/docs/reference/playground.html +25 -0
- package/dist/docs/reference/project-layout.html +55 -0
- package/dist/docs/reference/schedules.html +106 -0
- package/dist/docs/reference/sessions.html +32 -0
- package/dist/docs/reference/skills.html +39 -0
- package/dist/docs/reference/subagents.html +34 -0
- package/dist/docs/reference/tools.html +70 -0
- package/dist/docs/scaffolding-agents.html +25 -0
- package/dist/docs/troubleshooting.html +25 -0
- package/dist/docs/vp-icons.css +0 -0
- package/dist/evals.d.ts +312 -0
- package/dist/evals.d.ts.map +1 -0
- package/dist/evals.js +254 -0
- package/dist/hooks.d.ts +23 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +23 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +101 -0
- package/dist/internal/ab-collector.d.ts +42 -0
- package/dist/internal/ab-collector.d.ts.map +1 -0
- package/dist/internal/ab-collector.js +153 -0
- package/dist/internal/ab-fold.d.ts +36 -0
- package/dist/internal/ab-fold.d.ts.map +1 -0
- package/dist/internal/ab-fold.js +171 -0
- package/dist/internal/ab-snapshot.d.ts +70 -0
- package/dist/internal/ab-snapshot.d.ts.map +1 -0
- package/dist/internal/ab-snapshot.js +208 -0
- package/dist/internal/approval-gate.d.ts +34 -0
- package/dist/internal/approval-gate.d.ts.map +1 -0
- package/dist/internal/approval-gate.js +85 -0
- package/dist/internal/auth.d.ts +8 -0
- package/dist/internal/auth.d.ts.map +1 -0
- package/dist/internal/auth.js +27 -0
- package/dist/internal/authored-alias-hooks.d.ts +31 -0
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -0
- package/dist/internal/authored-alias-hooks.js +43 -0
- package/dist/internal/authored-loaders.d.ts +25 -0
- package/dist/internal/authored-loaders.d.ts.map +1 -0
- package/dist/internal/authored-loaders.js +129 -0
- package/dist/internal/bounded-int.d.ts +11 -0
- package/dist/internal/bounded-int.d.ts.map +1 -0
- package/dist/internal/bounded-int.js +13 -0
- package/dist/internal/brand.d.ts +6 -0
- package/dist/internal/brand.d.ts.map +1 -0
- package/dist/internal/brand.js +17 -0
- package/dist/internal/chat-client.d.ts +19 -0
- package/dist/internal/chat-client.d.ts.map +1 -0
- package/dist/internal/chat-client.js +327 -0
- package/dist/internal/cli-ax.d.ts +58 -0
- package/dist/internal/cli-ax.d.ts.map +1 -0
- package/dist/internal/cli-ax.js +345 -0
- package/dist/internal/cli-cursor.d.ts +20 -0
- package/dist/internal/cli-cursor.d.ts.map +1 -0
- package/dist/internal/cli-cursor.js +227 -0
- package/dist/internal/cli-github.d.ts +47 -0
- package/dist/internal/cli-github.d.ts.map +1 -0
- package/dist/internal/cli-github.js +644 -0
- package/dist/internal/cli-slack.d.ts +18 -0
- package/dist/internal/cli-slack.d.ts.map +1 -0
- package/dist/internal/cli-slack.js +144 -0
- package/dist/internal/cloud-merge.d.ts +23 -0
- package/dist/internal/cloud-merge.d.ts.map +1 -0
- package/dist/internal/cloud-merge.js +28 -0
- package/dist/internal/cron.d.ts +17 -0
- package/dist/internal/cron.d.ts.map +1 -0
- package/dist/internal/cron.js +60 -0
- package/dist/internal/cursor/account-mcp.d.ts +95 -0
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -0
- package/dist/internal/cursor/account-mcp.js +342 -0
- package/dist/internal/cursor/backend-client.d.ts +118 -0
- package/dist/internal/cursor/backend-client.d.ts.map +1 -0
- package/dist/internal/cursor/backend-client.js +477 -0
- package/dist/internal/cursor/credentials.d.ts +112 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -0
- package/dist/internal/cursor/credentials.js +329 -0
- package/dist/internal/cursor-event-relay.d.ts +111 -0
- package/dist/internal/cursor-event-relay.d.ts.map +1 -0
- package/dist/internal/cursor-event-relay.js +181 -0
- package/dist/internal/cursor-relay-core.d.ts +113 -0
- package/dist/internal/cursor-relay-core.d.ts.map +1 -0
- package/dist/internal/cursor-relay-core.js +364 -0
- package/dist/internal/cursor-slack-relay.d.ts +94 -0
- package/dist/internal/cursor-slack-relay.d.ts.map +1 -0
- package/dist/internal/cursor-slack-relay.js +171 -0
- package/dist/internal/describe-error.d.ts +3 -0
- package/dist/internal/describe-error.d.ts.map +1 -0
- package/dist/internal/describe-error.js +4 -0
- package/dist/internal/dev-mode.d.ts +13 -0
- package/dist/internal/dev-mode.d.ts.map +1 -0
- package/dist/internal/dev-mode.js +17 -0
- package/dist/internal/discovery.d.ts +55 -0
- package/dist/internal/discovery.d.ts.map +1 -0
- package/dist/internal/discovery.js +1427 -0
- package/dist/internal/distribution.d.ts +47 -0
- package/dist/internal/distribution.d.ts.map +1 -0
- package/dist/internal/distribution.js +82 -0
- package/dist/internal/docs-site.d.ts +28 -0
- package/dist/internal/docs-site.d.ts.map +1 -0
- package/dist/internal/docs-site.js +169 -0
- package/dist/internal/duration.d.ts +8 -0
- package/dist/internal/duration.d.ts.map +1 -0
- package/dist/internal/duration.js +35 -0
- package/dist/internal/eval-run-store.d.ts +81 -0
- package/dist/internal/eval-run-store.d.ts.map +1 -0
- package/dist/internal/eval-run-store.js +396 -0
- package/dist/internal/eval-runner.d.ts +76 -0
- package/dist/internal/eval-runner.d.ts.map +1 -0
- package/dist/internal/eval-runner.js +336 -0
- package/dist/internal/event-log.d.ts +51 -0
- package/dist/internal/event-log.d.ts.map +1 -0
- package/dist/internal/event-log.js +167 -0
- package/dist/internal/event-mapper.d.ts +46 -0
- package/dist/internal/event-mapper.d.ts.map +1 -0
- package/dist/internal/event-mapper.js +226 -0
- package/dist/internal/frontmatter.d.ts +12 -0
- package/dist/internal/frontmatter.d.ts.map +1 -0
- package/dist/internal/frontmatter.js +61 -0
- package/dist/internal/github-fanout.d.ts +32 -0
- package/dist/internal/github-fanout.d.ts.map +1 -0
- package/dist/internal/github-fanout.js +122 -0
- package/dist/internal/handleAgentServeTrigger.d.ts +59 -0
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -0
- package/dist/internal/handleAgentServeTrigger.js +115 -0
- package/dist/internal/host-platforms.d.ts +40 -0
- package/dist/internal/host-platforms.d.ts.map +1 -0
- package/dist/internal/host-platforms.js +113 -0
- package/dist/internal/http-channel.d.ts +54 -0
- package/dist/internal/http-channel.d.ts.map +1 -0
- package/dist/internal/http-channel.js +382 -0
- package/dist/internal/ids.d.ts +19 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +34 -0
- package/dist/internal/init-project.d.ts +22 -0
- package/dist/internal/init-project.d.ts.map +1 -0
- package/dist/internal/init-project.js +125 -0
- package/dist/internal/json-dir-store.d.ts +32 -0
- package/dist/internal/json-dir-store.d.ts.map +1 -0
- package/dist/internal/json-dir-store.js +100 -0
- package/dist/internal/json-schema.d.ts +18 -0
- package/dist/internal/json-schema.d.ts.map +1 -0
- package/dist/internal/json-schema.js +53 -0
- package/dist/internal/log-ring.d.ts +23 -0
- package/dist/internal/log-ring.d.ts.map +1 -0
- package/dist/internal/log-ring.js +42 -0
- package/dist/internal/map-pool.d.ts +6 -0
- package/dist/internal/map-pool.d.ts.map +1 -0
- package/dist/internal/map-pool.js +41 -0
- package/dist/internal/mcp-endpoint.d.ts +59 -0
- package/dist/internal/mcp-endpoint.d.ts.map +1 -0
- package/dist/internal/mcp-endpoint.js +355 -0
- package/dist/internal/mcp-host.d.ts +28 -0
- package/dist/internal/mcp-host.d.ts.map +1 -0
- package/dist/internal/mcp-host.js +162 -0
- package/dist/internal/net.d.ts +5 -0
- package/dist/internal/net.d.ts.map +1 -0
- package/dist/internal/net.js +30 -0
- package/dist/internal/peer-connections.d.ts +44 -0
- package/dist/internal/peer-connections.d.ts.map +1 -0
- package/dist/internal/peer-connections.js +67 -0
- package/dist/internal/playground/static.d.ts +35 -0
- package/dist/internal/playground/static.d.ts.map +1 -0
- package/dist/internal/playground/static.js +162 -0
- package/dist/internal/playground/toolchain.d.ts +57 -0
- package/dist/internal/playground/toolchain.d.ts.map +1 -0
- package/dist/internal/playground/toolchain.js +226 -0
- package/dist/internal/reminder-runner.d.ts +62 -0
- package/dist/internal/reminder-runner.d.ts.map +1 -0
- package/dist/internal/reminder-runner.js +582 -0
- package/dist/internal/reminder-schedule.d.ts +22 -0
- package/dist/internal/reminder-schedule.d.ts.map +1 -0
- package/dist/internal/reminder-schedule.js +82 -0
- package/dist/internal/reminder-store.d.ts +58 -0
- package/dist/internal/reminder-store.d.ts.map +1 -0
- package/dist/internal/reminder-store.js +106 -0
- package/dist/internal/resolved-connections.d.ts +41 -0
- package/dist/internal/resolved-connections.d.ts.map +1 -0
- package/dist/internal/resolved-connections.js +73 -0
- package/dist/internal/review-comments.d.ts +50 -0
- package/dist/internal/review-comments.d.ts.map +1 -0
- package/dist/internal/review-comments.js +194 -0
- package/dist/internal/router.d.ts +33 -0
- package/dist/internal/router.d.ts.map +1 -0
- package/dist/internal/router.js +93 -0
- package/dist/internal/run-client.d.ts +49 -0
- package/dist/internal/run-client.d.ts.map +1 -0
- package/dist/internal/run-client.js +208 -0
- package/dist/internal/schedule-runner.d.ts +31 -0
- package/dist/internal/schedule-runner.d.ts.map +1 -0
- package/dist/internal/schedule-runner.js +126 -0
- package/dist/internal/sdk-runner.d.ts +41 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -0
- package/dist/internal/sdk-runner.js +221 -0
- package/dist/internal/server.d.ts +25 -0
- package/dist/internal/server.d.ts.map +1 -0
- package/dist/internal/server.js +1374 -0
- package/dist/internal/session-engine.d.ts +287 -0
- package/dist/internal/session-engine.d.ts.map +1 -0
- package/dist/internal/session-engine.js +1377 -0
- package/dist/internal/session-store.d.ts +29 -0
- package/dist/internal/session-store.d.ts.map +1 -0
- package/dist/internal/session-store.js +140 -0
- package/dist/internal/session-urls.d.ts +10 -0
- package/dist/internal/session-urls.d.ts.map +1 -0
- package/dist/internal/session-urls.js +25 -0
- package/dist/internal/stream-progress.d.ts +14 -0
- package/dist/internal/stream-progress.d.ts.map +1 -0
- package/dist/internal/stream-progress.js +195 -0
- package/dist/internal/tool-result.d.ts +20 -0
- package/dist/internal/tool-result.d.ts.map +1 -0
- package/dist/internal/tool-result.js +45 -0
- package/dist/internal/trajectory.d.ts +56 -0
- package/dist/internal/trajectory.d.ts.map +1 -0
- package/dist/internal/trajectory.js +248 -0
- package/dist/internal/workspace.d.ts +42 -0
- package/dist/internal/workspace.d.ts.map +1 -0
- package/dist/internal/workspace.js +199 -0
- package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
- package/dist/playground/assets/index-1K-hG-7p.css +1 -0
- package/dist/playground/assets/index-FlWjhg3x.js +79 -0
- package/dist/playground/index.html +17 -0
- package/dist/reminders.d.ts +23 -0
- package/dist/reminders.d.ts.map +1 -0
- package/dist/reminders.js +22 -0
- package/dist/schedules.d.ts +23 -0
- package/dist/schedules.d.ts.map +1 -0
- package/dist/schedules.js +26 -0
- package/dist/skills.d.ts +22 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +22 -0
- package/dist/tools.d.ts +92 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +68 -0
- package/dist/types.d.ts +1609 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +80 -0
- package/docs/README.md +174 -0
- package/docs/ab.md +355 -0
- package/docs/building-with-agents.md +129 -0
- package/docs/concepts.md +177 -0
- package/docs/deployment.md +218 -0
- package/docs/evals.md +383 -0
- package/docs/guides/agent-to-agent.md +118 -0
- package/docs/guides/cloud-runtime.md +122 -0
- package/docs/guides/github.md +172 -0
- package/docs/guides/human-in-the-loop.md +131 -0
- package/docs/guides/slack.md +245 -0
- package/docs/guides/webhooks.md +201 -0
- package/docs/hillclimbing.md +93 -0
- package/docs/quickstart.md +183 -0
- package/docs/reference/agent-config.md +154 -0
- package/docs/reference/channels.md +206 -0
- package/docs/reference/cli.md +257 -0
- package/docs/reference/connections.md +137 -0
- package/docs/reference/hooks.md +74 -0
- package/docs/reference/http-api.md +219 -0
- package/docs/reference/instructions.md +77 -0
- package/docs/reference/playground.md +67 -0
- package/docs/reference/project-layout.md +119 -0
- package/docs/reference/schedules.md +220 -0
- package/docs/reference/sessions.md +165 -0
- package/docs/reference/skills.md +79 -0
- package/docs/reference/subagents.md +74 -0
- package/docs/reference/tools.md +203 -0
- package/docs/scaffolding-agents.md +113 -0
- package/docs/troubleshooting.md +95 -0
- package/package.json +185 -0
- package/skills/ab/SKILL.md +139 -0
- package/skills/create-agent/SKILL.md +219 -0
- package/skills/debug/SKILL.md +71 -0
- package/skills/evals/SKILL.md +217 -0
- package/skills/framework-map/SKILL.md +142 -0
- package/skills/github/SKILL.md +144 -0
- package/skills/hillclimb/SKILL.md +162 -0
- package/skills/setup-slack/SKILL.md +180 -0
- package/src/ab.ts +675 -0
- package/src/bin/agent-serve.ts +949 -0
- package/src/channels/github/api.ts +374 -0
- package/src/channels/github/auth.ts +275 -0
- package/src/channels/github/binding.ts +223 -0
- package/src/channels/github/defaults.ts +111 -0
- package/src/channels/github/events.ts +72 -0
- package/src/channels/github/forward.ts +381 -0
- package/src/channels/github/github-channel.ts +2270 -0
- package/src/channels/github/index.ts +52 -0
- package/src/channels/github/replay.ts +387 -0
- package/src/channels/github/state.ts +95 -0
- package/src/channels/github/types.ts +490 -0
- package/src/channels/slack/api.ts +580 -0
- package/src/channels/slack/approvals.ts +198 -0
- package/src/channels/slack/assistant.ts +76 -0
- package/src/channels/slack/auth.ts +112 -0
- package/src/channels/slack/channel-watch.ts +219 -0
- package/src/channels/slack/constants.ts +30 -0
- package/src/channels/slack/credentials.ts +90 -0
- package/src/channels/slack/cursor-account.ts +166 -0
- package/src/channels/slack/defaults.ts +450 -0
- package/src/channels/slack/dispatch.ts +293 -0
- package/src/channels/slack/doctor.ts +135 -0
- package/src/channels/slack/event-id-dedupe.ts +30 -0
- package/src/channels/slack/inbound.ts +219 -0
- package/src/channels/slack/index.ts +45 -0
- package/src/channels/slack/init.ts +133 -0
- package/src/channels/slack/interactive.ts +194 -0
- package/src/channels/slack/links.ts +23 -0
- package/src/channels/slack/live-delivery.ts +201 -0
- package/src/channels/slack/log.ts +83 -0
- package/src/channels/slack/manifest.ts +179 -0
- package/src/channels/slack/pr-ref.ts +50 -0
- package/src/channels/slack/setup.ts +97 -0
- package/src/channels/slack/slack-channel.ts +374 -0
- package/src/channels/slack/socket-mode.ts +154 -0
- package/src/channels/slack/stream.ts +63 -0
- package/src/channels/slack/tool-approval-events.ts +136 -0
- package/src/channels/slack/types.ts +349 -0
- package/src/channels.ts +385 -0
- package/src/connections.ts +89 -0
- package/src/evals.ts +501 -0
- package/src/hooks.ts +33 -0
- package/src/index.ts +184 -0
- package/src/internal/ab-collector.ts +210 -0
- package/src/internal/ab-fold.ts +228 -0
- package/src/internal/ab-snapshot.ts +335 -0
- package/src/internal/approval-gate.ts +115 -0
- package/src/internal/auth.ts +39 -0
- package/src/internal/authored-alias-hooks.ts +69 -0
- package/src/internal/authored-loaders.ts +138 -0
- package/src/internal/bounded-int.ts +27 -0
- package/src/internal/brand.ts +29 -0
- package/src/internal/chat-client.ts +407 -0
- package/src/internal/cli-ax.ts +474 -0
- package/src/internal/cli-cursor.ts +275 -0
- package/src/internal/cli-github.ts +849 -0
- package/src/internal/cli-slack.ts +175 -0
- package/src/internal/cloud-merge.ts +41 -0
- package/src/internal/cron.ts +78 -0
- package/src/internal/cursor/account-mcp.ts +472 -0
- package/src/internal/cursor/backend-client.ts +614 -0
- package/src/internal/cursor/credentials.ts +401 -0
- package/src/internal/cursor-event-relay.ts +281 -0
- package/src/internal/cursor-relay-core.ts +444 -0
- package/src/internal/cursor-slack-relay.ts +242 -0
- package/src/internal/describe-error.ts +4 -0
- package/src/internal/dev-mode.ts +20 -0
- package/src/internal/discovery.ts +1709 -0
- package/src/internal/distribution.ts +97 -0
- package/src/internal/docs-site.ts +191 -0
- package/src/internal/duration.ts +39 -0
- package/src/internal/eval-run-store.ts +519 -0
- package/src/internal/eval-runner.ts +522 -0
- package/src/internal/event-log.ts +175 -0
- package/src/internal/event-mapper.ts +272 -0
- package/src/internal/frontmatter.ts +77 -0
- package/src/internal/github-fanout.ts +159 -0
- package/src/internal/handleAgentServeTrigger.ts +156 -0
- package/src/internal/host-platforms.ts +144 -0
- package/src/internal/http-channel.ts +546 -0
- package/src/internal/ids.ts +44 -0
- package/src/internal/init-project.ts +165 -0
- package/src/internal/json-dir-store.ts +109 -0
- package/src/internal/json-schema.ts +69 -0
- package/src/internal/log-ring.ts +59 -0
- package/src/internal/map-pool.ts +32 -0
- package/src/internal/mcp-endpoint.ts +518 -0
- package/src/internal/mcp-host.ts +211 -0
- package/src/internal/net.ts +31 -0
- package/src/internal/peer-connections.ts +100 -0
- package/src/internal/playground/static.ts +189 -0
- package/src/internal/playground/toolchain.ts +277 -0
- package/src/internal/reminder-runner.ts +756 -0
- package/src/internal/reminder-schedule.ts +106 -0
- package/src/internal/reminder-store.ts +145 -0
- package/src/internal/resolved-connections.ts +145 -0
- package/src/internal/review-comments.ts +268 -0
- package/src/internal/router.ts +145 -0
- package/src/internal/run-client.ts +320 -0
- package/src/internal/schedule-runner.ts +161 -0
- package/src/internal/sdk-runner.ts +315 -0
- package/src/internal/server.ts +1737 -0
- package/src/internal/session-engine.ts +1810 -0
- package/src/internal/session-store.ts +147 -0
- package/src/internal/session-urls.ts +40 -0
- package/src/internal/stream-progress.ts +254 -0
- package/src/internal/tool-result.ts +54 -0
- package/src/internal/trajectory.ts +306 -0
- package/src/internal/workspace.ts +223 -0
- package/src/reminders.ts +35 -0
- package/src/schedules.ts +37 -0
- package/src/skills.ts +27 -0
- package/src/tools.ts +127 -0
- package/src/types.ts +1848 -0
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-agent MCP surface: every mounted agent is also a Model Context
|
|
3
|
+
* Protocol server over streamable HTTP at `<base>/v1/mcp`, so other agents
|
|
4
|
+
* (peer MCP connections) and ordinary MCP clients can delegate work to it.
|
|
5
|
+
*
|
|
6
|
+
* The endpoint is stateless (a fresh `McpServer` + transport per POST, JSON
|
|
7
|
+
* response mode): session identity travels in tool arguments, not in MCP
|
|
8
|
+
* transport session headers, so any number of hosts can sit in front of it.
|
|
9
|
+
*
|
|
10
|
+
* Tools:
|
|
11
|
+
* - `ask` — start (or continue, via `sessionId`) a conversation with this
|
|
12
|
+
* agent; runs a model turn in the agent's own context and returns the
|
|
13
|
+
* reply. Bounded wait: long turns return `status: "running"`.
|
|
14
|
+
* - `check` — wait for / poll a running session started by `ask`.
|
|
15
|
+
* - `call_tool` — call one of the agent's deterministic server tools
|
|
16
|
+
* directly (no model turn). Registered only when server tools exist.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
20
|
+
import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
import type {
|
|
23
|
+
AgentProject,
|
|
24
|
+
AuthContext,
|
|
25
|
+
SessionRecord,
|
|
26
|
+
TurnOutcome,
|
|
27
|
+
} from "../types.js";
|
|
28
|
+
import { samePrincipal } from "./auth.js";
|
|
29
|
+
import {
|
|
30
|
+
SessionBusyError,
|
|
31
|
+
type SessionEngine,
|
|
32
|
+
ToolInputError,
|
|
33
|
+
ToolNotDirectlyCallableError,
|
|
34
|
+
UnknownSessionError,
|
|
35
|
+
UnknownToolError,
|
|
36
|
+
} from "./session-engine.js";
|
|
37
|
+
|
|
38
|
+
/** Channel id recorded on sessions created through the MCP surface. */
|
|
39
|
+
export const MCP_CHANNEL_ID = "mcp";
|
|
40
|
+
|
|
41
|
+
/** Mount path of the MCP surface, relative to the agent base. */
|
|
42
|
+
export const MCP_ENDPOINT_PATH = "/v1/mcp";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Bounded waits stay below the MCP client default request timeout (60s) so
|
|
46
|
+
* a long model turn degrades to `status: "running"` instead of a client
|
|
47
|
+
* timeout that loses the session id.
|
|
48
|
+
*/
|
|
49
|
+
const MAX_WAIT_SECONDS = 55;
|
|
50
|
+
const DEFAULT_WAIT_SECONDS = 50;
|
|
51
|
+
|
|
52
|
+
export interface AgentMcpEndpoint {
|
|
53
|
+
/**
|
|
54
|
+
* Handle one HTTP request to the MCP mount. `auth` is the principal
|
|
55
|
+
* resolved by the route auth chain; sessions created through `ask` bind
|
|
56
|
+
* to it, and follow-ups enforce the same principal.
|
|
57
|
+
*/
|
|
58
|
+
handle(request: Request, auth: AuthContext | null): Promise<Response>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Minimal shape both `McpServer` and the low-level `Server` satisfy. */
|
|
62
|
+
interface ConnectableMcpServer {
|
|
63
|
+
connect(transport: WebStandardStreamableHTTPServerTransport): Promise<void>;
|
|
64
|
+
close(): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Serve one stateless streamable-HTTP MCP request: a fresh server +
|
|
69
|
+
* transport per POST, JSON response mode, spec-compliant 405 on other
|
|
70
|
+
* methods. Shared by the per-agent MCP endpoint and the Cursor account
|
|
71
|
+
* bridge so the subtle transport/error plumbing exists once.
|
|
72
|
+
*/
|
|
73
|
+
export async function handleStatelessMcpRequest(args: {
|
|
74
|
+
request: Request;
|
|
75
|
+
/** Builds the per-request MCP server (tools close over request state). */
|
|
76
|
+
buildServer: () => ConnectableMcpServer;
|
|
77
|
+
/** Label used in the failure log line, e.g. `"mcp endpoint"`. */
|
|
78
|
+
label: string;
|
|
79
|
+
logger?: (line: string) => void;
|
|
80
|
+
}): Promise<Response> {
|
|
81
|
+
const logger = args.logger ?? (() => {});
|
|
82
|
+
if (args.request.method !== "POST") {
|
|
83
|
+
// Stateless server: no server-initiated SSE stream (GET) and no
|
|
84
|
+
// transport sessions to delete (DELETE). 405 per the MCP spec;
|
|
85
|
+
// clients treat it as "streaming unsupported" and carry on.
|
|
86
|
+
return new Response(
|
|
87
|
+
JSON.stringify({
|
|
88
|
+
jsonrpc: "2.0",
|
|
89
|
+
error: { code: -32000, message: "Method not allowed." },
|
|
90
|
+
id: null,
|
|
91
|
+
}),
|
|
92
|
+
{
|
|
93
|
+
status: 405,
|
|
94
|
+
headers: { "content-type": "application/json", allow: "POST" },
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
const server = args.buildServer();
|
|
99
|
+
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
100
|
+
sessionIdGenerator: undefined,
|
|
101
|
+
enableJsonResponse: true,
|
|
102
|
+
});
|
|
103
|
+
try {
|
|
104
|
+
await server.connect(transport);
|
|
105
|
+
// JSON-response mode materializes the full body before resolving,
|
|
106
|
+
// so closing in `finally` never truncates a streamed response.
|
|
107
|
+
return await transport.handleRequest(args.request);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
logger(
|
|
110
|
+
`[agent-serve] ${args.label} request failed: ${describeError(error)}`
|
|
111
|
+
);
|
|
112
|
+
return new Response(
|
|
113
|
+
JSON.stringify({
|
|
114
|
+
jsonrpc: "2.0",
|
|
115
|
+
error: { code: -32603, message: "Internal server error." },
|
|
116
|
+
id: null,
|
|
117
|
+
}),
|
|
118
|
+
{ status: 500, headers: { "content-type": "application/json" } }
|
|
119
|
+
);
|
|
120
|
+
} finally {
|
|
121
|
+
void server.close().catch(() => {});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Tool names the MCP surface exposes for `project` (info projection). */
|
|
126
|
+
export function mcpEndpointToolNames(project: AgentProject): string[] {
|
|
127
|
+
const names = ["ask", "check"];
|
|
128
|
+
if (project.agent.tools.some((tool) => tool.execution === "server")) {
|
|
129
|
+
names.push("call_tool");
|
|
130
|
+
}
|
|
131
|
+
return names;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function createAgentMcpEndpoint(args: {
|
|
135
|
+
engine: SessionEngine;
|
|
136
|
+
logger?: (line: string) => void;
|
|
137
|
+
}): AgentMcpEndpoint {
|
|
138
|
+
const { engine, logger } = args;
|
|
139
|
+
|
|
140
|
+
return {
|
|
141
|
+
handle(request, auth): Promise<Response> {
|
|
142
|
+
return handleStatelessMcpRequest({
|
|
143
|
+
request,
|
|
144
|
+
buildServer: () => buildAgentMcpServer(engine, auth),
|
|
145
|
+
label: "mcp endpoint",
|
|
146
|
+
...(logger === undefined ? {} : { logger }),
|
|
147
|
+
});
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ============================================================================
|
|
153
|
+
// Server construction (per request; tools close over the caller principal)
|
|
154
|
+
// ============================================================================
|
|
155
|
+
|
|
156
|
+
function buildAgentMcpServer(
|
|
157
|
+
engine: SessionEngine,
|
|
158
|
+
auth: AuthContext | null
|
|
159
|
+
): McpServer {
|
|
160
|
+
const project = engine.project;
|
|
161
|
+
const agent = project.agent;
|
|
162
|
+
const server = new McpServer(
|
|
163
|
+
{ name: project.name, version: "0.1.0" },
|
|
164
|
+
{ instructions: buildInstructions(project) }
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
server.registerTool(
|
|
168
|
+
"ask",
|
|
169
|
+
{
|
|
170
|
+
description: buildAskDescription(project),
|
|
171
|
+
inputSchema: {
|
|
172
|
+
message: z.string().describe("The message or task for this agent."),
|
|
173
|
+
sessionId: z
|
|
174
|
+
.string()
|
|
175
|
+
.optional()
|
|
176
|
+
.describe(
|
|
177
|
+
"Existing session to follow up on (from a previous ask). Omit to start a fresh session with fresh context."
|
|
178
|
+
),
|
|
179
|
+
waitSeconds: z
|
|
180
|
+
.number()
|
|
181
|
+
.min(0)
|
|
182
|
+
.max(MAX_WAIT_SECONDS)
|
|
183
|
+
.optional()
|
|
184
|
+
.describe(
|
|
185
|
+
`How long to wait for the turn to finish before returning status "running" (default ${DEFAULT_WAIT_SECONDS}).`
|
|
186
|
+
),
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
async ({ message, sessionId, waitSeconds }) => {
|
|
190
|
+
try {
|
|
191
|
+
const targetSessionId = await (sessionId === undefined
|
|
192
|
+
? startSession(engine, auth, message)
|
|
193
|
+
: followUpSession(engine, auth, sessionId, message));
|
|
194
|
+
const payload = await waitForReply(
|
|
195
|
+
engine,
|
|
196
|
+
targetSessionId,
|
|
197
|
+
waitSeconds ?? DEFAULT_WAIT_SECONDS
|
|
198
|
+
);
|
|
199
|
+
return toToolResult(payload);
|
|
200
|
+
} catch (error) {
|
|
201
|
+
return errorResult(describeError(error));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
server.registerTool(
|
|
207
|
+
"check",
|
|
208
|
+
{
|
|
209
|
+
description:
|
|
210
|
+
'Wait for (or poll) a session started with ask. Returns the final reply once the turn completes, or status "running" to keep waiting. Use waitSeconds: 0 for a non-blocking poll.',
|
|
211
|
+
inputSchema: {
|
|
212
|
+
sessionId: z.string().describe("Session id returned by ask."),
|
|
213
|
+
waitSeconds: z
|
|
214
|
+
.number()
|
|
215
|
+
.min(0)
|
|
216
|
+
.max(MAX_WAIT_SECONDS)
|
|
217
|
+
.optional()
|
|
218
|
+
.describe(
|
|
219
|
+
`How long to wait for the running turn before returning status "running" (default ${DEFAULT_WAIT_SECONDS}).`
|
|
220
|
+
),
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
async ({ sessionId, waitSeconds }) => {
|
|
224
|
+
try {
|
|
225
|
+
await requireOwnedSession(engine, auth, sessionId);
|
|
226
|
+
const payload = await waitForReply(
|
|
227
|
+
engine,
|
|
228
|
+
sessionId,
|
|
229
|
+
waitSeconds ?? DEFAULT_WAIT_SECONDS
|
|
230
|
+
);
|
|
231
|
+
return toToolResult(payload);
|
|
232
|
+
} catch (error) {
|
|
233
|
+
return errorResult(describeError(error));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
const serverTools = agent.tools.filter((tool) => tool.execution === "server");
|
|
239
|
+
if (serverTools.length > 0) {
|
|
240
|
+
server.registerTool(
|
|
241
|
+
"call_tool",
|
|
242
|
+
{
|
|
243
|
+
description: `Call one of this agent's deterministic server tools directly (no model turn decides anything). Available tools: ${serverTools
|
|
244
|
+
.map((tool) => tool.name)
|
|
245
|
+
.join(", ")}.`,
|
|
246
|
+
inputSchema: {
|
|
247
|
+
toolName: z.string().describe("Name of the server tool to call."),
|
|
248
|
+
input: z
|
|
249
|
+
.record(z.unknown())
|
|
250
|
+
.optional()
|
|
251
|
+
.describe("Tool input, validated against the tool's schema."),
|
|
252
|
+
sessionId: z
|
|
253
|
+
.string()
|
|
254
|
+
.optional()
|
|
255
|
+
.describe(
|
|
256
|
+
"Run the tool inside an existing session (recorded on its event stream). Omit for an ephemeral scratch workspace."
|
|
257
|
+
),
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
async ({ toolName, input, sessionId }) => {
|
|
261
|
+
try {
|
|
262
|
+
if (sessionId !== undefined) {
|
|
263
|
+
await requireOwnedSession(engine, auth, sessionId);
|
|
264
|
+
}
|
|
265
|
+
const outcome = await engine.callTool(toolName, input ?? {}, {
|
|
266
|
+
auth,
|
|
267
|
+
...(sessionId === undefined ? {} : { sessionId }),
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
content: [
|
|
271
|
+
{
|
|
272
|
+
type: "text" as const,
|
|
273
|
+
text: JSON.stringify({
|
|
274
|
+
toolName: outcome.toolName,
|
|
275
|
+
isError: outcome.isError,
|
|
276
|
+
result: outcome.result,
|
|
277
|
+
durationMs: outcome.durationMs,
|
|
278
|
+
...(outcome.errorMessage === undefined
|
|
279
|
+
? {}
|
|
280
|
+
: { errorMessage: outcome.errorMessage }),
|
|
281
|
+
}),
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
...(outcome.isError ? { isError: true as const } : {}),
|
|
285
|
+
};
|
|
286
|
+
} catch (error) {
|
|
287
|
+
if (error instanceof UnknownToolError) {
|
|
288
|
+
return errorResult(
|
|
289
|
+
`${error.message}. Available tools: ${error.availableToolNames.join(", ") || "(none)"}.`
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
if (
|
|
293
|
+
error instanceof ToolNotDirectlyCallableError ||
|
|
294
|
+
error instanceof ToolInputError ||
|
|
295
|
+
error instanceof SessionBusyError ||
|
|
296
|
+
error instanceof UnknownSessionError
|
|
297
|
+
) {
|
|
298
|
+
return errorResult(error.message);
|
|
299
|
+
}
|
|
300
|
+
return errorResult(describeError(error));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return server;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function buildInstructions(project: AgentProject): string {
|
|
310
|
+
const agent = project.agent;
|
|
311
|
+
const parts = [
|
|
312
|
+
`This MCP server fronts the Cursor agent "${project.name}".`,
|
|
313
|
+
...(agent.description === undefined ? [] : [agent.description]),
|
|
314
|
+
'Delegate a task with the ask tool: each call without a sessionId starts a fresh session (fresh context); pass the returned sessionId to continue the same conversation. When ask returns status "running", call check with that sessionId to keep waiting for the reply.',
|
|
315
|
+
];
|
|
316
|
+
return parts.join(" ");
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function buildAskDescription(project: AgentProject): string {
|
|
320
|
+
const description = project.agent.description;
|
|
321
|
+
const purpose =
|
|
322
|
+
description === undefined || description.trim() === ""
|
|
323
|
+
? `the "${project.name}" agent`
|
|
324
|
+
: `the "${project.name}" agent — ${description.trim()}`;
|
|
325
|
+
return `Send a message to ${purpose}. Runs a full model turn in that agent's own context and returns its reply. Omit sessionId to start a fresh session; pass it to follow up. Long turns return status "running" — call check with the sessionId to keep waiting.`;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// ============================================================================
|
|
329
|
+
// Session helpers
|
|
330
|
+
// ============================================================================
|
|
331
|
+
|
|
332
|
+
async function startSession(
|
|
333
|
+
engine: SessionEngine,
|
|
334
|
+
auth: AuthContext | null,
|
|
335
|
+
message: string
|
|
336
|
+
): Promise<string> {
|
|
337
|
+
const session = await engine.send(MCP_CHANNEL_ID, message, { auth });
|
|
338
|
+
return session.id;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
async function followUpSession(
|
|
342
|
+
engine: SessionEngine,
|
|
343
|
+
auth: AuthContext | null,
|
|
344
|
+
sessionId: string,
|
|
345
|
+
message: string
|
|
346
|
+
): Promise<string> {
|
|
347
|
+
const record = await requireOwnedSession(engine, auth, sessionId);
|
|
348
|
+
if (record.mode === "task") {
|
|
349
|
+
throw new Error(
|
|
350
|
+
`Session ${sessionId} is a fire-and-forget task session; it does not accept follow-ups.`
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
if (record.continuationKey === null) {
|
|
354
|
+
throw new Error(
|
|
355
|
+
`Session ${sessionId} is not addressable for follow-ups (no active continuation).`
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
// Send as the session owner after the ownership gate above, mirroring the
|
|
359
|
+
// HTTP follow-up route (machine callers address sessions by id; the HTTP
|
|
360
|
+
// continuation token is not rotated).
|
|
361
|
+
await engine.send(record.channelId, message, {
|
|
362
|
+
auth: record.auth,
|
|
363
|
+
continuationToken: record.continuationKey,
|
|
364
|
+
});
|
|
365
|
+
return sessionId;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
async function requireOwnedSession(
|
|
369
|
+
engine: SessionEngine,
|
|
370
|
+
auth: AuthContext | null,
|
|
371
|
+
sessionId: string
|
|
372
|
+
): Promise<SessionRecord> {
|
|
373
|
+
const record = await engine.sessions.get(sessionId);
|
|
374
|
+
if (record === undefined) {
|
|
375
|
+
throw new UnknownSessionError(sessionId);
|
|
376
|
+
}
|
|
377
|
+
if (!samePrincipal(record.auth, auth)) {
|
|
378
|
+
throw new Error(
|
|
379
|
+
`Session ${sessionId} belongs to a different principal; use the credentials that created it.`
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
return record;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
interface ReplyPayload {
|
|
386
|
+
status: "completed" | "running" | "error" | "cancelled";
|
|
387
|
+
sessionId: string;
|
|
388
|
+
reply?: string;
|
|
389
|
+
errorMessage?: string;
|
|
390
|
+
note?: string;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
async function waitForReply(
|
|
394
|
+
engine: SessionEngine,
|
|
395
|
+
sessionId: string,
|
|
396
|
+
waitSeconds: number
|
|
397
|
+
): Promise<ReplyPayload> {
|
|
398
|
+
const waitMs = Math.max(0, Math.min(waitSeconds, MAX_WAIT_SECONDS)) * 1000;
|
|
399
|
+
const outcome = await raceTimeout(
|
|
400
|
+
engine.waitForCompletion(sessionId),
|
|
401
|
+
waitMs
|
|
402
|
+
);
|
|
403
|
+
if (outcome === undefined) {
|
|
404
|
+
return {
|
|
405
|
+
status: "running",
|
|
406
|
+
sessionId,
|
|
407
|
+
note: `The turn is still running. Call check with { "sessionId": "${sessionId}" } to keep waiting.`,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return toReplyPayload(engine, sessionId, outcome);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
async function toReplyPayload(
|
|
414
|
+
engine: SessionEngine,
|
|
415
|
+
sessionId: string,
|
|
416
|
+
outcome: TurnOutcome
|
|
417
|
+
): Promise<ReplyPayload> {
|
|
418
|
+
if (outcome.status === "finished") {
|
|
419
|
+
let reply = outcome.result;
|
|
420
|
+
if (reply === undefined || reply === "") {
|
|
421
|
+
// The engine's in-memory outcome is gone after a host restart; fall
|
|
422
|
+
// back to the durable event log for the last completed turn.
|
|
423
|
+
reply = await latestReplyFromEvents(engine, sessionId);
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
status: "completed",
|
|
427
|
+
sessionId,
|
|
428
|
+
...(reply === undefined ? {} : { reply }),
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
if (outcome.status === "cancelled") {
|
|
432
|
+
return {
|
|
433
|
+
status: "cancelled",
|
|
434
|
+
sessionId,
|
|
435
|
+
errorMessage: outcome.errorMessage ?? "The turn was cancelled.",
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
status: "error",
|
|
440
|
+
sessionId,
|
|
441
|
+
errorMessage: outcome.errorMessage ?? "The turn failed.",
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
async function latestReplyFromEvents(
|
|
446
|
+
engine: SessionEngine,
|
|
447
|
+
sessionId: string
|
|
448
|
+
): Promise<string | undefined> {
|
|
449
|
+
let events: Awaited<ReturnType<SessionEngine["listEvents"]>>;
|
|
450
|
+
try {
|
|
451
|
+
events = await engine.listEvents(sessionId);
|
|
452
|
+
} catch {
|
|
453
|
+
return undefined;
|
|
454
|
+
}
|
|
455
|
+
for (let i = events.length - 1; i >= 0; i--) {
|
|
456
|
+
const event = events[i];
|
|
457
|
+
if (event === undefined) {
|
|
458
|
+
continue;
|
|
459
|
+
}
|
|
460
|
+
if (event.type === "turn.completed" && event.data.result !== undefined) {
|
|
461
|
+
return event.data.result;
|
|
462
|
+
}
|
|
463
|
+
if (event.type === "message.completed" && event.data.text !== "") {
|
|
464
|
+
return event.data.text;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return undefined;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// ============================================================================
|
|
471
|
+
// Result shaping
|
|
472
|
+
// ============================================================================
|
|
473
|
+
|
|
474
|
+
interface McpToolResult {
|
|
475
|
+
content: Array<{ type: "text"; text: string }>;
|
|
476
|
+
isError?: true;
|
|
477
|
+
[key: string]: unknown;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
function toToolResult(payload: ReplyPayload): McpToolResult {
|
|
481
|
+
return {
|
|
482
|
+
content: [{ type: "text", text: JSON.stringify(payload) }],
|
|
483
|
+
...(payload.status === "error" ? { isError: true as const } : {}),
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
function errorResult(message: string): McpToolResult {
|
|
488
|
+
return {
|
|
489
|
+
content: [{ type: "text", text: message }],
|
|
490
|
+
isError: true,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
/** Resolve to the promise value, or undefined once `ms` elapses first. */
|
|
495
|
+
function raceTimeout<T>(
|
|
496
|
+
promise: Promise<T>,
|
|
497
|
+
ms: number
|
|
498
|
+
): Promise<T | undefined> {
|
|
499
|
+
return new Promise<T | undefined>((resolve, reject) => {
|
|
500
|
+
const timer = setTimeout(() => {
|
|
501
|
+
resolve(undefined);
|
|
502
|
+
}, ms);
|
|
503
|
+
promise.then(
|
|
504
|
+
(value) => {
|
|
505
|
+
clearTimeout(timer);
|
|
506
|
+
resolve(value);
|
|
507
|
+
},
|
|
508
|
+
(error: unknown) => {
|
|
509
|
+
clearTimeout(timer);
|
|
510
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
511
|
+
}
|
|
512
|
+
);
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function describeError(error: unknown): string {
|
|
517
|
+
return error instanceof Error ? error.message : String(error);
|
|
518
|
+
}
|