@cursor/bdk 0.2.25 → 0.2.27
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 +3 -18
- package/CHANGELOG.md +3 -0
- package/dist/artifacts.d.ts +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/bin/agent-serve.js +25 -21
- package/dist/channels/bitbucket/api.d.ts +2 -2
- package/dist/channels/bitbucket/api.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +2 -2
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
- package/dist/channels/deployments/deployments-channel.js +1 -1
- package/dist/channels/github/cursor-account.d.ts +7 -0
- package/dist/channels/github/cursor-account.d.ts.map +1 -1
- package/dist/channels/github/cursor-account.js +22 -5
- package/dist/channels/github/github-channel.js +1 -1
- package/dist/channels/github/replay.d.ts +1 -1
- package/dist/channels/github/replay.d.ts.map +1 -1
- package/dist/channels/gitlab/api.d.ts +2 -2
- package/dist/channels/gitlab/api.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +1 -1
- package/dist/channels/issues/issues-channel.js +1 -1
- package/dist/channels/origin/api.d.ts +4 -4
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +1 -1
- package/dist/channels/origin/origin-webhook.d.ts +3 -3
- package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts +2 -2
- package/dist/channels/pagerduty/pagerduty-webhook.d.ts.map +1 -1
- package/dist/channels/runs/runs-channel.js +1 -1
- package/dist/channels/slack/agentic-delivery.d.ts +2 -1
- package/dist/channels/slack/agentic-delivery.d.ts.map +1 -1
- package/dist/channels/slack/agentic-delivery.js +6 -10
- package/dist/channels/slack/agentic-signals.d.ts +2 -7
- package/dist/channels/slack/agentic-signals.d.ts.map +1 -1
- package/dist/channels/slack/agentic-signals.js +4 -3
- package/dist/channels/slack/api.d.ts +1 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +3 -0
- package/dist/channels/slack/constants.d.ts +2 -0
- package/dist/channels/slack/constants.d.ts.map +1 -1
- package/dist/channels/slack/constants.js +2 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +3 -2
- package/dist/channels/slack/dispatch.d.ts +9 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +3 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +24 -20
- package/dist/channels/slack/interactive.d.ts +2 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +1 -0
- package/dist/channels/slack/live-delivery.d.ts +3 -0
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +5 -0
- package/dist/channels/slack/reply-options.d.ts +9 -0
- package/dist/channels/slack/reply-options.d.ts.map +1 -1
- package/dist/channels/slack/reply-options.js +31 -1
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +7 -0
- package/dist/channels/slack/stream.d.ts +5 -1
- package/dist/channels/slack/stream.d.ts.map +1 -1
- package/dist/channels/slack/types.d.ts +29 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels.d.ts +1 -1
- package/dist/channels.js +1 -1
- package/dist/docs/404.html +3 -3
- package/dist/docs/assets/{app.BjS1QEI4.js → app.wA5xBBcd.js} +4 -4
- package/dist/docs/assets/changelog.md.BvHRIiMH.js +1 -0
- package/dist/docs/assets/changelog.md.BvHRIiMH.lean.js +1 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.BoDEJQWv.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BOuvjb5Y.js → VPLocalSearchBox.C29HLCVL.js} +2 -2
- package/dist/docs/assets/chunks/{arc.3WR6Jf-y.js → arc.BOaoYWmh.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.Dtb6Dqh6.js → architectureDiagram-Q4EWVU46.MfG0itQh.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.BUyrgrZE.js → baseUniq.CUeJciCF.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.BVLV_voZ.js → blockDiagram-DXYQGD6D.BrXMZRtK.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.jXJ1q70M.js → c4Diagram-AHTNJAMY.DfkDHeB9.js} +1 -1
- package/dist/docs/assets/chunks/channel.D2BTz0L-.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.zz1SMBvK.js → chunk-4BX2VUAB.xKz8CiXK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.CzYKuv3I.js → chunk-4TB4RGXK.kkfBh4zk.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.C7_tcJZD.js → chunk-55IACEB6.BClJGb94.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.DeTwQPVO.js → chunk-EDXVE4YY.P9BpQ9L3.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.DhMTl7ut.js → chunk-FMBD7UC4.R4iYi58S.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.Me7f5hEp.js → chunk-OYMX7WX6.Cpn8L1dw.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.D0E0Bb6g.js → chunk-QZHKN3VN.BLftECqU.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CdOOBFYL.js → chunk-YZCP3GAM.BWDV1AYt.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DqByliAC.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DqByliAC.js +1 -0
- package/dist/docs/assets/chunks/clone.CldT1lbQ.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BNbGESzN.js → cose-bilkent-S5V4N54A.DGpAcJ55.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.zU7Lu_xJ.js → dagre-KV5264BT.BBXxGEaD.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.B9qOdE5h.js → diagram-5BDNPKRD.EKqOwmK2.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.D8X-sf77.js → diagram-G4DWMVQ6.CB8pdkoZ.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.CW7MvMlE.js → diagram-MMDJMWI5.aHh4WGg9.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.J489G0Nd.js → diagram-TYMM5635.YIsbRH20.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.BkW7tGfs.js → erDiagram-SMLLAGMA.B3bTCW_e.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.jc9iWORD.js → flowDiagram-DWJPFMVM.M81hXIXZ.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.B-UQfd9E.js → ganttDiagram-T4ZO3ILL.BKg7WY--.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DFzrTSlJ.js → gitGraphDiagram-UUTBAWPF.CLEMZgO3.js} +1 -1
- package/dist/docs/assets/chunks/{graph.C5IB6_e_.js → graph.DS38W_Q-.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.DwF0-c8L.js → infoDiagram-42DDH7IO.BTiWTi82.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.fBaTqzE7.js → ishikawaDiagram-UXIWVN3A.DcqY_KQL.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.CM8gDVJy.js → journeyDiagram-VCZTEJTY.0lQNZ40U.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.YiD1p0LB.js → kanban-definition-6JOO6SKY.L5sKlf7X.js} +1 -1
- package/dist/docs/assets/chunks/{layout.6Um-DVJT.js → layout.7u4gFhQa.js} +1 -1
- package/dist/docs/assets/chunks/{linear.DcTeg4Hn.js → linear.D5v33SOb.js} +1 -1
- package/dist/docs/assets/chunks/{min.CIxkY8Fe.js → min.Dc9uCxf9.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.D4QM_voR.js → mindmap-definition-QFDTVHPH.B56nGoB_.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.nmB309G1.js → pieDiagram-DEJITSTG.Cba8e8lS.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.D1HtZR3C.js → quadrantDiagram-34T5L4WZ.2YjBycHF.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.CZgQWob-.js → requirementDiagram-MS252O5E.D4P5RqVI.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.DtiBfU-P.js → sankeyDiagram-XADWPNL6.C0Hn8NUm.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Cld4gDSt.js → sequenceDiagram-FGHM5R23.BZm7EaoT.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.DatP823_.js → stateDiagram-FHFEXIEX.DcR4f3X2.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Bb4oMe0P.js +1 -0
- package/dist/docs/assets/chunks/{theme.D5jbBys7.js → theme.DvfKzyXq.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.DwQLI2be.js → timeline-definition-GMOUNBTQ.CgDh96vg.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.a5yMfnsa.js → vennDiagram-DHZGUBPP.B4fagbC8.js} +1 -1
- package/dist/docs/assets/chunks/{wardley-RL74JXVD.B-FXivgT.js → wardley-RL74JXVD.Ck68omim.js} +1 -1
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.Dz--Opy3.js → wardleyDiagram-NUSXRM2D.DBUg0bvz.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.Dl8w8TeT.js → xychartDiagram-5P7HB3ND.DnKSGQE1.js} +1 -1
- package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.js → guides_hooks.md.B2XfGX50.js} +7 -3
- package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.js → guides_mcp-oauth.md.Cxq2TxBB.js} +3 -3
- package/dist/docs/assets/{guides_mcp-oauth.md.BM_eFC0L.lean.js → guides_mcp-oauth.md.Cxq2TxBB.lean.js} +1 -1
- package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.js +37 -0
- package/dist/docs/assets/guides_opentelemetry.md.D4wO7_8v.lean.js +1 -0
- package/dist/docs/assets/{guides_slack.md.Bn-WupSE.js → guides_slack.md.ClIyi7FI.js} +8 -3
- package/dist/docs/assets/{guides_slack.md.Bn-WupSE.lean.js → guides_slack.md.ClIyi7FI.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.IplwL25I.js → reference_agent-config.md.CZrbHOfT.js} +8 -4
- package/dist/docs/assets/{reference_agent-config.md.IplwL25I.lean.js → reference_agent-config.md.CZrbHOfT.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.Bxaa020x.js → reference_channels.md.CNNIS6K7.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.js → reference_hooks.md.CROr0QgC.js} +13 -7
- package/dist/docs/assets/{reference_hooks.md.B1jq3oGl.lean.js → reference_hooks.md.CROr0QgC.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.js → reference_schedules.md.BqWnJES4.js} +3 -3
- package/dist/docs/assets/reference_sessions.md.Bi6lHttM.js +22 -0
- package/dist/docs/assets/reference_sessions.md.Bi6lHttM.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.C2GWh7g8.js → reference_skills.md.Ckddg6KX.js} +3 -3
- package/dist/docs/assets/{reference_tools.md.-6pypsWt.js → reference_tools.md.Bo0UfT0a.js} +1 -1
- package/dist/docs/assets/{style.nMsabY-V.css → style.B9o0luvp.css} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/changelog.html +60 -0
- package/dist/docs/changelog.md +114 -0
- package/dist/docs/deployment.html +37 -37
- package/dist/docs/evals.html +37 -37
- package/dist/docs/guides/agent-to-agent.html +37 -37
- package/dist/docs/guides/bitbucket.html +37 -37
- package/dist/docs/guides/cloud-agents.html +37 -37
- package/dist/docs/guides/convert-automation.html +37 -37
- package/dist/docs/guides/export-grokbot.html +37 -37
- package/dist/docs/guides/github.html +37 -37
- package/dist/docs/guides/gitlab.html +37 -37
- package/dist/docs/guides/grokbot-agents.html +37 -37
- package/dist/docs/guides/hooks.html +45 -41
- package/dist/docs/guides/hooks.md +7 -3
- package/dist/docs/guides/improve.html +37 -37
- package/dist/docs/guides/jev.html +37 -37
- package/dist/docs/guides/mcp-oauth.html +39 -39
- package/dist/docs/guides/mcp-oauth.md +12 -0
- package/dist/docs/guides/migrate.html +37 -37
- package/dist/docs/guides/opentelemetry.html +62 -70
- package/dist/docs/guides/opentelemetry.md +149 -179
- package/dist/docs/guides/pagerduty.html +37 -37
- package/dist/docs/guides/slack.html +44 -39
- package/dist/docs/guides/slack.md +41 -0
- package/dist/docs/guides/webhooks.html +37 -37
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +37 -37
- package/dist/docs/index.html +37 -37
- package/dist/docs/llms-full.txt +422 -193
- package/dist/docs/llms.txt +2 -1
- package/dist/docs/quickstart.html +37 -37
- package/dist/docs/reference/agent-config.html +44 -40
- package/dist/docs/reference/agent-config.md +30 -1
- package/dist/docs/reference/artifacts.html +37 -37
- package/dist/docs/reference/channels.html +38 -38
- package/dist/docs/reference/channels.md +5 -1
- package/dist/docs/reference/cli.html +37 -37
- package/dist/docs/reference/connections.html +37 -37
- package/dist/docs/reference/evals.html +37 -37
- package/dist/docs/reference/extensions.html +37 -37
- package/dist/docs/reference/hooks.html +49 -43
- package/dist/docs/reference/hooks.md +10 -5
- package/dist/docs/reference/http-api.html +37 -37
- package/dist/docs/reference/instructions.html +37 -37
- package/dist/docs/reference/memory.html +37 -37
- package/dist/docs/reference/playground.html +36 -36
- package/dist/docs/reference/project-layout.html +37 -37
- package/dist/docs/reference/prompt.html +37 -37
- package/dist/docs/reference/schedules.html +40 -40
- package/dist/docs/reference/sessions.html +58 -37
- package/dist/docs/reference/sessions.md +46 -1
- package/dist/docs/reference/skills.html +40 -40
- package/dist/docs/reference/subagents.html +37 -37
- package/dist/docs/reference/tools.html +39 -39
- package/dist/docs/reference/tools.md +3 -3
- package/dist/docs/templates/agentic-owners.html +37 -37
- package/dist/docs/templates/grokbot-agents.html +37 -37
- package/dist/docs/templates/security-reviewer.html +37 -37
- package/dist/docs/templates/thermo-quality-review.html +37 -37
- package/dist/docs/templates/thermo-review.html +37 -37
- package/dist/docs/templates/triage.html +37 -37
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/extensions/cursor-cloud-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/extension.js +15 -15
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +2 -6
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/inputs.js +1 -1
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.d.ts.map +1 -1
- package/dist/extensions/cursor-grokbot-agents/extension.js +7 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.d.ts.map +1 -1
- package/dist/extensions/cursor-grokbot-agents/lib/inputs.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +1 -1
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +1 -1
- package/dist/extensions/improve/extension.js +1 -1
- package/dist/extensions/jev/extension.js +2 -2
- package/dist/extensions/jev/tools/evaluate.js +3 -3
- package/dist/extensions/slack-communication/extension.js +1 -1
- package/dist/extensions/slack-communication/tools/delete-message.js +1 -1
- package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -1
- package/dist/extensions/slack-communication/tools/edit-message.js +3 -6
- package/dist/extensions/slack-communication/tools/post-card.js +1 -1
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -1
- package/dist/extensions/slack-communication/tools/post-update.js +3 -6
- package/dist/extensions/slack-communication/tools/react.js +1 -1
- package/dist/extensions/slack-communication/tools/set-status.js +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/filesystem.d.ts +26 -5
- package/dist/filesystem.d.ts.map +1 -1
- package/dist/filesystem.js +91 -18
- package/dist/index.d.ts +14 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/internal/as-of.d.ts +2 -0
- package/dist/internal/as-of.d.ts.map +1 -1
- package/dist/internal/as-of.js +2 -0
- package/dist/internal/builtin-tools/reminders.js +1 -1
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +18 -10
- package/dist/internal/continuation.d.ts +3 -0
- package/dist/internal/continuation.d.ts.map +1 -0
- package/dist/internal/continuation.js +1 -0
- package/dist/internal/conversation-mirror.d.ts +5 -0
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +12 -1
- package/dist/internal/convert-automation/convert-workflow.js +1 -1
- package/dist/internal/convert-grokbot/answers.d.ts.map +1 -1
- package/dist/internal/convert-grokbot/answers.js +10 -8
- package/dist/internal/convert-grokbot/recipe.d.ts +1 -1
- package/dist/internal/convert-grokbot/recipe.d.ts.map +1 -1
- package/dist/internal/convert-grokbot/recipe.js +1 -1
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +2 -0
- package/dist/internal/cursor/backend-client.d.ts +8 -3
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +8 -3
- package/dist/internal/cursor/credentials.d.ts +2 -2
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +1 -1
- package/dist/internal/cursor-account-mcp-auth.d.ts +6 -2
- package/dist/internal/cursor-account-mcp-auth.d.ts.map +1 -1
- package/dist/internal/cursor-account-mcp-auth.js +15 -6
- package/dist/internal/deferred-channel-session.d.ts +5 -4
- package/dist/internal/deferred-channel-session.d.ts.map +1 -1
- package/dist/internal/deferred-channel-session.js +6 -4
- package/dist/internal/deploy-client.d.ts +5 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +3 -3
- package/dist/internal/deploy-manifest.js +2 -2
- package/dist/internal/describe-error.d.ts +2 -0
- package/dist/internal/describe-error.d.ts.map +1 -1
- package/dist/internal/describe-error.js +2 -0
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +29 -9
- package/dist/internal/discovery/context.d.ts.map +1 -1
- package/dist/internal/discovery/context.js +1 -2
- package/dist/internal/discovery/cursor-plugin.js +8 -8
- package/dist/internal/discovery/extensions.js +15 -8
- package/dist/internal/discovery/info.d.ts +2 -2
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +6 -9
- package/dist/internal/discovery/instrumentation.d.ts +10 -0
- package/dist/internal/discovery/instrumentation.d.ts.map +1 -0
- package/dist/internal/discovery/instrumentation.js +29 -0
- package/dist/internal/discovery/modules.d.ts.map +1 -1
- package/dist/internal/discovery/modules.js +4 -4
- package/dist/internal/discovery/project-public.d.ts +16 -0
- package/dist/internal/discovery/project-public.d.ts.map +1 -0
- package/dist/internal/discovery/project-public.js +54 -0
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +13 -3
- package/dist/internal/discovery/services.d.ts +5 -4
- package/dist/internal/discovery/services.d.ts.map +1 -1
- package/dist/internal/discovery/services.js +12 -6
- package/dist/internal/docs-site.d.ts +2 -5
- package/dist/internal/docs-site.d.ts.map +1 -1
- package/dist/internal/docs-site.js +2 -5
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +1 -0
- package/dist/internal/factory-resource-channel.d.ts +1 -1
- package/dist/internal/factory-resource-channel.d.ts.map +1 -1
- package/dist/internal/filesystem/nearest.d.ts +1 -0
- package/dist/internal/filesystem/nearest.d.ts.map +1 -1
- package/dist/internal/filesystem/nearest.js +1 -0
- package/dist/internal/filesystem/tools.d.ts.map +1 -1
- package/dist/internal/filesystem/tools.js +1 -1
- package/dist/internal/handleAgentServeTrigger.d.ts +10 -0
- package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -1
- package/dist/internal/handleAgentServeTrigger.js +3 -0
- package/dist/internal/hmac-secret-values.d.ts +1 -1
- package/dist/internal/hmac-secret-values.d.ts.map +1 -1
- package/dist/internal/host-otel.d.ts +1 -1
- package/dist/internal/host-otel.d.ts.map +1 -1
- package/dist/internal/host-otel.js +5 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +6 -2
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +1 -0
- package/dist/internal/ids.d.ts +8 -0
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +20 -0
- package/dist/internal/init-scaffold.js +1 -1
- package/dist/internal/interview/agent-questions.d.ts +1 -1
- package/dist/internal/interview/agent-questions.d.ts.map +1 -1
- package/dist/internal/interview/agent-questions.js +1 -1
- package/dist/internal/interview/question.d.ts +2 -2
- package/dist/internal/interview/question.d.ts.map +1 -1
- package/dist/internal/interview/question.js +2 -2
- package/dist/internal/json-schema.d.ts.map +1 -1
- package/dist/internal/json-schema.js +3 -7
- package/dist/internal/mcp-endpoint.d.ts +16 -4
- package/dist/internal/mcp-endpoint.d.ts.map +1 -1
- package/dist/internal/mcp-endpoint.js +18 -6
- package/dist/internal/mcp-host.d.ts +9 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +15 -0
- package/dist/internal/otel/collector.d.ts +5 -0
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +24 -5
- package/dist/internal/otel/config.d.ts +31 -21
- package/dist/internal/otel/config.d.ts.map +1 -1
- package/dist/internal/otel/config.js +121 -140
- package/dist/internal/otel/conversation-span-processor.d.ts +9 -0
- package/dist/internal/otel/conversation-span-processor.d.ts.map +1 -0
- package/dist/internal/otel/conversation-span-processor.js +34 -0
- package/dist/internal/otel/customer.d.ts +52 -0
- package/dist/internal/otel/customer.d.ts.map +1 -0
- package/dist/internal/otel/customer.js +727 -0
- package/dist/internal/otel/runtime.d.ts +12 -16
- package/dist/internal/otel/runtime.d.ts.map +1 -1
- package/dist/internal/otel/runtime.js +30 -234
- package/dist/internal/otel-env.d.ts +6 -0
- package/dist/internal/otel-env.d.ts.map +1 -0
- package/dist/internal/otel-env.js +5 -0
- package/dist/internal/reminder-runner.d.ts +9 -4
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +12 -10
- package/dist/internal/reminder-schedule.d.ts +1 -0
- package/dist/internal/reminder-schedule.d.ts.map +1 -1
- package/dist/internal/reminder-schedule.js +1 -0
- package/dist/internal/sdk-runner.d.ts +8 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +190 -14
- package/dist/internal/server.d.ts +4 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +25 -24
- package/dist/internal/session-engine.d.ts +35 -3
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +213 -41
- package/dist/internal/slack-provision-client.js +1 -1
- package/dist/internal/store-api-protocol.d.ts +1 -1
- package/dist/internal/store-api-protocol.d.ts.map +1 -1
- package/dist/internal/store-api-protocol.js +1 -1
- package/dist/internal/update-check.d.ts +2 -2
- package/dist/internal/update-check.d.ts.map +1 -1
- package/dist/internal/update-check.js +3 -3
- package/dist/internal/workspace.d.ts +10 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +47 -1
- package/dist/internal/zod3-datetime.d.ts +12 -0
- package/dist/internal/zod3-datetime.d.ts.map +1 -0
- package/dist/internal/zod3-datetime.js +17 -0
- package/dist/otel-public.d.ts +2 -3
- package/dist/otel-public.d.ts.map +1 -1
- package/dist/otel-public.js +2 -2
- package/dist/otel.d.ts +3 -102
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +61 -97
- package/dist/playground/assets/cursor-icons-16-DfKNljMZ.woff2 +0 -0
- package/dist/playground/assets/index-B3_YohwW.js +62 -0
- package/dist/playground/assets/index-Cn3-adsJ.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/public-deprecated.d.ts +36 -0
- package/dist/public-deprecated.d.ts.map +1 -0
- package/dist/public-deprecated.js +39 -0
- package/dist/tools.d.ts +3 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +1 -1
- package/dist/types.d.ts +262 -97
- package/dist/types.d.ts.map +1 -1
- package/docs/changelog.md +119 -0
- package/docs/guides/hooks.md +7 -3
- package/docs/guides/mcp-oauth.md +12 -0
- package/docs/guides/opentelemetry.md +149 -184
- package/docs/guides/slack.md +41 -0
- package/docs/reference/agent-config.md +30 -1
- package/docs/reference/channels.md +5 -1
- package/docs/reference/hooks.md +10 -5
- package/docs/reference/sessions.md +46 -1
- package/docs/reference/tools.md +3 -3
- package/package.json +35 -8
- package/schemas/grokbot-answers.schema.json +11 -0
- package/skills/framework-map/SKILL.md +2 -1
- package/skills/otel/SKILL.md +28 -48
- package/templates/code-wiki/evals/wiki.eval.ts +2 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.oGqZumnJ.js +0 -1
- package/dist/docs/assets/chunks/channel.Dt4aweTm.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.DGUHZs6j.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DGUHZs6j.js +0 -1
- package/dist/docs/assets/chunks/clone.DWf3k0Z0.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C0571l4D.js +0 -1
- package/dist/docs/assets/guides_opentelemetry.md.DBQtp7_V.js +0 -45
- package/dist/docs/assets/guides_opentelemetry.md.DBQtp7_V.lean.js +0 -1
- package/dist/docs/assets/reference_sessions.md.C8FXuGwk.js +0 -1
- package/dist/docs/assets/reference_sessions.md.C8FXuGwk.lean.js +0 -1
- package/dist/playground/assets/cursor-icons-16-DmHBTm1-.woff2 +0 -0
- package/dist/playground/assets/index-BdMwybMt.css +0 -1
- package/dist/playground/assets/index-CHk6O92d.js +0 -62
- package/templates/grokbot-agents/.gitignore +0 -4
- package/templates/security-help/.gitignore +0 -4
- /package/dist/docs/assets/{guides_hooks.md.Bfj0pK91.lean.js → guides_hooks.md.B2XfGX50.lean.js} +0 -0
- /package/dist/docs/assets/{reference_channels.md.Bxaa020x.lean.js → reference_channels.md.CNNIS6K7.lean.js} +0 -0
- /package/dist/docs/assets/{reference_schedules.md.03Ryy9ca.lean.js → reference_schedules.md.BqWnJES4.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.C2GWh7g8.lean.js → reference_skills.md.Ckddg6KX.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.-6pypsWt.lean.js → reference_tools.md.Bo0UfT0a.lean.js} +0 -0
|
@@ -6,71 +6,77 @@
|
|
|
6
6
|
<title>Hooks | Bot Development Kit (BDK)</title>
|
|
7
7
|
<meta name="description" content="Observe-only subscribers to the session event stream: audit logs, metrics, transcript mirrors, derived state.">
|
|
8
8
|
<meta name="generator" content="VitePress v1.6.4">
|
|
9
|
-
<link rel="preload stylesheet" href="/docs/assets/style.
|
|
9
|
+
<link rel="preload stylesheet" href="/docs/assets/style.B9o0luvp.css" as="style">
|
|
10
10
|
<link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
|
|
11
11
|
|
|
12
|
-
<script type="module" src="/docs/assets/app.
|
|
12
|
+
<script type="module" src="/docs/assets/app.wA5xBBcd.js"></script>
|
|
13
13
|
<link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
|
|
14
14
|
<link rel="modulepreload" href="/docs/assets/chunks/framework.BNw1pucY.js">
|
|
15
|
-
<link rel="modulepreload" href="/docs/assets/chunks/theme.
|
|
15
|
+
<link rel="modulepreload" href="/docs/assets/chunks/theme.DvfKzyXq.js">
|
|
16
16
|
<link rel="modulepreload" href="/docs/assets/chunks/katex.DkKDou_j.js">
|
|
17
|
-
<link rel="modulepreload" href="/docs/assets/chunks/dagre-KV5264BT.
|
|
18
|
-
<link rel="modulepreload" href="/docs/assets/chunks/cose-bilkent-S5V4N54A.
|
|
19
|
-
<link rel="modulepreload" href="/docs/assets/chunks/c4Diagram-AHTNJAMY.
|
|
20
|
-
<link rel="modulepreload" href="/docs/assets/chunks/flowDiagram-DWJPFMVM.
|
|
21
|
-
<link rel="modulepreload" href="/docs/assets/chunks/erDiagram-SMLLAGMA.
|
|
22
|
-
<link rel="modulepreload" href="/docs/assets/chunks/gitGraphDiagram-UUTBAWPF.
|
|
23
|
-
<link rel="modulepreload" href="/docs/assets/chunks/ganttDiagram-T4ZO3ILL.
|
|
24
|
-
<link rel="modulepreload" href="/docs/assets/chunks/infoDiagram-42DDH7IO.
|
|
25
|
-
<link rel="modulepreload" href="/docs/assets/chunks/pieDiagram-DEJITSTG.
|
|
26
|
-
<link rel="modulepreload" href="/docs/assets/chunks/quadrantDiagram-34T5L4WZ.
|
|
27
|
-
<link rel="modulepreload" href="/docs/assets/chunks/xychartDiagram-5P7HB3ND.
|
|
28
|
-
<link rel="modulepreload" href="/docs/assets/chunks/requirementDiagram-MS252O5E.
|
|
29
|
-
<link rel="modulepreload" href="/docs/assets/chunks/sequenceDiagram-FGHM5R23.
|
|
30
|
-
<link rel="modulepreload" href="/docs/assets/chunks/classDiagram-6PBFFD2Q.
|
|
31
|
-
<link rel="modulepreload" href="/docs/assets/chunks/classDiagram-v2-HSJHXN6E.
|
|
32
|
-
<link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-FHFEXIEX.
|
|
33
|
-
<link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.
|
|
34
|
-
<link rel="modulepreload" href="/docs/assets/chunks/journeyDiagram-VCZTEJTY.
|
|
35
|
-
<link rel="modulepreload" href="/docs/assets/chunks/timeline-definition-GMOUNBTQ.
|
|
36
|
-
<link rel="modulepreload" href="/docs/assets/chunks/mindmap-definition-QFDTVHPH.
|
|
37
|
-
<link rel="modulepreload" href="/docs/assets/chunks/kanban-definition-6JOO6SKY.
|
|
38
|
-
<link rel="modulepreload" href="/docs/assets/chunks/sankeyDiagram-XADWPNL6.
|
|
39
|
-
<link rel="modulepreload" href="/docs/assets/chunks/diagram-TYMM5635.
|
|
40
|
-
<link rel="modulepreload" href="/docs/assets/chunks/diagram-MMDJMWI5.
|
|
41
|
-
<link rel="modulepreload" href="/docs/assets/chunks/blockDiagram-DXYQGD6D.
|
|
42
|
-
<link rel="modulepreload" href="/docs/assets/chunks/diagram-5BDNPKRD.
|
|
43
|
-
<link rel="modulepreload" href="/docs/assets/chunks/architectureDiagram-Q4EWVU46.
|
|
44
|
-
<link rel="modulepreload" href="/docs/assets/chunks/ishikawaDiagram-UXIWVN3A.
|
|
45
|
-
<link rel="modulepreload" href="/docs/assets/chunks/vennDiagram-DHZGUBPP.
|
|
46
|
-
<link rel="modulepreload" href="/docs/assets/chunks/diagram-G4DWMVQ6.
|
|
47
|
-
<link rel="modulepreload" href="/docs/assets/chunks/wardleyDiagram-NUSXRM2D.
|
|
17
|
+
<link rel="modulepreload" href="/docs/assets/chunks/dagre-KV5264BT.BBXxGEaD.js">
|
|
18
|
+
<link rel="modulepreload" href="/docs/assets/chunks/cose-bilkent-S5V4N54A.DGpAcJ55.js">
|
|
19
|
+
<link rel="modulepreload" href="/docs/assets/chunks/c4Diagram-AHTNJAMY.DfkDHeB9.js">
|
|
20
|
+
<link rel="modulepreload" href="/docs/assets/chunks/flowDiagram-DWJPFMVM.M81hXIXZ.js">
|
|
21
|
+
<link rel="modulepreload" href="/docs/assets/chunks/erDiagram-SMLLAGMA.B3bTCW_e.js">
|
|
22
|
+
<link rel="modulepreload" href="/docs/assets/chunks/gitGraphDiagram-UUTBAWPF.CLEMZgO3.js">
|
|
23
|
+
<link rel="modulepreload" href="/docs/assets/chunks/ganttDiagram-T4ZO3ILL.BKg7WY--.js">
|
|
24
|
+
<link rel="modulepreload" href="/docs/assets/chunks/infoDiagram-42DDH7IO.BTiWTi82.js">
|
|
25
|
+
<link rel="modulepreload" href="/docs/assets/chunks/pieDiagram-DEJITSTG.Cba8e8lS.js">
|
|
26
|
+
<link rel="modulepreload" href="/docs/assets/chunks/quadrantDiagram-34T5L4WZ.2YjBycHF.js">
|
|
27
|
+
<link rel="modulepreload" href="/docs/assets/chunks/xychartDiagram-5P7HB3ND.DnKSGQE1.js">
|
|
28
|
+
<link rel="modulepreload" href="/docs/assets/chunks/requirementDiagram-MS252O5E.D4P5RqVI.js">
|
|
29
|
+
<link rel="modulepreload" href="/docs/assets/chunks/sequenceDiagram-FGHM5R23.BZm7EaoT.js">
|
|
30
|
+
<link rel="modulepreload" href="/docs/assets/chunks/classDiagram-6PBFFD2Q.DqByliAC.js">
|
|
31
|
+
<link rel="modulepreload" href="/docs/assets/chunks/classDiagram-v2-HSJHXN6E.DqByliAC.js">
|
|
32
|
+
<link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-FHFEXIEX.DcR4f3X2.js">
|
|
33
|
+
<link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.Bb4oMe0P.js">
|
|
34
|
+
<link rel="modulepreload" href="/docs/assets/chunks/journeyDiagram-VCZTEJTY.0lQNZ40U.js">
|
|
35
|
+
<link rel="modulepreload" href="/docs/assets/chunks/timeline-definition-GMOUNBTQ.CgDh96vg.js">
|
|
36
|
+
<link rel="modulepreload" href="/docs/assets/chunks/mindmap-definition-QFDTVHPH.B56nGoB_.js">
|
|
37
|
+
<link rel="modulepreload" href="/docs/assets/chunks/kanban-definition-6JOO6SKY.L5sKlf7X.js">
|
|
38
|
+
<link rel="modulepreload" href="/docs/assets/chunks/sankeyDiagram-XADWPNL6.C0Hn8NUm.js">
|
|
39
|
+
<link rel="modulepreload" href="/docs/assets/chunks/diagram-TYMM5635.YIsbRH20.js">
|
|
40
|
+
<link rel="modulepreload" href="/docs/assets/chunks/diagram-MMDJMWI5.aHh4WGg9.js">
|
|
41
|
+
<link rel="modulepreload" href="/docs/assets/chunks/blockDiagram-DXYQGD6D.BrXMZRtK.js">
|
|
42
|
+
<link rel="modulepreload" href="/docs/assets/chunks/diagram-5BDNPKRD.EKqOwmK2.js">
|
|
43
|
+
<link rel="modulepreload" href="/docs/assets/chunks/architectureDiagram-Q4EWVU46.MfG0itQh.js">
|
|
44
|
+
<link rel="modulepreload" href="/docs/assets/chunks/ishikawaDiagram-UXIWVN3A.DcqY_KQL.js">
|
|
45
|
+
<link rel="modulepreload" href="/docs/assets/chunks/vennDiagram-DHZGUBPP.B4fagbC8.js">
|
|
46
|
+
<link rel="modulepreload" href="/docs/assets/chunks/diagram-G4DWMVQ6.CB8pdkoZ.js">
|
|
47
|
+
<link rel="modulepreload" href="/docs/assets/chunks/wardleyDiagram-NUSXRM2D.DBUg0bvz.js">
|
|
48
48
|
<link rel="modulepreload" href="/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js">
|
|
49
|
-
<link rel="modulepreload" href="/docs/assets/reference_hooks.md.
|
|
49
|
+
<link rel="modulepreload" href="/docs/assets/reference_hooks.md.CROr0QgC.lean.js">
|
|
50
50
|
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
|
|
51
51
|
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
|
|
52
52
|
<link rel="alternate" type="text/plain" href="/docs/llms.txt">
|
|
53
53
|
<link rel="alternate" type="text/markdown" href="/docs/reference/hooks.md">
|
|
54
54
|
</head>
|
|
55
55
|
<body>
|
|
56
|
-
<div id="app"><div class="Layout" data-v-f430d453><!--[--><!--]--><!--[--><span tabindex="-1" data-v-680db83d></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-680db83d>Skip to content</a><!--]--><!----><header class="VPNav" data-v-f430d453 data-v-ac9780a6><div class="VPNavBar" data-v-ac9780a6 data-v-dabff950><div class="wrapper" data-v-dabff950><div class="container" data-v-dabff950><div class="title" data-v-dabff950><div class="VPNavBarTitle has-sidebar" data-v-dabff950 data-v-1fdc3e33><a class="title" href="/docs/" data-v-1fdc3e33><!--[--><!--]--><!----><span data-v-1fdc3e33>Bot Development Kit (BDK)</span><!--[--><!--[--><!--[--><!--[--><span class="bdk-version" title="BDK 0.2.25 (@cursor/bdk package)" data-v-d89e5038>0.2.25</span><!--]--><!--]--><!--]--><!--]--></a></div></div><div class="content" data-v-dabff950><div class="content-body" data-v-dabff950><!--[--><!--]--><div class="VPNavBarSearch search" data-v-dabff950><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-dabff950 data-v-eea646b1><span id="main-nav-aria-label" class="visually-hidden" data-v-eea646b1> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/quickstart.html" tabindex="0" data-v-eea646b1 data-v-356b6b19><!--[--><span data-v-356b6b19>Quickstart</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/guides/mcp-oauth.html" tabindex="0" data-v-eea646b1 data-v-356b6b19><!--[--><span data-v-356b6b19>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/guides/github.html" tabindex="0" data-v-eea646b1 data-v-356b6b19><!--[--><span data-v-356b6b19>Integrations</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/templates/security-reviewer.html" tabindex="0" data-v-eea646b1 data-v-356b6b19><!--[--><span data-v-356b6b19>Templates</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/reference/project-layout.html" tabindex="0" data-v-eea646b1 data-v-356b6b19><!--[--><span data-v-356b6b19>Reference</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-dabff950 data-v-bc95e225><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-bc95e225 data-v-d980e0ed data-v-18f4a150><span class="check" data-v-18f4a150><span class="icon" data-v-18f4a150><!--[--><span class="vpi-sun sun" data-v-d980e0ed></span><span class="vpi-moon moon" data-v-d980e0ed></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-dabff950 data-v-f342cad0 data-v-c62f596b><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-c62f596b><span class="vpi-more-horizontal icon" data-v-c62f596b></span></button><div class="menu" data-v-c62f596b><div class="VPMenu" data-v-c62f596b data-v-9eccc516><!----><!--[--><!--[--><!----><div class="group" data-v-f342cad0><div class="item appearance" data-v-f342cad0><p class="label" data-v-f342cad0>Appearance</p><div class="appearance-action" data-v-f342cad0><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f342cad0 data-v-d980e0ed data-v-18f4a150><span class="check" data-v-18f4a150><span class="icon" data-v-18f4a150><!--[--><span class="vpi-sun sun" data-v-d980e0ed></span><span class="vpi-moon moon" data-v-d980e0ed></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-dabff950 data-v-06592ead><span class="container" data-v-06592ead><span class="top" data-v-06592ead></span><span class="middle" data-v-06592ead></span><span class="bottom" data-v-06592ead></span></span></button></div></div></div></div><div class="divider" data-v-dabff950><div class="divider-line" data-v-dabff950></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-f430d453 data-v-2bfb3d4b><div class="container" data-v-2bfb3d4b><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2bfb3d4b><span class="vpi-align-left menu-icon" data-v-2bfb3d4b></span><span class="menu-text" data-v-2bfb3d4b>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2bfb3d4b data-v-993d5022><button data-v-993d5022>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-f430d453 data-v-4d843d7b><div class="curtain" data-v-4d843d7b></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-4d843d7b><span class="visually-hidden" id="sidebar-aria-label" data-v-4d843d7b> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-1c552b11><section class="VPSidebarItem level-0" data-v-1c552b11 data-v-1cdea42a><div class="item" role="button" tabindex="0" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><h2 class="text" data-v-1cdea42a>Getting started</h2><!----></div><div class="items" data-v-1cdea42a><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/quickstart.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Building your first agent</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-1c552b11><section class="VPSidebarItem level-0 collapsible" data-v-1c552b11 data-v-1cdea42a><div class="item" role="button" tabindex="0" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><h2 class="text" data-v-1cdea42a>Integrations</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1cdea42a><span class="vpi-chevron-right caret-icon" data-v-1cdea42a></span></div></div><div class="items" data-v-1cdea42a><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/github.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/slack.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Slack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/webhooks.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Webhooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/convert-automation.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Cursor Automations</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/opentelemetry.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>OpenTelemetry</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/gitlab.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>GitLab</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/bitbucket.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Bitbucket</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/pagerduty.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>PagerDuty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-1c552b11><section class="VPSidebarItem level-0 collapsible" data-v-1c552b11 data-v-1cdea42a><div class="item" role="button" tabindex="0" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><h2 class="text" data-v-1cdea42a>Extensions</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1cdea42a><span class="vpi-chevron-right caret-icon" data-v-1cdea42a></span></div></div><div class="items" data-v-1cdea42a><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/extensions.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/cloud-agents.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Cloud agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/grokbot-agents.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Grok Bot agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/improve.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Self-improvement</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/jev.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Jev</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-1c552b11><section class="VPSidebarItem level-0 collapsible" data-v-1c552b11 data-v-1cdea42a><div class="item" role="button" tabindex="0" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><h2 class="text" data-v-1cdea42a>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1cdea42a><span class="vpi-chevron-right caret-icon" data-v-1cdea42a></span></div></div><div class="items" data-v-1cdea42a><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/mcp-oauth.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>MCP</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/hooks.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/agent-to-agent.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Peer agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/deployment.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/export-grokbot.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Export a Grok Bot</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/guides/migrate.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Early-alpha migration</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/evals.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Evals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/hillclimbing.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Hillclimbing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/building-with-agents.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Build with a coding agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/troubleshooting.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Troubleshooting</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-1c552b11><section class="VPSidebarItem level-0 collapsible" data-v-1c552b11 data-v-1cdea42a><div class="item" role="button" tabindex="0" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><h2 class="text" data-v-1cdea42a>Templates</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1cdea42a><span class="vpi-chevron-right caret-icon" data-v-1cdea42a></span></div></div><div class="items" data-v-1cdea42a><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/templates/grokbot-agents.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Grok Bot agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/templates/security-reviewer.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Security reviewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/templates/thermo-review.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Thermo review</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/templates/thermo-quality-review.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Thermo quality review</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/templates/agentic-owners.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Agentic Approver</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/templates/triage.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Triage agent</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-1c552b11><section class="VPSidebarItem level-0 collapsible has-active" data-v-1c552b11 data-v-1cdea42a><div class="item" role="button" tabindex="0" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><h2 class="text" data-v-1cdea42a>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-1cdea42a><span class="vpi-chevron-right caret-icon" data-v-1cdea42a></span></div></div><div class="items" data-v-1cdea42a><!--[--><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/project-layout.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Project layout</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/agent-config.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Agent config</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/instructions.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Instructions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/tools.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/prompt.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>prompt</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/skills.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Skills</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/connections.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>MCP Connections</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/subagents.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Subagents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/channels.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Channels</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/schedules.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Schedules & reminders</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/hooks.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/memory.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Memory</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/evals.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Evals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/artifacts.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Artifacts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/sessions.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Sessions & streaming</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/playground.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>Playground</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/cli.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>CLI</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-1cdea42a><div class="item" data-v-1cdea42a><div class="indicator" data-v-1cdea42a></div><a class="VPLink link link" href="/docs/reference/http-api.html" data-v-1cdea42a><!--[--><p class="text" data-v-1cdea42a>HTTP API</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-f430d453 data-v-44f169b4><div class="VPDoc has-sidebar has-aside" data-v-44f169b4 data-v-2c214b72><!--[--><!--]--><div class="container" data-v-2c214b72><div class="aside" data-v-2c214b72><div class="aside-curtain" data-v-2c214b72></div><div class="aside-container" data-v-2c214b72><div class="aside-content" data-v-2c214b72><div class="VPDocAside" data-v-2c214b72 data-v-b6955c51><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-b6955c51 data-v-46e03482><div class="content" data-v-46e03482><div class="outline-marker" data-v-46e03482></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-46e03482>On this page</div><ul class="VPDocOutlineItem root" data-v-46e03482 data-v-1b25c5bc><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-b6955c51></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-2c214b72><div class="content-container" data-v-2c214b72><!--[--><!--]--><main class="main" data-v-2c214b72><div style="position:relative;" class="vp-doc _docs_reference_hooks" data-v-2c214b72><div><h1 id="hooks" tabindex="-1">Hooks <a class="header-anchor" href="#hooks" aria-label="Permalink to "Hooks""></a></h1><p>A hook subscribes to selected session events and can run a side effect after each matching event is recorded: an audit line, a metric, a transcript copy, or derived state. Hooks run in the serving process for every session of the agent. They cannot change the turn, the prompt, or the reply; a handler that throws is logged and skipped.</p><p>Treat the event as read-only. Later subscribers see the same object. That makes hooks safe to add to a production agent, and the wrong surface for anything that must run before the model or must fail a turn; see <a href="#hook-boundaries">Hook boundaries</a>.</p><p><code>defineHook</code> is unrelated to <a href="https://cursor.com/docs/agent/hooks" target="_blank" rel="noreferrer">Cursor Agent hooks</a>, the <code>.cursor/hooks.json</code> scripts that can observe, block, or modify the agent loop. Those still run inside a local session workspace.</p><h2 id="author-a-hook" tabindex="-1">Author a hook <a class="header-anchor" href="#author-a-hook" aria-label="Permalink to "Author a hook""></a></h2><p>Author <code>bot/hooks/<name>.ts</code> with <code>defineHook</code> from <code>@cursor/bdk/hooks</code>. This one meters tokens:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/hooks/usage.ts</span></span>
|
|
56
|
+
<div id="app"><div class="Layout" data-v-738a160a><!--[--><!--]--><!--[--><span tabindex="-1" data-v-a98c2453></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-a98c2453>Skip to content</a><!--]--><!----><header class="VPNav" data-v-738a160a data-v-76ad4059><div class="VPNavBar" data-v-76ad4059 data-v-6fc2afcb><div class="wrapper" data-v-6fc2afcb><div class="container" data-v-6fc2afcb><div class="title" data-v-6fc2afcb><div class="VPNavBarTitle has-sidebar" data-v-6fc2afcb data-v-9e6caa3f><a class="title" href="/docs/" data-v-9e6caa3f><!--[--><!--]--><!----><span data-v-9e6caa3f>Bot Development Kit (BDK)</span><!--[--><!--[--><!--[--><!--[--><span class="bdk-version" title="BDK 0.2.27 (@cursor/bdk package)" data-v-d89e5038>0.2.27</span><!--]--><!--]--><!--]--><!--]--></a></div></div><div class="content" data-v-6fc2afcb><div class="content-body" data-v-6fc2afcb><!--[--><!--]--><div class="VPNavBarSearch search" data-v-6fc2afcb><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-6fc2afcb data-v-78f72f99><span id="main-nav-aria-label" class="visually-hidden" data-v-78f72f99> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/quickstart.html" tabindex="0" data-v-78f72f99 data-v-a7790978><!--[--><span data-v-a7790978>Quickstart</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/guides/mcp-oauth.html" tabindex="0" data-v-78f72f99 data-v-a7790978><!--[--><span data-v-a7790978>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/guides/github.html" tabindex="0" data-v-78f72f99 data-v-a7790978><!--[--><span data-v-a7790978>Integrations</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/templates/security-reviewer.html" tabindex="0" data-v-78f72f99 data-v-a7790978><!--[--><span data-v-a7790978>Templates</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/reference/project-layout.html" tabindex="0" data-v-78f72f99 data-v-a7790978><!--[--><span data-v-a7790978>Reference</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-6fc2afcb data-v-bf7c3d0f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-bf7c3d0f data-v-e9e166e4 data-v-74f7b0ff><span class="check" data-v-74f7b0ff><span class="icon" data-v-74f7b0ff><!--[--><span class="vpi-sun sun" data-v-e9e166e4></span><span class="vpi-moon moon" data-v-e9e166e4></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-6fc2afcb data-v-799c9281 data-v-070c9767><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-070c9767><span class="vpi-more-horizontal icon" data-v-070c9767></span></button><div class="menu" data-v-070c9767><div class="VPMenu" data-v-070c9767 data-v-c05d27ee><!----><!--[--><!--[--><!----><div class="group" data-v-799c9281><div class="item appearance" data-v-799c9281><p class="label" data-v-799c9281>Appearance</p><div class="appearance-action" data-v-799c9281><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-799c9281 data-v-e9e166e4 data-v-74f7b0ff><span class="check" data-v-74f7b0ff><span class="icon" data-v-74f7b0ff><!--[--><span class="vpi-sun sun" data-v-e9e166e4></span><span class="vpi-moon moon" data-v-e9e166e4></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-6fc2afcb data-v-2caaf84e><span class="container" data-v-2caaf84e><span class="top" data-v-2caaf84e></span><span class="middle" data-v-2caaf84e></span><span class="bottom" data-v-2caaf84e></span></span></button></div></div></div></div><div class="divider" data-v-6fc2afcb><div class="divider-line" data-v-6fc2afcb></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-738a160a data-v-e0cbfd80><div class="container" data-v-e0cbfd80><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-e0cbfd80><span class="vpi-align-left menu-icon" data-v-e0cbfd80></span><span class="menu-text" data-v-e0cbfd80>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-e0cbfd80 data-v-36e0b8e9><button data-v-36e0b8e9>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-738a160a data-v-2859715e><div class="curtain" data-v-2859715e></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-2859715e><span class="visually-hidden" id="sidebar-aria-label" data-v-2859715e> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-8ed949fd><section class="VPSidebarItem level-0" data-v-8ed949fd data-v-84325fb7><div class="item" role="button" tabindex="0" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><h2 class="text" data-v-84325fb7>Getting started</h2><!----></div><div class="items" data-v-84325fb7><!--[--><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/changelog.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Changelog</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/quickstart.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Building your first agent</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8ed949fd><section class="VPSidebarItem level-0 collapsible" data-v-8ed949fd data-v-84325fb7><div class="item" role="button" tabindex="0" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><h2 class="text" data-v-84325fb7>Integrations</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-84325fb7><span class="vpi-chevron-right caret-icon" data-v-84325fb7></span></div></div><div class="items" data-v-84325fb7><!--[--><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/github.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/slack.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Slack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/webhooks.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Webhooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/convert-automation.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Cursor Automations</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/opentelemetry.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>OpenTelemetry</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/gitlab.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>GitLab</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/bitbucket.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Bitbucket</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/pagerduty.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>PagerDuty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8ed949fd><section class="VPSidebarItem level-0 collapsible" data-v-8ed949fd data-v-84325fb7><div class="item" role="button" tabindex="0" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><h2 class="text" data-v-84325fb7>Extensions</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-84325fb7><span class="vpi-chevron-right caret-icon" data-v-84325fb7></span></div></div><div class="items" data-v-84325fb7><!--[--><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/extensions.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/cloud-agents.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Cloud agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/grokbot-agents.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Grok Bot agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/improve.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Self-improvement</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/jev.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Jev</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8ed949fd><section class="VPSidebarItem level-0 collapsible" data-v-8ed949fd data-v-84325fb7><div class="item" role="button" tabindex="0" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><h2 class="text" data-v-84325fb7>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-84325fb7><span class="vpi-chevron-right caret-icon" data-v-84325fb7></span></div></div><div class="items" data-v-84325fb7><!--[--><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/mcp-oauth.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>MCP</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/hooks.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/agent-to-agent.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Peer agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/deployment.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/export-grokbot.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Export a Grok Bot</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/guides/migrate.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Early-alpha migration</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/evals.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Evals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/hillclimbing.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Hillclimbing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/building-with-agents.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Build with a coding agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/troubleshooting.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Troubleshooting</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8ed949fd><section class="VPSidebarItem level-0 collapsible" data-v-8ed949fd data-v-84325fb7><div class="item" role="button" tabindex="0" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><h2 class="text" data-v-84325fb7>Templates</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-84325fb7><span class="vpi-chevron-right caret-icon" data-v-84325fb7></span></div></div><div class="items" data-v-84325fb7><!--[--><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/templates/grokbot-agents.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Grok Bot agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/templates/security-reviewer.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Security reviewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/templates/thermo-review.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Thermo review</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/templates/thermo-quality-review.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Thermo quality review</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/templates/agentic-owners.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Agentic Approver</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/templates/triage.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Triage agent</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-8ed949fd><section class="VPSidebarItem level-0 collapsible has-active" data-v-8ed949fd data-v-84325fb7><div class="item" role="button" tabindex="0" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><h2 class="text" data-v-84325fb7>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-84325fb7><span class="vpi-chevron-right caret-icon" data-v-84325fb7></span></div></div><div class="items" data-v-84325fb7><!--[--><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/project-layout.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Project layout</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/agent-config.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Agent config</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/instructions.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Instructions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/tools.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/prompt.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>prompt</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/skills.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Skills</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/connections.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>MCP Connections</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/subagents.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Subagents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/channels.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Channels</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/schedules.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Schedules & reminders</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/hooks.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/memory.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Memory</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/evals.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Evals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/artifacts.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Artifacts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/sessions.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Sessions & streaming</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/playground.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>Playground</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/cli.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>CLI</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-84325fb7><div class="item" data-v-84325fb7><div class="indicator" data-v-84325fb7></div><a class="VPLink link link" href="/docs/reference/http-api.html" data-v-84325fb7><!--[--><p class="text" data-v-84325fb7>HTTP API</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-738a160a data-v-9f462cdf><div class="VPDoc has-sidebar has-aside" data-v-9f462cdf data-v-995f90b4><!--[--><!--]--><div class="container" data-v-995f90b4><div class="aside" data-v-995f90b4><div class="aside-curtain" data-v-995f90b4></div><div class="aside-container" data-v-995f90b4><div class="aside-content" data-v-995f90b4><div class="VPDocAside" data-v-995f90b4 data-v-10889960><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-10889960 data-v-afb61a88><div class="content" data-v-afb61a88><div class="outline-marker" data-v-afb61a88></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-afb61a88>On this page</div><ul class="VPDocOutlineItem root" data-v-afb61a88 data-v-0587367d><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-10889960></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-995f90b4><div class="content-container" data-v-995f90b4><!--[--><!--]--><main class="main" data-v-995f90b4><div style="position:relative;" class="vp-doc _docs_reference_hooks" data-v-995f90b4><div><h1 id="hooks" tabindex="-1">Hooks <a class="header-anchor" href="#hooks" aria-label="Permalink to "Hooks""></a></h1><p>A hook subscribes to selected session events and can run a side effect after each matching event is recorded: an audit line, a metric, a transcript copy, or derived state. Hooks run in the serving process for every session of the agent. They cannot change the turn, the prompt, or the reply; a handler that throws is logged and skipped.</p><p>Treat the event as read-only. Later subscribers see the same object. That makes hooks safe to add to a production agent, and the wrong surface for anything that must run before the model or must fail a turn; see <a href="#hook-boundaries">Hook boundaries</a>.</p><p><code>defineHook</code> is unrelated to <a href="https://cursor.com/docs/agent/hooks" target="_blank" rel="noreferrer">Cursor Agent hooks</a>, the <code>.cursor/hooks.json</code> scripts that can observe, block, or modify the agent loop. Those still run inside a local session workspace.</p><h2 id="author-a-hook" tabindex="-1">Author a hook <a class="header-anchor" href="#author-a-hook" aria-label="Permalink to "Author a hook""></a></h2><p>Author <code>bot/hooks/<name>.ts</code> with <code>defineHook</code> from <code>@cursor/bdk/hooks</code>. This one meters tokens:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/hooks/usage.ts</span></span>
|
|
57
|
+
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { metrics } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "@opentelemetry/api"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|
57
58
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineHook } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "@cursor/bdk/hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|
58
59
|
<span class="line"></span>
|
|
60
|
+
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> meter</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metrics.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getMeter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"acme"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|
61
|
+
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> inputTokens</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> meter.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">createCounter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"acme.tokens.input"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|
62
|
+
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> outputTokens</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> meter.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">createCounter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"acme.tokens.output"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|
63
|
+
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> turnFailed</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> meter.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">createCounter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"acme.turn.failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
|
|
64
|
+
<span class="line"></span>
|
|
59
65
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineHook</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
|
|
60
66
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> events: {</span></span>
|
|
61
67
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> async</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "turn.completed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">event</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">ctx</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|
62
68
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (ctx.session.purpose </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "eval"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> event.data.usage </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> undefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|
63
69
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|
64
70
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
|
|
65
|
-
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#
|
|
66
|
-
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
|
|
67
|
-
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
|
|
71
|
+
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> usage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> event.data.usage;</span></span>
|
|
72
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> inputTokens.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(usage.inputTokens);</span></span>
|
|
73
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> outputTokens.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(usage.outputTokens);</span></span>
|
|
68
74
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|
69
75
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> async</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "turn.failed"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">_event</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">ctx</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
|
|
70
|
-
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
|
|
76
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> turnFailed.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, { channel: ctx.channel.id });</span></span>
|
|
71
77
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|
72
78
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|
73
|
-
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>Any module under <code>bot/hooks/</code>, subfolders included, is a hook named by its path without the extension: <code>bot/hooks/audit/usage.ts</code> is <code>audit/usage</code>. <code>*.test.ts</code> and <code>*.spec.ts</code> files are skipped. The default export must be <code>defineHook(...)</code>, names can't contain <code>__</code>, and an empty <code>events</code> map skips the hook with a warning; <code>bdk validate</code> reports all three. An extension mounts its hooks as <code><ns>__<name></code>, and <code>disableHook()</code> removes one (<a href="./extensions.html#adjust-a-mounted-extension">Adjust a mounted extension</a>).</p><p><code>bdk init</code> scaffolds <code>bot/hooks/memory.ts</code>, which exports <code>memoryHook()</code> from <code>@cursor/bdk/memory</code> and journals every turn for later sessions to read. Delete the file to opt out. See <a href="./memory.html">Memory</a>.</p><h2 id="events-and-payloads" tabindex="-1">Events and payloads <a class="header-anchor" href="#events-and-payloads" aria-label="Permalink to "Events and payloads""></a></h2><p>Keys are event types from the <a href="./sessions.html#stream-events">event vocabulary</a>, or <code>"*"</code> for every event. A typed key narrows <code>event.data</code>; a <code>"*"</code> handler receives the union, so switch on <code>event.type</code>. Every event carries the stream envelope <code>{ type, index, sessionId, turnId?, at, data }</code>, with <code>turnId</code> set on turn-scoped events. Skip <code>*.appended</code> deltas when you want the final text; <code>message.completed</code> already has it.</p><table tabindex="0"><thead><tr><th>Event</th><th><code>event.data</code></th></tr></thead><tbody><tr><td><code>message.received</code></td><td><code>{ text }</code></td></tr><tr><td><code>turn.completed</code></td><td><code>{ result?, usage?, cost? }</code>. <code>usage</code> has <code>inputTokens</code>, <code>outputTokens</code>, <code>cacheReadTokens</code>, <code>cacheWriteTokens</code>, and optional <code>reasoningTokens</code>. <code>cost</code> has <code>totalUsd</code> and the <code>model</code> it was priced against</td></tr><tr><td><code>turn.failed</code></td><td><code>{ message, status? }</code>. <code>status</code> is <code>"error"</code> or <code>"cancelled"</code> when present</td></tr><tr><td><code>actions.requested</code></td><td><code>{ calls: [{ callId, toolName, args?, parentCallId? }], parentCallId? }</code>. One envelope per model step once that step has listed its tools. A single tool is a batch of one. <code>parentCallId</code> marks subagent work</td></tr><tr><td><code>actions.completed</code></td><td><code>{ results: [{ callId, toolName, output?, isError, stubbed?, parentCallId? }], parentCallId? }</code>. Pair with <code>actions.requested</code>; emitted when every call in that batch has a result</td></tr><tr><td><code>action.result</code></td><td><code>{ callId, toolName, output?, isError, stubbed?, parentCallId? }</code>. Live per-call envelope for chips and spans. <code>stubbed</code> means a dry-run session answered a write without running it</td></tr><tr><td><code>action.tool_retry</code></td><td><code>{ callId, toolName, attempt, reason, connection? }</code>. A read is running again after a transient failure. <code>attempt</code> is the try about to run. <code>reason</code> is a class such as <code>transport</code> or <code>http_503</code></td></tr></tbody></table><p>The types are <code>SessionEvent</code>, <code>SessionEventType</code>, and <code>HookContext</code>, exported from <code>@cursor/bdk</code>.</p><h2 id="handler-context" tabindex="-1">Handler context <a class="header-anchor" href="#handler-context" aria-label="Permalink to "Handler context""></a></h2><table tabindex="0"><thead><tr><th>Member</th><th>What it is</th></tr></thead><tbody><tr><td><code>ctx.session</code></td><td>Read-only session info: <code>id</code>, <code>channelId</code>, <code>mode</code> (<code>chat</code> or <code>task</code>), <code>purpose</code> (<code>live</code> or <code>eval</code>), <code>auth</code>, plus <code>title</code> and <code>sdkAgentId</code> when set</td></tr><tr><td><code>ctx.agent</code></td><td><code>{ name }</code> of the agent the event belongs to</td></tr><tr><td><code>ctx.channel</code></td><td><code>{ id, continuationToken }</code>. The token is <code>null</code> when the session can't take follow-ups</td></tr><tr><td><code>ctx.host.kv</code></td><td>Durable JSON, shared by every session of the agent. Prefix keys with <code>ctx.session.id</code> for per-session state</td></tr><tr><td><code>ctx.host.files</code></td><td>Durable files, bound to this session. Pass <code>{ scope: "deployment" }</code> for agent-wide files</td></tr><tr><td><code>ctx.host.
|
|
79
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>Any module under <code>bot/hooks/</code>, subfolders included, is a hook named by its path without the extension: <code>bot/hooks/audit/usage.ts</code> is <code>audit/usage</code>. <code>*.test.ts</code> and <code>*.spec.ts</code> files are skipped. The default export must be <code>defineHook(...)</code>, names can't contain <code>__</code>, and an empty <code>events</code> map skips the hook with a warning; <code>bdk validate</code> reports all three. An extension mounts its hooks as <code><ns>__<name></code>, and <code>disableHook()</code> removes one (<a href="./extensions.html#adjust-a-mounted-extension">Adjust a mounted extension</a>).</p><p><code>bdk init</code> scaffolds <code>bot/hooks/memory.ts</code>, which exports <code>memoryHook()</code> from <code>@cursor/bdk/memory</code> and journals every turn for later sessions to read. Delete the file to opt out. See <a href="./memory.html">Memory</a>.</p><h2 id="events-and-payloads" tabindex="-1">Events and payloads <a class="header-anchor" href="#events-and-payloads" aria-label="Permalink to "Events and payloads""></a></h2><p>Keys are event types from the <a href="./sessions.html#stream-events">event vocabulary</a>, or <code>"*"</code> for every event. A typed key narrows <code>event.data</code>; a <code>"*"</code> handler receives the union, so switch on <code>event.type</code>. Every event carries the stream envelope <code>{ type, index, sessionId, turnId?, at, data }</code>, with <code>turnId</code> set on turn-scoped events. Skip <code>*.appended</code> deltas when you want the final text; <code>message.completed</code> already has it.</p><table tabindex="0"><thead><tr><th>Event</th><th><code>event.data</code></th></tr></thead><tbody><tr><td><code>message.received</code></td><td><code>{ text }</code></td></tr><tr><td><code>turn.completed</code></td><td><code>{ result?, usage?, cost? }</code>. <code>usage</code> has <code>inputTokens</code>, <code>outputTokens</code>, <code>cacheReadTokens</code>, <code>cacheWriteTokens</code>, and optional <code>reasoningTokens</code>. <code>cost</code> has <code>totalUsd</code> and the <code>model</code> it was priced against</td></tr><tr><td><code>turn.failed</code></td><td><code>{ message, status? }</code>. <code>status</code> is <code>"error"</code> or <code>"cancelled"</code> when present</td></tr><tr><td><code>actions.requested</code></td><td><code>{ calls: [{ callId, toolName, args?, parentCallId? }], parentCallId? }</code>. One envelope per model step once that step has listed its tools. A single tool is a batch of one. <code>parentCallId</code> marks subagent work</td></tr><tr><td><code>actions.completed</code></td><td><code>{ results: [{ callId, toolName, output?, isError, stubbed?, parentCallId? }], parentCallId? }</code>. Pair with <code>actions.requested</code>; emitted when every call in that batch has a result</td></tr><tr><td><code>action.result</code></td><td><code>{ callId, toolName, output?, isError, stubbed?, parentCallId? }</code>. Live per-call envelope for chips and spans. <code>stubbed</code> means a dry-run session answered a write without running it</td></tr><tr><td><code>action.tool_retry</code></td><td><code>{ callId, toolName, attempt, reason, connection? }</code>. A read is running again after a transient failure. <code>attempt</code> is the try about to run. <code>reason</code> is a class such as <code>transport</code> or <code>http_503</code></td></tr></tbody></table><p>The types are <code>SessionEvent</code>, <code>SessionEventType</code>, and <code>HookContext</code>, exported from <code>@cursor/bdk</code>.</p><h2 id="handler-context" tabindex="-1">Handler context <a class="header-anchor" href="#handler-context" aria-label="Permalink to "Handler context""></a></h2><table tabindex="0"><thead><tr><th>Member</th><th>What it is</th></tr></thead><tbody><tr><td><code>ctx.session</code></td><td>Read-only session info: <code>id</code>, <code>channelId</code>, <code>mode</code> (<code>chat</code> or <code>task</code>), <code>purpose</code> (<code>live</code> or <code>eval</code>), <code>auth</code>, plus <code>title</code> and <code>sdkAgentId</code> when set</td></tr><tr><td><code>ctx.agent</code></td><td><code>{ name }</code> of the agent the event belongs to</td></tr><tr><td><code>ctx.channel</code></td><td><code>{ id, continuationToken }</code>. The token is <code>null</code> when the session can't take follow-ups</td></tr><tr><td><code>ctx.host.kv</code></td><td>Durable JSON, shared by every session of the agent. Prefix keys with <code>ctx.session.id</code> for per-session state</td></tr><tr><td><code>ctx.host.files</code></td><td>Durable files, bound to this session. Pass <code>{ scope: "deployment" }</code> for agent-wide files</td></tr><tr><td><code>ctx.host.mcp</code>, <code>ctx.host.github</code>, <code>ctx.host.slack</code></td><td>The same shared clients tools get</td></tr><tr><td><code>ctx.host.reminders</code></td><td>Per-session <a href="./schedules.html#reminders">reminders</a>, the same API tools get</td></tr><tr><td><code>ctx.artifacts</code></td><td>Session-bound <a href="./artifacts.html">artifacts</a> facade: <code>tag</code> fills in <code>sessionId</code> and <code>turnId</code></td></tr><tr><td><code>ctx.stateRoot</code></td><td>Absolute path of the local state root. It resets when a hosted deployment is replaced; keep derived state in <code>kv</code> or <code>files</code></td></tr></tbody></table><h2 id="hook-dispatch" tabindex="-1">Hook dispatch <a class="header-anchor" href="#hook-dispatch" aria-label="Permalink to "Hook dispatch""></a></h2><p>A hook runs after the event is recorded. It never delays the model and never sees an event that wasn't recorded.</p><table tabindex="0"><thead><tr><th>Rule</th><th>What happens</th></tr></thead><tbody><tr><td>Same session</td><td>Events dispatch one at a time</td></tr><tr><td>Eval sessions</td><td>The same stream fires; skip metering or paging when <code>ctx.session.purpose === "eval"</code></td></tr><tr><td>Host restart</td><td>Recorded events are not replayed into hooks, so a mirror needs no dedupe</td></tr><tr><td>Slow handler</td><td>Holds the next event's handlers on that session, not the model. Keep handlers short and queue anything slow</td></tr></tbody></table><p>Read hosted secrets inside the handler, not at module scope. Give outbound calls a timeout; a stalled request holds later handlers on that session. Skip cancelled turns when paging; they record interrupted work.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bot/hooks/page-on-failure.ts</span></span>
|
|
74
80
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineHook } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "@cursor/bdk/hooks"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
|
|
75
81
|
<span class="line"></span>
|
|
76
82
|
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineHook</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
|
|
@@ -97,8 +103,8 @@
|
|
|
97
103
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> });</span></span>
|
|
98
104
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|
99
105
|
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
|
|
100
|
-
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="hooks-vs-channels-vs-evals" tabindex="-1">Hooks vs channels vs evals <a class="header-anchor" href="#hooks-vs-channels-vs-evals" aria-label="Permalink to "Hooks vs channels vs evals""></a></h2><p>All three consume the same stream, for different jobs:</p><table tabindex="0"><thead><tr><th></th><th>Hooks</th><th>Channel <code>events</code></th><th>Evals</th></tr></thead><tbody><tr><td>Scope</td><td>every session of the agent</td><td>sessions the channel owns</td><td>one test turn</td></tr><tr><td>Job</td><td>observe: audit, metrics, mirrors, derived state</td><td>deliver: replies back to the channel's surface</td><td>assert: gates over the trajectory</td></tr><tr><td>Context</td><td><code>ctx.host</code>, <code>ctx.artifacts</code>, session info</td><td><code>channel.state</code>, <code>setContinuationToken</code>, <code>ctx.host</code>, session info</td><td>the <code>t</code> assertion helpers</td></tr><tr><td>Can affect the run</td><td>no</td><td>yes, it owns the surface</td><td>n/a</td></tr><tr><td>Authored at</td><td><code>bot/hooks/*.ts</code></td><td>channel config</td><td><code>evals/**/*.eval.ts</code></td></tr></tbody></table><h2 id="hook-boundaries" tabindex="-1">Hook boundaries <a class="header-anchor" href="#hook-boundaries" aria-label="Permalink to "Hook boundaries""></a></h2><table tabindex="0"><thead><tr><th>You want to</th><th>Use instead</th></tr></thead><tbody><tr><td>Add context before the model runs</td><td>The channel's <code>send</code> message and <code>workspaceFiles</code>, <code>instructions.md</code>, skills, or <code>sandbox/workspace/</code> seed files</td></tr><tr><td>Reply on Slack, comment on a PR, or post any other delivery</td><td>The channel's <code>events</code> map, or the Slack and GitHub packs</td></tr><tr><td>Show PR progress (merge-box check, sticky banner)</td><td><code>githubChannel({ progress: { commitStatus, banner } })</code>; see <a href="./../guides/github.html">GitHub agents</a></td></tr><tr><td>Gate a change on behavior</td><td><a href="./../evals.html">Evals</a></td></tr></tbody></table><p>To act on a turn's decision, such as a label or a ticket, have the model record it with an authored <a href="./tools.html">tool</a>. A <code>turn.completed</code> hook then reads the recorded decision and acts on it through <code>ctx.host</code>.</p><h2 id="test-a-hook" tabindex="-1">Test a hook <a class="header-anchor" href="#test-a-hook" aria-label="Permalink to "Test a hook""></a></h2><p>A hook definition is a plain object, so a unit test calls <code>hook.events["turn.completed"]</code> directly with an event and a stub <code>HookContext</code>. Discovery skips <code>*.test.ts</code>, so the test can live next to the hook.</p><table tabindex="0"><thead><tr><th>Command</th><th>What it reports</th></tr></thead><tbody><tr><td><code>bdk validate --dir .</code></td><td>Discovery errors and the empty-handlers warning</td></tr><tr><td><code>bdk info --dir . --json</code></td><td>Loaded hooks under <code>agents[].hooks</code></td></tr><tr><td><code>bdk run --dir . --message "…"</code></td><td>Serve log on stderr, including <code>hook "<name>" handler for <event> threw: …</code></td></tr></tbody></table><p>On hosting, read the same log with <a href="./cli.html#logs"><code>bdk logs</code></a>.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to "Related""></a></h2><ul><li><a href="./../guides/hooks.html">Hooks guide</a>: meter usage and page on failure</li><li><a href="./sessions.html">Sessions and streaming</a>: the event vocabulary hooks observe</li><li><a href="./../guides/opentelemetry.html">OpenTelemetry</a>: OTLP traces and metrics from the same event stream</li><li><a href="./../deployment.html#observability">Deployment</a>: runtime logs and export paths</li><li><a href="./channels.html#events">Channels</a>: the delivery-side counterpart</li></ul></div></div></main><footer class="VPDocFooter" data-v-
|
|
101
|
-
<script>window.__VP_HASH_MAP__=JSON.parse("{\"building-with-agents.md\":\"FZXrY8Nk\",\"deployment.md\":\"3MMWuPeV\",\"evals.md\":\"CHR34K1Y\",\"guides_agent-to-agent.md\":\"CwL5cwuE\",\"guides_bitbucket.md\":\"CKUayYtD\",\"guides_cloud-agents.md\":\"BzbzcOyj\",\"guides_convert-automation.md\":\"DMEX9nF-\",\"guides_export-grokbot.md\":\"qo5bxi4h\",\"guides_github.md\":\"TuNiZAOQ\",\"guides_gitlab.md\":\"CtNI4fSH\",\"guides_grokbot-agents.md\":\"BwAykJ7U\",\"guides_hooks.md\":\"
|
|
106
|
+
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><h2 id="hooks-vs-channels-vs-evals" tabindex="-1">Hooks vs channels vs evals <a class="header-anchor" href="#hooks-vs-channels-vs-evals" aria-label="Permalink to "Hooks vs channels vs evals""></a></h2><p>All three consume the same stream, for different jobs:</p><table tabindex="0"><thead><tr><th></th><th>Hooks</th><th>Channel <code>events</code></th><th>Evals</th></tr></thead><tbody><tr><td>Scope</td><td>every session of the agent</td><td>sessions the channel owns</td><td>one test turn</td></tr><tr><td>Job</td><td>observe: audit, metrics, mirrors, derived state</td><td>deliver: replies back to the channel's surface</td><td>assert: gates over the trajectory</td></tr><tr><td>Context</td><td><code>ctx.host</code>, <code>ctx.artifacts</code>, session info</td><td><code>channel.state</code>, <code>setContinuationToken</code>, <code>ctx.host</code>, session info</td><td>the <code>t</code> assertion helpers</td></tr><tr><td>Can affect the run</td><td>no</td><td>yes, it owns the surface</td><td>n/a</td></tr><tr><td>Authored at</td><td><code>bot/hooks/*.ts</code></td><td>channel config</td><td><code>evals/**/*.eval.ts</code></td></tr></tbody></table><h2 id="hook-boundaries" tabindex="-1">Hook boundaries <a class="header-anchor" href="#hook-boundaries" aria-label="Permalink to "Hook boundaries""></a></h2><table tabindex="0"><thead><tr><th>You want to</th><th>Use instead</th></tr></thead><tbody><tr><td>Add context before the model runs</td><td>The channel's <code>send</code> message and <code>workspaceFiles</code>, <code>instructions.md</code>, skills, or <code>sandbox/workspace/</code> seed files</td></tr><tr><td>Reply on Slack, comment on a PR, or post any other delivery</td><td>The channel's <code>events</code> map, or the Slack and GitHub packs</td></tr><tr><td>Show PR progress (merge-box check, sticky banner)</td><td><code>githubChannel({ progress: { commitStatus, banner } })</code>; see <a href="./../guides/github.html">GitHub agents</a></td></tr><tr><td>Gate a change on behavior</td><td><a href="./../evals.html">Evals</a></td></tr></tbody></table><p>To act on a turn's decision, such as a label or a ticket, have the model record it with an authored <a href="./tools.html">tool</a>. A <code>turn.completed</code> hook then reads the recorded decision and acts on it through <code>ctx.host</code>.</p><h2 id="test-a-hook" tabindex="-1">Test a hook <a class="header-anchor" href="#test-a-hook" aria-label="Permalink to "Test a hook""></a></h2><p>A hook definition is a plain object, so a unit test calls <code>hook.events["turn.completed"]</code> directly with an event and a stub <code>HookContext</code>. Discovery skips <code>*.test.ts</code>, so the test can live next to the hook.</p><table tabindex="0"><thead><tr><th>Command</th><th>What it reports</th></tr></thead><tbody><tr><td><code>bdk validate --dir .</code></td><td>Discovery errors and the empty-handlers warning</td></tr><tr><td><code>bdk info --dir . --json</code></td><td>Loaded hooks under <code>agents[].hooks</code></td></tr><tr><td><code>bdk run --dir . --message "…"</code></td><td>Serve log on stderr, including <code>hook "<name>" handler for <event> threw: …</code></td></tr></tbody></table><p>On hosting, read the same log with <a href="./cli.html#logs"><code>bdk logs</code></a>.</p><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to "Related""></a></h2><ul><li><a href="./../guides/hooks.html">Hooks guide</a>: meter usage and page on failure</li><li><a href="./sessions.html">Sessions and streaming</a>: the event vocabulary hooks observe</li><li><a href="./../guides/opentelemetry.html">OpenTelemetry</a>: OTLP traces and metrics from the same event stream</li><li><a href="./../deployment.html#observability">Deployment</a>: runtime logs and export paths</li><li><a href="./channels.html#events">Channels</a>: the delivery-side counterpart</li></ul></div></div></main><footer class="VPDocFooter" data-v-995f90b4 data-v-8edf72db><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-8edf72db><span class="visually-hidden" id="doc-footer-aria-label" data-v-8edf72db>Pager</span><div class="pager" data-v-8edf72db><a class="VPLink link pager-link prev" href="/docs/reference/schedules.html" data-v-8edf72db><!--[--><span class="desc" data-v-8edf72db>Previous page</span><span class="title" data-v-8edf72db>Schedules & reminders</span><!--]--></a></div><div class="pager" data-v-8edf72db><a class="VPLink link pager-link next" href="/docs/reference/memory.html" data-v-8edf72db><!--[--><span class="desc" data-v-8edf72db>Next page</span><span class="title" data-v-8edf72db>Memory</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
|
|
107
|
+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"building-with-agents.md\":\"FZXrY8Nk\",\"changelog.md\":\"BvHRIiMH\",\"deployment.md\":\"3MMWuPeV\",\"evals.md\":\"CHR34K1Y\",\"guides_agent-to-agent.md\":\"CwL5cwuE\",\"guides_bitbucket.md\":\"CKUayYtD\",\"guides_cloud-agents.md\":\"BzbzcOyj\",\"guides_convert-automation.md\":\"DMEX9nF-\",\"guides_export-grokbot.md\":\"qo5bxi4h\",\"guides_github.md\":\"TuNiZAOQ\",\"guides_gitlab.md\":\"CtNI4fSH\",\"guides_grokbot-agents.md\":\"BwAykJ7U\",\"guides_hooks.md\":\"B2XfGX50\",\"guides_improve.md\":\"CZKVt1cT\",\"guides_jev.md\":\"D7XH4JH3\",\"guides_mcp-oauth.md\":\"Cxq2TxBB\",\"guides_migrate.md\":\"CQlGaBKX\",\"guides_opentelemetry.md\":\"D4wO7_8v\",\"guides_pagerduty.md\":\"BHXMcMtx\",\"guides_slack.md\":\"ClIyi7FI\",\"guides_webhooks.md\":\"Cpdc3BDX\",\"hillclimbing.md\":\"Dxvd-0gT\",\"index.md\":\"CAnsLl8D\",\"quickstart.md\":\"D8JDfkKO\",\"reference_agent-config.md\":\"CZrbHOfT\",\"reference_artifacts.md\":\"DLV9MZES\",\"reference_channels.md\":\"CNNIS6K7\",\"reference_cli.md\":\"1o_TqKdt\",\"reference_connections.md\":\"BJE2Zllp\",\"reference_evals.md\":\"Ccwp4x3o\",\"reference_extensions.md\":\"DKxTuCIw\",\"reference_hooks.md\":\"CROr0QgC\",\"reference_http-api.md\":\"Dji-DD_Z\",\"reference_instructions.md\":\"BYMVxAkw\",\"reference_memory.md\":\"BwyJXYZe\",\"reference_playground.md\":\"q4MI-0td\",\"reference_project-layout.md\":\"mFcS8yDD\",\"reference_prompt.md\":\"DqPh71XN\",\"reference_schedules.md\":\"BqWnJES4\",\"reference_sessions.md\":\"Bi6lHttM\",\"reference_skills.md\":\"Ckddg6KX\",\"reference_subagents.md\":\"ChNGh6HK\",\"reference_tools.md\":\"Bo0UfT0a\",\"templates_agentic-owners.md\":\"CTEnR0jp\",\"templates_grokbot-agents.md\":\"DgpPEs7B\",\"templates_security-reviewer.md\":\"Gh6EF9Us\",\"templates_thermo-quality-review.md\":\"B77UyTrX\",\"templates_thermo-review.md\":\"DRJ7mC5U\",\"templates_triage.md\":\"CNN6b0JZ\",\"troubleshooting.md\":\"DFnoTDlQ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Bot Development Kit (BDK)\",\"description\":\"Build and serve bots and agents from versioned Markdown and TypeScript.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"sdkVersion\":\"0.2.27\",\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/mcp-oauth\"},{\"text\":\"Integrations\",\"link\":\"/guides/github\"},{\"text\":\"Templates\",\"link\":\"/templates/security-reviewer\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Changelog\",\"link\":\"/changelog\"},{\"text\":\"Building your first agent\",\"link\":\"/quickstart\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Webhooks\",\"link\":\"/guides/webhooks\"},{\"text\":\"Cursor Automations\",\"link\":\"/guides/convert-automation\"},{\"text\":\"OpenTelemetry\",\"link\":\"/guides/opentelemetry\"},{\"text\":\"GitLab\",\"link\":\"/guides/gitlab\"},{\"text\":\"Bitbucket\",\"link\":\"/guides/bitbucket\"},{\"text\":\"PagerDuty\",\"link\":\"/guides/pagerduty\"}]},{\"text\":\"Extensions\",\"collapsed\":false,\"items\":[{\"text\":\"Overview\",\"link\":\"/reference/extensions\"},{\"text\":\"Cloud agents\",\"link\":\"/guides/cloud-agents\"},{\"text\":\"Grok Bot agents\",\"link\":\"/guides/grokbot-agents\"},{\"text\":\"Self-improvement\",\"link\":\"/guides/improve\"},{\"text\":\"Jev\",\"link\":\"/guides/jev\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"MCP\",\"link\":\"/guides/mcp-oauth\"},{\"text\":\"Hooks\",\"link\":\"/guides/hooks\"},{\"text\":\"Peer agents\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Export a Grok Bot\",\"link\":\"/guides/export-grokbot\"},{\"text\":\"Early-alpha migration\",\"link\":\"/guides/migrate\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"},{\"text\":\"Build with a coding agent\",\"link\":\"/building-with-agents\"},{\"text\":\"Troubleshooting\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Templates\",\"collapsed\":false,\"items\":[{\"text\":\"Grok Bot agents\",\"link\":\"/templates/grokbot-agents\"},{\"text\":\"Security reviewer\",\"link\":\"/templates/security-reviewer\"},{\"text\":\"Thermo review\",\"link\":\"/templates/thermo-review\"},{\"text\":\"Thermo quality review\",\"link\":\"/templates/thermo-quality-review\"},{\"text\":\"Agentic Approver\",\"link\":\"/templates/agentic-owners\"},{\"text\":\"Triage agent\",\"link\":\"/templates/triage\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"prompt\",\"link\":\"/reference/prompt\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Memory\",\"link\":\"/reference/memory\"},{\"text\":\"Evals\",\"link\":\"/reference/evals\"},{\"text\":\"Artifacts\",\"link\":\"/reference/artifacts\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
|
|
102
108
|
|
|
103
109
|
</body>
|
|
104
110
|
</html>
|
|
@@ -23,20 +23,26 @@ Author `bot/hooks/<name>.ts` with `defineHook` from
|
|
|
23
23
|
|
|
24
24
|
```ts
|
|
25
25
|
// bot/hooks/usage.ts
|
|
26
|
+
import { metrics } from "@opentelemetry/api";
|
|
26
27
|
import { defineHook } from "@cursor/bdk/hooks";
|
|
27
28
|
|
|
29
|
+
const meter = metrics.getMeter("acme");
|
|
30
|
+
const inputTokens = meter.createCounter("acme.tokens.input");
|
|
31
|
+
const outputTokens = meter.createCounter("acme.tokens.output");
|
|
32
|
+
const turnFailed = meter.createCounter("acme.turn.failed");
|
|
33
|
+
|
|
28
34
|
export default defineHook({
|
|
29
35
|
events: {
|
|
30
36
|
async "turn.completed"(event, ctx) {
|
|
31
37
|
if (ctx.session.purpose === "eval" || event.data.usage === undefined) {
|
|
32
38
|
return;
|
|
33
39
|
}
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
const usage = event.data.usage;
|
|
41
|
+
inputTokens.add(usage.inputTokens);
|
|
42
|
+
outputTokens.add(usage.outputTokens);
|
|
37
43
|
},
|
|
38
44
|
async "turn.failed"(_event, ctx) {
|
|
39
|
-
|
|
45
|
+
turnFailed.add(1, { channel: ctx.channel.id });
|
|
40
46
|
},
|
|
41
47
|
},
|
|
42
48
|
});
|
|
@@ -88,7 +94,6 @@ exported from `@cursor/bdk`.
|
|
|
88
94
|
| `ctx.channel` | `{ id, continuationToken }`. The token is `null` when the session can't take follow-ups |
|
|
89
95
|
| `ctx.host.kv` | Durable JSON, shared by every session of the agent. Prefix keys with `ctx.session.id` for per-session state |
|
|
90
96
|
| `ctx.host.files` | Durable files, bound to this session. Pass `{ scope: "deployment" }` for agent-wide files |
|
|
91
|
-
| `ctx.host.otel` | Counters, histograms, and tags, attributed to this session |
|
|
92
97
|
| `ctx.host.mcp`, `ctx.host.github`, `ctx.host.slack` | The same shared clients tools get |
|
|
93
98
|
| `ctx.host.reminders` | Per-session [reminders](/docs/reference/schedules.md#reminders), the same API tools get |
|
|
94
99
|
| `ctx.artifacts` | Session-bound [artifacts](/docs/reference/artifacts.md) facade: `tag` fills in `sessionId` and `turnId` |
|