@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
package/src/channels.ts
ADDED
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineChannel` and the built-in HTTP channel — authored at
|
|
3
|
+
* `agent/channels/<name>.ts`.
|
|
4
|
+
*
|
|
5
|
+
* A channel is the surface an agent lives on. The built-in HTTP channel
|
|
6
|
+
* (session create / follow-up / NDJSON stream routes under `/v1/session*`)
|
|
7
|
+
* is always mounted; author `agent/channels/http.ts` with `httpChannel()`
|
|
8
|
+
* only to override its defaults. Custom channels declare their own routes
|
|
9
|
+
* and are mounted under `/v1/channels/<name>`:
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { defineChannel, POST } from "@anysphere/agent-serve/channels";
|
|
13
|
+
* import { z } from "zod";
|
|
14
|
+
*
|
|
15
|
+
* export default defineChannel({
|
|
16
|
+
* routes: [
|
|
17
|
+
* POST("/message", {
|
|
18
|
+
* bodySchema: z.object({
|
|
19
|
+
* message: z.string(),
|
|
20
|
+
* token: z.string().optional(),
|
|
21
|
+
* }),
|
|
22
|
+
* handler: async (_req, { send, body }) => {
|
|
23
|
+
* const { message, token } = body as {
|
|
24
|
+
* message: string;
|
|
25
|
+
* token?: string;
|
|
26
|
+
* };
|
|
27
|
+
* const session = await send(message, {
|
|
28
|
+
* continuationToken: token,
|
|
29
|
+
* });
|
|
30
|
+
* return Response.json({ sessionId: session.id });
|
|
31
|
+
* },
|
|
32
|
+
* }),
|
|
33
|
+
* ],
|
|
34
|
+
* events: {
|
|
35
|
+
* "message.completed"(event, channel, ctx) {
|
|
36
|
+
* // deliver completed messages back to the surface that owns this
|
|
37
|
+
* // channel (post to a webhook, reply in a thread, ...)
|
|
38
|
+
* },
|
|
39
|
+
* },
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* Route helpers are typed so HTTP channels must declare **Zod** schemas at
|
|
44
|
+
* compile time: `GET` requires `querySchema`, `POST`/`PUT`/`PATCH` require
|
|
45
|
+
* `bodySchema`. Plain JSON Schema objects will not type-check. Use
|
|
46
|
+
* `z.object({})` / `z.unknown()` when the surface is intentionally open.
|
|
47
|
+
* Handlers receive `args.body` / `args.query` inferred from those schemas.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
import { Buffer } from "node:buffer";
|
|
51
|
+
import { timingSafeEqual } from "node:crypto";
|
|
52
|
+
import { brandDefinition } from "./internal/brand.js";
|
|
53
|
+
import { isLoopbackAddress, isLoopbackHostname } from "./internal/net.js";
|
|
54
|
+
import type {
|
|
55
|
+
AuthContext,
|
|
56
|
+
AuthPolicy,
|
|
57
|
+
ChannelBodyRouteSpec,
|
|
58
|
+
ChannelConfig,
|
|
59
|
+
ChannelDefinition,
|
|
60
|
+
ChannelDeleteRouteSpec,
|
|
61
|
+
ChannelGetRouteSpec,
|
|
62
|
+
ChannelRoute,
|
|
63
|
+
ChannelRouteHandler,
|
|
64
|
+
ChannelRouteSchema,
|
|
65
|
+
HttpChannelConfig,
|
|
66
|
+
HttpChannelDefinition,
|
|
67
|
+
JsonValue,
|
|
68
|
+
RouteMethod,
|
|
69
|
+
} from "./types.js";
|
|
70
|
+
|
|
71
|
+
export type {
|
|
72
|
+
AuthContext,
|
|
73
|
+
AuthPolicy,
|
|
74
|
+
ChannelBodyRouteSpec,
|
|
75
|
+
ChannelConfig,
|
|
76
|
+
ChannelDefinition,
|
|
77
|
+
ChannelDeleteRouteSpec,
|
|
78
|
+
ChannelEventContext,
|
|
79
|
+
ChannelEventHandler,
|
|
80
|
+
ChannelEventHandlers,
|
|
81
|
+
ChannelGetRouteSpec,
|
|
82
|
+
ChannelHandlerArgs,
|
|
83
|
+
ChannelHandlerArgsWithBody,
|
|
84
|
+
ChannelHandlerArgsWithBodyAndQuery,
|
|
85
|
+
ChannelHandlerArgsWithQuery,
|
|
86
|
+
ChannelRoute,
|
|
87
|
+
ChannelRouteHandler,
|
|
88
|
+
ChannelRouteSchema,
|
|
89
|
+
ChannelRouteSpec,
|
|
90
|
+
ChannelSession,
|
|
91
|
+
ChannelStartArgs,
|
|
92
|
+
HttpChannelConfig,
|
|
93
|
+
HttpChannelDefinition,
|
|
94
|
+
ReceiveInput,
|
|
95
|
+
RouteMethod,
|
|
96
|
+
SendMessageFn,
|
|
97
|
+
SendMessageOptions,
|
|
98
|
+
} from "./types.js";
|
|
99
|
+
|
|
100
|
+
/** Define a custom channel. */
|
|
101
|
+
export function defineChannel<TState = JsonValue>(
|
|
102
|
+
config: ChannelConfig<TState>
|
|
103
|
+
): ChannelDefinition<TState> {
|
|
104
|
+
return brandDefinition("channel", config);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Configure the built-in HTTP session channel. Only meaningful as the
|
|
109
|
+
* default export of `agent/channels/http.ts`.
|
|
110
|
+
*/
|
|
111
|
+
export function httpChannel(
|
|
112
|
+
config: HttpChannelConfig = {}
|
|
113
|
+
): HttpChannelDefinition {
|
|
114
|
+
return brandDefinition("http-channel", config);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Route verbs
|
|
119
|
+
// ============================================================================
|
|
120
|
+
|
|
121
|
+
function route(
|
|
122
|
+
method: RouteMethod,
|
|
123
|
+
path: string,
|
|
124
|
+
spec: {
|
|
125
|
+
description?: string;
|
|
126
|
+
bodySchema?: ChannelRouteSchema;
|
|
127
|
+
querySchema?: ChannelRouteSchema;
|
|
128
|
+
handler: ChannelRouteHandler;
|
|
129
|
+
}
|
|
130
|
+
): ChannelRoute {
|
|
131
|
+
if (!path.startsWith("/")) {
|
|
132
|
+
throw new Error(`Channel route path must start with "/": ${path}`);
|
|
133
|
+
}
|
|
134
|
+
const result: ChannelRoute = {
|
|
135
|
+
method,
|
|
136
|
+
path,
|
|
137
|
+
handler: spec.handler,
|
|
138
|
+
};
|
|
139
|
+
if (spec.description !== undefined) {
|
|
140
|
+
result.description = spec.description;
|
|
141
|
+
}
|
|
142
|
+
if (spec.bodySchema !== undefined) {
|
|
143
|
+
result.bodySchema = spec.bodySchema;
|
|
144
|
+
}
|
|
145
|
+
if (spec.querySchema !== undefined) {
|
|
146
|
+
result.querySchema = spec.querySchema;
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** GET — Zod `querySchema` is required (use `z.object({})` when unused). */
|
|
152
|
+
export function GET<TQuery extends ChannelRouteSchema>(
|
|
153
|
+
path: string,
|
|
154
|
+
spec: ChannelGetRouteSpec<TQuery>
|
|
155
|
+
): ChannelRoute {
|
|
156
|
+
return route("GET", path, {
|
|
157
|
+
description: spec.description,
|
|
158
|
+
querySchema: spec.querySchema,
|
|
159
|
+
handler: spec.handler as ChannelRouteHandler,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** POST — Zod `bodySchema` is required. */
|
|
164
|
+
export function POST<
|
|
165
|
+
TBody extends ChannelRouteSchema,
|
|
166
|
+
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
167
|
+
>(path: string, spec: ChannelBodyRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
168
|
+
return route("POST", path, {
|
|
169
|
+
description: spec.description,
|
|
170
|
+
bodySchema: spec.bodySchema,
|
|
171
|
+
querySchema: spec.querySchema,
|
|
172
|
+
handler: spec.handler as ChannelRouteHandler,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** PUT — Zod `bodySchema` is required. */
|
|
177
|
+
export function PUT<
|
|
178
|
+
TBody extends ChannelRouteSchema,
|
|
179
|
+
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
180
|
+
>(path: string, spec: ChannelBodyRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
181
|
+
return route("PUT", path, {
|
|
182
|
+
description: spec.description,
|
|
183
|
+
bodySchema: spec.bodySchema,
|
|
184
|
+
querySchema: spec.querySchema,
|
|
185
|
+
handler: spec.handler as ChannelRouteHandler,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** PATCH — Zod `bodySchema` is required. */
|
|
190
|
+
export function PATCH<
|
|
191
|
+
TBody extends ChannelRouteSchema,
|
|
192
|
+
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
193
|
+
>(path: string, spec: ChannelBodyRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
194
|
+
return route("PATCH", path, {
|
|
195
|
+
description: spec.description,
|
|
196
|
+
bodySchema: spec.bodySchema,
|
|
197
|
+
querySchema: spec.querySchema,
|
|
198
|
+
handler: spec.handler as ChannelRouteHandler,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** DELETE — Zod schemas optional. */
|
|
203
|
+
export function DELETE<
|
|
204
|
+
TBody extends ChannelRouteSchema | undefined = undefined,
|
|
205
|
+
TQuery extends ChannelRouteSchema | undefined = undefined,
|
|
206
|
+
>(path: string, spec: ChannelDeleteRouteSpec<TBody, TQuery>): ChannelRoute {
|
|
207
|
+
return route("DELETE", path, {
|
|
208
|
+
description: spec.description,
|
|
209
|
+
bodySchema: spec.bodySchema,
|
|
210
|
+
querySchema: spec.querySchema,
|
|
211
|
+
handler: spec.handler,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// ============================================================================
|
|
216
|
+
// Auth policies
|
|
217
|
+
// ============================================================================
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Admit requests that arrive over the loopback interface with no proxy
|
|
221
|
+
* forwarding headers. The default route policy: local tooling works out of
|
|
222
|
+
* the box while remote (or reverse-proxied) callers are rejected until you
|
|
223
|
+
* wire real auth (e.g. {@link bearerAuth}).
|
|
224
|
+
*
|
|
225
|
+
* Requests carrying `X-Forwarded-For`, `X-Real-IP`, `Forwarded`, or
|
|
226
|
+
* `X-Forwarded-Host` are denied even when the TCP peer is 127.0.0.1 — that
|
|
227
|
+
* pattern is how tunnels and same-host reverse proxies re-expose loopback.
|
|
228
|
+
*/
|
|
229
|
+
export function localDev(): AuthPolicy {
|
|
230
|
+
return (request, info) => {
|
|
231
|
+
if (hasProxyForwardingHeaders(request)) {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
if (info.requestIp !== null && isLoopbackAddress(info.requestIp)) {
|
|
235
|
+
return {
|
|
236
|
+
authenticator: "local-dev",
|
|
237
|
+
principalId: "local",
|
|
238
|
+
principalType: "user",
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Like {@link localDev} but also requires the request URL hostname to be
|
|
247
|
+
* loopback. Rejects DNS-rebinding callers that reach 127.0.0.1 with a remote
|
|
248
|
+
* `Host` header (e.g. attacker.example after rebinding to localhost).
|
|
249
|
+
*/
|
|
250
|
+
export function localDevStrict(): AuthPolicy {
|
|
251
|
+
return (request, info) => {
|
|
252
|
+
if (localDev()(request, info) === null) {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
let hostname: string;
|
|
256
|
+
try {
|
|
257
|
+
hostname = new URL(request.url).hostname;
|
|
258
|
+
} catch {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
if (!isLoopbackHostname(hostname)) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
authenticator: "local-dev-strict",
|
|
266
|
+
principalId: "local",
|
|
267
|
+
principalType: "user",
|
|
268
|
+
};
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Admit requests whose TCP peer is loopback, ignoring `Host` and
|
|
274
|
+
* proxy-forwarding headers. The peer address (`req.socket.remoteAddress`) is
|
|
275
|
+
* the real boundary: a loopback-bound server only accepts local processes, and
|
|
276
|
+
* a LAN caller's peer IP is non-loopback and rejected. Unlike {@link localDev},
|
|
277
|
+
* this does not veto on `X-Forwarded-*` headers — so it admits loopback clients
|
|
278
|
+
* that legitimately relay them, e.g. `gh webhook forward`, which forwards
|
|
279
|
+
* GitHub's edge `X-Forwarded-For` / `X-Real-Ip`. Intended for dev-only relaxed
|
|
280
|
+
* auth where remote exposure is still refused.
|
|
281
|
+
*/
|
|
282
|
+
export function loopbackOnly(): AuthPolicy {
|
|
283
|
+
return (_request, info) => {
|
|
284
|
+
if (info.requestIp !== null && isLoopbackAddress(info.requestIp)) {
|
|
285
|
+
return {
|
|
286
|
+
authenticator: "loopback-only",
|
|
287
|
+
principalId: "local",
|
|
288
|
+
principalType: "user",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return null;
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function hasGitHubWebhookDeliveryHeaders(request: Request): boolean {
|
|
296
|
+
const event = request.headers.get("x-github-event");
|
|
297
|
+
return event !== null && event.trim() !== "";
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Dev-only GitHub channel auth without a webhook secret: loopback peer
|
|
302
|
+
* required. Plain local fixtures (no proxy headers) are admitted; deliveries
|
|
303
|
+
* relayed through `gh webhook forward` carry GitHub's `X-Forwarded-*` headers
|
|
304
|
+
* and are admitted only when `X-GitHub-Event` is present (GitHub deliveries
|
|
305
|
+
* always include it). Loopback tunnels that relay arbitrary remote traffic
|
|
306
|
+
* without those delivery headers stay rejected.
|
|
307
|
+
*/
|
|
308
|
+
export function loopbackGitHubDev(): AuthPolicy {
|
|
309
|
+
return (request, info) => {
|
|
310
|
+
if (info.requestIp === null || !isLoopbackAddress(info.requestIp)) {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
if (
|
|
314
|
+
hasProxyForwardingHeaders(request) &&
|
|
315
|
+
!hasGitHubWebhookDeliveryHeaders(request)
|
|
316
|
+
) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
authenticator: "loopback-github-dev",
|
|
321
|
+
principalId: "local",
|
|
322
|
+
principalType: "user",
|
|
323
|
+
};
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function hasProxyForwardingHeaders(request: Request): boolean {
|
|
328
|
+
return (
|
|
329
|
+
request.headers.has("x-forwarded-for") ||
|
|
330
|
+
request.headers.has("x-forwarded-host") ||
|
|
331
|
+
request.headers.has("x-real-ip") ||
|
|
332
|
+
request.headers.has("forwarded")
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Admit requests carrying `Authorization: Bearer <token>`. Pass the expected
|
|
338
|
+
* token (compared in constant time) or a verifier that maps a presented
|
|
339
|
+
* token to an {@link AuthContext}.
|
|
340
|
+
*/
|
|
341
|
+
export function bearerAuth(
|
|
342
|
+
tokenOrVerify:
|
|
343
|
+
| string
|
|
344
|
+
| ((token: string) => AuthContext | null | Promise<AuthContext | null>)
|
|
345
|
+
): AuthPolicy {
|
|
346
|
+
return async (request) => {
|
|
347
|
+
const header = request.headers.get("authorization");
|
|
348
|
+
if (header === null || !header.toLowerCase().startsWith("bearer ")) {
|
|
349
|
+
return null;
|
|
350
|
+
}
|
|
351
|
+
const presented = header.slice("bearer ".length).trim();
|
|
352
|
+
if (typeof tokenOrVerify === "function") {
|
|
353
|
+
return await tokenOrVerify(presented);
|
|
354
|
+
}
|
|
355
|
+
if (tokenOrVerify !== "" && constantTimeEquals(presented, tokenOrVerify)) {
|
|
356
|
+
return {
|
|
357
|
+
authenticator: "bearer",
|
|
358
|
+
principalId: "bearer",
|
|
359
|
+
principalType: "service",
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
return null;
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
function constantTimeEquals(a: string, b: string): boolean {
|
|
367
|
+
const aBytes = Buffer.from(a);
|
|
368
|
+
const bBytes = Buffer.from(b);
|
|
369
|
+
if (aBytes.length !== bBytes.length) {
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
return timingSafeEqual(aBytes, bBytes);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Admit every request as an anonymous principal. Only for surfaces that are
|
|
377
|
+
* intentionally public or protected upstream.
|
|
378
|
+
*/
|
|
379
|
+
export function allowAll(): AuthPolicy {
|
|
380
|
+
return () => ({
|
|
381
|
+
authenticator: "allow-all",
|
|
382
|
+
principalId: "anonymous",
|
|
383
|
+
principalType: "user",
|
|
384
|
+
});
|
|
385
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `defineConnection` — authored at `agent/mcp-connections/<name>.ts`.
|
|
3
|
+
*
|
|
4
|
+
* A connection gives tools from an external MCP server. The filename
|
|
5
|
+
* becomes the connection (server) name. Every connection is always
|
|
6
|
+
* available in three places:
|
|
7
|
+
* - the Cursor agent (local harness or cloud), via SDK `mcpServers`
|
|
8
|
+
* - the agent-serve host, via `ctx.host.mcp` on in-process tools
|
|
9
|
+
* - channel / schedule handlers, via `args.host.mcp`
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { defineConnection } from "@anysphere/agent-serve/connections";
|
|
13
|
+
*
|
|
14
|
+
* export default defineConnection({
|
|
15
|
+
* url: "https://mcp.linear.app/mcp",
|
|
16
|
+
* headers: { authorization: `Bearer ${process.env.LINEAR_TOKEN}` },
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* A **Cursor account MCP connection** exposes the MCP connectors the operator
|
|
21
|
+
* already authorized in their Cursor account (dashboard → MCP). Every tool
|
|
22
|
+
* executes **on the Cursor backend** with the account's stored OAuth
|
|
23
|
+
* credentials, so the agent gets Linear / Notion / Slack / … tools with
|
|
24
|
+
* zero token plumbing and no OAuth secrets on this host. Requires the host
|
|
25
|
+
* to be signed in (`agent-serve login` or `CURSOR_API_KEY`):
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* // agent/mcp-connections/cursor.ts — every connected server
|
|
29
|
+
* export default defineConnection({ cursorAccount: true });
|
|
30
|
+
*
|
|
31
|
+
* // or restrict to specific connectors by name
|
|
32
|
+
* export default defineConnection({ cursorAccount: true, servers: ["Linear"] });
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* A **peer MCP connection** addresses another agent mounted on the same serve
|
|
36
|
+
* host by slug — every mounted agent is itself an MCP server at
|
|
37
|
+
* `/<slug>/v1/mcp` (tools: `ask`, `check`, and `call_tool` when it has
|
|
38
|
+
* server tools), so the model can delegate work to the peer, which runs
|
|
39
|
+
* in its own sessions with its own tools and context:
|
|
40
|
+
*
|
|
41
|
+
* ```ts
|
|
42
|
+
* export default defineConnection({
|
|
43
|
+
* agent: "weather-agent",
|
|
44
|
+
* description: "Delegate weather questions to the weather agent.",
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* Peer URLs resolve when the server starts: loopback for local-runtime
|
|
49
|
+
* turns and host-side calls, the serve `--public-url` for cloud-runtime
|
|
50
|
+
* turns (a cloud VM cannot reach this host's loopback address).
|
|
51
|
+
*
|
|
52
|
+
* Server tools can call the same connection:
|
|
53
|
+
*
|
|
54
|
+
* ```ts
|
|
55
|
+
* async execute(input, ctx) {
|
|
56
|
+
* return ctx.host.mcp.callTool("linear", "list_issues", { query: input.q });
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* So can webhook / channel route handlers (deterministic, no agent loop):
|
|
61
|
+
*
|
|
62
|
+
* ```ts
|
|
63
|
+
* POST("/sync", {
|
|
64
|
+
* bodySchema: z.object({}),
|
|
65
|
+
* handler: async (_req, { host }) => {
|
|
66
|
+
* const result = await host.mcp.callTool("linear", "list_issues", {});
|
|
67
|
+
* return Response.json(result);
|
|
68
|
+
* },
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
import { brandDefinition } from "./internal/brand.js";
|
|
74
|
+
import type { ConnectionConfig, ConnectionDefinition } from "./types.js";
|
|
75
|
+
|
|
76
|
+
export type {
|
|
77
|
+
ConnectionConfig,
|
|
78
|
+
ConnectionDefinition,
|
|
79
|
+
ConnectionTransport,
|
|
80
|
+
HostMcpCallResult,
|
|
81
|
+
HostMcpRegistry,
|
|
82
|
+
HostMcpToolInfo,
|
|
83
|
+
} from "./types.js";
|
|
84
|
+
|
|
85
|
+
export function defineConnection(
|
|
86
|
+
config: ConnectionConfig
|
|
87
|
+
): ConnectionDefinition {
|
|
88
|
+
return brandDefinition("connection", config);
|
|
89
|
+
}
|