@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,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "GitHub"
|
|
3
|
+
description: "Wake your agent from pull requests, CI, and comments by pulling Cursor SCM events, with fixtures and replay for local tests."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GitHub agents
|
|
7
|
+
|
|
8
|
+
Wake your agent from repository events without exposing a public webhook
|
|
9
|
+
URL. Prefer `serve --cursor-events`: the host long-polls Cursor's SCM
|
|
10
|
+
event stream for repos you've connected to Cursor. You still declare a
|
|
11
|
+
`githubChannel` so hooks decide what each event does.
|
|
12
|
+
|
|
13
|
+
The companion skill for coding agents is
|
|
14
|
+
[`skills/github/SKILL.md`](../../skills/github/SKILL.md).
|
|
15
|
+
|
|
16
|
+
## Pull events from Cursor
|
|
17
|
+
|
|
18
|
+
Connect GitHub in Cursor for the repositories you care about (Settings or
|
|
19
|
+
[cursor.com/dashboard](https://cursor.com/dashboard)). That gives your
|
|
20
|
+
account access and lets Cursor receive the repo's webhooks. Sign the host
|
|
21
|
+
in (`agentkit login` or `CURSOR_API_KEY`), define a GitHub
|
|
22
|
+
channel, then serve with `--cursor-events` and at least one `--repo`:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
agentkit serve --dir . --cursor-events --repo owner/repo
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Repeat `--repo` for each repository. The stream is read as the host's
|
|
29
|
+
Cursor user. `serve` refuses to start signed out rather than run a relay
|
|
30
|
+
that can never receive events.
|
|
31
|
+
|
|
32
|
+
Offset and consumer id live under `<state-root>/cursor-events/`.
|
|
33
|
+
`CURSOR_API_BASE_URL` overrides the backend. The stream carries event
|
|
34
|
+
metadata, not full webhook bodies, so your agent should re-read the PR
|
|
35
|
+
or checks from GitHub instead of trusting a snapshot in the wake.
|
|
36
|
+
|
|
37
|
+
This is the preferred production path: no public URL, no repo admin
|
|
38
|
+
webhook, and no inbound network for GitHub deliveries.
|
|
39
|
+
|
|
40
|
+
## Define the channel
|
|
41
|
+
|
|
42
|
+
Author `agent/channels/github.ts` with `githubChannel()` from
|
|
43
|
+
`@cursor/july/channels/github`. It mounts
|
|
44
|
+
`POST /<slug>/v1/channels/github` and publishes the events it
|
|
45
|
+
dispatches on. That event set comes from the hooks you declare, or you
|
|
46
|
+
pin it with `webhookEvents`. Cursor event pull and local replay both use
|
|
47
|
+
it.
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { defaultGitHubAuth, githubChannel } from "@cursor/july/channels/github";
|
|
51
|
+
|
|
52
|
+
export default githubChannel({
|
|
53
|
+
botName: "my-agent", // or GITHUB_APP_SLUG; used to ignore self-comments
|
|
54
|
+
credentials: { webhookSecret: () => process.env.GITHUB_WEBHOOK_SECRET },
|
|
55
|
+
onPullRequest: (ctx, pr) =>
|
|
56
|
+
pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null,
|
|
57
|
+
onCheckSuite: (ctx, suite) =>
|
|
58
|
+
suite.conclusion === "failure" ? { task: () => triage(ctx) } : null,
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The hooks are `onPullRequest`, `onComment`, `onIssue`, `onCheckSuite`,
|
|
63
|
+
`onCheckRun`, `onWorkflowRun`, `onStatus`, the catch-all `onEvent`, and
|
|
64
|
+
the lifecycle pair `onStart` / `onStop`. Each hook returns one of three
|
|
65
|
+
things:
|
|
66
|
+
|
|
67
|
+
| Return | Meaning |
|
|
68
|
+
| --- | --- |
|
|
69
|
+
| `{ auth }` | Start or continue a model turn as that actor. A chat session exists and shows up in the playground. |
|
|
70
|
+
| `{ task }` | Host-side work. The delivery is 202-ACKed immediately and the task runs past GitHub's ~10-second timeout. No chat session. |
|
|
71
|
+
| `null` | Skip this delivery. |
|
|
72
|
+
|
|
73
|
+
Return `{ task }` when the wake drives deterministic code. A security
|
|
74
|
+
reviewer can run its whole review loop this way and report
|
|
75
|
+
through commit statuses. Return `{ auth }` when the model needs to reason
|
|
76
|
+
about the event.
|
|
77
|
+
|
|
78
|
+
Outbound GitHub API calls prefer App installation tokens when
|
|
79
|
+
`GITHUB_APP_ID` and `GITHUB_APP_PRIVATE_KEY` are set (with an
|
|
80
|
+
installation id from the event or `GITHUB_APP_INSTALLATION_ID`). On
|
|
81
|
+
serve warmup, App-backed hosts also export a short-lived installation
|
|
82
|
+
token as `GH_TOKEN` so tools that shell out to `gh` (a host-side
|
|
83
|
+
`prepare_review` tool, say) authenticate without a PAT. For
|
|
84
|
+
local testing, skip the App credentials and use `GITHUB_TOKEN`,
|
|
85
|
+
`GH_TOKEN`, or `gh auth login`.
|
|
86
|
+
|
|
87
|
+
## Test wakes locally
|
|
88
|
+
|
|
89
|
+
Use fixtures and `github replay` so you can develop without waiting on
|
|
90
|
+
live pushes. Both target the same channel route the Cursor relay uses.
|
|
91
|
+
|
|
92
|
+
### Post a saved fixture
|
|
93
|
+
|
|
94
|
+
For offline tests, POST a saved payload with an `x-github-event` header.
|
|
95
|
+
A `--dev` server does not require a signature:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
curl -s -X POST http://127.0.0.1:3000/<slug>/v1/channels/github \
|
|
99
|
+
-H 'content-type: application/json' \
|
|
100
|
+
-H 'x-github-event: pull_request' \
|
|
101
|
+
-d @fixtures/github/pull_request.synchronize.json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Don't hand-write payloads. Snapshot real ones with replay's
|
|
105
|
+
`--dry-run --out`, below.
|
|
106
|
+
|
|
107
|
+
### Test with `github replay`
|
|
108
|
+
|
|
109
|
+
Use `replay` for deterministic tests and
|
|
110
|
+
[hillclimbing](../hillclimbing.md). It reads a real PR with `gh api`,
|
|
111
|
+
synthesizes GitHub-shaped payloads, signs them when a secret is
|
|
112
|
+
configured, and POSTs them at the channel. Pull access is enough: no
|
|
113
|
+
admin, and an env `GITHUB_TOKEN` is fine here. The same input produces
|
|
114
|
+
the same delivery.
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# Replay a pull_request delivery for a PR
|
|
118
|
+
agentkit github replay https://github.com/owner/repo/pull/123 --dir .
|
|
119
|
+
|
|
120
|
+
# Replay everything the channel listens for, with CI failing
|
|
121
|
+
agentkit github replay owner/repo#123 --dir . --events '*' --conclusion failure
|
|
122
|
+
|
|
123
|
+
# Inspect payloads without POSTing, and snapshot them as fixtures
|
|
124
|
+
agentkit github replay owner/repo#123 --dir . --events '*' --dry-run --out fixtures/github
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`--events` defaults to `pull_request`, and `'*'` means the channel's
|
|
128
|
+
declared set. `--action`, `--conclusion`, `--comment`, and `--context`
|
|
129
|
+
shape each synthesized event. `--secret` (or `GITHUB_WEBHOOK_SECRET`)
|
|
130
|
+
signs them.
|
|
131
|
+
|
|
132
|
+
## Receive webhooks directly
|
|
133
|
+
|
|
134
|
+
Most hosts should pull events from Cursor instead. Use the HTTP channel
|
|
135
|
+
route when you already terminate GitHub webhooks yourself, or when you
|
|
136
|
+
are POSTing fixtures and replay locally.
|
|
137
|
+
|
|
138
|
+
With a webhook secret configured, the route admits everyone
|
|
139
|
+
(`allowAll()`) and the channel verifies `X-Hub-Signature-256` before
|
|
140
|
+
parsing. The HMAC becomes the request principal. Without a secret, the
|
|
141
|
+
route is loopback-only. The exception is `serve --dev`, which admits
|
|
142
|
+
unsigned loopback deliveries so fixtures and replay work with zero
|
|
143
|
+
config. Non-dev targets that accept real GitHub POSTs always need the
|
|
144
|
+
secret, and the same value must live on the server and on whatever signs
|
|
145
|
+
deliveries.
|
|
146
|
+
|
|
147
|
+
## Handle high event volume
|
|
148
|
+
|
|
149
|
+
These patterns come from running a PR agent against real traffic:
|
|
150
|
+
|
|
151
|
+
- Debounce per PR (~3 seconds, latest event wins), and re-buffer while
|
|
152
|
+
CI settles. Skip a flush when a turn for that PR is already running.
|
|
153
|
+
- Persist the buffer before you acknowledge a wake, and restore it on
|
|
154
|
+
channel start. A restart must not drop buffered wakes.
|
|
155
|
+
- Key sessions with a stable continuation token (`pr:owner/repo#N`) so
|
|
156
|
+
every wake resumes the PR's conversation. Cross-channel resume needs
|
|
157
|
+
an affinity store mapping PR → SDK agent id; write one from an
|
|
158
|
+
`agent.bound` hook.
|
|
159
|
+
- Keep payload details out of wake prompts. Send a generic "re-check
|
|
160
|
+
the PR" and let the agent re-read source of truth instead of trusting a
|
|
161
|
+
stale snapshot.
|
|
162
|
+
- Cancel PR-scoped reminders on `pull_request.closed`.
|
|
163
|
+
- Decide explicitly which repos the agent may act on. Without an
|
|
164
|
+
allowlist the channel wakes for whatever deliveries reach it, and
|
|
165
|
+
every wake spends real model budget.
|
|
166
|
+
|
|
167
|
+
## Related
|
|
168
|
+
|
|
169
|
+
- [Webhooks and custom channels](./webhooks.md): the HTTP mechanism under
|
|
170
|
+
this pack
|
|
171
|
+
- [Evals](../evals.md): turn replay snapshots into regression fixtures
|
|
172
|
+
- [Cloud runtime](./cloud-runtime.md): attach PRs to cloud VMs
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Human-in-the-loop"
|
|
3
|
+
description: "Gate a tool call on human approval: park it, resolve it from the playground, HTTP, or Slack, and keep the turn alive throughout."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Human-in-the-loop approvals
|
|
7
|
+
|
|
8
|
+
Some tools must wait for human review: promoting a build, approving a PR,
|
|
9
|
+
spending money. Mark those tools `needsApproval` and the host parks the
|
|
10
|
+
in-flight call until a person approves or denies it, from the
|
|
11
|
+
playground, over HTTP, or with Slack buttons. The turn stays running;
|
|
12
|
+
nothing executes until someone decides.
|
|
13
|
+
|
|
14
|
+
## Gate a tool
|
|
15
|
+
|
|
16
|
+
Mark the tool with `needsApproval` and export it like any other tool.
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { defineTool } from "@cursor/july/tools";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
|
|
22
|
+
export default defineTool({
|
|
23
|
+
description: "Promote a verified build to production.",
|
|
24
|
+
needsApproval: true,
|
|
25
|
+
inputSchema: z.object({
|
|
26
|
+
service: z.string(),
|
|
27
|
+
buildId: z.string(),
|
|
28
|
+
}),
|
|
29
|
+
async execute({ service, buildId }) {
|
|
30
|
+
return {
|
|
31
|
+
promoted: true,
|
|
32
|
+
service,
|
|
33
|
+
buildId,
|
|
34
|
+
environment: "production",
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`needsApproval` also takes a predicate over the validated input, so you
|
|
41
|
+
can gate only the dangerous shapes:
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
needsApproval: (input) => input.amountUsd > 100,
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## What happens to a gated call
|
|
48
|
+
|
|
49
|
+
When the model calls a `needsApproval` tool, the call parks and the
|
|
50
|
+
session's stream emits `action.approval_requested` with the `callId`,
|
|
51
|
+
tool name, and arguments. The turn stays running and waits. When a
|
|
52
|
+
person resolves it, the stream emits `action.approval_resolved` with the
|
|
53
|
+
decision and, where known, who decided. On approval, `execute` runs and
|
|
54
|
+
`action.result` follows exactly as if the tool had run immediately. On
|
|
55
|
+
denial, the model receives the denial as the tool result and continues
|
|
56
|
+
the turn. It can explain, adjust, or try something else.
|
|
57
|
+
|
|
58
|
+
Approvals exist for `execution: "server"` tools on the local runtime
|
|
59
|
+
only. Parked calls do not survive a host restart: pending approvals left
|
|
60
|
+
after a crash resolve as interrupted, and you re-run the turn.
|
|
61
|
+
|
|
62
|
+
## Resolve from the playground
|
|
63
|
+
|
|
64
|
+
Parked calls render Approve / Deny buttons inline in the conversation.
|
|
65
|
+
Nothing to configure.
|
|
66
|
+
|
|
67
|
+
## Resolve over HTTP
|
|
68
|
+
|
|
69
|
+
List and resolve programmatically. The routes run the same auth chain as
|
|
70
|
+
the rest of the session API, and the caller must be the session owner:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
curl http://127.0.0.1:3000/<slug>/v1/session/ses_.../approvals
|
|
74
|
+
# {"approvals":[{"callId":"...","toolName":"approve_pr","args":{...}}]}
|
|
75
|
+
|
|
76
|
+
curl -X POST http://127.0.0.1:3000/<slug>/v1/session/ses_.../approvals/<callId> \
|
|
77
|
+
-H 'content-type: application/json' \
|
|
78
|
+
-d '{"decision":"approve"}' # or "deny"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Resolve from Slack
|
|
82
|
+
|
|
83
|
+
Set `toolApprovals: true` on the Slack channel and the pack posts Block
|
|
84
|
+
Kit Approve/Deny cards and routes the button clicks back to the parked
|
|
85
|
+
call:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { slackChannel } from "@cursor/july/channels/slack";
|
|
89
|
+
|
|
90
|
+
export default slackChannel({
|
|
91
|
+
toolApprovals: true,
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
The Slack app manifest needs interactivity enabled. Cards show redacted,
|
|
96
|
+
truncated arguments because of Block Kit size limits. Execution still
|
|
97
|
+
uses the full validated input, so review sensitive tools in the
|
|
98
|
+
playground when the arguments may exceed the card. Details in the
|
|
99
|
+
[Slack guide](./slack.md#add-approval-buttons).
|
|
100
|
+
|
|
101
|
+
In `serve --dev`, the playground can also list Slack sessions and
|
|
102
|
+
resolve their parked tools (the audit trail records the HTTP caller).
|
|
103
|
+
That bridge does not open cross-owner approval for HTTP sessions, and
|
|
104
|
+
production and bearer-auth hosts stay strict: Slack approvals must come
|
|
105
|
+
from Slack interactivity or a matching principal.
|
|
106
|
+
|
|
107
|
+
## Design principles for approvals
|
|
108
|
+
|
|
109
|
+
Park/resume is independent of delivery: `needsApproval` works with no
|
|
110
|
+
Slack channel at all, because the playground and HTTP surfaces are
|
|
111
|
+
always there.
|
|
112
|
+
|
|
113
|
+
Prefer approval gates over trust in instructions. "Only call this tool
|
|
114
|
+
when…" is a suggestion; `needsApproval` is a guarantee. And pair
|
|
115
|
+
approvals with dry-run defaults for destructive integrations: post real
|
|
116
|
+
PR reviews only behind an explicit env flag like `MY_AGENT_LIVE=1`, no
|
|
117
|
+
matter who approved.
|
|
118
|
+
|
|
119
|
+
Deterministic tool calls (`agentkit call`, `POST /v1/tools/:name`)
|
|
120
|
+
execute directly without parking. There the human is the caller.
|
|
121
|
+
Approval parking applies to model-initiated calls.
|
|
122
|
+
|
|
123
|
+
## What's next
|
|
124
|
+
|
|
125
|
+
Continue with these pages:
|
|
126
|
+
|
|
127
|
+
- [Tools](../reference/tools.md): the full tool API `needsApproval`
|
|
128
|
+
lives on
|
|
129
|
+
- [Slack](./slack.md): the approval cards in context
|
|
130
|
+
- [Sessions and streaming](../reference/sessions.md): the
|
|
131
|
+
`action.approval_*` events on the wire
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Slack"
|
|
3
|
+
description: "Put the agent in Slack over Socket Mode: manifests, tokens, doctor, engagement rules, and approval buttons."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Slack agents
|
|
7
|
+
|
|
8
|
+
The Slack channel puts your agent in Slack over Socket Mode: no public
|
|
9
|
+
Request URL, streaming replies in threads, tool "thinking" steps,
|
|
10
|
+
suggested prompts, and opt-in approval buttons. Setup is four short
|
|
11
|
+
phases. Two are yours, and two need a human with Slack admin access.
|
|
12
|
+
|
|
13
|
+
The companion skill is
|
|
14
|
+
[`skills/setup-slack/SKILL.md`](../../skills/setup-slack/SKILL.md).
|
|
15
|
+
|
|
16
|
+
## Define the channel
|
|
17
|
+
|
|
18
|
+
Author `agent/channels/slack.ts` with `slackChannel()` from
|
|
19
|
+
`@cursor/july/channels/slack`:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import { slackChannel } from "@cursor/july/channels/slack";
|
|
23
|
+
|
|
24
|
+
// Single agent: reads SLACK_BOT_TOKEN + SLACK_APP_TOKEN
|
|
25
|
+
export default slackChannel();
|
|
26
|
+
|
|
27
|
+
// Multi-agent serve: one Slack app (and token pair) per agent
|
|
28
|
+
export default slackChannel({ envPrefix: "WEATHER_AGENT" });
|
|
29
|
+
// → WEATHER_AGENT_SLACK_BOT_TOKEN + WEATHER_AGENT_SLACK_APP_TOKEN
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
By default the channel connects over Socket Mode (the app connects
|
|
33
|
+
outward, so it works from behind any firewall) and responds only to
|
|
34
|
+
`app_mention` events and direct messages. Threads bind to sessions with
|
|
35
|
+
`continuationToken = channelId:threadTs`, so a thread is one durable
|
|
36
|
+
conversation. Replies stream (`chat.startStream` / `appendStream` /
|
|
37
|
+
`stopStream`) with a plain-message fallback, a rotating status shows
|
|
38
|
+
while the agent works, and the pack sets thread titles and suggested
|
|
39
|
+
prompts. When a Slack API is unavailable (`method_not_found`,
|
|
40
|
+
`missing_scope`), the pack degrades to `postMessage` instead of failing.
|
|
41
|
+
|
|
42
|
+
Missing tokens leave the channel idle (`channel idle … missing
|
|
43
|
+
credentials`) rather than failing `serve`. That's useful when you mount
|
|
44
|
+
many agents and only some have Slack apps.
|
|
45
|
+
|
|
46
|
+
## Use the Cursor Slack connection
|
|
47
|
+
|
|
48
|
+
If the Cursor Slack app is already installed in your workspace and linked
|
|
49
|
+
to your Cursor account, skip the dedicated Slack app:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import { slackChannel } from "@cursor/july/channels/slack";
|
|
53
|
+
|
|
54
|
+
export default slackChannel({
|
|
55
|
+
cursorAccount: true,
|
|
56
|
+
agentName: "Weatherbot", // defaults to a name derived from the mount slug
|
|
57
|
+
agentIcon: { emoji: ":robot_face:" },
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Sign the host in (`agentkit login` or `CURSOR_API_KEY`), then mention the
|
|
62
|
+
agent in Slack as `@Cursor Weatherbot …`. Thread replies and DMs keep going to
|
|
63
|
+
the same agent. Messages appear as the Cursor app under that agent's name
|
|
64
|
+
and icon, with live updates as the turn progresses.
|
|
65
|
+
|
|
66
|
+
Use a dedicated Socket Mode Slack app when you need your own bot user,
|
|
67
|
+
channel watching (`engagement.channelPosts`), or approval buttons. On
|
|
68
|
+
`cursorAccount`, agents must be explicitly addressed (@mention, DM, or
|
|
69
|
+
claimed-thread reply). Channel watching and `toolApprovals` /
|
|
70
|
+
`interactivity` are Socket Mode only; the Cursor connection does not relay
|
|
71
|
+
Block Kit clicks. Agent names must be unique on the host; an unmatched
|
|
72
|
+
`@Cursor <name>` stays on Cursor's normal Slack agent.
|
|
73
|
+
|
|
74
|
+
## Set it up
|
|
75
|
+
|
|
76
|
+
### Generate the app assets
|
|
77
|
+
|
|
78
|
+
One command generates the channel file, the app manifests, and the env template.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
agentkit slack init --dir . --name "My Agent"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This writes `agent/channels/slack.ts` (with an `envPrefix` derived from
|
|
85
|
+
the directory name), importable app manifests at
|
|
86
|
+
`.agentkit/slack/manifest.{dev,prod}.json`, and
|
|
87
|
+
`.agentkit/slack/env.example`. Use `--no-prefix` for the shared
|
|
88
|
+
`SLACK_*` variables on single-agent hosts, `--prefix CUSTOM` to
|
|
89
|
+
override, and `--channel-posts` if you plan to watch channels.
|
|
90
|
+
|
|
91
|
+
### Create the apps (human, Slack admin)
|
|
92
|
+
|
|
93
|
+
This phase needs a human with permission to create Slack apps.
|
|
94
|
+
|
|
95
|
+
1. Open [api.slack.com/apps](https://api.slack.com/apps) → **Create New
|
|
96
|
+
App** → **From a manifest**.
|
|
97
|
+
2. Paste `manifest.dev.json` and create the dev app.
|
|
98
|
+
3. Repeat with `manifest.prod.json`. Dev and prod are separate Slack
|
|
99
|
+
apps with separate tokens.
|
|
100
|
+
|
|
101
|
+
### Install and mint tokens (human)
|
|
102
|
+
|
|
103
|
+
For each app: **Install to Workspace** and copy the Bot User OAuth Token
|
|
104
|
+
(`xoxb-…`), then under **Basic Information → App-Level Tokens** create a
|
|
105
|
+
token with scope `connections:write` and copy it (`xapp-…`).
|
|
106
|
+
|
|
107
|
+
### Wire the env and verify
|
|
108
|
+
|
|
109
|
+
Export the tokens in the shell that runs `serve`, using the names from
|
|
110
|
+
`env.example`. The CLI doesn't load `.env` files itself, so use your
|
|
111
|
+
usual env manager if you keep them in one:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
export MY_AGENT_SLACK_BOT_TOKEN=xoxb-…
|
|
115
|
+
export MY_AGENT_SLACK_APP_TOKEN=xapp-…
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
agentkit slack doctor --prefix MY_AGENT
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Proceed when `app_token`, `connections_open`, `bot_token`, and
|
|
123
|
+
`auth_test` are all green. Then serve and smoke it:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
agentkit serve --dir . --dev
|
|
127
|
+
# expect: [agentkit/slack] Socket Mode connected
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Invite the bot to a channel and @mention it (or DM it). Expect the
|
|
131
|
+
Thinking… status, then a threaded streaming reply, with correlated
|
|
132
|
+
server logs (`inbound kind=app_mention`, `session start`,
|
|
133
|
+
`reply delivered via stream|postMessage`).
|
|
134
|
+
|
|
135
|
+
## Choose when the agent engages
|
|
136
|
+
|
|
137
|
+
Mentions and DMs are on by default. Watching channels means dispatching
|
|
138
|
+
on new posts without a mention. That's an explicit opt-in:
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
export default slackChannel({
|
|
142
|
+
envPrefix: "TRIAGE",
|
|
143
|
+
engagement: {
|
|
144
|
+
// mentions / directMessages default to true
|
|
145
|
+
channelPosts: {
|
|
146
|
+
allow: ["#triage-alerts"], // explicit allowlist; no wildcard exists
|
|
147
|
+
posts: "top-level", // default: thread replies never dispatch
|
|
148
|
+
debounceMs: 15_000, // optional: let rapid edits settle
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
onChannelPost: async (ctx, message) => {
|
|
152
|
+
// same contract as onAppMention: return null to skip
|
|
153
|
+
return message.markdown.length > 20 ? {} : null;
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Channel watching needs the `message.channels` / `message.groups` events
|
|
159
|
+
on the Slack app (Socket Mode only — not available with
|
|
160
|
+
`cursorAccount: true`). Generate manifests with `slack init --channel-posts`,
|
|
161
|
+
or add the events and re-import. The bot must also be a member of each
|
|
162
|
+
watched channel. Posts that mention the bot stay on the `app_mention`
|
|
163
|
+
path, bot-authored posts never dispatch, and deleting a post inside the
|
|
164
|
+
debounce window cancels its dispatch. Watched posts reuse the
|
|
165
|
+
thread-scoped principal, so a later @mention continues the same session.
|
|
166
|
+
Set `engagement.mentions` or `engagement.directMessages` to `false` to
|
|
167
|
+
turn those surfaces off.
|
|
168
|
+
|
|
169
|
+
## Prepare work on the host
|
|
170
|
+
|
|
171
|
+
Mention and DM handlers may return a prepared `message`,
|
|
172
|
+
`workspaceFiles`, or `cloud` block. It's the same host-prep pattern as
|
|
173
|
+
[custom channels](./webhooks.md#prepare-on-the-host-then-hand-off).
|
|
174
|
+
PR agents use it: extract a PR URL from the mention text and run the
|
|
175
|
+
same host path as the HTTP channel.
|
|
176
|
+
|
|
177
|
+
## Add approval buttons
|
|
178
|
+
|
|
179
|
+
Tools with `needsApproval` park until a person decides. Route that
|
|
180
|
+
through Slack with one flag:
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
export default slackChannel({
|
|
184
|
+
toolApprovals: true, // posts Block Kit Approve/Deny cards + routes clicks
|
|
185
|
+
});
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The Slack app manifest must have interactivity enabled. Regenerate with
|
|
189
|
+
`buildSlackManifest({ interactivity: true })` (or edit and re-import) if
|
|
190
|
+
your app predates it. Composing events by hand instead: spread
|
|
191
|
+
`buildToolApprovalEvents({ credentials })` into `events` and set
|
|
192
|
+
`interactivity: true` on the channel so Socket Mode routes the clicks.
|
|
193
|
+
|
|
194
|
+
Approval buttons need Socket Mode. `slackChannel({ cursorAccount: true })`
|
|
195
|
+
rejects `toolApprovals` and `interactivity` at construction, since the
|
|
196
|
+
Cursor Slack connection does not relay Block Kit clicks. Use a dedicated
|
|
197
|
+
Slack app to run approvals for a cursor-account agent.
|
|
198
|
+
|
|
199
|
+
Cards show redacted, truncated arguments (Block Kit size limits);
|
|
200
|
+
execution still uses the full validated input, so review sensitive tools
|
|
201
|
+
in the playground when the arguments may exceed the card. Approvals
|
|
202
|
+
exist for `execution: "server"` tools on the local runtime only, and
|
|
203
|
+
parked calls do not survive a host restart. The full lifecycle is in
|
|
204
|
+
[Human-in-the-loop](./human-in-the-loop.md).
|
|
205
|
+
|
|
206
|
+
## Run several agents on one host
|
|
207
|
+
|
|
208
|
+
One Slack app and token pair per agent. Never share a pair across
|
|
209
|
+
agents in the same process. `envPrefix` keeps them apart
|
|
210
|
+
(`WEATHER_AGENT_SLACK_*`, `TRIAGE_SLACK_*`, …), and agents without tokens mount
|
|
211
|
+
with their Slack channel idle while everything else serves normally.
|
|
212
|
+
|
|
213
|
+
## Keep the channel healthy
|
|
214
|
+
|
|
215
|
+
Two habits matter most.
|
|
216
|
+
|
|
217
|
+
- Don't `await` long work inside Slack dispatch handlers. The pack
|
|
218
|
+
dispatches through `waitUntil` and streams as the turn progresses.
|
|
219
|
+
- In `--dev` (loopback) or `--allow-anonymous` (trusted shared host), the
|
|
220
|
+
playground can list and stream Slack sessions and resolve their parked
|
|
221
|
+
approvals (the audit trail records the HTTP caller). Bearer-auth hosts
|
|
222
|
+
stay strict: Slack approvals must come from Slack interactivity or a
|
|
223
|
+
matching principal.
|
|
224
|
+
|
|
225
|
+
## CLI reference
|
|
226
|
+
|
|
227
|
+
The `slack` subcommands cover setup end to end.
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
agentkit slack setup # guided checklist
|
|
231
|
+
agentkit slack init --dir . --name "My Agent"
|
|
232
|
+
agentkit slack init --dir . --no-prefix # shared SLACK_* vars
|
|
233
|
+
agentkit slack init --dir . --channel-posts
|
|
234
|
+
agentkit slack manifest --env both # regenerate manifests
|
|
235
|
+
agentkit slack doctor --prefix MY_AGENT # token / connectivity checks
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## What's next
|
|
239
|
+
|
|
240
|
+
Continue with these pages:
|
|
241
|
+
|
|
242
|
+
- [Human-in-the-loop](./human-in-the-loop.md): the approval lifecycle
|
|
243
|
+
behind `toolApprovals`
|
|
244
|
+
- [Webhooks and custom channels](./webhooks.md): the mechanism this
|
|
245
|
+
pack is built on
|