@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,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Hooks"
|
|
3
|
+
description: "Observe-only subscribers to the session event stream: audit logs, metrics, transcript mirrors, derived state."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hooks
|
|
7
|
+
|
|
8
|
+
A hook is an observe-only subscriber to the session event stream. Hooks
|
|
9
|
+
run after each event is recorded and fanned out (file persistence flushes
|
|
10
|
+
in the background). That makes them the home for audit logging, metrics,
|
|
11
|
+
mirroring transcripts into your own store, and maintaining derived state.
|
|
12
|
+
Handler errors are logged and never fatal. A hook can't modify events or
|
|
13
|
+
block a turn.
|
|
14
|
+
|
|
15
|
+
Author `agent/hooks/<name>.ts` with `defineHook` from
|
|
16
|
+
`@cursor/july/hooks`:
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import { defineHook } from "@cursor/july/hooks";
|
|
20
|
+
|
|
21
|
+
export default defineHook({
|
|
22
|
+
events: {
|
|
23
|
+
async "turn.completed"(event, ctx) {
|
|
24
|
+
console.log("turn done", ctx.session.id, event.data.usage);
|
|
25
|
+
},
|
|
26
|
+
async "turn.failed"(event, ctx) {
|
|
27
|
+
// page, count, or record
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Keys are event types (the full list is in the
|
|
34
|
+
[event vocabulary](./sessions.md#the-event-vocabulary)), or `"*"` for
|
|
35
|
+
everything. Handlers receive the event with its envelope (`index`,
|
|
36
|
+
`sessionId`, `turnId?`, `at`) and a context carrying read-only
|
|
37
|
+
`ctx.session` info.
|
|
38
|
+
|
|
39
|
+
## Hooks, channel events, evals, or A/B?
|
|
40
|
+
|
|
41
|
+
All of them consume the same stream, for different jobs:
|
|
42
|
+
|
|
43
|
+
| | Hooks | Channel `events` | Evals | A/B (`defineAB`) |
|
|
44
|
+
| --- | --- | --- | --- | --- |
|
|
45
|
+
| Scope | every session on the agent | sessions the channel owns | one test turn | every live session; enrollment at creation, metrics on each turn |
|
|
46
|
+
| Job | observe: audit, metrics, mirrors, derived state | deliver: replies back to the channel's surface | assert: gates over the trajectory | `ab.assigned` + fold stream → `onSample` |
|
|
47
|
+
| Can affect the run | no | yes, it owns the surface | n/a | yes through arm instructions or `session.abs`; collection is observe-only |
|
|
48
|
+
| Authored at | `agent/hooks/*.ts` | channel config | `evals/**/*.eval.ts` | [`agent/ab.ts` or `agent/ab/*.ts`](../ab.md) |
|
|
49
|
+
|
|
50
|
+
## Patterns
|
|
51
|
+
|
|
52
|
+
Usage metering: subscribe to `turn.completed` and forward
|
|
53
|
+
`event.data.usage` (token counts) to your metrics system.
|
|
54
|
+
|
|
55
|
+
Failure alerting: `turn.failed` carries the message, and
|
|
56
|
+
`ctx.session.id` points at the trace.
|
|
57
|
+
|
|
58
|
+
Derived state: `agent.bound` fires when the Cursor SDK agent id is known
|
|
59
|
+
(`bc-…` on cloud). A PR agent can record PR → agent id from it in a
|
|
60
|
+
hook, so later webhook wakes resume the same cloud conversation.
|
|
61
|
+
|
|
62
|
+
Transcript export: subscribe to `"*"` and append to your own store. The
|
|
63
|
+
NDJSON envelope is already ordered and replayable.
|
|
64
|
+
|
|
65
|
+
## What's next
|
|
66
|
+
|
|
67
|
+
Continue with these pages:
|
|
68
|
+
|
|
69
|
+
- [Sessions and streaming](./sessions.md): every event a hook can see
|
|
70
|
+
- [Deployment](../deployment.md#observability): hooks as the metrics
|
|
71
|
+
export path
|
|
72
|
+
- [Channels](./channels.md#events): the delivery-side counterpart
|
|
73
|
+
- [Live A/B metrics](../ab.md): sticky variants over the same event
|
|
74
|
+
stream
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "HTTP API"
|
|
3
|
+
description: "Every route the server mounts: sessions, approvals, deterministic tool calls, discovery, the MCP endpoint, and dev-mode dispatch."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# HTTP API reference
|
|
7
|
+
|
|
8
|
+
Every agentkit host speaks the same stable HTTP API. In the default
|
|
9
|
+
multi-agent layout each agent is namespaced under its slug
|
|
10
|
+
(`/<slug>/v1/session`, `/<slug>/playground`), with host-level routes at
|
|
11
|
+
the root. With `--mode single`, one agent serves the same surface
|
|
12
|
+
unslugged (`/v1/*`).
|
|
13
|
+
|
|
14
|
+
Unless noted otherwise, routes run the agent's HTTP auth chain: the
|
|
15
|
+
default is `localDevStrict()` (loopback only), replaced by `bearerAuth` under
|
|
16
|
+
`--bearer-token` or `allowAll()` under `--allow-anonymous`. Session
|
|
17
|
+
routes also require the caller to be the session's owner (`403`
|
|
18
|
+
otherwise). Errors return JSON
|
|
19
|
+
`{ ok: false, error: "<code>", message? }` with a matching HTTP status.
|
|
20
|
+
|
|
21
|
+
## Host-level routes (multi-agent mode)
|
|
22
|
+
|
|
23
|
+
These routes live at the host root, above any agent. The two index
|
|
24
|
+
routes exist only while the playground is enabled (`--no-playground`
|
|
25
|
+
removes them) and run no auth. The documentation site is mounted in
|
|
26
|
+
both layouts and removed by `--no-docs`.
|
|
27
|
+
|
|
28
|
+
| Route | What it does |
|
|
29
|
+
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
30
|
+
| `GET /` | A web index of every mounted agent, linking to playgrounds (playground only) |
|
|
31
|
+
| `GET /v1/agents` | The JSON index of mounted agents (playground only, no auth) |
|
|
32
|
+
| `GET /docs`, `GET /docs/*` | This documentation, served as a static site (both layouts, no auth) |
|
|
33
|
+
| `GET /v1/health` | Host-level liveness, no auth; made for ALB/ECS checks |
|
|
34
|
+
| `POST /v1/webhooks/github` | Loopback-only trigger endpoint that fans a GitHub-shaped payload out to every mounted GitHub channel (used by local tooling) |
|
|
35
|
+
|
|
36
|
+
## Start a session
|
|
37
|
+
|
|
38
|
+
`POST /v1/session` opens a durable conversation.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
curl -X POST http://127.0.0.1:3000/<slug>/v1/session \
|
|
42
|
+
-H 'content-type: application/json' \
|
|
43
|
+
-d '{"message":"What can you do?"}'
|
|
44
|
+
# {"ok":true,"sessionId":"ses_…","continuationToken":"http:…",
|
|
45
|
+
# "playgroundUrl":"…?sessionId=ses_…","traceUrl":"…/v1/session/ses_…/events"}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The response returns as soon as the message is accepted; follow the
|
|
49
|
+
stream for progress. The continuation token is the follow-up credential,
|
|
50
|
+
and `playgroundUrl` deep-links the session in the playground.
|
|
51
|
+
|
|
52
|
+
## Send a follow-up
|
|
53
|
+
|
|
54
|
+
`POST /v1/session/:sessionId` continues an existing conversation.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
curl -X POST http://127.0.0.1:3000/<slug>/v1/session/ses_… \
|
|
58
|
+
-H 'content-type: application/json' \
|
|
59
|
+
-d '{"continuationToken":"http:…","message":"Make it shorter."}'
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Works for any chat session, including ones created by custom channels.
|
|
63
|
+
Each accepted follow-up rotates the token, and the response carries the
|
|
64
|
+
new one. Sending to a busy session interrupts the in-flight turn, waits
|
|
65
|
+
for it to settle, then sends; when the turn can't be interrupted (for
|
|
66
|
+
example, concurrent follow-ups racing), the request returns
|
|
67
|
+
`409 session_busy`.
|
|
68
|
+
|
|
69
|
+
Expect `409` on a stale token, an uninterruptible busy session, or a
|
|
70
|
+
task/schedule session (those aren't followable), and `403` when the
|
|
71
|
+
caller isn't the session owner.
|
|
72
|
+
|
|
73
|
+
## Stream a session
|
|
74
|
+
|
|
75
|
+
`GET /v1/session/:sessionId/stream` is the live NDJSON feed.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
curl -N 'http://127.0.0.1:3000/<slug>/v1/session/ses_…/stream?startIndex=0'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
One NDJSON event per line, from `startIndex`, then following live. The
|
|
82
|
+
default is `0`: omitting the parameter replays the entire recorded
|
|
83
|
+
stream before following. Pass the last index you've seen plus one to
|
|
84
|
+
resume without duplicates. The stream is durable and reconnectable. For
|
|
85
|
+
the vocabulary, see
|
|
86
|
+
[Sessions](./sessions.md#the-event-vocabulary).
|
|
87
|
+
|
|
88
|
+
`GET /v1/session/:sessionId/events` returns the same content as a
|
|
89
|
+
one-shot dump with no live follow.
|
|
90
|
+
|
|
91
|
+
## Stop and list
|
|
92
|
+
|
|
93
|
+
`POST /v1/session/:sessionId/stop` interrupts the in-flight turn without
|
|
94
|
+
sending a new message. `GET /v1/sessions` lists sessions owned by the
|
|
95
|
+
calling principal. Under `serve --dev` on loopback it includes all
|
|
96
|
+
sessions, which is how webhook and schedule sessions show up in the
|
|
97
|
+
playground.
|
|
98
|
+
|
|
99
|
+
## Approvals
|
|
100
|
+
|
|
101
|
+
Two routes list and resolve parked tool calls.
|
|
102
|
+
|
|
103
|
+
| Route | What it does |
|
|
104
|
+
| ----------------------------------------------- | -------------------------------------------------------------- |
|
|
105
|
+
| `GET /v1/session/:sessionId/approvals` | Pending human-in-the-loop tool approvals |
|
|
106
|
+
| `POST /v1/session/:sessionId/approvals/:callId` | Resolve one: `{"decision":"approve"}` or `{"decision":"deny"}` |
|
|
107
|
+
|
|
108
|
+
For the lifecycle, see [Human-in-the-loop](../guides/human-in-the-loop.md).
|
|
109
|
+
|
|
110
|
+
## Call a tool directly
|
|
111
|
+
|
|
112
|
+
`POST /v1/tools/:toolName` runs a server tool with no model turn.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
curl -X POST http://127.0.0.1:3000/<slug>/v1/tools/inspect_pr \
|
|
116
|
+
-H 'content-type: application/json' \
|
|
117
|
+
-d '{"input":{"prUrl":"https://github.com/acme/checkout/pull/42"}}'
|
|
118
|
+
# {"ok":true,"toolName":"inspect_pr","callId":"tool_inspect_pr_…",
|
|
119
|
+
# "isError":false,"result":{…},"durationMs":12}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
It runs an authored server tool in-process: schema-validated, no model
|
|
123
|
+
turn. An optional `"sessionId"` in the body runs it inside an existing
|
|
124
|
+
session and records it on that session's stream (`409 session_busy`
|
|
125
|
+
while a turn runs). Agent-execution tools are rejected with `400`, and
|
|
126
|
+
unknown tools with `404` and the list of available names. For the
|
|
127
|
+
semantics, see [Tools](./tools.md#call-a-tool-without-a-model-turn).
|
|
128
|
+
|
|
129
|
+
## Discovery and meta
|
|
130
|
+
|
|
131
|
+
Five read-only routes describe the running agent.
|
|
132
|
+
|
|
133
|
+
| Route | What it does |
|
|
134
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
135
|
+
| `GET /v1/info` | The manifest snapshot: model, tools, skills, MCP connections, subagents, channels and routes (with schemas), schedules, hooks, A/B experiments, diagnostics; the same shape as `agentkit info --json` |
|
|
136
|
+
| `GET /v1/health` | Per-agent liveness, no auth |
|
|
137
|
+
| `GET /v1/meta` | SPA bootstrap: agent name, dev flag, base path (no auth) |
|
|
138
|
+
| `GET /v1/logs?after=N` | Recent server log lines from the ring buffer, with a polling cursor |
|
|
139
|
+
| `GET /v1/abs` | [Live A/B metrics](../ab.md): per-session assignments and aggregate arm totals folded from durable event streams (`config` reports `maxPlaygroundSessions` / `durableSamples` / `durableSnapshots` from `agent/ab.config.ts`) |
|
|
140
|
+
|
|
141
|
+
## Custom channel routes
|
|
142
|
+
|
|
143
|
+
Authored routes mount under `/v1/channels/<id>` with the methods, paths,
|
|
144
|
+
and Zod schemas the channel declared (a
|
|
145
|
+
`POST /<slug>/v1/channels/drive` route, say). Bodies are validated before
|
|
146
|
+
handlers run (`400` on schema violations), and each channel's auth chain
|
|
147
|
+
applies. The GitHub channel verifies `X-Hub-Signature-256` when a
|
|
148
|
+
secret is configured. See [Channels](./channels.md).
|
|
149
|
+
|
|
150
|
+
## MCP endpoint
|
|
151
|
+
|
|
152
|
+
`/v1/mcp` serves the Model Context Protocol over streamable HTTP
|
|
153
|
+
(stateless; POST carries the protocol, and GET/DELETE return
|
|
154
|
+
spec-compliant 405s). The tools are `ask` (delegate a message, bounded
|
|
155
|
+
waits), `check` (poll a running session), and `call_tool` (deterministic
|
|
156
|
+
server-tool passthrough, present when the agent has server tools). The
|
|
157
|
+
route runs the same auth chain as the session API. See
|
|
158
|
+
[Agent-to-agent](../guides/agent-to-agent.md).
|
|
159
|
+
|
|
160
|
+
## Playground eval routes
|
|
161
|
+
|
|
162
|
+
Always registered (including production / non-`--dev` serves). The playground
|
|
163
|
+
Evals tab uses these:
|
|
164
|
+
|
|
165
|
+
| Route | What it does |
|
|
166
|
+
| ------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
167
|
+
| `GET /v1/dev/evals` | List discovered eval datapoints and project config as `{ evals, config }` (`config` includes `maxPlaygroundRuns`, `durableRuns`) |
|
|
168
|
+
| `GET /v1/dev/evals/runs` | List recent run snapshots (newest first) as `{ runs, activeRunId? }` for playground rehydrate |
|
|
169
|
+
| `POST /v1/dev/evals/runs` | Start an eval run (`{filterIds?, tags?}`); `202` with a snapshot, `404` when nothing matches, `409` when one is running |
|
|
170
|
+
| `GET /v1/dev/evals/runs/:runId` | Poll a run's progress |
|
|
171
|
+
|
|
172
|
+
Eval runs are asynchronous. Poll the run route for case progress and
|
|
173
|
+
the final `completed` or `failed` status. Batch errors appear on the
|
|
174
|
+
snapshot returned by the poll. Entries within `filterIds` and `tags`
|
|
175
|
+
use OR semantics. When both fields are present, a case must match one
|
|
176
|
+
entry from each field. Without `persistRuns` in `evals.config.ts`,
|
|
177
|
+
listed runs are process-memory only (capped by `maxPlaygroundRuns`).
|
|
178
|
+
|
|
179
|
+
## Dev-mode routes
|
|
180
|
+
|
|
181
|
+
These routes exist only under `serve --dev`.
|
|
182
|
+
|
|
183
|
+
| Route | What it does |
|
|
184
|
+
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
|
185
|
+
| `POST /v1/dev/schedules/:scheduleId` | Dispatch a schedule by hand, exactly once, through the production path. Returns `{scheduleId, sessionIds}` |
|
|
186
|
+
| `GET /v1/dev/reminders` | List reminders |
|
|
187
|
+
| `POST /v1/dev/reminders/:reminderId` | Fire a reminder by hand |
|
|
188
|
+
|
|
189
|
+
Schedules and reminders never fire automatically in dev mode. These
|
|
190
|
+
routes are the only way they run, which keeps iteration deterministic.
|
|
191
|
+
|
|
192
|
+
## Playground assets
|
|
193
|
+
|
|
194
|
+
`GET /playground` and `GET /playground/assets/:file` serve the static
|
|
195
|
+
SPA bundle (omitted with `--no-playground`). The playground calls the
|
|
196
|
+
JSON API above and has no privileged surface.
|
|
197
|
+
|
|
198
|
+
## Status codes
|
|
199
|
+
|
|
200
|
+
Error responses use a small, consistent set of status codes.
|
|
201
|
+
|
|
202
|
+
| Code | Meaning here |
|
|
203
|
+
| ----- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
204
|
+
| `400` | Schema-invalid body or query, agent-execution tool called on the host, malformed request |
|
|
205
|
+
| `401` | No auth policy admitted the request |
|
|
206
|
+
| `403` | Authenticated, but not the session owner |
|
|
207
|
+
| `404` | Unknown session, tool, schedule, reminder, or eval run; no eval datapoints match a run request |
|
|
208
|
+
| `405` | Wrong method (GET on the MCP endpoint, say) |
|
|
209
|
+
| `409` | Stale continuation token, busy session (`session_busy`), a non-followable task session, or an eval run already in progress |
|
|
210
|
+
| `202` | Accepted for background work (GitHub `{ task }` hooks, eval runs) |
|
|
211
|
+
|
|
212
|
+
## What's next
|
|
213
|
+
|
|
214
|
+
Continue with these pages:
|
|
215
|
+
|
|
216
|
+
- [Sessions and streaming](./sessions.md): the handles and events these
|
|
217
|
+
routes traffic in
|
|
218
|
+
- [Channels](./channels.md): authoring your own routes
|
|
219
|
+
- [Deployment](../deployment.md): auth on real hosts
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Instructions"
|
|
3
|
+
description: "The always-on system prompt: authoring forms, how it reaches the model on each runtime, and what makes instructions hold up."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Instructions
|
|
7
|
+
|
|
8
|
+
`agent/instructions.md` is the always-on system prompt. It's the one
|
|
9
|
+
piece of prose the model sees on every turn. It's required on the root
|
|
10
|
+
agent; subagents may inline `instructions` in their `agent.ts` instead.
|
|
11
|
+
|
|
12
|
+
## Authoring forms
|
|
13
|
+
|
|
14
|
+
Three forms cover every case.
|
|
15
|
+
|
|
16
|
+
| Form | Reach for it when |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| `agent/instructions.md` | Plain Markdown for most agents. |
|
|
19
|
+
| `agent/instructions.ts` | Generated prompts. Default-export `defineInstructions({ markdown })` or a plain string. |
|
|
20
|
+
| `agent/instructions/` directory | A long prompt split across files, composed in filename order. |
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
// agent/instructions.ts
|
|
24
|
+
import { defineInstructions } from "@cursor/july";
|
|
25
|
+
|
|
26
|
+
export default defineInstructions({
|
|
27
|
+
markdown: `You are the on-call assistant for ${process.env.TEAM_NAME}.`,
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## How instructions reach the model
|
|
32
|
+
|
|
33
|
+
On the local runtime, instructions land in the session workspace as
|
|
34
|
+
`AGENTS.md`, and the harness loads them natively. On the cloud runtime,
|
|
35
|
+
they're prepended to the first prompt, because the cloud VM doesn't
|
|
36
|
+
share the local session workspace.
|
|
37
|
+
|
|
38
|
+
The local workspace is a real Cursor project directory, so the harness
|
|
39
|
+
may also load ambient `AGENTS.md` and `.cursor` config from ancestor
|
|
40
|
+
directories. [Agent config → Local cwd](./agent-config.md#local-cwd)
|
|
41
|
+
covers controlling that.
|
|
42
|
+
|
|
43
|
+
## Best Practices
|
|
44
|
+
|
|
45
|
+
Keep them a few lines: identity, when to use which tool, output shape.
|
|
46
|
+
The [quickstart weather agent](../quickstart.md) is the pattern:
|
|
47
|
+
|
|
48
|
+
```md
|
|
49
|
+
# Weather agent
|
|
50
|
+
|
|
51
|
+
You are a concise weather assistant.
|
|
52
|
+
|
|
53
|
+
- Use `get_weather` before answering questions about current weather.
|
|
54
|
+
- Tell the user the weather data is simulated.
|
|
55
|
+
- Keep replies to two sentences or fewer.
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- Name the tools and the decision rule ("use X before answering about
|
|
59
|
+
Y"), not general encouragement.
|
|
60
|
+
- State the output contract: length, format, fences. That contract is
|
|
61
|
+
what your [evals](../evals.md) gate.
|
|
62
|
+
- Move procedures to [skills](./skills.md). A multi-step workflow the
|
|
63
|
+
model only sometimes needs belongs in `agent/skills/`, where it loads
|
|
64
|
+
on demand and keeps the always-on prompt small.
|
|
65
|
+
|
|
66
|
+
Instructions are the third lever in the
|
|
67
|
+
[hillclimbing loop](../hillclimbing.md), after host preparation and evidence
|
|
68
|
+
shape. If a fixture keeps failing, look there before rewriting prose.
|
|
69
|
+
|
|
70
|
+
## What's next
|
|
71
|
+
|
|
72
|
+
Continue with these pages:
|
|
73
|
+
|
|
74
|
+
- [Skills](./skills.md): procedures the model loads only when relevant
|
|
75
|
+
- [Agent config](./agent-config.md): the file next to this one
|
|
76
|
+
- [Hillclimbing](../hillclimbing.md): iterating on instructions with
|
|
77
|
+
evidence
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Playground"
|
|
3
|
+
description: "The built-in web UI: chat with streaming, Try buttons and slash commands, session replay, approvals, and dev-mode dispatch."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Playground
|
|
7
|
+
|
|
8
|
+
Every served agent ships with a web playground at
|
|
9
|
+
`http://127.0.0.1:3000/<slug>/playground` (or `/playground` in single
|
|
10
|
+
mode): a static SPA over the same public HTTP API, made for manual
|
|
11
|
+
testing, demos, and reading sessions. Every call it makes runs the
|
|
12
|
+
normal route auth chain, so anything you can do in the playground you
|
|
13
|
+
can also do with curl.
|
|
14
|
+
|
|
15
|
+
## What it does
|
|
16
|
+
|
|
17
|
+
The playground covers the whole manual-testing loop.
|
|
18
|
+
|
|
19
|
+
- **Chat** with the agent. Text and reasoning stream live, rendered as
|
|
20
|
+
markdown with syntax highlighting, and tool calls appear inline with
|
|
21
|
+
their arguments, output, and error state as the `actions.requested` /
|
|
22
|
+
`action.result` events arrive.
|
|
23
|
+
- **Slash commands**: custom channel routes become composer commands
|
|
24
|
+
(a `drive` route becomes `/drive <pr-url>`), derived from the schemas
|
|
25
|
+
on `GET /v1/info`, with `/help` and autocomplete.
|
|
26
|
+
- **Try** any channel route from the Agent surface. The modal remembers
|
|
27
|
+
your last body per endpoint and has Copy curl, and a successful Try
|
|
28
|
+
opens the created session.
|
|
29
|
+
- **Sessions**: browse every session (chat, custom-channel, schedule
|
|
30
|
+
tasks) and replay their durable event streams. Search by session ID
|
|
31
|
+
to filter the list, or press Enter to open an ID directly. "Open
|
|
32
|
+
trace" renders any `events.ndjson` file.
|
|
33
|
+
- **Approvals**: parked `needsApproval` tool calls render Approve /
|
|
34
|
+
Deny buttons.
|
|
35
|
+
- **Evals**: list and run filesystem evals from the browser (backed by
|
|
36
|
+
`/v1/dev/evals`). Schedule hand-dispatch still requires `--dev`.
|
|
37
|
+
- **The surface**: inspect the discovered tools, skills, subagents, MCP
|
|
38
|
+
connections, channels, and hooks.
|
|
39
|
+
- **Raw NDJSON pane**: flip it on to see the exact wire events.
|
|
40
|
+
- **Logs tab**: recent server log lines, polled from `GET /v1/logs`.
|
|
41
|
+
- **A/Bs tab**: per-session and aggregate
|
|
42
|
+
[live A/B metrics](../ab.md) from `GET /v1/abs` (folds durable
|
|
43
|
+
`ab.assigned` plus turn and tool events; no separate store).
|
|
44
|
+
|
|
45
|
+
In multi-agent mode each agent has its own playground at
|
|
46
|
+
`/<slug>/playground`, and `/` is an index of them all.
|
|
47
|
+
|
|
48
|
+
## Share it beyond localhost
|
|
49
|
+
|
|
50
|
+
The default `localDevStrict()` auth admits direct loopback calls only
|
|
51
|
+
and rejects proxy-forwarding headers, so a tunnel or LAN address won't
|
|
52
|
+
work
|
|
53
|
+
until you pass `--bearer-token <secret>` (or
|
|
54
|
+
`serve(dir, { authToken })`). Open the playground on the remote device
|
|
55
|
+
and paste the token into the token field in the navbar. `--allow-anonymous` is the
|
|
56
|
+
demo-only alternative for trusted networks.
|
|
57
|
+
|
|
58
|
+
## What's next
|
|
59
|
+
|
|
60
|
+
Continue with these pages:
|
|
61
|
+
|
|
62
|
+
- [HTTP API](./http-api.md): everything the playground calls
|
|
63
|
+
- [Sessions and streaming](./sessions.md): the streams it renders
|
|
64
|
+
- [Human-in-the-loop](../guides/human-in-the-loop.md): the approval
|
|
65
|
+
buttons in context
|
|
66
|
+
- [Live A/B metrics](../ab.md): the assignments and results in the A/Bs
|
|
67
|
+
tab
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Project layout"
|
|
3
|
+
description: "The folder structure under agent/ and the path-derived naming rule."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Project layout
|
|
7
|
+
|
|
8
|
+
agentkit builds an agent by walking the filesystem under `agent/`.
|
|
9
|
+
Each folder has a defined purpose. The path a file lands in determines
|
|
10
|
+
how agentkit loads it.
|
|
11
|
+
|
|
12
|
+
## Folder structure
|
|
13
|
+
|
|
14
|
+
For the capabilities below, identity usually comes from the path. A/B
|
|
15
|
+
experiments can override their file-derived name.
|
|
16
|
+
|
|
17
|
+
| Path | Resolves to |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `agent/tools/approve_pr.ts` | tool `approve_pr` |
|
|
20
|
+
| `agent/mcp-connections/linear.ts` | MCP connection `linear` |
|
|
21
|
+
| `agent/skills/pr-review.md` | skill `pr-review` |
|
|
22
|
+
| `agent/subagents/reviewer/` | subagent `reviewer` |
|
|
23
|
+
| `agent/channels/drive.ts` | channel `drive`, routes under `/v1/channels/drive` |
|
|
24
|
+
| `agent/ab.ts` | A/B experiment `ab` unless `name` overrides it |
|
|
25
|
+
| `agent/ab/concise.ts` | A/B experiment `concise` unless `name` overrides it |
|
|
26
|
+
|
|
27
|
+
The root agent takes its name from `package.json` `name`, falling back
|
|
28
|
+
to the directory name. When serving multiple agents, the slug is the
|
|
29
|
+
directory name and must match `[A-Za-z0-9][A-Za-z0-9_-]*` (and not the
|
|
30
|
+
reserved `v1`, `playground`, or `docs` segments).
|
|
31
|
+
|
|
32
|
+
## Full project layout
|
|
33
|
+
|
|
34
|
+
A full project looks like this.
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
my-agent/
|
|
38
|
+
├── package.json
|
|
39
|
+
├── agent/
|
|
40
|
+
│ ├── agent.ts # runtime config (model, runtime, cloud/local)
|
|
41
|
+
│ ├── instructions.md # always-on system prompt (required)
|
|
42
|
+
│ ├── tools/
|
|
43
|
+
│ │ └── approve_pr.ts # one typed tool per file
|
|
44
|
+
│ ├── skills/
|
|
45
|
+
│ │ └── pr-review.md # on-demand procedures (SKILL.md convention)
|
|
46
|
+
│ ├── mcp-connections/
|
|
47
|
+
│ │ └── linear.ts # tools from external MCP servers
|
|
48
|
+
│ ├── subagents/
|
|
49
|
+
│ │ └── reviewer/ # child agents (agent.ts + instructions.md)
|
|
50
|
+
│ ├── channels/
|
|
51
|
+
│ │ ├── webhook.ts # custom HTTP surfaces
|
|
52
|
+
│ │ ├── slack.ts # the Slack channel pack
|
|
53
|
+
│ │ └── github.ts # the GitHub webhook channel pack
|
|
54
|
+
│ ├── hooks/
|
|
55
|
+
│ │ └── audit.ts # observe the runtime event stream
|
|
56
|
+
│ ├── ab.ts # optional live A/B experiment
|
|
57
|
+
│ ├── ab/
|
|
58
|
+
│ │ └── concise.ts # optional: more experiments
|
|
59
|
+
│ ├── schedules/
|
|
60
|
+
│ │ └── heartbeat.md # cron-driven runs
|
|
61
|
+
│ ├── sandbox/workspace/ # files seeded into each session's workspace
|
|
62
|
+
│ └── lib/ # shared code (import-only, never discovered)
|
|
63
|
+
└── evals/
|
|
64
|
+
├── evals.config.ts # required when evals exist (maxConcurrency)
|
|
65
|
+
└── readiness.eval.ts # filesystem evals
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Evals live in `evals/` at the project root, a sibling of `agent/`, never
|
|
69
|
+
inside it. `agent/evals/` is silently ignored. See
|
|
70
|
+
[Evals](../evals.md).
|
|
71
|
+
|
|
72
|
+
## Folder reference
|
|
73
|
+
|
|
74
|
+
Each path maps to a capability and a reference page.
|
|
75
|
+
|
|
76
|
+
| Path | What it is | Reference |
|
|
77
|
+
| --- | --- | --- |
|
|
78
|
+
| `agent/agent.ts` | `defineAgent({ model?, runtime?, cloud?, local? })`; the model defaults to `grok-4.5` with `effort=high`, `fast=true` | [Agent config](./agent-config.md) |
|
|
79
|
+
| `agent/instructions.md` | Always-on system prompt, required on the root agent (`.ts` and directory forms exist) | [Instructions](./instructions.md) |
|
|
80
|
+
| `agent/tools/<name>.ts` | One typed tool; filename = tool name. `execution: "server"` (in-process, default) or `"agent"` (a script that runs where the agent runs) | [Tools](./tools.md) |
|
|
81
|
+
| `agent/skills/*` | SKILL.md-convention procedures, loaded on demand | [Skills](./skills.md) |
|
|
82
|
+
| `agent/mcp-connections/<name>.ts` | MCP servers, available to the model, to server tools (`ctx.host.mcp`), and to channel/schedule handlers (`args.host.mcp`) | [MCP connections](./connections.md) |
|
|
83
|
+
| `agent/subagents/<id>/` | Child agent directory; `description` required | [Subagents](./subagents.md) |
|
|
84
|
+
| `agent/channels/*.ts` | HTTP surfaces beyond the built-in session API; `slack.ts` and `github.ts` use the platform packs | [Channels](./channels.md) |
|
|
85
|
+
| `agent/hooks/*.ts` | Observe-only event subscribers, never fatal | [Hooks](./hooks.md) |
|
|
86
|
+
| `agent/ab.ts`, `agent/ab/*.ts` | `defineAB` experiments with sticky variants and live metrics | [Live A/B metrics](../ab.md) |
|
|
87
|
+
| `agent/schedules/*` | Cron-driven runs (UTC, 5-field; never auto-fire under `--dev`) | [Schedules](./schedules.md) |
|
|
88
|
+
| `agent/lib/` | Import-only shared code, never discovered | None |
|
|
89
|
+
| `evals/**/*.eval.ts` | Filesystem evals; case id = path under `evals/` | [Evals](../evals.md) |
|
|
90
|
+
|
|
91
|
+
`agent/lib/` is the only place for shared code. Everything else under
|
|
92
|
+
`agent/` is discovery surface. A stray `.ts` file in one of these
|
|
93
|
+
folders is treated as a definition.
|
|
94
|
+
|
|
95
|
+
## Why didn't agentkit discover my file?
|
|
96
|
+
|
|
97
|
+
Run `agentkit validate --dir .` and `agentkit info --dir .`.
|
|
98
|
+
`validate` prints diagnostics, and `serve` refuses to start on
|
|
99
|
+
error-severity ones. Warnings, such as cloud runtime combined with
|
|
100
|
+
local-only capabilities, print but don't block. `info` lists the discovered
|
|
101
|
+
surface, so a missing tool or channel shows up immediately. From
|
|
102
|
+
there, check the folder reference: the file is usually in the wrong directory
|
|
103
|
+
or has the wrong extension.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
agentkit validate --dir . # diagnostics; non-zero exit on errors
|
|
107
|
+
agentkit info --dir . # human-readable surface
|
|
108
|
+
agentkit info --dir . --json # machine-readable manifest (same shape as GET /v1/info)
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## What's next
|
|
112
|
+
|
|
113
|
+
Continue with these pages:
|
|
114
|
+
|
|
115
|
+
- [Agent config](./agent-config.md): the runtime config at the root
|
|
116
|
+
- [Tools](./tools.md): add typed actions under `agent/tools/`
|
|
117
|
+
- [Live A/B metrics](../ab.md): compare variants from `agent/ab.ts` or
|
|
118
|
+
`agent/ab/`
|
|
119
|
+
- [Concepts](../concepts.md): why the filesystem is the interface
|