@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,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Webhooks & custom channels"
|
|
3
|
+
description: "Give the agent its own HTTP surface: validated routes, sessions keyed to your domain, and replies delivered back out."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Webhooks and custom channels
|
|
7
|
+
|
|
8
|
+
A custom channel gives the agent its own HTTP surface. You get routes
|
|
9
|
+
with validated payloads, sessions keyed to something in your domain (a
|
|
10
|
+
thread, a ticket, a PR), and replies delivered back to the caller. The
|
|
11
|
+
[Slack](./slack.md) and [GitHub](./github.md) packs build on this
|
|
12
|
+
mechanism. This page is the mechanism itself.
|
|
13
|
+
|
|
14
|
+
## What you already have
|
|
15
|
+
|
|
16
|
+
The built-in HTTP channel is always mounted (under `/<slug>` in the
|
|
17
|
+
default multi-agent layout). `POST /v1/session` starts a conversation,
|
|
18
|
+
`POST /v1/session/:id` follows up, and `GET /v1/session/:id/stream`
|
|
19
|
+
streams NDJSON events, plus sessions, approvals, and tool routes. The
|
|
20
|
+
full list is in the [HTTP API reference](../reference/http-api.md).
|
|
21
|
+
|
|
22
|
+
Write a custom channel when that shape doesn't fit: a webhook with its
|
|
23
|
+
own payload contract, a surface that keys sessions by a domain id, or a
|
|
24
|
+
flow that does host-side work before (or instead of) a model turn.
|
|
25
|
+
|
|
26
|
+
## Define a channel
|
|
27
|
+
|
|
28
|
+
Author `agent/channels/<id>.ts` with `defineChannel`. The filename is
|
|
29
|
+
the channel id, and routes mount under `/v1/channels/<id>`:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { defineChannel, POST } from "@cursor/july/channels";
|
|
33
|
+
import { z } from "zod";
|
|
34
|
+
|
|
35
|
+
export default defineChannel({
|
|
36
|
+
routes: [
|
|
37
|
+
POST("/message", {
|
|
38
|
+
description: "Enqueue a chat turn on this channel",
|
|
39
|
+
bodySchema: z.object({
|
|
40
|
+
message: z.string(),
|
|
41
|
+
thread: z.string().optional(),
|
|
42
|
+
}),
|
|
43
|
+
handler: async (_req, { send, body }) => {
|
|
44
|
+
const session = await send(body.message, {
|
|
45
|
+
// stable key: same thread → same durable session
|
|
46
|
+
continuationToken: body.thread,
|
|
47
|
+
});
|
|
48
|
+
return Response.json({ sessionId: session.id });
|
|
49
|
+
},
|
|
50
|
+
}),
|
|
51
|
+
],
|
|
52
|
+
events: {
|
|
53
|
+
"message.completed"(event, channel, ctx) {
|
|
54
|
+
// deliver the reply back to the surface that owns this channel:
|
|
55
|
+
// post to a webhook, reply in a thread, update a ticket, …
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
curl -X POST http://127.0.0.1:3000/<slug>/v1/channels/<id>/message \
|
|
63
|
+
-H 'content-type: application/json' \
|
|
64
|
+
-d '{"message":"hello","thread":"ticket-42"}'
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Schemas are Zod, and required
|
|
68
|
+
|
|
69
|
+
`GET` routes require a Zod `querySchema`. `POST`, `PUT`, and `PATCH`
|
|
70
|
+
require a Zod `bodySchema`. Compile-time checks enforce this, so plain
|
|
71
|
+
JSON Schema objects won't type-check. Use `z.object({})` or
|
|
72
|
+
`z.unknown()` when a surface is intentionally open. The host validates
|
|
73
|
+
before your handler runs, handlers receive typed `args.body` and
|
|
74
|
+
`args.query`, and empty POST bodies are coerced to `{}` first.
|
|
75
|
+
|
|
76
|
+
Declared schemas also feed `GET /v1/info`, which adds two things to the
|
|
77
|
+
playground: a **Try** button on every route, and matching **slash
|
|
78
|
+
commands** in the composer (a channel `drive` route becomes `/drive …`).
|
|
79
|
+
|
|
80
|
+
## What a handler receives
|
|
81
|
+
|
|
82
|
+
Handlers get the Fetch `Request` plus an args object:
|
|
83
|
+
|
|
84
|
+
| Helper | What it does |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
| `send(message, options?)` | Run a model turn on this channel. `continuationToken` keys the durable session; options can seed `workspaceFiles`, attach `cloud` repos, or override `auth`. |
|
|
87
|
+
| `getSession(sessionId)` | Look up an existing session |
|
|
88
|
+
| `receive(channel, input)` | Hand off to another channel (schedules use this) |
|
|
89
|
+
| `callTool(name, input, opts?)` | Run an authored server tool with no model turn ([Tools](../reference/tools.md#call-a-tool-without-a-model-turn)) |
|
|
90
|
+
| `body`, `query`, `params` | Validated payloads and path params |
|
|
91
|
+
| `auth` | The `AuthContext` the route's auth chain resolved |
|
|
92
|
+
| `requestIp` | The TCP peer address |
|
|
93
|
+
| `host` | Shared host services: `host.mcp`, `host.github`, `host.slack`, `host.reminders` |
|
|
94
|
+
| `waitUntil(promise)` | Background work that outlives the response |
|
|
95
|
+
|
|
96
|
+
Channel `state` declares the starting per-session adapter state. It
|
|
97
|
+
persists across events, and event handlers receive it on
|
|
98
|
+
`channel.state`.
|
|
99
|
+
|
|
100
|
+
## Respond fast, work in the background
|
|
101
|
+
|
|
102
|
+
Webhook senders time out quickly. GitHub gives you about ten seconds.
|
|
103
|
+
For slow work, ACK immediately and continue in the background:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
handler: async (_req, { send, waitUntil, body }) => {
|
|
107
|
+
waitUntil(
|
|
108
|
+
send(`Process incoming report: ${body.url}`, {
|
|
109
|
+
continuationToken: `report:${body.id}`,
|
|
110
|
+
})
|
|
111
|
+
);
|
|
112
|
+
return Response.json({ accepted: true }, { status: 202 });
|
|
113
|
+
},
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Prepare on the host, then hand off
|
|
117
|
+
|
|
118
|
+
The strongest channel pattern: do the deterministic setup in the
|
|
119
|
+
handler, then hand the model prepared evidence. Fetch the PR with
|
|
120
|
+
`callTool`, seed the files it needs, and make the prompt about judgment
|
|
121
|
+
rather than about finding things:
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
handler: async (_req, { callTool, send, body }) => {
|
|
125
|
+
const prep = await callTool("prepare_pr", { pr: body.pr });
|
|
126
|
+
if (prep.isError) {
|
|
127
|
+
return Response.json({ ok: false, error: prep.result }, { status: 502 });
|
|
128
|
+
}
|
|
129
|
+
const session = await send("Review the prepared PR under pr/.", {
|
|
130
|
+
continuationToken: `pr:${body.pr}`,
|
|
131
|
+
});
|
|
132
|
+
return Response.json({ sessionId: session.id });
|
|
133
|
+
},
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
This host-prep shape is the change with the largest effect on latency
|
|
137
|
+
and quality. [Hillclimbing](../hillclimbing.md) lists it first.
|
|
138
|
+
|
|
139
|
+
## Deliver replies back out
|
|
140
|
+
|
|
141
|
+
The `events` map subscribes the channel to stream events for the
|
|
142
|
+
sessions it owns. Typical wiring: `message.completed` posts the
|
|
143
|
+
assistant text back to the caller's surface, and `turn.failed` posts an
|
|
144
|
+
error notice. The full vocabulary is in
|
|
145
|
+
[Sessions and streaming](../reference/sessions.md#the-event-vocabulary).
|
|
146
|
+
|
|
147
|
+
## Auth: loopback by default, on purpose
|
|
148
|
+
|
|
149
|
+
Every route runs an auth-policy chain (the channel's `auth` array). The
|
|
150
|
+
default is `[localDevStrict()]`: direct loopback callers only. Requests
|
|
151
|
+
carrying proxy-forwarding headers (`X-Forwarded-For`, `X-Real-IP`,
|
|
152
|
+
`Forwarded`, `X-Forwarded-Host`) are rejected, and a loopback `Host`
|
|
153
|
+
header is required. So a tunnel, a same-host reverse proxy, or a
|
|
154
|
+
DNS-rebinding page can't silently re-expose the route.
|
|
155
|
+
|
|
156
|
+
Before real traffic, author auth explicitly:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
import { bearerAuth, defineChannel, localDevStrict } from "@cursor/july/channels";
|
|
160
|
+
|
|
161
|
+
export default defineChannel({
|
|
162
|
+
auth: [localDevStrict(), bearerAuth(process.env.WEBHOOK_TOKEN ?? "")],
|
|
163
|
+
routes: [/* … */],
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The built-in policies are `localDevStrict()` (the default),
|
|
168
|
+
`localDev()`, `loopbackOnly()`, `bearerAuth(tokenOrVerify)`, and
|
|
169
|
+
`allowAll()`, and any `(request, info) => AuthContext | null` function
|
|
170
|
+
composes with them. Signature-verified surfaces usually use `allowAll()`
|
|
171
|
+
at the route and verify the HMAC in the channel; the GitHub channel with
|
|
172
|
+
a webhook secret works this way. The details live in
|
|
173
|
+
[Channels](../reference/channels.md#auth-policies).
|
|
174
|
+
|
|
175
|
+
Server-level flags interact with channel auth. `--bearer-token <secret>`
|
|
176
|
+
swaps the default for `bearerAuth` on every channel that doesn't author
|
|
177
|
+
its own chain, and `--allow-anonymous` swaps it for `allowAll()`
|
|
178
|
+
(trusted networks only). Authored `auth` arrays always win over both.
|
|
179
|
+
|
|
180
|
+
## Test a channel
|
|
181
|
+
|
|
182
|
+
Start with curl and saved payloads under `fixtures/`. The playground's
|
|
183
|
+
**Try** modal covers manual probes. It remembers your last body per
|
|
184
|
+
endpoint, has Copy curl, and opens the created session on a successful
|
|
185
|
+
Try. For regression coverage, drive the same behavior through an eval,
|
|
186
|
+
or keep channel logic deterministic in `agent/lib/` and unit-test it
|
|
187
|
+
there. When something looks wrong, read the session's `events.ndjson`.
|
|
188
|
+
The stream is the record of what happened.
|
|
189
|
+
|
|
190
|
+
For GitHub specifically, don't hand-roll fixtures.
|
|
191
|
+
`agentkit github replay` synthesizes real-shaped, signed payloads
|
|
192
|
+
from any PR you can read. See the [GitHub guide](./github.md).
|
|
193
|
+
|
|
194
|
+
## What's next
|
|
195
|
+
|
|
196
|
+
Continue with these pages:
|
|
197
|
+
|
|
198
|
+
- [Channels reference](../reference/channels.md): the full authoring API
|
|
199
|
+
- [GitHub](./github.md) and [Slack](./slack.md): the packaged channels
|
|
200
|
+
- [Sessions and streaming](../reference/sessions.md): events your
|
|
201
|
+
channel can subscribe to
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Hillclimbing"
|
|
3
|
+
description: "Improve an agent one measured round at a time, with the hillclimb skill running the loop with you."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hillclimbing
|
|
7
|
+
|
|
8
|
+
Make an agent better on fixed inputs: measure, change one lever, remeasure, and lock every kept win with an eval.
|
|
9
|
+
|
|
10
|
+
## What is hillclimbing?
|
|
11
|
+
|
|
12
|
+
Hillclimbing is a measured improvement loop. You pin a few fixtures, name the one dominant problem in the run, change one lever, and check the same fixtures again. Keep only what helps. Every kept change lands an [eval](./evals.md) so the win stays put.
|
|
13
|
+
|
|
14
|
+
You don't have to run the loop alone. The package ships a coding-agent skill that drives it with you.
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart LR
|
|
18
|
+
measure[Measure] --> change[Change one lever]
|
|
19
|
+
change --> remeasure[Remeasure]
|
|
20
|
+
remeasure --> measure
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## How do I hillclimb an agent with a coding agent?
|
|
24
|
+
|
|
25
|
+
Have Cursor read [`skills/hillclimb/SKILL.md`](../skills/hillclimb/SKILL.md).
|
|
26
|
+
|
|
27
|
+
Tell it:
|
|
28
|
+
|
|
29
|
+
1. **Which agent** you're improving (path or slug)
|
|
30
|
+
2. **One to three fixtures** you'll reuse every round: a PR URL, a saved webhook body, or a canonical chat prompt
|
|
31
|
+
3. **What "better" means** this round: correct tool choice, fewer tools, lower latency, or output quality. Name the freeze line too: API shape, public output, and existing evals that must stay green
|
|
32
|
+
|
|
33
|
+
The skill serves the agent, hits your fixtures, reads the session trajectory, proposes one change, remeasures, and checks with you before the next round.
|
|
34
|
+
|
|
35
|
+
Other skills cover the edges:
|
|
36
|
+
|
|
37
|
+
| When you need… | Skill |
|
|
38
|
+
| --- | --- |
|
|
39
|
+
| The measured improvement loop | [`skills/hillclimb/SKILL.md`](../skills/hillclimb/SKILL.md) |
|
|
40
|
+
| An eval that locks a kept win | [`skills/evals/SKILL.md`](../skills/evals/SKILL.md) |
|
|
41
|
+
| Repeatable GitHub webhook inputs | [`skills/github/SKILL.md`](../skills/github/SKILL.md) |
|
|
42
|
+
| A run that misbehaves | [`skills/debug/SKILL.md`](../skills/debug/SKILL.md) |
|
|
43
|
+
|
|
44
|
+
See [Building agents with agents](./building-with-agents.md) for every framework skill and a good first prompt.
|
|
45
|
+
|
|
46
|
+
## What do I need before a hillclimb round?
|
|
47
|
+
|
|
48
|
+
Agree on four things before you edit:
|
|
49
|
+
|
|
50
|
+
1. **The target agent**: the project you're improving
|
|
51
|
+
2. **Fixtures**: one to three fixed inputs you can compare across runs
|
|
52
|
+
3. **Success criteria**: what better means this round
|
|
53
|
+
4. **The freeze line**: what must not change
|
|
54
|
+
|
|
55
|
+
Pin the input first. A moving fixture is noise. For GitHub agents, use `agentkit github replay` (see the [GitHub guide](./guides/github.md)). For a single tool without a model turn, use `agentkit call`. For a chat turn, use `agentkit run --dir . --message "…"`.
|
|
56
|
+
|
|
57
|
+
## How do I run one hillclimb round?
|
|
58
|
+
|
|
59
|
+
**Measure.** Hit the agent the way a user would: playground, channel HTTP, or Slack in `--dev`. Or ask the hillclimb skill to do it. `agentkit run` returns a JSON trajectory and writes a trace under `.agentkit/traces/`.
|
|
60
|
+
|
|
61
|
+
**Reflect.** Score the trajectory, not impressions. Was the answer right? Did the model thrash (too many tools, fat evidence, grep loops)? Did it invent work the host should have prepared? Name the single dominant problem for this round in one sentence. Example: "Full-file dumps trigger grep loops."
|
|
62
|
+
|
|
63
|
+
**Change one lever.** Prefer the smallest change that addresses that problem:
|
|
64
|
+
|
|
65
|
+
1. Host prep: seed what the model needs so it doesn't hunt
|
|
66
|
+
2. Evidence shape: trim or reorder artifacts
|
|
67
|
+
3. Instructions and skills: tighten the procedure
|
|
68
|
+
4. Tool surface: remove or gate tools that invite wandering
|
|
69
|
+
5. Framework changes: only when the agent can't express the fix
|
|
70
|
+
|
|
71
|
+
**Remeasure.** Same fixtures. Diff tools, wall time, and quality side by side. Keep the change only if the target metric improves and the freeze line holds.
|
|
72
|
+
|
|
73
|
+
## How do I lock a hillclimb improvement with an eval?
|
|
74
|
+
|
|
75
|
+
Every kept change needs an eval that would have failed before the change: a tool-choice gate, an `action.result` count bound, or an output-shape check. Run `agentkit eval --dir . --json` between rounds. Never weaken an existing gate to pass the round.
|
|
76
|
+
|
|
77
|
+
Details live in [Evals](./evals.md). The evals skill will author the case with you.
|
|
78
|
+
|
|
79
|
+
## What habits help hillclimbing stay reliable?
|
|
80
|
+
|
|
81
|
+
- One problem per round. Don't bundle "trim evidence and rewrite instructions" unless you chose that on purpose.
|
|
82
|
+
- Keep fixtures fixed until you deliberately need a harder case.
|
|
83
|
+
- Separate host work from model tools when you blame latency. Moving deterministic prep onto the host is often the biggest win. In one PR reviewer, host-prepared evidence cut turns from about 8 minutes to about 1 minute.
|
|
84
|
+
- Spot-check quality on at least one fixture against a known-good answer. Efficiency-only climbs quietly drop findings.
|
|
85
|
+
- Treat `turn.failed` with `"turn interrupted"` as expected when a follow-up or stop preempted the turn.
|
|
86
|
+
- Don't deploy, post to real surfaces, or weaken evals as part of a climb.
|
|
87
|
+
|
|
88
|
+
## Related
|
|
89
|
+
|
|
90
|
+
- [Evals](./evals.md)
|
|
91
|
+
- [Building agents with agents](./building-with-agents.md)
|
|
92
|
+
- [GitHub guide](./guides/github.md)
|
|
93
|
+
- [Fix common agent problems](./troubleshooting.md)
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Build your first weather agent"
|
|
3
|
+
description: "Create a weather agent, add a typed tool, run it from the terminal, and open it in the playground."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Build your first weather agent
|
|
7
|
+
|
|
8
|
+
Create an agent, give it a weather tool, run a complete turn, and chat
|
|
9
|
+
with it in the browser.
|
|
10
|
+
|
|
11
|
+
## Prerequisites
|
|
12
|
+
|
|
13
|
+
You need:
|
|
14
|
+
|
|
15
|
+
- Node 22.13 or newer. Bun isn't supported.
|
|
16
|
+
- The `agentkit` CLI. See [Run the CLI](./README.md#run-the-cli)
|
|
17
|
+
for the current package and command names.
|
|
18
|
+
- A Cursor credential for model turns. Sign in once:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
agentkit login
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
You can also set `CURSOR_API_KEY` instead of signing in.
|
|
25
|
+
|
|
26
|
+
## Scaffolding Agents
|
|
27
|
+
|
|
28
|
+
Have Cursor read [`skills/create-agent/SKILL.md`](../skills/create-agent/SKILL.md)
|
|
29
|
+
and describe what you want:
|
|
30
|
+
|
|
31
|
+
> Build me a weather agent for the playground. Start with one weather
|
|
32
|
+
> tool and guide me through the remaining decisions.
|
|
33
|
+
|
|
34
|
+
Cursor asks for missing choices, shows you the plan, then builds and
|
|
35
|
+
verifies the agent. Continue below to do the same by hand.
|
|
36
|
+
|
|
37
|
+
See [Scaffold an agent with Cursor](./scaffolding-agents.md) for the
|
|
38
|
+
full guided workflow.
|
|
39
|
+
|
|
40
|
+
## Create your project
|
|
41
|
+
|
|
42
|
+
Start with the built-in scaffold:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
agentkit init ./weather-agent
|
|
46
|
+
cd weather-agent
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The scaffold creates the files agentkit discovers:
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
weather-agent/
|
|
53
|
+
├── agent/
|
|
54
|
+
│ ├── agent.ts
|
|
55
|
+
│ ├── instructions.md
|
|
56
|
+
│ └── tools/
|
|
57
|
+
│ └── echo.ts
|
|
58
|
+
└── package.json
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`agent.ts` holds the model and runtime settings. `instructions.md` is
|
|
62
|
+
the always-on system prompt. Each file under `agent/tools/` becomes a
|
|
63
|
+
tool.
|
|
64
|
+
|
|
65
|
+
Check the project before you run it:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
agentkit validate --dir .
|
|
69
|
+
agentkit info --dir .
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
These commands inspect the project without starting a model turn.
|
|
73
|
+
|
|
74
|
+
## Run your agent
|
|
75
|
+
|
|
76
|
+
The scaffold already works. Run one turn from the terminal:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
agentkit run --dir . \
|
|
80
|
+
--message "Introduce yourself in one sentence."
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`run` starts the agent, sends the message, and waits for the final
|
|
84
|
+
reply. It prints a JSON trajectory with the response, tool calls, and
|
|
85
|
+
token usage. It also writes an NDJSON trace under
|
|
86
|
+
`.agentkit/traces/`.
|
|
87
|
+
|
|
88
|
+
## Add weather instructions
|
|
89
|
+
|
|
90
|
+
Replace `agent/instructions.md`:
|
|
91
|
+
|
|
92
|
+
```md
|
|
93
|
+
# Weather agent
|
|
94
|
+
|
|
95
|
+
You are a concise weather assistant.
|
|
96
|
+
|
|
97
|
+
- Use `get_weather` before answering questions about current weather.
|
|
98
|
+
- Tell the user the weather data is simulated.
|
|
99
|
+
- Keep replies to two sentences or fewer.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Remove the demo echo tool:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
rm agent/tools/echo.ts
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Add a weather tool
|
|
109
|
+
|
|
110
|
+
Create `agent/tools/get_weather.ts`:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { defineTool } from "@cursor/july/tools";
|
|
114
|
+
import { z } from "zod";
|
|
115
|
+
|
|
116
|
+
export default defineTool({
|
|
117
|
+
description: "Get simulated current weather for a city.",
|
|
118
|
+
inputSchema: z.object({
|
|
119
|
+
city: z.string().describe("City name, such as San Francisco"),
|
|
120
|
+
}),
|
|
121
|
+
async execute({ city }) {
|
|
122
|
+
const temperatureF = Math.round(Math.random() * (90 - 32) + 32);
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
city,
|
|
126
|
+
temperatureF,
|
|
127
|
+
conditions: "sunny",
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
The file adds one tool named `get_weather`:
|
|
134
|
+
|
|
135
|
+
- `description` tells the model when to call it.
|
|
136
|
+
- `inputSchema` defines and validates the arguments.
|
|
137
|
+
- `execute` runs on the server and returns data to the model.
|
|
138
|
+
|
|
139
|
+
This version uses simulated data so you can run it without another API
|
|
140
|
+
key. Replace `execute` with a weather API when you're ready.
|
|
141
|
+
|
|
142
|
+
## Try the weather tool
|
|
143
|
+
|
|
144
|
+
Call the tool directly first:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
agentkit call get_weather --dir . \
|
|
148
|
+
--input '{"city":"San Francisco"}'
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
`call` validates the input and runs `execute` without a model turn. If
|
|
152
|
+
the result looks right, ask the agent:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
agentkit run --dir . \
|
|
156
|
+
--message "What's the weather in San Francisco?"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The agent calls `get_weather`, receives the result, and uses it in the
|
|
160
|
+
final reply. agentkit runs the tool loop for you.
|
|
161
|
+
|
|
162
|
+
## Open the playground
|
|
163
|
+
|
|
164
|
+
Start the development server:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
agentkit serve --dir . --dev
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Open the playground URL printed in the terminal. Ask the same weather
|
|
171
|
+
question. The playground streams the reply and shows the tool arguments
|
|
172
|
+
and result inline.
|
|
173
|
+
|
|
174
|
+
## Where to go next
|
|
175
|
+
|
|
176
|
+
- [Tools](./reference/tools.md): add more typed capabilities, like
|
|
177
|
+
replacing the simulated weather tool with live Open-Meteo data
|
|
178
|
+
- [Evals](./evals.md): turn this weather question into a regression
|
|
179
|
+
check
|
|
180
|
+
- [Channels](./reference/channels.md): expose the agent through HTTP,
|
|
181
|
+
Slack, or another webhook
|
|
182
|
+
- [Building agents with agents](./building-with-agents.md): have a
|
|
183
|
+
coding agent extend the project for you
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Agent config"
|
|
3
|
+
description: "defineAgent at agent/agent.ts: the model, the local and cloud runtimes, and serving programmatically."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agent config (`agent/agent.ts`)
|
|
7
|
+
|
|
8
|
+
`agent/agent.ts` default-exports `defineAgent(config)`: which model runs
|
|
9
|
+
the agent, where turns execute, and runtime-specific defaults.
|
|
10
|
+
Everything is optional on the root agent.
|
|
11
|
+
|
|
12
|
+
```ts
|
|
13
|
+
import { defineAgent } from "@cursor/july";
|
|
14
|
+
|
|
15
|
+
export default defineAgent({
|
|
16
|
+
model: {
|
|
17
|
+
id: "grok-4.5",
|
|
18
|
+
params: [
|
|
19
|
+
{ id: "effort", value: "high" },
|
|
20
|
+
{ id: "fast", value: "true" },
|
|
21
|
+
],
|
|
22
|
+
}, // optional; this is the default
|
|
23
|
+
runtime: "local", // default, or "cloud"
|
|
24
|
+
// cloud: {
|
|
25
|
+
// repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
|
|
26
|
+
// },
|
|
27
|
+
// local: { cwd: "../harness" },
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Fields on `defineAgent`
|
|
32
|
+
|
|
33
|
+
`defineAgent` accepts these fields.
|
|
34
|
+
|
|
35
|
+
| Field | Type | Meaning |
|
|
36
|
+
| --- | --- | --- |
|
|
37
|
+
| `model` | string or `{ id, params }` | Cursor model for turns. Defaults to `grok-4.5` with `effort=high`, `fast=true` on the root agent. Subagents omit it to inherit. |
|
|
38
|
+
| `name` | string | Display name override. Defaults to the package name or directory name. |
|
|
39
|
+
| `description` | string | What the agent is for. Required on subagents; the parent model reads it to decide when to delegate. Documentation-only on the root. |
|
|
40
|
+
| `instructions` | string | Inline instructions. Prefer `instructions.md`; this exists for subagents and generated configs. |
|
|
41
|
+
| `runtime` | `"local"` or `"cloud"` | Where turns execute. Default `"local"`. |
|
|
42
|
+
| `cloud` | object | Cloud agent defaults: repos, env, envVars, forwarded to the Cursor SDK. Used when `runtime` is `"cloud"`, and as the base merged under per-session `cloud` send options. |
|
|
43
|
+
| `local` | `{ cwd? }` | Local harness defaults; ignored for cloud turns. |
|
|
44
|
+
|
|
45
|
+
## Choose a model
|
|
46
|
+
|
|
47
|
+
`model` is a Cursor model id string, or `{ id, params }`. Effort and
|
|
48
|
+
speed are params, not id suffixes. The SDK rejects suffix-style ids
|
|
49
|
+
like `grok-4.5-fast`:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
model: {
|
|
53
|
+
id: "grok-4.5",
|
|
54
|
+
params: [
|
|
55
|
+
{ id: "effort", value: "high" },
|
|
56
|
+
{ id: "fast", value: "true" },
|
|
57
|
+
],
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
A plain string works when you don't need params:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
model: "composer-2.5",
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Choose a runtime
|
|
68
|
+
|
|
69
|
+
`runtime: "local"` (the default) runs turns on the Cursor SDK harness on
|
|
70
|
+
this machine. The session id doubles as the SDK agent id, and server
|
|
71
|
+
tools, skills, sandbox seeds, and tool approvals all apply.
|
|
72
|
+
|
|
73
|
+
`runtime: "cloud"` runs turns on Cursor cloud agents (`bc-…` ids). Pass
|
|
74
|
+
a `cloud` block with the repos the VM carries. In-process server
|
|
75
|
+
tools are not available, and instructions and agent-tool catalogs are
|
|
76
|
+
prepended to the first prompt, because the local session workspace is
|
|
77
|
+
not the cloud VM.
|
|
78
|
+
|
|
79
|
+
`validate` warns when `runtime: "cloud"` is combined with server tools,
|
|
80
|
+
skills, or sandbox seeds that only apply locally. The full capability
|
|
81
|
+
matrix and the patterns that hold up are in the
|
|
82
|
+
[Cloud runtime guide](../guides/cloud-runtime.md).
|
|
83
|
+
|
|
84
|
+
## Local cwd
|
|
85
|
+
|
|
86
|
+
`local.cwd` sets the default parent directory for local harness
|
|
87
|
+
workspaces. Each session uses `<cwd>/<sessionId>` (absolute, or relative
|
|
88
|
+
to the project root) unless a per-send `workspaceDir` overrides it.
|
|
89
|
+
|
|
90
|
+
This is your control over ambient context. Session workspaces are real
|
|
91
|
+
Cursor project directories, so the harness loads `AGENTS.md` and
|
|
92
|
+
`.cursor` config from ancestor directories. An agent inside a big
|
|
93
|
+
monorepo that must not inherit the monorepo's rules points `cwd`
|
|
94
|
+
outside it (or runs with `--state-root` under `/tmp`). An agent that
|
|
95
|
+
*needs* a specific checkout's skills and rules points `cwd` inside that
|
|
96
|
+
checkout.
|
|
97
|
+
|
|
98
|
+
## The `cloud` block
|
|
99
|
+
|
|
100
|
+
Cloud agent defaults forwarded to the Cursor SDK: `repos` (each
|
|
101
|
+
`{ url, startingRef? }`), environment selection, `envVars`, and the
|
|
102
|
+
rest. A local agent uses the same block as the base config when a
|
|
103
|
+
channel opens a cloud-attached session per send. That hybrid pattern is
|
|
104
|
+
covered in
|
|
105
|
+
[Cloud runtime](../guides/cloud-runtime.md#hybrid-local-agent-cloud-sessions).
|
|
106
|
+
|
|
107
|
+
## Generate instructions
|
|
108
|
+
|
|
109
|
+
When the system prompt must be computed, author `agent/instructions.ts`
|
|
110
|
+
instead of markdown:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { defineInstructions } from "@cursor/july";
|
|
114
|
+
|
|
115
|
+
export default defineInstructions({
|
|
116
|
+
markdown: `You are the on-call assistant for ${process.env.TEAM_NAME}.`,
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The directory form and the runtime mapping are in
|
|
121
|
+
[Instructions](./instructions.md).
|
|
122
|
+
|
|
123
|
+
## Serve programmatically
|
|
124
|
+
|
|
125
|
+
`serve(dirOrProject, options)` embeds the server in your own process:
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
import { serve } from "@cursor/july";
|
|
129
|
+
|
|
130
|
+
const handle = await serve("./my-agent", {
|
|
131
|
+
port: 3000,
|
|
132
|
+
apiKey: process.env.CURSOR_API_KEY, // optional; see credential order
|
|
133
|
+
});
|
|
134
|
+
console.log(`listening on ${handle.url}`);
|
|
135
|
+
// handle.callTool(...), handle.dispatchSchedule("heartbeat"),
|
|
136
|
+
// handle.createReminder(...), handle.project, await handle.close()
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`ServeOptions` mirrors the CLI flags: `port`, `host`, `dev`,
|
|
140
|
+
`stateRoot`, `apiKey`, `schedules`, `reminders`, `playground`,
|
|
141
|
+
`authToken` (the `--bearer-token` equivalent), `allowAnonymous`,
|
|
142
|
+
`publicUrl`, `cursorEvents`, and `mode: "single" | "multi"`. The Cursor
|
|
143
|
+
credential resolves in one order everywhere: explicit `apiKey`, then
|
|
144
|
+
`CURSOR_API_KEY`, then the key stored by `agentkit login`.
|
|
145
|
+
|
|
146
|
+
## What's next
|
|
147
|
+
|
|
148
|
+
Continue with these pages:
|
|
149
|
+
|
|
150
|
+
- [Instructions](./instructions.md): the required half of a minimal
|
|
151
|
+
agent
|
|
152
|
+
- [Cloud runtime](../guides/cloud-runtime.md): when and how to leave
|
|
153
|
+
the host
|
|
154
|
+
- [CLI](./cli.md): the flags `ServeOptions` mirrors
|