@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/docs/evals.md
ADDED
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Evals"
|
|
3
|
+
description: "Define repeatable checks with defineEval, run them with agentkit eval, and use them as regression checks."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Evals
|
|
7
|
+
|
|
8
|
+
An eval is a repeatable check that runs your agent against a fixed input
|
|
9
|
+
and gates the recorded trajectory: the run completed, the right tool
|
|
10
|
+
ran, the reply has the right shape. Evals are how you know a prompt
|
|
11
|
+
tweak helped, a refactor didn't regress the agent, and last month's fix
|
|
12
|
+
is still holding.
|
|
13
|
+
|
|
14
|
+
Evals exercise the same surface your users hit. The runner starts (or
|
|
15
|
+
targets) a real agent server, drives sessions over the public API, and
|
|
16
|
+
grades what comes back. A passing eval means the agent started,
|
|
17
|
+
accepted a message, and did what you asserted.
|
|
18
|
+
|
|
19
|
+
> [!NOTE]
|
|
20
|
+
> Import paths here use `@cursor/july/evals`. On projects still
|
|
21
|
+
> using `@cursor/july`, swap the import and run
|
|
22
|
+
> `agent-serve eval`. See
|
|
23
|
+
> [Run the CLI](./README.md#run-the-cli) for the full rename table.
|
|
24
|
+
|
|
25
|
+
## Define evals with `defineEval`
|
|
26
|
+
|
|
27
|
+
agentkit discovers evals under the project-root `evals/` directory,
|
|
28
|
+
in `.eval.ts` or `.eval.js` files. That's a sibling of `agent/`, never
|
|
29
|
+
inside it (`agent/evals/` is silently ignored). TypeScript is the normal
|
|
30
|
+
authoring format.
|
|
31
|
+
|
|
32
|
+
The file path is the eval's identity, so you don't author an id.
|
|
33
|
+
Directories group related evals: `evals/builds/api.eval.ts` becomes id
|
|
34
|
+
`builds/api`. An `index` filename collapses to its directory, so
|
|
35
|
+
`evals/builds/index.eval.ts` becomes `builds`.
|
|
36
|
+
|
|
37
|
+
An eval is a single `async test(t)`. You drive the agent with `t` and
|
|
38
|
+
assert on the run with the same `t`:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
// evals/readiness.eval.ts
|
|
42
|
+
import { defineEval, includes } from "@cursor/july/evals";
|
|
43
|
+
|
|
44
|
+
export default defineEval({
|
|
45
|
+
description: "Inspects a PR without approving it.",
|
|
46
|
+
tags: ["smoke"],
|
|
47
|
+
timeoutMs: 120_000,
|
|
48
|
+
async test(t) {
|
|
49
|
+
await t.send(
|
|
50
|
+
"Is https://github.com/acme/checkout/pull/42 ready to approve?"
|
|
51
|
+
);
|
|
52
|
+
t.succeeded();
|
|
53
|
+
t.calledTool("inspect_pr");
|
|
54
|
+
t.notCalledTool("approve_pr");
|
|
55
|
+
t.check(t.reply, includes(/ready|approve/i));
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
One file can also hold several datapoints through `cases` (provide
|
|
61
|
+
either `test` or `cases`, not both). Each case id becomes
|
|
62
|
+
`<fileId>/<case.id>`:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
// evals/prs.eval.ts → prs/checkout, prs/search
|
|
66
|
+
export default defineEval({
|
|
67
|
+
tags: ["smoke", "prs"],
|
|
68
|
+
cases: [
|
|
69
|
+
{
|
|
70
|
+
id: "checkout",
|
|
71
|
+
description: "Checkout PR readiness.",
|
|
72
|
+
async test(t) {
|
|
73
|
+
await t.send(
|
|
74
|
+
"Is https://github.com/acme/checkout/pull/42 ready to approve?"
|
|
75
|
+
);
|
|
76
|
+
t.succeeded();
|
|
77
|
+
t.calledTool("inspect_pr");
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: "search",
|
|
82
|
+
async test(t) {
|
|
83
|
+
await t.send(
|
|
84
|
+
"Check https://github.com/acme/search/pull/7 before approval."
|
|
85
|
+
);
|
|
86
|
+
t.succeeded();
|
|
87
|
+
t.calledTool("inspect_pr");
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Case ids must be single path segments, unique within the file.
|
|
95
|
+
Each case can set its own `description`, `tags`, and `timeoutMs`. A
|
|
96
|
+
case-level value replaces the file-level value for that datapoint.
|
|
97
|
+
|
|
98
|
+
## Configure eval runs
|
|
99
|
+
|
|
100
|
+
Each project with evals needs `evals/evals.config.ts` or
|
|
101
|
+
`evals/evals.config.js`, and it must set `maxConcurrency`. Each case
|
|
102
|
+
issues real model-provider requests, so concurrency is capped hard at
|
|
103
|
+
200. Existing projects use 20. Discovery with `eval --list` works
|
|
104
|
+
without this file, but running a case does not.
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import {
|
|
108
|
+
defineEvalConfig,
|
|
109
|
+
persistEvalRunsToDir,
|
|
110
|
+
} from "@cursor/july/evals";
|
|
111
|
+
|
|
112
|
+
export default defineEvalConfig({
|
|
113
|
+
maxConcurrency: 20, // required
|
|
114
|
+
// timeoutMs: 180_000, // optional project-wide default
|
|
115
|
+
// maxPlaygroundRuns: 50, // playground /v1/dev/evals history only (default 20)
|
|
116
|
+
//
|
|
117
|
+
// Playground batches default to **process memory only** — they disappear
|
|
118
|
+
// when `serve` exits. Opt into durable storage:
|
|
119
|
+
// persistRuns: persistEvalRunsToDir(".agent-serve/eval-runs"),
|
|
120
|
+
// Or implement { load, save, delete } yourself (S3, DB, …).
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
The timeout order is case or file `timeoutMs`, CLI `--timeout-ms`,
|
|
125
|
+
project config `timeoutMs`, then the 180-second runner default.
|
|
126
|
+
|
|
127
|
+
Playground batch retention is separate from case concurrency:
|
|
128
|
+
|
|
129
|
+
| Option | Default | Meaning |
|
|
130
|
+
| --- | --- | --- |
|
|
131
|
+
| `maxPlaygroundRuns` | `20` | Max batches in the playground / `/v1/dev/evals*` history (not CLI `eval`) |
|
|
132
|
+
| `persistRuns` | unset | Optional `{ load, save, delete }` so batches survive process restart (`delete` required for durable prune) |
|
|
133
|
+
|
|
134
|
+
Without `persistRuns`, navigating away and back still works while the same
|
|
135
|
+
`serve` process is up; a restart clears history.
|
|
136
|
+
|
|
137
|
+
## Drive and assert with `t`
|
|
138
|
+
|
|
139
|
+
`t` is both the driver and the assertion surface. You write ordinary
|
|
140
|
+
control flow, sending turns and asserting inline.
|
|
141
|
+
|
|
142
|
+
Drive the agent with `t.send(message, options?)`. It runs one turn and
|
|
143
|
+
waits for the session to park or fail. Multiple sends in one case share
|
|
144
|
+
the session, which is how you write multi-turn evals. The return value
|
|
145
|
+
contains the turn's `message`, `sessionId`, `events`, `toolCalls`, and
|
|
146
|
+
`ok` state.
|
|
147
|
+
|
|
148
|
+
Read the full case state with `t.reply` (the last assistant text),
|
|
149
|
+
`t.events` (every captured session event across turns), and
|
|
150
|
+
`t.sessionId`.
|
|
151
|
+
|
|
152
|
+
Assert with the gates:
|
|
153
|
+
|
|
154
|
+
| Gate | Checks |
|
|
155
|
+
| --- | --- |
|
|
156
|
+
| `t.succeeded()` | the captured trajectory has at least one turn and did not fail |
|
|
157
|
+
| `t.calledTool(name)` | `name` appears in the captured tool calls |
|
|
158
|
+
| `t.notCalledTool(name)` | `name` does not appear in the captured tool calls |
|
|
159
|
+
| `t.messageIncludes(token)` | the last assistant reply matches a string or `RegExp` |
|
|
160
|
+
| `t.check(value, expectation)` | any value, against a builder |
|
|
161
|
+
|
|
162
|
+
`calledTool` reads the recorded trajectory. A requested call counts even
|
|
163
|
+
when its result has not arrived. To require a completed result, inspect
|
|
164
|
+
`t.events` for an `action.result` event.
|
|
165
|
+
|
|
166
|
+
The expectation builders are `includes(string | RegExp)`,
|
|
167
|
+
`equals(value)`, and `satisfies(predicate, label)`. `includes`
|
|
168
|
+
stringifies its input, `equals` compares values deeply, and `satisfies`
|
|
169
|
+
runs your predicate. `t.log(message)` records a debug line for the CLI
|
|
170
|
+
and playground result.
|
|
171
|
+
|
|
172
|
+
Two `t.send` options make cases self-contained: `workspaceFiles`
|
|
173
|
+
(`{ path: contents }`, seeded into the session workspace before the
|
|
174
|
+
first turn) and `workspaceDir` (an absolute harness cwd). Prefer
|
|
175
|
+
`workspaceFiles` over machine-local paths, so the case carries its own
|
|
176
|
+
fixtures. Both options only apply to the first `t.send`, when the runner
|
|
177
|
+
creates the session.
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
const toolResults = t.events.filter((e) => e.type === "action.result");
|
|
181
|
+
t.check(
|
|
182
|
+
toolResults.length,
|
|
183
|
+
satisfies((n) => (n as number) <= 4, "at most 4 tool calls")
|
|
184
|
+
);
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
A case with no explicit gates falls back to whether at least one turn
|
|
188
|
+
completed successfully. Add `t.succeeded()` and behavior-specific gates
|
|
189
|
+
anyway. They make the contract visible during review.
|
|
190
|
+
|
|
191
|
+
## Run evals from the CLI
|
|
192
|
+
|
|
193
|
+
The `eval` command discovers, filters, and runs cases.
|
|
194
|
+
|
|
195
|
+
Run the CLI under Node 22.13 or newer. Do not use Bun. Its HTTP/2 client
|
|
196
|
+
breaks tool-result streams and causes eval turns to fail.
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
agentkit eval --dir . --list # discover only
|
|
200
|
+
agentkit eval --dir . # run all
|
|
201
|
+
agentkit eval --dir . builds/checkout # one datapoint
|
|
202
|
+
agentkit eval --dir . builds search # several ids or prefixes
|
|
203
|
+
agentkit eval --dir . --tag smoke --tag pull-request # any matching tag
|
|
204
|
+
agentkit eval --dir . --json --no-stream # machine-readable results
|
|
205
|
+
agentkit eval --dir . --verbose # logs + reply snippets
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Id filters use OR semantics. Each filter selects an exact id and its
|
|
209
|
+
descendants. For example, `builds` selects `builds`,
|
|
210
|
+
`builds/checkout`, and every other case below that path. Repeated tags
|
|
211
|
+
also use OR semantics. When you provide both ids and tags, a case must
|
|
212
|
+
match both groups.
|
|
213
|
+
|
|
214
|
+
`eval` boots an ephemeral server on port 0 with a temp state root
|
|
215
|
+
outside the project, so cases don't inherit ambient monorepo rules and
|
|
216
|
+
don't pollute `.agentkit/`. Point `--url` at a running server to eval
|
|
217
|
+
a live agent instead:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
agentkit eval --dir . \
|
|
221
|
+
--url http://127.0.0.1:3000/weather-agent \
|
|
222
|
+
--bearer-token "$AGENT_TOKEN"
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
The eval definitions still come from `--dir`; `--url` only changes the
|
|
226
|
+
agent that receives the turns. For a locally mounted multi-agent
|
|
227
|
+
directory, `--slug weather-agent` chooses the target. Use
|
|
228
|
+
`--state-root` to keep ephemeral session state at a chosen path,
|
|
229
|
+
`--timeout-ms` to override the project timeout, and `--no-stream` to
|
|
230
|
+
keep live progress off stderr. A TTY streams turn progress by default.
|
|
231
|
+
`--verbose` still writes `t.log` lines to stderr and adds reply snippets
|
|
232
|
+
to text results.
|
|
233
|
+
|
|
234
|
+
Model turns need a Cursor credential from `agentkit login` or
|
|
235
|
+
`CURSOR_API_KEY`.
|
|
236
|
+
|
|
237
|
+
The exit code is `0` when every selected case passes, `1` when any case
|
|
238
|
+
fails, and `2` when no case matches. `--list` exits `0`, including when
|
|
239
|
+
it finds no cases.
|
|
240
|
+
|
|
241
|
+
For a compact command index, see [CLI: eval](./reference/cli.md#eval).
|
|
242
|
+
|
|
243
|
+
### JSON results
|
|
244
|
+
|
|
245
|
+
Use `--json --no-stream` in scripts and CI. The top-level result carries
|
|
246
|
+
the totals and one result per case:
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
{
|
|
250
|
+
"ok": true,
|
|
251
|
+
"passed": 1,
|
|
252
|
+
"failed": 0,
|
|
253
|
+
"results": [
|
|
254
|
+
{
|
|
255
|
+
"id": "readiness",
|
|
256
|
+
"ok": true,
|
|
257
|
+
"assertions": [{ "name": "succeeded", "passed": true }],
|
|
258
|
+
"sessionId": "ses_123",
|
|
259
|
+
"inputs": ["Is checkout pull request 42 ready to approve?"],
|
|
260
|
+
"toolCalls": [{ "toolName": "inspect_pr", "isError": false }],
|
|
261
|
+
"logs": [],
|
|
262
|
+
"durationMs": 12340
|
|
263
|
+
}
|
|
264
|
+
]
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
Each case result can also include `description`, `finalText`, `tools`,
|
|
269
|
+
`error`, and tool arguments or output. This shape lets CI report the
|
|
270
|
+
failed assertion without parsing terminal text.
|
|
271
|
+
|
|
272
|
+
## Run evals in the playground
|
|
273
|
+
|
|
274
|
+
Start the server with `--dev`, open the playground, and choose
|
|
275
|
+
**Evals**. You can run every case or one case, watch progress, and open
|
|
276
|
+
the resulting session trace.
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
agentkit serve --dir . --dev
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Playground runs target the live server instead of an ephemeral one.
|
|
283
|
+
Their sessions appear in the session list. One eval batch can run at a
|
|
284
|
+
time. By default those batches are **in-memory only** (capped by
|
|
285
|
+
`maxPlaygroundRuns`); set `persistRuns` in `evals.config.ts` if you need them
|
|
286
|
+
after a serve restart — see [Configure eval runs](#configure-eval-runs).
|
|
287
|
+
|
|
288
|
+
The UI uses the playground eval routes (available without `--dev`):
|
|
289
|
+
`GET /v1/dev/evals` lists datapoints and config (includes `maxPlaygroundRuns` /
|
|
290
|
+
`durableRuns`),
|
|
291
|
+
`GET /v1/dev/evals/runs` rehydrates recent batches after navigation,
|
|
292
|
+
`POST /v1/dev/evals/runs` starts a batch, and
|
|
293
|
+
`GET /v1/dev/evals/runs/:runId` polls it. See
|
|
294
|
+
[Playground eval routes](./reference/http-api.md#playground-eval-routes).
|
|
295
|
+
The start request returns `202` while cases run in the background.
|
|
296
|
+
Poll until the snapshot status becomes `completed` or `failed`.
|
|
297
|
+
Configuration errors appear on a failed snapshot.
|
|
298
|
+
|
|
299
|
+
## What good cases assert
|
|
300
|
+
|
|
301
|
+
Gate decisions and shape, not prose. Model wording varies run to run.
|
|
302
|
+
Tool choice, tool avoidance, and output structure are the stable
|
|
303
|
+
contract.
|
|
304
|
+
|
|
305
|
+
1. `t.succeeded()`: always, first.
|
|
306
|
+
2. The tool decision: `calledTool` for the intended path,
|
|
307
|
+
`notCalledTool` for the likely wrong alternative. The pair is
|
|
308
|
+
stronger than either alone.
|
|
309
|
+
3. Output shape: a regex for the contract (`/ready|blocked/i`, a JSON
|
|
310
|
+
marker, a findings-block fence), never exact sentences.
|
|
311
|
+
4. For structured output, parse `t.reply` and check fields with
|
|
312
|
+
`satisfies` instead of substring-matching JSON.
|
|
313
|
+
|
|
314
|
+
The common failure modes: asserting exact phrasing, packing more than
|
|
315
|
+
about five gates into one case (split it), and cases that depend on live
|
|
316
|
+
external state that drifts (pin the input; see fixtures).
|
|
317
|
+
|
|
318
|
+
## Pick fixtures by agent type
|
|
319
|
+
|
|
320
|
+
The right fixture depends on the surface under test.
|
|
321
|
+
|
|
322
|
+
| Agent surface | Fixture |
|
|
323
|
+
| --- | --- |
|
|
324
|
+
| Chat / domain assistant | A canonical prompt string, chosen once and frozen |
|
|
325
|
+
| Tool-heavy | Run `agentkit call <tool>` first to pin what the tool returns, then freeze the prompt that triggers it |
|
|
326
|
+
| GitHub webhook | `agentkit github replay <pr> --events '*' --dry-run --out fixtures/github` snapshots real payloads for offline replay ([GitHub guide](./guides/github.md)) |
|
|
327
|
+
| PR reviewer with host preparation | Diff, metadata, and gold labels pinned to commit SHAs; keep any live PR matrix small |
|
|
328
|
+
| Workspace-dependent | `workspaceFiles` in `t.send` options, never developer-machine paths |
|
|
329
|
+
|
|
330
|
+
Tag the fast, reliably passing core `smoke` and run `--tag smoke` in the
|
|
331
|
+
inner loop. Leave slow or flaky-prone cases untagged for explicit runs.
|
|
332
|
+
|
|
333
|
+
### Materialize API-backed fixtures
|
|
334
|
+
|
|
335
|
+
An input that only points at external data, such as a pull request URL,
|
|
336
|
+
snapshot id, or pair of commit SHAs, is not self-contained. Fetch it
|
|
337
|
+
once and commit the rendered fixture before you expand the suite.
|
|
338
|
+
|
|
339
|
+
1. Save the diff, metadata, and labels under `fixtures/` at pinned
|
|
340
|
+
revisions.
|
|
341
|
+
2. Seed those files with `workspaceFiles`, or read them from the fixture
|
|
342
|
+
directory.
|
|
343
|
+
3. Assert decisions and output shape against the saved evidence.
|
|
344
|
+
4. Keep a small `smoke` subset for any remaining live pipeline checks.
|
|
345
|
+
|
|
346
|
+
`maxConcurrency` limits parallel datapoints. It does not limit model or
|
|
347
|
+
API fan-out inside one datapoint. Materialized fixtures prevent a large
|
|
348
|
+
suite from exhausting provider and GitHub rate limits. The
|
|
349
|
+
[evals skill](../skills/evals/SKILL.md) has the full fixture workflow.
|
|
350
|
+
|
|
351
|
+
## Keep improvements with regression evals
|
|
352
|
+
|
|
353
|
+
Every [hillclimb](./hillclimbing.md) round that keeps a change must land
|
|
354
|
+
an eval that would have failed before the change. If you can't express
|
|
355
|
+
the improvement as a gate (a `calledTool` shift, a bounded
|
|
356
|
+
`action.result` count, an output-shape regex), the improvement is
|
|
357
|
+
unverified, and it'll regress silently.
|
|
358
|
+
|
|
359
|
+
The rule cuts the other way too: never weaken an existing gate to make a
|
|
360
|
+
round pass. That's the freeze line moving, and it turns your regression
|
|
361
|
+
suite into a list of checks that no longer protect anything.
|
|
362
|
+
|
|
363
|
+
## Compare variants on live traffic
|
|
364
|
+
|
|
365
|
+
Use `defineAB` to compare variant metrics on live sessions. It is not a
|
|
366
|
+
test runner and has no `agentkit ab` command. Keep `defineEval` as the
|
|
367
|
+
regression ratchet. Eval sessions do not enroll or change live metrics.
|
|
368
|
+
See [Live A/B metrics](./ab.md) for assignment, behavior, collection,
|
|
369
|
+
and inspection.
|
|
370
|
+
|
|
371
|
+
## What's next
|
|
372
|
+
|
|
373
|
+
Continue with these pages:
|
|
374
|
+
|
|
375
|
+
- [Live A/B metrics](./ab.md): sticky variants and cumulative metrics
|
|
376
|
+
on live sessions
|
|
377
|
+
- [Hillclimbing](./hillclimbing.md): the loop evals make trustworthy
|
|
378
|
+
- [Building agents with agents](./building-with-agents.md): have a
|
|
379
|
+
coding agent write the first suite
|
|
380
|
+
- [GitHub guide](./guides/github.md): deterministic webhook fixtures
|
|
381
|
+
with `github replay`
|
|
382
|
+
- [Sessions and streaming](./reference/sessions.md): the events
|
|
383
|
+
`t.events` contains
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Agent-to-agent"
|
|
3
|
+
description: "Every agent is an MCP server. Peer MCP connections let one agent delegate to another that keeps its own tools, sessions, and context."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agent-to-agent
|
|
7
|
+
|
|
8
|
+
Every mounted agent is also an MCP server. So agents can delegate to each
|
|
9
|
+
other without extra infrastructure. One agent hands a question to
|
|
10
|
+
another, and the peer answers in its own session with its own
|
|
11
|
+
instructions, tools, and context. Any external MCP client can do the
|
|
12
|
+
same. A peer MCP connection makes the wiring one line.
|
|
13
|
+
|
|
14
|
+
This guide wires a `concierge` agent that delegates weather questions
|
|
15
|
+
to a `weather-agent` peer mounted on the same host.
|
|
16
|
+
|
|
17
|
+
## The MCP endpoint
|
|
18
|
+
|
|
19
|
+
Each agent serves the Model Context Protocol over streamable HTTP at
|
|
20
|
+
`/<slug>/v1/mcp` (or `/v1/mcp` in single mode). The surface is stateless
|
|
21
|
+
(session identity travels in tool arguments) and runs the same route
|
|
22
|
+
auth chain as the session API. It exposes three tools:
|
|
23
|
+
|
|
24
|
+
| Tool | Behavior |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `ask` | Send a message. Runs a model turn in this agent's own session and returns `{ status, sessionId, reply }`. Omit `sessionId` for a fresh session; pass it back to follow up. |
|
|
27
|
+
| `check` | Wait for or poll a running session (`waitSeconds: 0` polls without blocking). |
|
|
28
|
+
| `call_tool` | Call one of the agent's server tools directly, no model turn. Registered only when the agent has server tools. |
|
|
29
|
+
|
|
30
|
+
Waits are bounded at roughly 50 seconds, below typical MCP client
|
|
31
|
+
request timeouts: a long turn returns `status: "running"` and the caller
|
|
32
|
+
keeps waiting with `check`. Sessions created this way live on the `mcp`
|
|
33
|
+
channel, bind to the calling principal, and show up in the playground
|
|
34
|
+
and `GET /v1/sessions` like any other session.
|
|
35
|
+
|
|
36
|
+
Any MCP client can attach to this endpoint. It isn't only for other
|
|
37
|
+
agentkit agents.
|
|
38
|
+
|
|
39
|
+
## Wire a peer MCP connection
|
|
40
|
+
|
|
41
|
+
A peer MCP connection points one agent at another mounted on the same
|
|
42
|
+
serve host. Author an MCP connection whose transport is the peer's slug:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
// agents/concierge/agent/mcp-connections/weather.ts
|
|
46
|
+
import { defineConnection } from "@cursor/july/connections";
|
|
47
|
+
|
|
48
|
+
export default defineConnection({
|
|
49
|
+
agent: "weather-agent",
|
|
50
|
+
description: "Delegate weather questions to the weather agent.",
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The parent model now sees the peer's `ask` and `check` (and `call_tool`)
|
|
55
|
+
tools under the `weather` server name. It reads like subagent
|
|
56
|
+
delegation, except the peer is a full agent that keeps its own
|
|
57
|
+
instructions, tools, MCP connections, and sessions.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
agentkit serve --dir ./agents --dev
|
|
61
|
+
agentkit chat --url http://127.0.0.1:3000/concierge \
|
|
62
|
+
--message "What's the weather in Paris right now?"
|
|
63
|
+
# concierge → weather.ask → weather-agent's own session/tools → reply
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Peer or subagent?
|
|
67
|
+
|
|
68
|
+
The two delegation mechanisms solve different problems.
|
|
69
|
+
|
|
70
|
+
| | Subagent (`agent/subagents/<id>/`) | Peer (`defineConnection({ agent })`) |
|
|
71
|
+
| --- | --- | --- |
|
|
72
|
+
| Runs as | an SDK custom subagent inside the parent's harness | an independent agent on the same host |
|
|
73
|
+
| Own tools, MCP connections, sessions | no, inherits the parent's surface | yes, everything is its own |
|
|
74
|
+
| Visible to others | only its parent | any MCP client, other agents, its own playground |
|
|
75
|
+
| Reach for it when | splitting one job into specialist roles | composing independently useful agents |
|
|
76
|
+
|
|
77
|
+
## How peer URLs resolve
|
|
78
|
+
|
|
79
|
+
Peer URLs resolve when the server starts, so the ephemeral ports `run`
|
|
80
|
+
and `eval` use work too. Local-runtime turns (and host-side
|
|
81
|
+
`ctx.host.mcp` or channel-handler calls) reach the peer over loopback,
|
|
82
|
+
which works under the default auth. Cloud-runtime turns execute on a VM
|
|
83
|
+
that cannot reach this host's loopback address: pass
|
|
84
|
+
`--public-url https://agentkit.example.com` (or
|
|
85
|
+
`serve(dir, { publicUrl })`) so peers resolve to a reachable URL.
|
|
86
|
+
Without one, peers are omitted from cloud turns and the server warns at
|
|
87
|
+
startup. With `--bearer-token`, the token is attached to peer calls
|
|
88
|
+
automatically so they pass the target agent's auth chain.
|
|
89
|
+
|
|
90
|
+
## Guardrails
|
|
91
|
+
|
|
92
|
+
Unknown peer slugs and self-references fail `serve` at startup, so you
|
|
93
|
+
find out immediately rather than at delegation time. Peers require the
|
|
94
|
+
multi-agent layout (each agent mounted under its slug, the default).
|
|
95
|
+
|
|
96
|
+
The framework does not provide cross-host loop protection. If agent A's
|
|
97
|
+
instructions delegate to B and B's delegate back to A, they can recurse.
|
|
98
|
+
Scope each agent's delegation instructions narrowly. The concierge
|
|
99
|
+
delegates *weather questions* to `weather-agent`, not everything.
|
|
100
|
+
|
|
101
|
+
## Call a peer from host code
|
|
102
|
+
|
|
103
|
+
Peer MCP connections are ordinary MCP connections, so deterministic host code
|
|
104
|
+
can use them too. A channel handler or server tool can call
|
|
105
|
+
`host.mcp.callTool("weather", "ask", { message: "…" })` without any
|
|
106
|
+
model turn deciding to. See
|
|
107
|
+
[MCP connections](../reference/connections.md#every-mcp-connection-is-available-in-three-places)
|
|
108
|
+
for the three places every MCP connection is available.
|
|
109
|
+
|
|
110
|
+
## What's next
|
|
111
|
+
|
|
112
|
+
Continue with these pages:
|
|
113
|
+
|
|
114
|
+
- [MCP connections](../reference/connections.md): all four MCP connection
|
|
115
|
+
transports
|
|
116
|
+
- [Subagents](../reference/subagents.md): the in-harness alternative
|
|
117
|
+
- [HTTP API](../reference/http-api.md#mcp-endpoint): the endpoint
|
|
118
|
+
contract
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Cloud runtime"
|
|
3
|
+
description: "Run turns on Cursor cloud agents instead of the local harness: when to switch, what changes, and the patterns that hold up."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cloud runtime
|
|
7
|
+
|
|
8
|
+
By default, turns execute on the Cursor SDK's local harness, on the same
|
|
9
|
+
machine as the server. Set `runtime: "cloud"` and turns execute on
|
|
10
|
+
Cursor cloud agents instead. They're ephemeral VMs that carry a repo
|
|
11
|
+
checkout, run `gh`, `git`, and tests for real, and scale past what one
|
|
12
|
+
host's disk and CPU can do. The serve host keeps handling routing, host
|
|
13
|
+
preparation, sessions, and bookkeeping.
|
|
14
|
+
|
|
15
|
+
A canonical use is a PR driver whose triage runs on cloud VMs. The
|
|
16
|
+
patterns in this guide come from running one against real PR traffic.
|
|
17
|
+
|
|
18
|
+
## When to switch
|
|
19
|
+
|
|
20
|
+
A guideline from running PR agents at scale: per-PR worktrees on the serve host
|
|
21
|
+
don't scale to hundreds of engineers opening PRs. When the job needs a
|
|
22
|
+
repo checkout at scale, use cloud. The signals:
|
|
23
|
+
|
|
24
|
+
- The agent must run repo commands (tests, builds, `git`) against many
|
|
25
|
+
different refs concurrently.
|
|
26
|
+
- Turns are long and heavy, and you don't want them competing with the
|
|
27
|
+
server for resources.
|
|
28
|
+
- The work product is a PR or branch the VM can push, not a local file.
|
|
29
|
+
|
|
30
|
+
Stay local when the agent is conversational, tool-driven against APIs,
|
|
31
|
+
or works over host-prepared evidence. Local turns are cheaper, start
|
|
32
|
+
faster, and support the full authored surface.
|
|
33
|
+
|
|
34
|
+
## Configure it
|
|
35
|
+
|
|
36
|
+
Cloud runtime is two fields on the agent config.
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { defineAgent } from "@cursor/july";
|
|
40
|
+
|
|
41
|
+
export default defineAgent({
|
|
42
|
+
runtime: "cloud",
|
|
43
|
+
cloud: {
|
|
44
|
+
repos: [{ url: "https://github.com/org/repo", startingRef: "main" }],
|
|
45
|
+
// env / envVars / … forwarded to the Cursor SDK
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The host must be signed in (`agentkit login` or `CURSOR_API_KEY`).
|
|
51
|
+
|
|
52
|
+
> [!IMPORTANT]
|
|
53
|
+
> Cloud agents run against the Cursor backend under the signed-in
|
|
54
|
+
> account, and every wake spends real cloud-agent budget. Decide
|
|
55
|
+
> explicitly what may trigger one.
|
|
56
|
+
|
|
57
|
+
## What changes on cloud
|
|
58
|
+
|
|
59
|
+
Cloud turns run on a VM without your authored files, so the runtime
|
|
60
|
+
mapping shifts:
|
|
61
|
+
|
|
62
|
+
| Folder or file | Local runtime | Cloud runtime |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| `instructions.*` | `AGENTS.md` in the session workspace | prepended to the first prompt |
|
|
65
|
+
| Server tools (`execution: "server"`) | in-process SDK custom tools | not available |
|
|
66
|
+
| Agent tools (`execution: "agent"`) | scripts in the session workspace | catalog + script bodies on the first prompt |
|
|
67
|
+
| `skills/*` | `.cursor/skills/` in the workspace | only if present in the cloud repo |
|
|
68
|
+
| `mcp-connections/*.ts` | SDK `mcpServers` | SDK `mcpServers` (peers need `--public-url`) |
|
|
69
|
+
| `sandbox/workspace/**` | seeded into the session workspace | ignored |
|
|
70
|
+
| Tool approvals (`needsApproval`) | supported | not supported |
|
|
71
|
+
|
|
72
|
+
`agentkit validate` warns when `runtime: "cloud"` is combined with
|
|
73
|
+
local-only capabilities. Those warnings match this table.
|
|
74
|
+
|
|
75
|
+
Two more behaviors are cloud-specific. Sessions persist a separate SDK
|
|
76
|
+
agent id (`bc-…`), emitted on the stream as `agent.bound` with a URL to
|
|
77
|
+
the cloud conversation. Cloud ids are minted during the first send. And
|
|
78
|
+
peer MCP connections resolve to `--public-url` for cloud turns, because a VM
|
|
79
|
+
cannot reach the host's loopback; without one, peers are omitted from
|
|
80
|
+
cloud turns and the server warns at startup.
|
|
81
|
+
|
|
82
|
+
## Hybrid: local agent, cloud sessions
|
|
83
|
+
|
|
84
|
+
A local-runtime agent can still open cloud-attached sessions per send.
|
|
85
|
+
Channel handlers may pass a `cloud` block (repos pinned to a PR ref, say)
|
|
86
|
+
in `send` options, and Slack handlers may return `cloud` from a mention
|
|
87
|
+
hook. A PR driver works this way: chat stays local, and the `drive`
|
|
88
|
+
flow attaches the PR to a cloud VM. The agent-level `cloud` config is the
|
|
89
|
+
base that per-session options merge over.
|
|
90
|
+
|
|
91
|
+
## Patterns that hold up
|
|
92
|
+
|
|
93
|
+
These come from running a PR driver against real PR traffic:
|
|
94
|
+
|
|
95
|
+
- One cloud agent per unit of work (per PR, say). Store the `bc-…` id
|
|
96
|
+
keyed by the work unit (an affinity store written from an
|
|
97
|
+
`agent.bound` hook) so webhook wakes resume the same conversation
|
|
98
|
+
instead of booting a fresh VM per event.
|
|
99
|
+
- Stable continuation keys (`pr:owner/repo#N`) so every wake lands on
|
|
100
|
+
the same session within a channel.
|
|
101
|
+
- Keep the host deterministic: fetch briefs and metadata on the host,
|
|
102
|
+
send the VM a compact prompt, and let the VM re-read source of truth
|
|
103
|
+
with its own `gh` and `git` instead of trusting payload snapshots.
|
|
104
|
+
- Limit exposure: add repository allowlists on webhook channels,
|
|
105
|
+
because every wake spends the account's budget.
|
|
106
|
+
|
|
107
|
+
## Verify cloud agents
|
|
108
|
+
|
|
109
|
+
`agentkit run` and `eval` work unchanged. The trajectory records the
|
|
110
|
+
same event vocabulary plus `agent.bound` with the cloud URL, so you can
|
|
111
|
+
open the cloud conversation for any session. Cloud turns take minutes.
|
|
112
|
+
Pass generous `--timeout-ms` values, and keep curl timeouts long when
|
|
113
|
+
driving channels directly.
|
|
114
|
+
|
|
115
|
+
## What's next
|
|
116
|
+
|
|
117
|
+
Continue with these pages:
|
|
118
|
+
|
|
119
|
+
- [Agent config](../reference/agent-config.md): the `runtime` and
|
|
120
|
+
`cloud` fields precisely
|
|
121
|
+
- [GitHub guide](./github.md): the webhook patterns that pair with
|
|
122
|
+
cloud triage
|