@cursor/july 0.1.108 → 0.1.111
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 -7
- package/README.md +3 -21
- package/dist/bin/agent-serve.js +81 -66
- package/dist/channels/bitbucket/api.d.ts +41 -0
- package/dist/channels/bitbucket/api.d.ts.map +1 -1
- package/dist/channels/bitbucket/api.js +266 -6
- package/dist/channels/bitbucket/binding.d.ts +4 -0
- package/dist/channels/bitbucket/binding.d.ts.map +1 -1
- package/dist/channels/bitbucket/binding.js +20 -4
- package/dist/channels/bitbucket/bitbucket-channel.js +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +1 -1
- package/dist/channels/bitbucket/checks.d.ts.map +1 -1
- package/dist/channels/bitbucket/checks.js +1 -1
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/events.js +1 -1
- package/dist/channels/bitbucket/index.d.ts +1 -1
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +1 -1
- package/dist/channels/change-monitors/change-monitors-channel.js +1 -1
- package/dist/channels/checks.d.ts.map +1 -1
- package/dist/channels/checks.js +2 -2
- package/dist/channels/deployments/deployments-channel.js +1 -1
- package/dist/channels/github/cursor-account.js +3 -3
- package/dist/channels/github/defaults.d.ts.map +1 -1
- package/dist/channels/github/defaults.js +5 -3
- package/dist/channels/github/events.js +1 -1
- package/dist/channels/github/forward.js +8 -8
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +17 -13
- package/dist/channels/github/progress.d.ts.map +1 -1
- package/dist/channels/github/progress.js +7 -2
- package/dist/channels/github/state.d.ts +6 -0
- package/dist/channels/github/state.d.ts.map +1 -1
- package/dist/channels/github/types.d.ts +6 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.d.ts +27 -0
- package/dist/channels/gitlab/api.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +88 -0
- package/dist/channels/gitlab/binding.d.ts +5 -0
- package/dist/channels/gitlab/binding.d.ts.map +1 -1
- package/dist/channels/gitlab/binding.js +14 -4
- package/dist/channels/gitlab/checks.d.ts.map +1 -1
- package/dist/channels/gitlab/checks.js +1 -1
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/events.js +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +1 -1
- package/dist/channels/gitlab/index.d.ts +1 -1
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +1 -1
- package/dist/channels/gitlab/replay.js +2 -2
- package/dist/channels/origin/binding.d.ts +2 -0
- package/dist/channels/origin/binding.d.ts.map +1 -1
- package/dist/channels/origin/binding.js +3 -3
- package/dist/channels/origin/checks.d.ts +19 -7
- package/dist/channels/origin/checks.d.ts.map +1 -1
- package/dist/channels/origin/checks.js +13 -9
- package/dist/channels/origin/cursor-account.js +1 -1
- package/dist/channels/origin/defaults.d.ts.map +1 -1
- package/dist/channels/origin/defaults.js +3 -1
- package/dist/channels/origin/events.js +1 -1
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +2 -1
- package/dist/channels/origin/origin-webhook.js +2 -2
- package/dist/channels/slack/agentic-delivery.d.ts +23 -0
- package/dist/channels/slack/agentic-delivery.d.ts.map +1 -0
- package/dist/channels/slack/agentic-delivery.js +558 -0
- package/dist/channels/slack/agentic-posted.d.ts +30 -0
- package/dist/channels/slack/agentic-posted.d.ts.map +1 -0
- package/dist/channels/slack/agentic-posted.js +102 -0
- package/dist/channels/slack/agentic-signals.d.ts +48 -0
- package/dist/channels/slack/agentic-signals.d.ts.map +1 -0
- package/dist/channels/slack/agentic-signals.js +204 -0
- package/dist/channels/slack/api.d.ts +20 -1
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +43 -11
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/auth.d.ts.map +1 -1
- package/dist/channels/slack/auth.js +3 -1
- package/dist/channels/slack/blocks.js +3 -3
- package/dist/channels/slack/bot-mentions.d.ts.map +1 -1
- package/dist/channels/slack/bot-mentions.js +5 -5
- package/dist/channels/slack/channel-watch.js +1 -1
- package/dist/channels/slack/cli-project.js +3 -3
- package/dist/channels/slack/defaults.d.ts +3 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +90 -29
- package/dist/channels/slack/dispatch.d.ts +44 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +233 -103
- package/dist/channels/slack/doctor.js +1 -1
- package/dist/channels/slack/eval-directive.js +1 -1
- package/dist/channels/slack/external-policy.d.ts +2 -1
- package/dist/channels/slack/external-policy.d.ts.map +1 -1
- package/dist/channels/slack/external-policy.js +13 -2
- package/dist/channels/slack/footer.d.ts +30 -0
- package/dist/channels/slack/footer.d.ts.map +1 -0
- package/dist/channels/slack/footer.js +88 -0
- package/dist/channels/slack/index.d.ts +2 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +2 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +5 -3
- package/dist/channels/slack/live-delivery.d.ts +1 -1
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +20 -6
- package/dist/channels/slack/log.d.ts.map +1 -1
- package/dist/channels/slack/log.js +1 -1
- package/dist/channels/slack/manifest.js +1 -1
- package/dist/channels/slack/nudge-carrier.js +1 -1
- package/dist/channels/slack/nudge-store.js +2 -2
- package/dist/channels/slack/paint-start.d.ts +22 -0
- package/dist/channels/slack/paint-start.d.ts.map +1 -0
- package/dist/channels/slack/paint-start.js +91 -0
- package/dist/channels/slack/placeholder.d.ts +36 -0
- package/dist/channels/slack/placeholder.d.ts.map +1 -0
- package/dist/channels/slack/placeholder.js +240 -0
- package/dist/channels/slack/progress-delivery.d.ts.map +1 -1
- package/dist/channels/slack/progress-delivery.js +13 -4
- package/dist/channels/slack/reasoning-chip.d.ts +8 -0
- package/dist/channels/slack/reasoning-chip.d.ts.map +1 -0
- package/dist/channels/slack/reasoning-chip.js +30 -0
- package/dist/channels/slack/recording-sink.d.ts +29 -0
- package/dist/channels/slack/recording-sink.d.ts.map +1 -0
- package/dist/channels/slack/recording-sink.js +142 -0
- package/dist/channels/slack/reply-options.d.ts +8 -1
- package/dist/channels/slack/reply-options.d.ts.map +1 -1
- package/dist/channels/slack/reply-options.js +59 -14
- package/dist/channels/slack/setup.js +1 -1
- package/dist/channels/slack/slack-channel.d.ts +12 -5
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +110 -24
- package/dist/channels/slack/socket-mode.js +2 -2
- package/dist/channels/slack/thread-context.js +5 -5
- package/dist/channels/slack/tool-approval-events.d.ts +5 -0
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
- package/dist/channels/slack/tool-approval-events.js +50 -38
- package/dist/channels/slack/tool-cards.js +1 -1
- package/dist/channels/slack/tool-chip.d.ts +9 -0
- package/dist/channels/slack/tool-chip.d.ts.map +1 -0
- package/dist/channels/slack/tool-chip.js +25 -0
- package/dist/channels/slack/types.d.ts +49 -7
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.d.ts +13 -0
- package/dist/channels/slack/upload.d.ts.map +1 -0
- package/dist/channels/slack/upload.js +135 -0
- package/dist/channels.d.ts +10 -14
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +9 -21
- package/dist/dashboard-session-url.d.ts +15 -0
- package/dist/dashboard-session-url.d.ts.map +1 -0
- package/dist/dashboard-session-url.js +25 -0
- package/dist/docs/404.html +3 -3
- package/dist/docs/architecture.svg +59 -0
- package/dist/docs/assets/app.Drol6mi6.js +309 -0
- package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.js → building-with-agents.md.CEGVXkmO.js} +2 -2
- package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.lean.js → building-with-agents.md.CEGVXkmO.lean.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtXk1hy-.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BOKxlYGP.js → VPLocalSearchBox.CdqoBZJX.js} +2 -2
- package/dist/docs/assets/chunks/arc.BVX3ycTn.js +1 -0
- package/dist/docs/assets/chunks/architectureDiagram-Q4EWVU46.CcChnMxX.js +36 -0
- package/dist/docs/assets/chunks/baseUniq.xwtXO-yt.js +1 -0
- package/dist/docs/assets/chunks/blockDiagram-DXYQGD6D.CijZ_taK.js +132 -0
- package/dist/docs/assets/chunks/c4Diagram-AHTNJAMY.0FBvwBvK.js +10 -0
- package/dist/docs/assets/chunks/channel.Bkv1N-gK.js +1 -0
- package/dist/docs/assets/chunks/chunk-4BX2VUAB.CELMmMDA.js +1 -0
- package/dist/docs/assets/chunks/chunk-4TB4RGXK.C4bhFtSm.js +206 -0
- package/dist/docs/assets/chunks/chunk-55IACEB6.ZnQ9gRRQ.js +1 -0
- package/dist/docs/assets/chunks/chunk-EDXVE4YY.DPlmglG-.js +1 -0
- package/dist/docs/assets/chunks/chunk-FMBD7UC4.BrUk8pff.js +15 -0
- package/dist/docs/assets/chunks/chunk-OYMX7WX6.CcmWIncu.js +231 -0
- package/dist/docs/assets/chunks/chunk-QZHKN3VN.D65-cs8I.js +1 -0
- package/dist/docs/assets/chunks/chunk-YZCP3GAM.qoXZpG9F.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CZDco1o8.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CZDco1o8.js +1 -0
- package/dist/docs/assets/chunks/clone.YSt_40_s.js +1 -0
- package/dist/docs/assets/chunks/cose-bilkent-S5V4N54A.8rYtqudO.js +1 -0
- package/dist/docs/assets/chunks/cytoscape.esm.BQk4lpUV.js +331 -0
- package/dist/docs/assets/chunks/dagre-KV5264BT.DrRP1fOh.js +4 -0
- package/dist/docs/assets/chunks/defaultLocale.C4B-KCzX.js +1 -0
- package/dist/docs/assets/chunks/diagram-5BDNPKRD.DHj_xA2_.js +10 -0
- package/dist/docs/assets/chunks/diagram-G4DWMVQ6.Bz_6nAKj.js +24 -0
- package/dist/docs/assets/chunks/diagram-MMDJMWI5.BWA0xSW9.js +43 -0
- package/dist/docs/assets/chunks/diagram-TYMM5635.CpTJLNJI.js +24 -0
- package/dist/docs/assets/chunks/erDiagram-SMLLAGMA.-7AWWSrP.js +85 -0
- package/dist/docs/assets/chunks/flowDiagram-DWJPFMVM.BTnQ742_.js +162 -0
- package/dist/docs/assets/chunks/framework.dypDpWZ3.js +19 -0
- package/dist/docs/assets/chunks/ganttDiagram-T4ZO3ILL.B5_HiiQ5.js +292 -0
- package/dist/docs/assets/chunks/gitGraphDiagram-UUTBAWPF.CZcNTFZd.js +106 -0
- package/dist/docs/assets/chunks/graph.V2GLaab4.js +1 -0
- package/dist/docs/assets/chunks/infoDiagram-42DDH7IO.7pZOkCCU.js +2 -0
- package/dist/docs/assets/chunks/init.Gi6I4Gst.js +1 -0
- package/dist/docs/assets/chunks/ishikawaDiagram-UXIWVN3A.DSMo3Qa3.js +70 -0
- package/dist/docs/assets/chunks/journeyDiagram-VCZTEJTY.BNEgWN1S.js +139 -0
- package/dist/docs/assets/chunks/kanban-definition-6JOO6SKY.B-4d4tC7.js +89 -0
- package/dist/docs/assets/chunks/katex.DkKDou_j.js +257 -0
- package/dist/docs/assets/chunks/layout.Dvbn9nSb.js +1 -0
- package/dist/docs/assets/chunks/linear.D2GM4p4b.js +1 -0
- package/dist/docs/assets/chunks/min.DVBtLK-B.js +1 -0
- package/dist/docs/assets/chunks/mindmap-definition-QFDTVHPH.CnJRI55x.js +96 -0
- package/dist/docs/assets/chunks/ordinal.DBvzRdQf.js +1 -0
- package/dist/docs/assets/chunks/pieDiagram-DEJITSTG.CtoaTFlA.js +30 -0
- package/dist/docs/assets/chunks/quadrantDiagram-34T5L4WZ.DtT24_vN.js +7 -0
- package/dist/docs/assets/chunks/requirementDiagram-MS252O5E.CjSO4o8f.js +84 -0
- package/dist/docs/assets/chunks/sankeyDiagram-XADWPNL6.-wWiIVWa.js +10 -0
- package/dist/docs/assets/chunks/sequenceDiagram-FGHM5R23.DSk8s4gX.js +157 -0
- package/dist/docs/assets/chunks/stateDiagram-FHFEXIEX.BFKAsdkN.js +1 -0
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.C4CLm481.js +1 -0
- package/dist/docs/assets/chunks/{theme.DbDZW-zb.js → theme.C0MctGaz.js} +2 -2
- package/dist/docs/assets/chunks/timeline-definition-GMOUNBTQ.TUNJbAFe.js +120 -0
- package/dist/docs/assets/chunks/vennDiagram-DHZGUBPP.C-RGNnk4.js +34 -0
- package/dist/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js +1 -0
- package/dist/docs/assets/chunks/wardley-RL74JXVD.g5efOWmT.js +162 -0
- package/dist/docs/assets/chunks/wardleyDiagram-NUSXRM2D.DH4zt73Y.js +20 -0
- package/dist/docs/assets/chunks/xychartDiagram-5P7HB3ND.B-3k6bF6.js +7 -0
- package/dist/docs/assets/{deployment.md.JenwuCCB.js → deployment.md.Dm4Qo3hp.js} +5 -5
- package/dist/docs/assets/{deployment.md.JenwuCCB.lean.js → deployment.md.Dm4Qo3hp.lean.js} +1 -1
- package/dist/docs/assets/evals.md.BLDRt5LH.js +211 -0
- package/dist/docs/assets/evals.md.BLDRt5LH.lean.js +1 -0
- package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.js +14 -0
- package/dist/docs/assets/guides_agent-to-agent.md.BI0xclmy.lean.js +1 -0
- package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.js +10 -0
- package/dist/docs/assets/guides_bitbucket.md.CTpCl__f.lean.js +1 -0
- package/dist/docs/assets/{guides_cloud-agents.md.BsloyHdY.js → guides_cloud-agents.md.lSE_l7lH.js} +2 -2
- package/dist/docs/assets/{guides_cloud-agents.md.BsloyHdY.lean.js → guides_cloud-agents.md.lSE_l7lH.lean.js} +1 -1
- package/dist/docs/assets/{guides_convert-automation.md.B4sjlodG.js → guides_convert-automation.md.Ck6Cr68A.js} +1 -1
- package/dist/docs/assets/{guides_convert-automation.md.B4sjlodG.lean.js → guides_convert-automation.md.Ck6Cr68A.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.BH33UEBJ.js → guides_github.md.D6ER29dG.js} +13 -3
- package/dist/docs/assets/{guides_github.md.BH33UEBJ.lean.js → guides_github.md.D6ER29dG.lean.js} +1 -1
- package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.js +14 -0
- package/dist/docs/assets/guides_gitlab.md.P-TjBnS5.lean.js +1 -0
- package/dist/docs/assets/guides_grokbot-agents.md.WBZIOvkz.js +9 -0
- package/dist/docs/assets/{guides_grokbot-agents.md.DyV-WArv.lean.js → guides_grokbot-agents.md.WBZIOvkz.lean.js} +1 -1
- package/dist/docs/assets/{guides_improve.md.BGVk32bK.js → guides_improve.md.BKaDuKKK.js} +1 -1
- package/dist/docs/assets/{guides_improve.md.BGVk32bK.lean.js → guides_improve.md.BKaDuKKK.lean.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.Dp6cDP7f.js → guides_mcp-oauth.md.DMNMpXtO.js} +1 -1
- package/dist/docs/assets/{guides_mcp-oauth.md.Dp6cDP7f.lean.js → guides_mcp-oauth.md.DMNMpXtO.lean.js} +1 -1
- package/dist/docs/assets/{guides_opentelemetry.md.SCRMskno.js → guides_opentelemetry.md._CRfDyzH.js} +14 -14
- package/dist/docs/assets/{guides_opentelemetry.md.SCRMskno.lean.js → guides_opentelemetry.md._CRfDyzH.lean.js} +1 -1
- package/dist/docs/assets/{guides_slack.md.D4RVMM4G.js → guides_slack.md.DdT8rmsj.js} +12 -4
- package/dist/docs/assets/{guides_slack.md.D4RVMM4G.lean.js → guides_slack.md.DdT8rmsj.lean.js} +1 -1
- package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.js → guides_webhooks.md.aQW10HRe.js} +3 -3
- package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.lean.js → guides_webhooks.md.aQW10HRe.lean.js} +1 -1
- package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.js +1 -0
- package/dist/docs/assets/hillclimbing.md.Dq4kkVIL.lean.js +1 -0
- package/dist/docs/assets/index.md.BFVyY2KT.js +17 -0
- package/dist/docs/assets/index.md.BFVyY2KT.lean.js +1 -0
- package/dist/docs/assets/{quickstart.md.DdQOF7Y8.js → quickstart.md.D3MjSZN-.js} +30 -38
- package/dist/docs/assets/quickstart.md.D3MjSZN-.lean.js +1 -0
- package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.js → reference_agent-config.md.CfVA-LZJ.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.CvoL6pof.lean.js → reference_agent-config.md.CfVA-LZJ.lean.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.js → reference_artifacts.md.Vf7qyIZ-.js} +1 -1
- package/dist/docs/assets/{reference_artifacts.md.Dior32Qw.lean.js → reference_artifacts.md.Vf7qyIZ-.lean.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.D-qTqwcq.js → reference_channels.md.icqLKcTc.js} +2 -12
- package/dist/docs/assets/{reference_channels.md.D-qTqwcq.lean.js → reference_channels.md.icqLKcTc.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.Ca26u0Es.js → reference_cli.md.B2dBL6L8.js} +4 -4
- package/dist/docs/assets/{reference_cli.md.Ca26u0Es.lean.js → reference_cli.md.B2dBL6L8.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BojkC6c5.js → reference_connections.md.Cb3U_c8n.js} +4 -4
- package/dist/docs/assets/{reference_connections.md.BojkC6c5.lean.js → reference_connections.md.Cb3U_c8n.lean.js} +1 -1
- package/dist/docs/assets/{reference_extensions.md.CPWt00ds.js → reference_extensions.md.wlFD3cUR.js} +3 -3
- package/dist/docs/assets/{reference_extensions.md.CPWt00ds.lean.js → reference_extensions.md.wlFD3cUR.lean.js} +1 -1
- package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.js → reference_hooks.md.CZuynAxj.js} +3 -3
- package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.lean.js → reference_hooks.md.CZuynAxj.lean.js} +1 -1
- package/dist/docs/assets/{reference_http-api.md.oySXBO8o.js → reference_http-api.md.DTKcYE6L.js} +3 -3
- package/dist/docs/assets/{reference_http-api.md.oySXBO8o.lean.js → reference_http-api.md.DTKcYE6L.lean.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.js → reference_instructions.md.D7gkckK-.js} +1 -1
- package/dist/docs/assets/{reference_instructions.md.CR7XSsGk.lean.js → reference_instructions.md.D7gkckK-.lean.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.4myJPxrf.js → reference_playground.md.D2YExv5K.js} +1 -1
- package/dist/docs/assets/{reference_playground.md.4myJPxrf.lean.js → reference_playground.md.D2YExv5K.lean.js} +1 -1
- package/dist/docs/assets/reference_project-layout.md.DPxbUJyt.js +19 -0
- package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.lean.js → reference_project-layout.md.DPxbUJyt.lean.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.js → reference_prompt.md.BQ5uAv1F.js} +1 -1
- package/dist/docs/assets/{reference_prompt.md.DnaD5dNK.lean.js → reference_prompt.md.BQ5uAv1F.lean.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.js → reference_schedules.md.BasfZWO-.js} +1 -1
- package/dist/docs/assets/{reference_schedules.md.DI_JrHgq.lean.js → reference_schedules.md.BasfZWO-.lean.js} +1 -1
- package/dist/docs/assets/reference_sessions.md.YKvIsWAx.js +1 -0
- package/dist/docs/assets/{reference_sessions.md.CueyOHSL.lean.js → reference_sessions.md.YKvIsWAx.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.l2ezAcaN.js → reference_skills.md.rNgpsGd0.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.l2ezAcaN.lean.js → reference_skills.md.rNgpsGd0.lean.js} +1 -1
- package/dist/docs/assets/{reference_subagents.md.CfsIloPm.js → reference_subagents.md.e5qitjJt.js} +2 -2
- package/dist/docs/assets/{reference_subagents.md.CfsIloPm.lean.js → reference_subagents.md.e5qitjJt.lean.js} +1 -1
- package/dist/docs/assets/{reference_tools.md.aGrn99hP.js → reference_tools.md.BdCO2aHZ.js} +4 -4
- package/dist/docs/assets/{reference_tools.md.aGrn99hP.lean.js → reference_tools.md.BdCO2aHZ.lean.js} +1 -1
- package/dist/docs/assets/{style.DCD_zyg3.css → style.Cfo2vbik.css} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.js → templates_agentic-owners.md.Da_AGDlH.js} +1 -1
- package/dist/docs/assets/{templates_agentic-owners.md.BZSH4N9z.lean.js → templates_agentic-owners.md.Da_AGDlH.lean.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.js → templates_pr-autofixer.md.DqxocIGh.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.Bds_XWcV.lean.js → templates_pr-autofixer.md.DqxocIGh.lean.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.js → templates_security-reviewer.md.Bhnvd8VE.js} +1 -1
- package/dist/docs/assets/{templates_security-reviewer.md.lshxbCLK.lean.js → templates_security-reviewer.md.Bhnvd8VE.lean.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.js → templates_triage.md.BdBWO9Ic.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.Co4UNzkZ.lean.js → templates_triage.md.BdBWO9Ic.lean.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.CYEAO9bM.js → troubleshooting.md.BcgNoYtJ.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.CYEAO9bM.lean.js → troubleshooting.md.BcgNoYtJ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +41 -8
- package/dist/docs/building-with-agents.md +15 -16
- package/dist/docs/deployment.html +44 -11
- package/dist/docs/deployment.md +6 -7
- package/dist/docs/evals.html +196 -37
- package/dist/docs/evals.md +612 -297
- package/dist/docs/guides/agent-to-agent.html +48 -11
- package/dist/docs/guides/agent-to-agent.md +40 -83
- package/dist/docs/guides/bitbucket.html +69 -0
- package/dist/docs/guides/bitbucket.md +84 -0
- package/dist/docs/guides/cloud-agents.html +41 -8
- package/dist/docs/guides/cloud-agents.md +24 -20
- package/dist/docs/guides/convert-automation.html +41 -8
- package/dist/docs/guides/github.html +52 -9
- package/dist/docs/guides/github.md +32 -1
- package/dist/docs/guides/gitlab.html +73 -0
- package/dist/docs/guides/gitlab.md +92 -0
- package/dist/docs/guides/grokbot-agents.html +41 -8
- package/dist/docs/guides/grokbot-agents.md +26 -19
- package/dist/docs/guides/improve.html +41 -8
- package/dist/docs/guides/mcp-oauth.html +41 -8
- package/dist/docs/guides/mcp-oauth.md +1 -1
- package/dist/docs/guides/opentelemetry.html +53 -20
- package/dist/docs/guides/opentelemetry.md +28 -41
- package/dist/docs/guides/slack.html +51 -10
- package/dist/docs/guides/slack.md +53 -4
- package/dist/docs/guides/webhooks.html +42 -9
- package/dist/docs/guides/webhooks.md +7 -6
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +40 -10
- package/dist/docs/hillclimbing.md +7 -7
- package/dist/docs/index.html +57 -12
- package/dist/docs/index.md +81 -146
- package/dist/docs/llms-full.txt +1368 -5551
- package/dist/docs/llms.txt +6 -31
- package/dist/docs/quickstart.html +70 -45
- package/dist/docs/quickstart.md +44 -105
- package/dist/docs/reference/agent-config.html +41 -8
- package/dist/docs/reference/artifacts.html +41 -8
- package/dist/docs/reference/channels.html +41 -18
- package/dist/docs/reference/channels.md +16 -19
- package/dist/docs/reference/cli.html +43 -10
- package/dist/docs/reference/cli.md +6 -20
- package/dist/docs/reference/connections.html +43 -10
- package/dist/docs/reference/connections.md +3 -5
- package/dist/docs/reference/extensions.html +43 -10
- package/dist/docs/reference/extensions.md +2 -5
- package/dist/docs/reference/hooks.html +42 -9
- package/dist/docs/reference/hooks.md +11 -16
- package/dist/docs/reference/http-api.html +42 -9
- package/dist/docs/reference/http-api.md +6 -7
- package/dist/docs/reference/instructions.html +41 -8
- package/dist/docs/reference/playground.html +40 -7
- package/dist/docs/reference/playground.md +2 -6
- package/dist/docs/reference/project-layout.html +42 -9
- package/dist/docs/reference/project-layout.md +4 -12
- package/dist/docs/reference/prompt.html +41 -8
- package/dist/docs/reference/schedules.html +41 -8
- package/dist/docs/reference/sessions.html +40 -7
- package/dist/docs/reference/sessions.md +6 -6
- package/dist/docs/reference/skills.html +41 -8
- package/dist/docs/reference/subagents.html +41 -8
- package/dist/docs/reference/subagents.md +2 -4
- package/dist/docs/reference/tools.html +43 -10
- package/dist/docs/reference/tools.md +2 -5
- package/dist/docs/templates/agentic-owners.html +41 -8
- package/dist/docs/templates/pr-autofixer.html +41 -8
- package/dist/docs/templates/security-reviewer.html +41 -8
- package/dist/docs/templates/triage.html +41 -8
- package/dist/docs/troubleshooting.html +40 -7
- package/dist/docs/troubleshooting.md +1 -2
- package/dist/evals/assertions.js +19 -19
- package/dist/evals/expect.js +1 -1
- package/dist/evals/judge.js +1 -1
- package/dist/evals/reporters.d.ts.map +1 -1
- package/dist/evals/reporters.js +8 -8
- package/dist/evals/run-facts.js +2 -2
- package/dist/evals.d.ts +1 -1
- package/dist/evals.d.ts.map +1 -1
- package/dist/evals.js +7 -7
- package/dist/extensions/cursor-cloud-agents/extension.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +3 -3
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +6 -6
- package/dist/extensions/cursor-cloud-agents/lib/transcript.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -2
- package/dist/extensions/cursor-cloud-agents/tools/list.js +1 -1
- package/dist/extensions/improve/skills/yourself.js +1 -1
- package/dist/extensions/slack-communication/extension.d.ts +28 -0
- package/dist/extensions/slack-communication/extension.d.ts.map +1 -0
- package/dist/extensions/slack-communication/extension.js +32 -0
- package/dist/extensions/slack-communication/skills/slack-voice.d.ts +5 -0
- package/dist/extensions/slack-communication/skills/slack-voice.d.ts.map +1 -0
- package/dist/extensions/slack-communication/skills/slack-voice.js +54 -0
- package/dist/extensions/slack-communication/tools/delete-message.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/delete-message.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/delete-message.js +29 -0
- package/dist/extensions/slack-communication/tools/edit-message.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/edit-message.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/edit-message.js +37 -0
- package/dist/extensions/slack-communication/tools/post-card.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/post-card.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/post-card.js +25 -0
- package/dist/extensions/slack-communication/tools/post-file.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/post-file.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/post-file.js +76 -0
- package/dist/extensions/slack-communication/tools/post-update.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/post-update.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/post-update.js +36 -0
- package/dist/extensions/slack-communication/tools/react.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/react.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/react.js +27 -0
- package/dist/extensions/slack-communication/tools/set-status.d.ts +4 -0
- package/dist/extensions/slack-communication/tools/set-status.d.ts.map +1 -0
- package/dist/extensions/slack-communication/tools/set-status.js +18 -0
- package/dist/extensions.d.ts +2 -3
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +2 -5
- package/dist/files-backends/cursor-hosted.d.ts +18 -6
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +357 -74
- package/dist/files-backends/local-fs.js +1 -1
- package/dist/files.d.ts +15 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/filesystem.d.ts.map +1 -1
- package/dist/filesystem.js +15 -15
- package/dist/index.d.ts +6 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -8
- package/dist/internal/advertise-tools.js +6 -6
- package/dist/internal/approval-gate.js +1 -1
- package/dist/internal/artifacts-store.js +3 -3
- package/dist/internal/as-of.js +2 -2
- package/dist/internal/authored-alias-hooks.d.ts +5 -0
- package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
- package/dist/internal/authored-alias-hooks.js +17 -0
- package/dist/internal/authored-loaders.d.ts +4 -0
- package/dist/internal/authored-loaders.d.ts.map +1 -1
- package/dist/internal/authored-loaders.js +21 -2
- package/dist/internal/builtin-tools/reminders.js +2 -2
- package/dist/internal/chat-client.js +5 -5
- package/dist/internal/cli-ax.d.ts +2 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +69 -15
- package/dist/internal/cli-bitbucket.js +10 -10
- package/dist/internal/cli-convert-automation.js +2 -2
- package/dist/internal/cli-cursor.d.ts +3 -11
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +5 -10
- package/dist/internal/cli-deploy.d.ts +12 -2
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +328 -96
- package/dist/internal/cli-docs.js +5 -5
- package/dist/internal/cli-github.js +15 -16
- package/dist/internal/cli-gitlab.js +10 -10
- package/dist/internal/cli-manifest.js +1 -1
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
- package/dist/internal/cli-mcp-oauth.js +5 -5
- package/dist/internal/cli-mcp.js +3 -3
- package/dist/internal/cli-skills.js +2 -2
- package/dist/internal/cli-slack.js +5 -5
- package/dist/internal/cloud-turn-cost.js +1 -1
- package/dist/internal/continuation-channel.d.ts.map +1 -1
- package/dist/internal/continuation-channel.js +2 -2
- package/dist/internal/continuation-identity.d.ts.map +1 -1
- package/dist/internal/continuation-identity.js +22 -12
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +33 -2
- package/dist/internal/convert-automation/convert-workflow.js +25 -24
- package/dist/internal/convert-automation/types.d.ts +8 -0
- package/dist/internal/convert-automation/types.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.d.ts +2 -2
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +32 -27
- package/dist/internal/cursor/backend-client.d.ts +15 -10
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +17 -11
- package/dist/internal/cursor/credentials.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.d.ts +16 -0
- package/dist/internal/cursor/hosted-store-secrets.d.ts.map +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +25 -0
- package/dist/internal/cursor-account-mcp-auth.js +9 -9
- package/dist/internal/cursor-deployment-relay.js +9 -9
- package/dist/internal/cursor-event-relay.js +10 -10
- package/dist/internal/cursor-relay-core.js +2 -2
- package/dist/internal/deploy-client.d.ts +106 -9
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +171 -23
- package/dist/internal/deploy-manifest.d.ts +13 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +32 -16
- package/dist/internal/discovery/agent-config.d.ts +5 -0
- package/dist/internal/discovery/agent-config.d.ts.map +1 -1
- package/dist/internal/discovery/agent-config.js +27 -0
- package/dist/internal/discovery/agent.d.ts +1 -1
- package/dist/internal/discovery/agent.d.ts.map +1 -1
- package/dist/internal/discovery/agent.js +10 -13
- package/dist/internal/discovery/channels.js +4 -4
- package/dist/internal/discovery/connections.js +4 -4
- package/dist/internal/discovery/cursor-plugin.js +12 -12
- package/dist/internal/discovery/extension-overlay.d.ts +1 -2
- package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
- package/dist/internal/discovery/extension-overlay.js +3 -17
- package/dist/internal/discovery/extensions.d.ts +1 -2
- package/dist/internal/discovery/extensions.d.ts.map +1 -1
- package/dist/internal/discovery/extensions.js +10 -28
- package/dist/internal/discovery/info.d.ts.map +1 -1
- package/dist/internal/discovery/info.js +44 -26
- package/dist/internal/discovery/instructions.js +1 -1
- package/dist/internal/discovery/modules.js +0 -1
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +4 -20
- package/dist/internal/discovery/services.js +1 -1
- package/dist/internal/discovery/tools.js +1 -1
- package/dist/internal/docs-site.js +2 -2
- package/dist/internal/env-file.js +1 -1
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +7 -7
- package/dist/internal/eval-runner.js +14 -15
- package/dist/internal/evals-client.js +4 -4
- package/dist/internal/event-log.js +8 -8
- package/dist/internal/event-mapper.d.ts +18 -0
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +34 -2
- package/dist/internal/filesystem/format.d.ts.map +1 -1
- package/dist/internal/filesystem/format.js +6 -3
- package/dist/internal/filesystem/scratch.js +3 -3
- package/dist/internal/filesystem/tools.d.ts.map +1 -1
- package/dist/internal/filesystem/tools.js +6 -6
- package/dist/internal/filesystem/walk.js +1 -1
- package/dist/internal/framework-file-storage.d.ts +10 -7
- package/dist/internal/framework-file-storage.d.ts.map +1 -1
- package/dist/internal/framework-file-storage.js +95 -7
- package/dist/internal/framework-storage-selection.d.ts +2 -8
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +4 -13
- package/dist/internal/github-fanout.js +3 -3
- package/dist/internal/guest-network.js +4 -4
- package/dist/internal/host-files.js +1 -1
- package/dist/internal/host-kv.js +2 -2
- package/dist/internal/hosted-admission-adapter.d.ts +2 -0
- package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +2 -4
- package/dist/internal/hosted-catch.js +1 -1
- package/dist/internal/hosted-delivery-protocol.d.ts +29 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +76 -8
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +201 -64
- package/dist/internal/hosted-execution-diag.js +3 -3
- package/dist/internal/hosted-execution-latency.d.ts +80 -0
- package/dist/internal/hosted-execution-latency.d.ts.map +1 -0
- package/dist/internal/hosted-execution-latency.js +220 -0
- package/dist/internal/hosting.d.ts +5 -5
- package/dist/internal/hosting.d.ts.map +1 -1
- package/dist/internal/hosting.js +5 -6
- package/dist/internal/http-channel-define.d.ts +11 -0
- package/dist/internal/http-channel-define.d.ts.map +1 -0
- package/dist/internal/http-channel-define.js +18 -0
- package/dist/internal/http-channel.d.ts +2 -3
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +3 -4
- package/dist/internal/http-control-plane-session.d.ts +7 -3
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +22 -10
- package/dist/internal/incoming-headers-to-fetch.d.ts +10 -0
- package/dist/internal/incoming-headers-to-fetch.d.ts.map +1 -0
- package/dist/internal/incoming-headers-to-fetch.js +41 -0
- package/dist/internal/init-interview.js +7 -7
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +14 -14
- package/dist/internal/init-scaffold.d.ts.map +1 -1
- package/dist/internal/init-scaffold.js +2 -3
- package/dist/internal/inline-stdio-mcp.js +2 -2
- package/dist/internal/install-cursor-skills.d.ts +5 -2
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +35 -15
- package/dist/internal/json-schema.js +1 -1
- package/dist/internal/local-control-plane.d.ts.map +1 -1
- package/dist/internal/local-control-plane.js +3 -3
- package/dist/internal/local-env.js +3 -3
- package/dist/internal/log-ring.js +1 -1
- package/dist/internal/logs-client.js +1 -1
- package/dist/internal/mcp-endpoint.js +8 -8
- package/dist/internal/mcp-host.js +4 -4
- package/dist/internal/mcp-oauth-on-demand.js +3 -3
- package/dist/internal/mcp-oauth.js +5 -5
- package/dist/internal/net.js +2 -2
- package/dist/internal/otel/config.js +3 -3
- package/dist/internal/otel/runtime.js +13 -13
- package/dist/internal/peer-connections.js +2 -2
- package/dist/internal/platform-schedule-sync.js +1 -1
- package/dist/internal/platform-timers.js +1 -1
- package/dist/internal/playground/static.js +2 -2
- package/dist/internal/playground/toolchain.js +2 -2
- package/dist/internal/playground-proxy.js +3 -3
- package/dist/internal/process-memory-telemetry.js +1 -1
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +7 -7
- package/dist/internal/reminder-store.js +1 -1
- package/dist/internal/request-error-status.d.ts.map +1 -1
- package/dist/internal/request-error-status.js +9 -0
- package/dist/internal/resolved-connections.js +8 -8
- package/dist/internal/result-output.d.ts +14 -2
- package/dist/internal/result-output.d.ts.map +1 -1
- package/dist/internal/result-output.js +45 -2
- package/dist/internal/router.js +4 -4
- package/dist/internal/run-client.d.ts +1 -1
- package/dist/internal/run-client.js +2 -2
- package/dist/internal/schedule-runner.js +6 -6
- package/dist/internal/scm/pr-url.d.ts +3 -1
- package/dist/internal/scm/pr-url.d.ts.map +1 -1
- package/dist/internal/scm/pr-url.js +10 -2
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +15 -16
- package/dist/internal/serve-restart.js +1 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +81 -101
- package/dist/internal/session-cost.js +3 -3
- package/dist/internal/session-engine.d.ts +39 -35
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +394 -343
- package/dist/internal/session-run-log.d.ts.map +1 -1
- package/dist/internal/session-run-log.js +4 -4
- package/dist/internal/session-store.d.ts +47 -3
- package/dist/internal/session-store.d.ts.map +1 -1
- package/dist/internal/session-store.js +198 -33
- package/dist/internal/sessions-client.js +3 -3
- package/dist/internal/slack-thread-key.d.ts +7 -0
- package/dist/internal/slack-thread-key.d.ts.map +1 -0
- package/dist/internal/slack-thread-key.js +10 -0
- package/dist/internal/sleep.js +1 -1
- package/dist/internal/storage-coordinator.d.ts +22 -19
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +114 -73
- package/dist/internal/storage-roles.d.ts +4 -9
- package/dist/internal/storage-roles.d.ts.map +1 -1
- package/dist/internal/storage-roles.js +2 -2
- package/dist/internal/storage.d.ts +2 -0
- package/dist/internal/storage.d.ts.map +1 -0
- package/dist/internal/storage.js +1 -0
- package/dist/internal/store-mirror.js +4 -4
- package/dist/internal/terminal-style.js +2 -2
- package/dist/internal/tool-result.js +3 -3
- package/dist/internal/trajectory.js +7 -7
- package/dist/internal/turn-governor.js +2 -2
- package/dist/internal/turn-outbox.js +1 -1
- package/dist/internal/update-check.js +2 -2
- package/dist/internal/v2-hosting.d.ts +9 -0
- package/dist/internal/v2-hosting.d.ts.map +1 -1
- package/dist/internal/v2-hosting.js +10 -0
- package/dist/internal/workspace.d.ts +13 -10
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +17 -16
- package/dist/kv/memory-kv.d.ts +6 -4
- package/dist/kv/memory-kv.d.ts.map +1 -1
- package/dist/kv/memory-kv.js +9 -7
- package/dist/kv.d.ts +4 -7
- package/dist/kv.d.ts.map +1 -1
- package/dist/kv.js +4 -7
- package/dist/otel-public.d.ts +7 -0
- package/dist/otel-public.d.ts.map +1 -0
- package/dist/otel-public.js +5 -0
- package/dist/otel.d.ts +7 -2
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +7 -2
- package/dist/playground/assets/index-BLlKgZtI.css +1 -0
- package/dist/playground/assets/index-CDS5p9sR.js +67 -0
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +1 -1
- package/dist/result.d.ts +10 -4
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +9 -3
- package/dist/storage-backends/cursor-hosted-v2.d.ts +4 -5
- package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted-v2.js +6 -7
- package/dist/storage-backends/cursor-hosted.d.ts +6 -19
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +6 -50
- package/dist/storage-backends/file-kv.d.ts +9 -12
- package/dist/storage-backends/file-kv.d.ts.map +1 -1
- package/dist/storage-backends/file-kv.js +18 -54
- package/dist/storage-protocol.d.ts +3 -11
- package/dist/storage-protocol.d.ts.map +1 -1
- package/dist/storage-protocol.js +3 -11
- package/dist/storage.d.ts +28 -38
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +15 -50
- package/dist/types.d.ts +87 -68
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -4
- package/docs/README.md +83 -148
- package/docs/building-with-agents.md +15 -16
- package/docs/deployment.md +6 -7
- package/docs/evals.md +613 -298
- package/docs/guides/agent-to-agent.md +41 -84
- package/docs/guides/bitbucket.md +89 -0
- package/docs/guides/cloud-agents.md +25 -20
- package/docs/guides/github.md +32 -1
- package/docs/guides/gitlab.md +97 -0
- package/docs/guides/grokbot-agents.md +27 -19
- package/docs/guides/mcp-oauth.md +1 -1
- package/docs/guides/opentelemetry.md +28 -41
- package/docs/guides/slack.md +53 -4
- package/docs/guides/webhooks.md +7 -6
- package/docs/hillclimbing.md +7 -7
- package/docs/quickstart.md +45 -106
- package/docs/reference/channels.md +16 -19
- package/docs/reference/cli.md +6 -20
- package/docs/reference/connections.md +3 -5
- package/docs/reference/extensions.md +2 -5
- package/docs/reference/hooks.md +11 -16
- package/docs/reference/http-api.md +6 -7
- package/docs/reference/playground.md +2 -6
- package/docs/reference/project-layout.md +4 -12
- package/docs/reference/sessions.md +6 -6
- package/docs/reference/subagents.md +2 -4
- package/docs/reference/tools.md +2 -5
- package/docs/troubleshooting.md +1 -2
- package/package.json +55 -43
- package/skills/deploy/SKILL.md +169 -0
- package/skills/evals/SKILL.md +45 -8
- package/skills/framework-map/SKILL.md +3 -4
- package/skills/otel/SKILL.md +8 -18
- package/src/bin/agent-serve.ts +93 -72
- package/src/channels/bitbucket/api.ts +347 -6
- package/src/channels/bitbucket/binding.ts +29 -4
- package/src/channels/bitbucket/bitbucket-channel.ts +1 -1
- package/src/channels/bitbucket/bitbucket-webhook.ts +1 -1
- package/src/channels/bitbucket/checks.ts +3 -4
- package/src/channels/bitbucket/cursor-account.ts +1 -1
- package/src/channels/bitbucket/events.ts +1 -1
- package/src/channels/bitbucket/index.ts +2 -0
- package/src/channels/change-monitors/change-monitors-channel.ts +2 -2
- package/src/channels/checks.ts +5 -4
- package/src/channels/deployments/deployments-channel.ts +1 -1
- package/src/channels/github/api.ts +1 -1
- package/src/channels/github/checks.ts +1 -1
- package/src/channels/github/cursor-account.ts +3 -3
- package/src/channels/github/defaults.ts +8 -4
- package/src/channels/github/events.ts +1 -1
- package/src/channels/github/forward.ts +8 -8
- package/src/channels/github/github-channel.ts +19 -2
- package/src/channels/github/progress.ts +7 -2
- package/src/channels/github/state.ts +6 -0
- package/src/channels/github/types.ts +6 -0
- package/src/channels/gitlab/api.ts +123 -0
- package/src/channels/gitlab/binding.ts +16 -4
- package/src/channels/gitlab/checks.ts +3 -4
- package/src/channels/gitlab/cursor-account.ts +1 -1
- package/src/channels/gitlab/events.ts +1 -1
- package/src/channels/gitlab/gitlab-channel.ts +1 -1
- package/src/channels/gitlab/gitlab-webhook.ts +1 -1
- package/src/channels/gitlab/index.ts +1 -0
- package/src/channels/gitlab/replay.ts +2 -2
- package/src/channels/origin/binding.ts +6 -3
- package/src/channels/origin/checks.ts +27 -17
- package/src/channels/origin/cursor-account.ts +1 -1
- package/src/channels/origin/defaults.ts +5 -1
- package/src/channels/origin/events.ts +1 -1
- package/src/channels/origin/origin-channel.ts +2 -1
- package/src/channels/origin/origin-webhook.ts +2 -2
- package/src/channels/slack/agentic-delivery.ts +659 -0
- package/src/channels/slack/agentic-posted.ts +148 -0
- package/src/channels/slack/agentic-signals.ts +248 -0
- package/src/channels/slack/api.ts +51 -11
- package/src/channels/slack/approvals.ts +1 -1
- package/src/channels/slack/attachments.ts +1 -1
- package/src/channels/slack/auth.ts +3 -1
- package/src/channels/slack/blocks.ts +3 -3
- package/src/channels/slack/bot-mentions.ts +5 -7
- package/src/channels/slack/channel-watch.ts +1 -1
- package/src/channels/slack/cli-project.ts +3 -3
- package/src/channels/slack/defaults.ts +109 -37
- package/src/channels/slack/dispatch.ts +323 -164
- package/src/channels/slack/doctor.ts +1 -1
- package/src/channels/slack/eval-directive.ts +1 -1
- package/src/channels/slack/external-policy.ts +15 -2
- package/src/channels/slack/footer.ts +108 -0
- package/src/channels/slack/index.ts +2 -0
- package/src/channels/slack/interactive.ts +4 -2
- package/src/channels/slack/live-delivery.ts +23 -7
- package/src/channels/slack/log.ts +1 -1
- package/src/channels/slack/manifest.ts +1 -1
- package/src/channels/slack/nudge-carrier.ts +1 -1
- package/src/channels/slack/nudge-store.ts +2 -2
- package/src/channels/slack/paint-start.ts +93 -0
- package/src/channels/slack/placeholder.ts +315 -0
- package/src/channels/slack/progress-delivery.ts +14 -1
- package/src/channels/slack/reasoning-chip.ts +48 -0
- package/src/channels/slack/recording-sink.ts +176 -0
- package/src/channels/slack/reply-options.ts +71 -15
- package/src/channels/slack/setup.ts +1 -1
- package/src/channels/slack/slack-channel.ts +140 -18
- package/src/channels/slack/socket-mode.ts +2 -2
- package/src/channels/slack/thread-context.ts +5 -5
- package/src/channels/slack/tool-approval-events.ts +54 -38
- package/src/channels/slack/tool-cards.ts +1 -1
- package/src/channels/slack/tool-chip.ts +36 -0
- package/src/channels/slack/types.ts +47 -7
- package/src/channels/slack/upload.ts +142 -0
- package/src/channels.ts +12 -30
- package/src/dashboard-session-url.ts +32 -0
- package/src/evals/assertions.ts +19 -19
- package/src/evals/expect.ts +1 -1
- package/src/evals/judge.ts +1 -1
- package/src/evals/reporters.ts +8 -9
- package/src/evals/run-facts.ts +2 -2
- package/src/evals.ts +7 -10
- package/src/extensions/cursor-cloud-agents/extension.ts +1 -1
- package/src/extensions/cursor-cloud-agents/lib/backend.ts +3 -3
- package/src/extensions/cursor-cloud-agents/lib/fleet.ts +1 -1
- package/src/extensions/cursor-cloud-agents/lib/repos.ts +3 -3
- package/src/extensions/cursor-cloud-agents/lib/transcript.ts +3 -4
- package/src/extensions/cursor-cloud-agents/tools/list.ts +1 -1
- package/src/extensions/improve/skills/yourself.ts +1 -1
- package/src/extensions/slack-communication/evals/harness.ts +728 -0
- package/src/extensions/slack-communication/evals/slack-communication.eval.ts +953 -0
- package/src/extensions/slack-communication/evals/slack-placeholder.eval.ts +194 -0
- package/src/extensions/slack-communication/extension.ts +45 -0
- package/src/extensions/slack-communication/skills/slack-voice.ts +59 -0
- package/src/extensions/slack-communication/tools/delete-message.ts +34 -0
- package/src/extensions/slack-communication/tools/edit-message.ts +42 -0
- package/src/extensions/slack-communication/tools/post-card.ts +28 -0
- package/src/extensions/slack-communication/tools/post-file.ts +85 -0
- package/src/extensions/slack-communication/tools/post-update.ts +41 -0
- package/src/extensions/slack-communication/tools/react.ts +33 -0
- package/src/extensions/slack-communication/tools/set-status.ts +21 -0
- package/src/extensions.ts +2 -6
- package/src/files-backends/cursor-hosted.ts +502 -98
- package/src/files-backends/local-fs.ts +1 -1
- package/src/files.ts +15 -0
- package/src/filesystem.ts +16 -18
- package/src/index.ts +4 -39
- package/src/internal/advertise-tools.ts +6 -6
- package/src/internal/approval-gate.ts +1 -1
- package/src/internal/artifacts-store.ts +3 -3
- package/src/internal/as-of.ts +2 -2
- package/src/internal/authored-alias-hooks.ts +32 -0
- package/src/internal/authored-loaders.ts +25 -2
- package/src/internal/builtin-tools/reminders.ts +2 -2
- package/src/internal/chat-client.ts +5 -5
- package/src/internal/cli-ax.ts +85 -16
- package/src/internal/cli-bitbucket.ts +11 -11
- package/src/internal/cli-convert-automation.ts +2 -2
- package/src/internal/cli-cursor.ts +5 -16
- package/src/internal/cli-deploy.ts +389 -104
- package/src/internal/cli-docs.ts +5 -5
- package/src/internal/cli-github.ts +16 -19
- package/src/internal/cli-gitlab.ts +11 -11
- package/src/internal/cli-manifest.ts +1 -1
- package/src/internal/cli-mcp-oauth.ts +5 -7
- package/src/internal/cli-mcp.ts +3 -3
- package/src/internal/cli-skills.ts +2 -2
- package/src/internal/cli-slack.ts +5 -5
- package/src/internal/cloud-turn-cost.ts +1 -1
- package/src/internal/continuation-channel.ts +2 -1
- package/src/internal/continuation-identity.ts +23 -11
- package/src/internal/conversation-mirror.ts +36 -3
- package/src/internal/convert-automation/convert-workflow.ts +27 -27
- package/src/internal/convert-automation/types.ts +9 -0
- package/src/internal/cursor/account-mcp.ts +48 -31
- package/src/internal/cursor/backend-client.ts +28 -17
- package/src/internal/cursor/credentials.ts +1 -1
- package/src/internal/cursor/hosted-store-secrets.ts +34 -0
- package/src/internal/cursor-account-mcp-auth.ts +9 -9
- package/src/internal/cursor-deployment-relay.ts +10 -10
- package/src/internal/cursor-event-relay.ts +10 -10
- package/src/internal/cursor-relay-core.ts +2 -2
- package/src/internal/deploy-client.ts +266 -24
- package/src/internal/deploy-manifest.ts +46 -8
- package/src/internal/discovery/agent-config.ts +34 -0
- package/src/internal/discovery/agent.ts +15 -13
- package/src/internal/discovery/channels.ts +4 -4
- package/src/internal/discovery/connections.ts +4 -4
- package/src/internal/discovery/cursor-plugin.ts +12 -12
- package/src/internal/discovery/extension-overlay.ts +3 -21
- package/src/internal/discovery/extensions.ts +8 -32
- package/src/internal/discovery/info.ts +12 -22
- package/src/internal/discovery/instructions.ts +1 -1
- package/src/internal/discovery/modules.ts +0 -1
- package/src/internal/discovery/project.ts +4 -20
- package/src/internal/discovery/services.ts +1 -1
- package/src/internal/discovery/tools.ts +1 -1
- package/src/internal/docs-site.ts +2 -2
- package/src/internal/env-file.ts +2 -2
- package/src/internal/eval-run-store.ts +7 -9
- package/src/internal/eval-runner.ts +20 -21
- package/src/internal/evals-client.ts +6 -6
- package/src/internal/event-log.ts +10 -10
- package/src/internal/event-mapper.ts +37 -2
- package/src/internal/filesystem/format.ts +11 -12
- package/src/internal/filesystem/scratch.ts +3 -3
- package/src/internal/filesystem/tools.ts +6 -8
- package/src/internal/filesystem/walk.ts +1 -1
- package/src/internal/framework-file-storage.ts +108 -9
- package/src/internal/framework-storage-selection.ts +4 -14
- package/src/internal/github-fanout.ts +4 -4
- package/src/internal/guest-network.ts +4 -4
- package/src/internal/host-files.ts +1 -1
- package/src/internal/host-kv.ts +2 -2
- package/src/internal/hosted-admission-adapter.ts +2 -0
- package/src/internal/hosted-catch-protocol.ts +3 -5
- package/src/internal/hosted-catch.ts +1 -1
- package/src/internal/hosted-delivery-protocol.ts +111 -13
- package/src/internal/hosted-delivery.ts +286 -81
- package/src/internal/hosted-execution-diag.ts +3 -3
- package/src/internal/hosted-execution-latency.ts +334 -0
- package/src/internal/hosting.ts +5 -6
- package/src/internal/http-channel-define.ts +27 -0
- package/src/internal/http-channel.ts +3 -4
- package/src/internal/http-control-plane-session.ts +24 -11
- package/src/internal/incoming-headers-to-fetch.ts +54 -0
- package/src/internal/init-interview.ts +7 -7
- package/src/internal/init-project.ts +14 -16
- package/src/internal/init-scaffold.ts +2 -3
- package/src/internal/inline-stdio-mcp.ts +2 -2
- package/src/internal/install-cursor-skills.ts +49 -16
- package/src/internal/json-schema.ts +1 -1
- package/src/internal/local-control-plane.ts +4 -5
- package/src/internal/local-env.ts +3 -3
- package/src/internal/log-ring.ts +1 -1
- package/src/internal/logs-client.ts +1 -1
- package/src/internal/mcp-endpoint.ts +10 -10
- package/src/internal/mcp-host.ts +9 -9
- package/src/internal/mcp-oauth-on-demand.ts +3 -3
- package/src/internal/mcp-oauth.ts +5 -5
- package/src/internal/net.ts +2 -2
- package/src/internal/otel/config.ts +3 -3
- package/src/internal/otel/runtime.ts +14 -14
- package/src/internal/peer-connections.ts +2 -2
- package/src/internal/platform-schedule-sync.ts +1 -1
- package/src/internal/platform-timers.ts +1 -1
- package/src/internal/playground/static.ts +2 -2
- package/src/internal/playground/toolchain.ts +2 -2
- package/src/internal/playground-proxy.ts +3 -3
- package/src/internal/process-memory-telemetry.ts +1 -1
- package/src/internal/reminder-runner.ts +8 -10
- package/src/internal/reminder-store.ts +1 -1
- package/src/internal/request-error-status.ts +9 -0
- package/src/internal/resolved-connections.ts +8 -8
- package/src/internal/result-output.ts +62 -5
- package/src/internal/router.ts +4 -4
- package/src/internal/run-client.ts +3 -3
- package/src/internal/schedule-runner.ts +6 -6
- package/src/internal/scm/pr-url.ts +11 -2
- package/src/internal/sdk-runner.ts +15 -29
- package/src/internal/serve-restart.ts +1 -1
- package/src/internal/server.ts +97 -115
- package/src/internal/session-cost.ts +3 -3
- package/src/internal/session-engine.ts +517 -445
- package/src/internal/session-run-log.ts +4 -6
- package/src/internal/session-store.ts +213 -39
- package/src/internal/sessions-client.ts +3 -3
- package/src/internal/slack-thread-key.ts +11 -0
- package/src/internal/sleep.ts +1 -1
- package/src/internal/storage-coordinator.ts +122 -96
- package/src/internal/storage-roles.ts +4 -9
- package/src/internal/storage.ts +1 -0
- package/src/internal/store-mirror.ts +4 -4
- package/src/internal/terminal-style.ts +2 -2
- package/src/internal/tool-result.ts +3 -3
- package/src/internal/trajectory.ts +7 -7
- package/src/internal/turn-governor.ts +2 -2
- package/src/internal/turn-outbox.ts +1 -1
- package/src/internal/update-check.ts +2 -2
- package/src/internal/v2-hosting.ts +14 -0
- package/src/internal/workspace.ts +17 -17
- package/src/kv/memory-kv.ts +9 -7
- package/src/kv.ts +4 -7
- package/src/otel-public.ts +24 -0
- package/src/otel.ts +7 -2
- package/src/prompt.ts +1 -1
- package/src/result.ts +10 -8
- package/src/storage-backends/cursor-hosted-v2.ts +6 -9
- package/src/storage-backends/cursor-hosted.ts +6 -60
- package/src/storage-backends/file-kv.ts +17 -58
- package/src/storage-protocol.ts +3 -17
- package/src/storage.ts +32 -108
- package/src/types.ts +101 -73
- package/templates/agentic-owners/agent/channels/github.ts +3 -6
- package/templates/agentic-owners/agent/lib/github.ts +5 -5
- package/templates/agentic-owners/agent/lib/owners/decision.ts +13 -10
- package/templates/agentic-owners/agent/lib/owners/handles.ts +2 -2
- package/templates/agentic-owners/agent/lib/owners/match.ts +3 -3
- package/templates/agentic-owners/agent/lib/owners/matching.ts +1 -1
- package/templates/agentic-owners/agent/lib/owners/parse.ts +4 -9
- package/templates/agentic-owners/agent/lib/owners/prompt.ts +1 -1
- package/templates/agentic-owners/agent/lib/review.ts +37 -30
- package/templates/agentic-owners/evals/owners.eval.ts +2 -2
- package/templates/agentic-owners/package.json +1 -1
- package/templates/agents-md/agent/lib/collect.ts +16 -10
- package/templates/agents-md/agent/lib/config.ts +1 -1
- package/templates/agents-md/agent/tools/apply_agents.ts +10 -8
- package/templates/agents-md/package.json +1 -1
- package/templates/code-wiki/agent/channels/github.ts +4 -7
- package/templates/code-wiki/agent/lib/repos.ts +1 -1
- package/templates/code-wiki/agent/tools/apply_wiki.ts +3 -4
- package/templates/code-wiki/package.json +1 -1
- package/templates/demo/README.md +10 -6
- package/templates/demo/agent/channels/github.ts +2 -0
- package/templates/demo/agent/channels/queue.ts +6 -2
- package/templates/demo/agent/lib/collect.ts +6 -2
- package/templates/demo/agent/lib/repos.ts +5 -0
- package/templates/demo/agent/tools/record_demo.ts +1 -1
- package/templates/demo/evals/demo.eval.ts +1 -5
- package/templates/demo/init.json +25 -0
- package/templates/demo/package.json +1 -1
- package/templates/grokbot-agents/package.json +1 -1
- package/templates/pr-autofixer/agent/channels/github.ts +16 -13
- package/templates/pr-autofixer/agent/lib/merge-watch.ts +2 -4
- package/templates/pr-autofixer/agent/lib/repos.ts +2 -2
- package/templates/pr-autofixer/agent/lib/webhook-routing.ts +1 -1
- package/templates/pr-autofixer/package.json +1 -1
- package/templates/security-help/agent/lib/repos.ts +1 -1
- package/templates/security-help/package.json +1 -1
- package/templates/security-reviewer/agent/lib/repos.ts +1 -1
- package/templates/security-reviewer/agent/tools/post_findings.ts +1 -3
- package/templates/security-reviewer/package.json +1 -1
- package/templates/triage/agent/lib/actuate.ts +26 -41
- package/templates/triage/agent/lib/parse-queue-event.ts +2 -1
- package/templates/triage/agent/lib/verify-webhook.ts +10 -5
- package/templates/triage/agent/tools/record_triage.ts +1 -4
- package/templates/triage/package.json +1 -1
- package/dist/ab.d.ts +0 -209
- package/dist/ab.d.ts.map +0 -1
- package/dist/ab.js +0 -246
- package/dist/client.d.ts +0 -14
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -12
- package/dist/docs/ab.html +0 -80
- package/dist/docs/ab.md +0 -332
- package/dist/docs/assets/ab.md.mlVgqvSk.js +0 -54
- package/dist/docs/assets/ab.md.mlVgqvSk.lean.js +0 -1
- package/dist/docs/assets/app.BASKM3M4.js +0 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BHZYsNVi.js +0 -1
- package/dist/docs/assets/chunks/framework.BCISBCiQ.js +0 -19
- package/dist/docs/assets/concepts.md.DgEcZOfT.js +0 -1
- package/dist/docs/assets/concepts.md.DgEcZOfT.lean.js +0 -1
- package/dist/docs/assets/evals.md.C1ekS3k2.js +0 -85
- package/dist/docs/assets/evals.md.C1ekS3k2.lean.js +0 -1
- package/dist/docs/assets/guides_agent-to-agent.md.BDb0t1QV.js +0 -10
- package/dist/docs/assets/guides_agent-to-agent.md.BDb0t1QV.lean.js +0 -1
- package/dist/docs/assets/guides_grokbot-agents.md.DyV-WArv.js +0 -9
- package/dist/docs/assets/guides_human-in-the-loop.md.By1G2T3_.js +0 -28
- package/dist/docs/assets/guides_human-in-the-loop.md.By1G2T3_.lean.js +0 -1
- package/dist/docs/assets/hillclimbing.md.CpTGTCle.js +0 -4
- package/dist/docs/assets/hillclimbing.md.CpTGTCle.lean.js +0 -1
- package/dist/docs/assets/index.md.BjH1w2ZW.js +0 -5
- package/dist/docs/assets/index.md.BjH1w2ZW.lean.js +0 -1
- package/dist/docs/assets/quickstart.md.DdQOF7Y8.lean.js +0 -1
- package/dist/docs/assets/reference_project-layout.md.DuBu9a96.js +0 -19
- package/dist/docs/assets/reference_result.md.BK5SxDrf.js +0 -19
- package/dist/docs/assets/reference_result.md.BK5SxDrf.lean.js +0 -1
- package/dist/docs/assets/reference_sessions.md.CueyOHSL.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.Kctn3OVb.js +0 -1
- package/dist/docs/assets/scaffolding-agents.md.Kctn3OVb.lean.js +0 -1
- package/dist/docs/assets/skills_ab.md.CsFNatVx.js +0 -26
- package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +0 -1
- package/dist/docs/assets/skills_create-agent.md.Q3h6Je-e.js +0 -8
- package/dist/docs/assets/skills_create-agent.md.Q3h6Je-e.lean.js +0 -1
- package/dist/docs/assets/skills_debug.md.CVjCXMFF.js +0 -1
- package/dist/docs/assets/skills_debug.md.CVjCXMFF.lean.js +0 -1
- package/dist/docs/assets/skills_evals.md.BhovOvrl.js +0 -25
- package/dist/docs/assets/skills_evals.md.BhovOvrl.lean.js +0 -1
- package/dist/docs/assets/skills_framework-map.md.D-tFZhFS.js +0 -1
- package/dist/docs/assets/skills_framework-map.md.D-tFZhFS.lean.js +0 -1
- package/dist/docs/assets/skills_github.md.hgFX_oKY.js +0 -16
- package/dist/docs/assets/skills_github.md.hgFX_oKY.lean.js +0 -1
- package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.js +0 -7
- package/dist/docs/assets/skills_hillclimb.md.B_zJerxA.lean.js +0 -1
- package/dist/docs/assets/skills_index.md.DKwIxzGg.js +0 -1
- package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +0 -1
- package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.js +0 -18
- package/dist/docs/assets/skills_mcp-auth.md.DGvFP3HE.lean.js +0 -1
- package/dist/docs/assets/skills_otel.md.B5Ddv1xH.js +0 -8
- package/dist/docs/assets/skills_otel.md.B5Ddv1xH.lean.js +0 -1
- package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.js +0 -20
- package/dist/docs/assets/skills_setup-slack.md.BBgx8lUz.lean.js +0 -1
- package/dist/docs/assets/storage.md.BOHeqk2M.js +0 -30
- package/dist/docs/assets/storage.md.BOHeqk2M.lean.js +0 -1
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +0 -2
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +0 -1
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +0 -2
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.lean.js +0 -1
- package/dist/docs/assets/templates_demo.md.BeQX9V3H.js +0 -4
- package/dist/docs/assets/templates_demo.md.BeQX9V3H.lean.js +0 -1
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.js +0 -3
- package/dist/docs/assets/templates_grokbot-agents.md.c1s6Flp9.lean.js +0 -1
- package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.js +0 -4
- package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.lean.js +0 -1
- package/dist/docs/concepts.html +0 -27
- package/dist/docs/concepts.md +0 -168
- package/dist/docs/design/filesystem.md +0 -376
- package/dist/docs/design/runtime-abstraction.md +0 -1756
- package/dist/docs/guides/human-in-the-loop.html +0 -54
- package/dist/docs/guides/human-in-the-loop.md +0 -126
- package/dist/docs/reference/result.html +0 -45
- package/dist/docs/reference/result.md +0 -89
- package/dist/docs/scaffolding-agents.html +0 -27
- package/dist/docs/scaffolding-agents.md +0 -130
- package/dist/docs/skills/ab.html +0 -52
- package/dist/docs/skills/ab.md +0 -50
- package/dist/docs/skills/create-agent.html +0 -34
- package/dist/docs/skills/create-agent.md +0 -160
- package/dist/docs/skills/debug.html +0 -27
- package/dist/docs/skills/debug.md +0 -36
- package/dist/docs/skills/evals.html +0 -51
- package/dist/docs/skills/evals.md +0 -99
- package/dist/docs/skills/framework-map.html +0 -27
- package/dist/docs/skills/framework-map.md +0 -100
- package/dist/docs/skills/github.html +0 -42
- package/dist/docs/skills/github.md +0 -93
- package/dist/docs/skills/hillclimb.html +0 -33
- package/dist/docs/skills/hillclimb.md +0 -55
- package/dist/docs/skills/index.html +0 -27
- package/dist/docs/skills/index.md +0 -21
- package/dist/docs/skills/mcp-auth.html +0 -44
- package/dist/docs/skills/mcp-auth.md +0 -76
- package/dist/docs/skills/otel.html +0 -34
- package/dist/docs/skills/otel.md +0 -53
- package/dist/docs/skills/setup-slack.html +0 -46
- package/dist/docs/skills/setup-slack.md +0 -141
- package/dist/docs/storage.html +0 -56
- package/dist/docs/storage.md +0 -176
- package/dist/docs/templates/agents-md.html +0 -28
- package/dist/docs/templates/agents-md.md +0 -105
- package/dist/docs/templates/code-wiki.html +0 -28
- package/dist/docs/templates/code-wiki.md +0 -91
- package/dist/docs/templates/demo.html +0 -30
- package/dist/docs/templates/demo.md +0 -80
- package/dist/docs/templates/grokbot-agents.html +0 -29
- package/dist/docs/templates/grokbot-agents.md +0 -48
- package/dist/docs/templates/security-help.html +0 -30
- package/dist/docs/templates/security-help.md +0 -65
- package/dist/internal/ab-collector.d.ts +0 -44
- package/dist/internal/ab-collector.d.ts.map +0 -1
- package/dist/internal/ab-collector.js +0 -142
- package/dist/internal/ab-fold.d.ts +0 -36
- package/dist/internal/ab-fold.d.ts.map +0 -1
- package/dist/internal/ab-fold.js +0 -175
- package/dist/internal/ab-snapshot.d.ts +0 -68
- package/dist/internal/ab-snapshot.d.ts.map +0 -1
- package/dist/internal/ab-snapshot.js +0 -208
- package/dist/internal/discovery/ab.d.ts +0 -9
- package/dist/internal/discovery/ab.d.ts.map +0 -1
- package/dist/internal/discovery/ab.js +0 -113
- package/dist/internal/tenant-slack/relay.d.ts +0 -75
- package/dist/internal/tenant-slack/relay.d.ts.map +0 -1
- package/dist/internal/tenant-slack/relay.js +0 -148
- package/dist/playground/assets/index-BMDqAeXu.js +0 -67
- package/dist/playground/assets/index-LUgJoWdL.css +0 -1
- package/docs/ab.md +0 -337
- package/docs/concepts.md +0 -173
- package/docs/design/filesystem.md +0 -376
- package/docs/design/runtime-abstraction.md +0 -1756
- package/docs/guides/human-in-the-loop.md +0 -131
- package/docs/reference/result.md +0 -94
- package/docs/scaffolding-agents.md +0 -135
- package/docs/skills/index.md +0 -26
- package/docs/storage.md +0 -181
- package/docs/templates/agents-md.md +0 -110
- package/docs/templates/code-wiki.md +0 -96
- package/docs/templates/demo.md +0 -85
- package/docs/templates/grokbot-agents.md +0 -53
- package/docs/templates/security-help.md +0 -70
- package/skills/ab/SKILL.md +0 -58
- package/src/ab.ts +0 -430
- package/src/client.ts +0 -23
- package/src/internal/ab-collector.ts +0 -200
- package/src/internal/ab-fold.ts +0 -232
- package/src/internal/ab-snapshot.ts +0 -331
- package/src/internal/discovery/ab.ts +0 -131
- package/src/internal/tenant-slack/relay.ts +0 -203
- package/templates/pr-autofixer/agent/storage.ts +0 -7
package/docs/evals.md
CHANGED
|
@@ -1,35 +1,68 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Evals"
|
|
3
|
-
description: "
|
|
3
|
+
description: "Write defineEval cases that gate an agent's trajectory, run them with agent-sdk eval locally and in CI, and lock every kept improvement with a regression check."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Evals
|
|
7
7
|
|
|
8
|
-
An eval
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
tweak helped, a refactor didn't regress the agent, and last
|
|
12
|
-
|
|
8
|
+
An eval sends a fixed message to your agent and asserts over the
|
|
9
|
+
trajectory it records: the turn completed, the right tool ran with the
|
|
10
|
+
right input, the reply has the right shape. Evals are how you know a
|
|
11
|
+
prompt tweak helped, a refactor didn't regress the agent, and last
|
|
12
|
+
month's fix still holds.
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
Nothing is mocked. The runner starts (or targets) a real agent server,
|
|
15
|
+
drives sessions over the public API, and grades the events it gets
|
|
16
|
+
back. The model runs and server tools execute, so
|
|
17
|
+
[keep side effects out of eval sessions](#keep-side-effects-out-of-eval-sessions)
|
|
18
|
+
before you point an eval at an agent that posts anywhere.
|
|
18
19
|
|
|
19
|
-
##
|
|
20
|
+
## Evals, hooks, or hillclimbing?
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
inside it (`agent/evals/` is silently ignored). TypeScript is the normal
|
|
24
|
-
authoring format.
|
|
22
|
+
All three read the same session event stream. Pick by the question you
|
|
23
|
+
are asking.
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
| You want to | Use |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| Gate one fixed input's behavior, locally and in CI | Evals (this page) |
|
|
28
|
+
| Observe every live session: metrics, audit, alerts | [Hooks](./reference/hooks.md) |
|
|
29
|
+
| Improve an agent one measured round at a time | [Hillclimbing](./hillclimbing.md); each kept win lands an eval |
|
|
30
|
+
|
|
31
|
+
[Hooks, channel events, or evals?](./reference/hooks.md#hooks-channel-events-or-evals)
|
|
32
|
+
has the side-by-side table.
|
|
33
|
+
|
|
34
|
+
### When not to write an eval
|
|
35
|
+
|
|
36
|
+
- Test a server tool's own logic with
|
|
37
|
+
`agent-sdk call <tool> --dir . --input '{...}'` or a unit test. No
|
|
38
|
+
model turn, no credential.
|
|
39
|
+
- Explore a prompt with `agent-sdk run --dir . --message "..."` and
|
|
40
|
+
read the trajectory. Write the eval once you know which decision to
|
|
41
|
+
gate.
|
|
42
|
+
- Stop a bad turn while it runs with
|
|
43
|
+
[`needsApproval`](./reference/tools.md#gate-a-tool-on-human-approval)
|
|
44
|
+
on the tool or `defineResult`. Evals grade
|
|
45
|
+
after the fact.
|
|
46
|
+
|
|
47
|
+
## Write your first eval
|
|
48
|
+
|
|
49
|
+
Evals live under the project-root `evals/` directory, a sibling of
|
|
50
|
+
`agent/`. `agent/evals/` is silently ignored. Discovery loads every
|
|
51
|
+
`.eval.ts` (or `.eval.js`) file under `evals/`, plus one config file.
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
my-agent/
|
|
55
|
+
agent/
|
|
56
|
+
agent.ts
|
|
57
|
+
tools/inspect_pr.ts
|
|
58
|
+
evals/
|
|
59
|
+
evals.config.ts # required to run: maxConcurrency
|
|
60
|
+
readiness.eval.ts # id: readiness
|
|
61
|
+
prs.eval.ts # cases: prs/checkout, prs/search
|
|
62
|
+
```
|
|
30
63
|
|
|
31
|
-
An eval is a single `async test(t)`. You drive the agent with `t`
|
|
32
|
-
assert on the run with the same `t`:
|
|
64
|
+
An eval is a single `async test(t)`. You drive the agent with `t.send`
|
|
65
|
+
and assert on the recorded run with the same `t`:
|
|
33
66
|
|
|
34
67
|
```ts
|
|
35
68
|
// evals/readiness.eval.ts
|
|
@@ -51,12 +84,49 @@ export default defineEval({
|
|
|
51
84
|
});
|
|
52
85
|
```
|
|
53
86
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
87
|
+
```ts
|
|
88
|
+
// evals/evals.config.ts
|
|
89
|
+
import { defineEvalConfig } from "@cursor/july/evals";
|
|
90
|
+
|
|
91
|
+
export default defineEvalConfig({ maxConcurrency: 20 });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Run it under Node 22.13 or newer (never Bun) with a Cursor credential
|
|
95
|
+
in place; see [Credentials](#credentials):
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
agent-sdk eval --dir . --list
|
|
99
|
+
agent-sdk eval --dir . readiness
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
PASS readiness (14.2s) — Inspects a PR without approving it.
|
|
104
|
+
✓ succeeded
|
|
105
|
+
✓ calledTool(inspect_pr)
|
|
106
|
+
✓ notCalledTool(approve_pr)
|
|
107
|
+
✓ check(includes)
|
|
108
|
+
|
|
109
|
+
1 passed, 0 failed, 1 total
|
|
110
|
+
artifacts: <project state directory>/evals/2026-09-11T15-02-11-402Z
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Every local run writes each case's assertions, inputs, tool calls, and
|
|
114
|
+
`t.log` lines under that artifacts directory. Open
|
|
115
|
+
`evals/<case-id>.json` there when a case fails; see
|
|
116
|
+
[Where results land](#where-results-land).
|
|
117
|
+
|
|
118
|
+
## Name cases by path
|
|
119
|
+
|
|
120
|
+
The file path is the eval's identity, so you don't author an id.
|
|
121
|
+
`evals/builds/api.eval.ts` becomes `builds/api`. An `index` filename
|
|
122
|
+
collapses to its directory: `evals/builds/index.eval.ts` becomes
|
|
123
|
+
`builds`.
|
|
124
|
+
|
|
125
|
+
One file can hold several datapoints through `cases`. Provide either
|
|
126
|
+
`test` or `cases`, not both. Each case id becomes `<fileId>/<case.id>`:
|
|
57
127
|
|
|
58
128
|
```ts
|
|
59
|
-
// evals/prs.eval.ts
|
|
129
|
+
// evals/prs.eval.ts: prs/checkout, prs/search
|
|
60
130
|
export default defineEval({
|
|
61
131
|
tags: ["smoke", "prs"],
|
|
62
132
|
cases: [
|
|
@@ -85,93 +155,75 @@ export default defineEval({
|
|
|
85
155
|
});
|
|
86
156
|
```
|
|
87
157
|
|
|
88
|
-
Case ids
|
|
89
|
-
|
|
90
|
-
`
|
|
91
|
-
datapoint
|
|
158
|
+
Case ids are single path segments, unique within the file. A case can
|
|
159
|
+
set its own `description`, `tags`, `timeoutMs`, `iterations`, `judge`,
|
|
160
|
+
`reporters`, and `metadata`. A case-level value replaces the file-level
|
|
161
|
+
one for that datapoint, except `metadata`, which merges with case keys
|
|
162
|
+
winning, and `reporters`, which adds to the file's list. `metadata` is
|
|
163
|
+
free-form data carried onto the result and every reporter.
|
|
164
|
+
|
|
165
|
+
A file may instead export an array of `defineEval` calls to fan out
|
|
166
|
+
over a dataset. Ids are then the file id plus a zero-padded index
|
|
167
|
+
(`sql/0000`, `sql/0001`, ...); see [Load a dataset](#load-a-dataset).
|
|
168
|
+
Prefer `cases` when datapoints are hand-written and deserve stable
|
|
169
|
+
names.
|
|
92
170
|
|
|
93
171
|
### Iterations
|
|
94
172
|
|
|
95
|
-
`iterations` (file or case, default `1`) runs a datapoint
|
|
96
|
-
Discovery expands `iterations: 3` on case `nyc` to runnable
|
|
97
|
-
`weather/nyc/1`, `weather/nyc/2`, `weather/nyc/3
|
|
98
|
-
`weather/nyc` still selects all three
|
|
99
|
-
`t.iteration`
|
|
173
|
+
`iterations` (file or case, default `1`, cap `100`) runs a datapoint
|
|
174
|
+
repeatedly. Discovery expands `iterations: 3` on case `nyc` to runnable
|
|
175
|
+
ids `weather/nyc/1`, `weather/nyc/2`, and `weather/nyc/3`. The filter
|
|
176
|
+
`weather/nyc` still selects all three. Each expanded case exposes
|
|
177
|
+
`t.iteration` and `t.iterations`.
|
|
100
178
|
|
|
101
|
-
`maxConcurrency` counts
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
`maxConcurrency: 20`
|
|
179
|
+
`maxConcurrency` counts authored datapoints, not expanded iterations.
|
|
180
|
+
Iterations of one datapoint share a concurrency slot and run in
|
|
181
|
+
sequence, so a suite of 11 cases with 3 iterations each and
|
|
182
|
+
`maxConcurrency: 20` has at most 11 cases in flight.
|
|
105
183
|
|
|
106
|
-
##
|
|
184
|
+
## Drive the agent with `t.send`
|
|
107
185
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
200. Existing projects use 20. Discovery with `eval --list` works
|
|
112
|
-
without this file, but running a case does not.
|
|
186
|
+
`t.send(message, options?)` runs one turn and waits for it to settle:
|
|
187
|
+
complete, park on an approval request, or fail. Several sends in one
|
|
188
|
+
case share the session, which is how you write multi-turn evals.
|
|
113
189
|
|
|
114
|
-
|
|
115
|
-
|
|
190
|
+
Each send resolves to a turn result: `message` (the assistant text),
|
|
191
|
+
`sessionId`, `events`, `toolCalls` (tool names in order), `ok`, and
|
|
192
|
+
`index`. The turn carries the same assertion vocabulary as `t`, scoped
|
|
193
|
+
to that turn, so you can grade an intermediate turn before the next
|
|
194
|
+
send overwrites `t.reply`. `turn.expectOk()` throws when the turn
|
|
195
|
+
failed, for later steps that depend on it.
|
|
116
196
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
197
|
+
Read the whole case with `t.reply` (last assistant text), `t.events`
|
|
198
|
+
(every event so far), `t.turns` (settled turns, oldest first), and
|
|
199
|
+
`t.sessionId`. `t.signal` aborts when the case hits its timeout; pass
|
|
200
|
+
it to your own async work.
|
|
201
|
+
|
|
202
|
+
Three options apply on the first send only, because they shape session
|
|
203
|
+
creation:
|
|
204
|
+
|
|
205
|
+
| Option | Effect |
|
|
206
|
+
| --- | --- |
|
|
207
|
+
| `workspaceFiles` | `{ path: contents }` seeded into the local session workspace. Prefer this over machine-local paths |
|
|
208
|
+
| `workspaceDir` | Absolute harness cwd for the local runtime |
|
|
209
|
+
| `cloud` | Per-session cloud options merged over the agent's static `cloud` config. Pin a fixture repo here for cloud evals instead of on the agent's default `cloud.repos`. On the cloud runtime, seeded files reach the agent as described under [Choose a runtime](./reference/agent-config.md#choose-a-runtime) |
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
await t.send("Review pr/diff.patch and post findings.", {
|
|
213
|
+
workspaceFiles: {
|
|
214
|
+
"pr/diff.patch": [
|
|
215
|
+
"diff --git a/app/routes/search.ts b/app/routes/search.ts",
|
|
216
|
+
"+res.send(`<h1>Results for ${req.query.q}</h1>`);",
|
|
217
|
+
].join("\n"),
|
|
218
|
+
},
|
|
123
219
|
});
|
|
124
220
|
```
|
|
125
221
|
|
|
126
|
-
|
|
127
|
-
project config `timeoutMs`, then the 180-second runner default.
|
|
222
|
+
## Assert over the trajectory
|
|
128
223
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| --- | --- | --- |
|
|
133
|
-
| `timeoutMs` | `180_000` | Project-wide per-case timeout |
|
|
134
|
-
| `judge` | unset | Default judge model for `t.judge.*`; see [Judge free-form output](#judge-free-form-output) |
|
|
135
|
-
| `reporters` | unset | Destinations that observe every case; `--skip-report` suppresses them |
|
|
136
|
-
| `maxPlaygroundRuns` | `20` | Max batches in the playground / `/v1/dev/evals*` history (not CLI `eval`). Hard-capped at 500. |
|
|
137
|
-
|
|
138
|
-
Reporters come from `@cursor/july/evals/reporters`: `JUnit` writes a
|
|
139
|
-
JUnit XML file for CI, `Artifacts` writes per-case files, and
|
|
140
|
-
`combineReporters` merges several into one (`renderJUnitXml` renders
|
|
141
|
-
the XML for a custom destination). A file or case can add its own
|
|
142
|
-
`reporters` on top of the config list.
|
|
143
|
-
|
|
144
|
-
Playground batches survive restarts whenever `agent/storage.ts` exists
|
|
145
|
-
with an `evals` table or a KV core providing `delete` and `list` (the
|
|
146
|
-
table is derived over the core); see
|
|
147
|
-
[Storage](./storage.md#eval-and-a-b-tables). Without storage they live
|
|
148
|
-
in process memory and disappear when `serve` exits. Navigating away
|
|
149
|
-
and back still works while the process is up.
|
|
150
|
-
|
|
151
|
-
## Drive and assert with `t`
|
|
152
|
-
|
|
153
|
-
`t` is both the driver and the assertion surface. You write ordinary
|
|
154
|
-
control flow, sending turns and asserting inline.
|
|
155
|
-
|
|
156
|
-
Drive the agent with `t.send(message, options?)`. It runs one turn and
|
|
157
|
-
waits for the session to park or fail. Multiple sends in one case share
|
|
158
|
-
the session, which is how you write multi-turn evals.
|
|
159
|
-
|
|
160
|
-
Each `t.send` resolves to a turn result with `message`,
|
|
161
|
-
`sessionId`, `events`, `toolCalls`, `ok`, and `index`. The turn carries
|
|
162
|
-
the same assertion vocabulary as `t`, scoped to that turn, so you can
|
|
163
|
-
grade an intermediate turn before the next send overwrites `t.reply`.
|
|
164
|
-
`turn.expectOk()` throws when the turn failed, for later
|
|
165
|
-
steps that depend on it.
|
|
166
|
-
|
|
167
|
-
Read the full case state with `t.reply` (the last assistant text),
|
|
168
|
-
`t.events` (session events captured so far), `t.turns` (settled
|
|
169
|
-
turns, oldest first), and `t.sessionId`. `t.signal` aborts when the
|
|
170
|
-
case hits its timeout; pass it to your own async work. A thrown
|
|
171
|
-
[turn result](./reference/result.md) `commit` fails the turn, so
|
|
172
|
-
`t.succeeded()` fails too.
|
|
173
|
-
|
|
174
|
-
Assert with the gates:
|
|
224
|
+
Assertions record; they never throw. One run reports every failure
|
|
225
|
+
instead of dying on the first. Assertions on `t` read the whole run.
|
|
226
|
+
Assertions on a turn read only that turn.
|
|
175
227
|
|
|
176
228
|
| Gate | Checks |
|
|
177
229
|
| --- | --- |
|
|
@@ -180,158 +232,483 @@ Assert with the gates:
|
|
|
180
232
|
| `t.messageIncludes(token)` | the joined assistant text matches a string or `RegExp` |
|
|
181
233
|
| `t.calledTool(name, matcher?)` | a matching call to `name` happened |
|
|
182
234
|
| `t.notCalledTool(name)` | no request for `name`, in any lifecycle state |
|
|
183
|
-
| `t.loadedSkill(name)` | the agent opened
|
|
184
|
-
| `t.toolOrder(names)` | tool requests appear in this relative order
|
|
235
|
+
| `t.loadedSkill(name)` | the agent opened `skills/<name>/SKILL.md` (read, grep, or shell `cat`) |
|
|
236
|
+
| `t.toolOrder(names)` | tool requests appear in this relative order; extra calls allowed |
|
|
185
237
|
| `t.usedNoTools()` | no tool calls at all |
|
|
186
238
|
| `t.maxToolCalls(max)` | at most `max` tool calls |
|
|
187
239
|
| `t.noFailedActions()` | no tool call reported an error |
|
|
188
240
|
| `t.calledSubagent(name, matcher?)` | a matching subagent delegation happened |
|
|
189
241
|
| `t.taggedArtifact(kind?, predicate?)` | at least one [artifact](./reference/artifacts.md) was tagged |
|
|
190
|
-
| `t.event(type, matcher?)` | at least one matching event of `type`
|
|
191
|
-
| `t.notEvent(type, matcher?)` | no matching event of `type`
|
|
242
|
+
| `t.event(type, matcher?)` | at least one matching [event](./reference/sessions.md#which-events-can-i-stream) of `type` |
|
|
243
|
+
| `t.notEvent(type, matcher?)` | no matching event of `type` |
|
|
192
244
|
| `t.eventOrder(matchers)` | matching event groups occur in this relative order |
|
|
193
245
|
| `t.eventsSatisfy(label, predicate)` | your predicate over the typed event stream |
|
|
194
|
-
| `t.check(value, expectation)` | any value, against a builder |
|
|
195
|
-
| `t.score(name, value)` |
|
|
196
|
-
|
|
197
|
-
|
|
246
|
+
| `t.check(value, expectation)` | any value, against a [builder](#grade-values-with-expectation-builders) |
|
|
247
|
+
| `t.score(name, value)` | a 0-1 score you computed; soft until you add a bar |
|
|
248
|
+
|
|
249
|
+
Three more assertions gate and return the matched fact. They stop the
|
|
250
|
+
test body when nothing matches, without a duplicate execution error.
|
|
251
|
+
`t.requireToolCall(name, matcher?)` returns the call so later code can
|
|
252
|
+
read its `input` and `output`. `t.requireInputRequest(filter?)` returns
|
|
253
|
+
the single pending approval request. `await t.require(value, expectation)`
|
|
254
|
+
does the same for a value check.
|
|
255
|
+
|
|
256
|
+
A case with no assertions passes when at least one turn completed. Add
|
|
257
|
+
`t.succeeded()` and behavior gates anyway. They make the contract
|
|
258
|
+
visible in review.
|
|
259
|
+
|
|
260
|
+
### What good cases assert
|
|
261
|
+
|
|
262
|
+
Gate decisions and shape, not prose. Model wording varies run to run.
|
|
263
|
+
Tool choice, tool avoidance, and output structure are the stable
|
|
264
|
+
contract.
|
|
265
|
+
|
|
266
|
+
1. `t.succeeded()`: always, first.
|
|
267
|
+
2. The tool decision: `calledTool` for the intended path,
|
|
268
|
+
`notCalledTool` for the likely wrong alternative. The pair is
|
|
269
|
+
stronger than either alone.
|
|
270
|
+
3. Output shape: a regex for the contract (`/ready|blocked/i`, a JSON
|
|
271
|
+
marker, a findings-block fence), never exact sentences.
|
|
272
|
+
4. For structured output, parse `t.reply` and check fields with
|
|
273
|
+
`matches` or `satisfies` instead of substring-matching JSON.
|
|
274
|
+
|
|
275
|
+
The common failure modes: asserting exact phrasing, packing more than
|
|
276
|
+
about five gates into one case (split it), and cases that depend on
|
|
277
|
+
live external state that drifts (pin the input).
|
|
198
278
|
|
|
199
|
-
|
|
200
|
-
`.atLeast(0.7)` adds a soft score bar, and `.gate(0.8)` promotes a
|
|
201
|
-
scored assertion into a hard gate.
|
|
279
|
+
### Narrow tool assertions with matchers
|
|
202
280
|
|
|
203
281
|
With no matcher, `calledTool` is request-based: a requested call counts
|
|
204
|
-
even
|
|
205
|
-
`t.calledTool("inspect_pr", { status: "completed" })` to require the
|
|
206
|
-
call to return. `input`, `output`, and `count` matcher fields accept a
|
|
207
|
-
literal, a `RegExp`, or a predicate.
|
|
208
|
-
|
|
209
|
-
The expectation builders are `includes(string | RegExp)`,
|
|
210
|
-
`equals(value)`, `matches(schema)`, `similarity(expected)`, and
|
|
211
|
-
`satisfies(predicate, label)`. `includes` stringifies its input,
|
|
212
|
-
`equals` compares values deeply, `matches` validates against a Standard
|
|
213
|
-
Schema (or anything with `safeParse`, like Zod), `similarity` scores
|
|
214
|
-
normalized text similarity, and `satisfies` runs your predicate. The
|
|
215
|
-
plain function `normalizedSimilarity(actual, expected)` returns the
|
|
216
|
-
same 0–1 score for use with `t.score`.
|
|
217
|
-
|
|
218
|
-
A few more context members shape a case: `t.require(value, expectation)`
|
|
219
|
-
records a gate and stops the test body when it fails, without a
|
|
220
|
-
duplicate execution error. `t.skip(reason)` ends the case as skipped
|
|
221
|
-
(reported separately, never changes the exit code; call it before
|
|
222
|
-
sending messages). `t.metric(name, value)` records a structured score
|
|
223
|
-
for the playground case card. `t.log(message)` records a debug line for
|
|
224
|
-
the CLI and playground result.
|
|
225
|
-
|
|
226
|
-
Three `t.send` options apply on session create (first `t.send` only):
|
|
227
|
-
|
|
228
|
-
- `workspaceFiles`: `{ path: contents }`, seeded into the local session
|
|
229
|
-
workspace. Prefer this over machine-local paths.
|
|
230
|
-
- `workspaceDir`: absolute harness cwd (local runtime).
|
|
231
|
-
- `cloud`: per-session cloud options merged over the agent's static
|
|
232
|
-
`cloud` config (repos / env / …). Use a pinned `repos` override to
|
|
233
|
-
attach a fixture repo for cloud evals without putting it on the
|
|
234
|
-
agent's default `cloud.repos`. Cloud ignores `workspaceFiles` seeds.
|
|
282
|
+
even before its result arrives. A matcher narrows it:
|
|
235
283
|
|
|
236
284
|
```ts
|
|
237
|
-
|
|
285
|
+
t.calledTool("inspect_pr", { status: "completed" });
|
|
286
|
+
t.calledTool("apply_agents", { input: { verdict: "update" } });
|
|
287
|
+
t.calledTool("bash", { input: { command: /^gh pr view/ }, count: 1 });
|
|
288
|
+
t.calledTool("read_file", {
|
|
289
|
+
output: (value) => String(value).includes("TODO"),
|
|
290
|
+
});
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
`input`, `output`, and `count` accept a literal, a `RegExp`, or a
|
|
294
|
+
predicate. Object literals partial-deep-match, so `{ verdict: "update" }`
|
|
295
|
+
matches arguments that also carry other keys. `status` is one of
|
|
296
|
+
`completed`, `failed`, `pending`, or `rejected` (a human denied the
|
|
297
|
+
approval). `calledSubagent` takes `{ output, status, count, callId }`.
|
|
298
|
+
`event`, `notEvent`, and `eventOrder` take `{ data, count }`.
|
|
299
|
+
|
|
300
|
+
### Grade values with expectation builders
|
|
301
|
+
|
|
302
|
+
`t.check(value, expectation)` grades any value: `t.reply`, a parsed
|
|
303
|
+
JSON field, a tool's output.
|
|
304
|
+
|
|
305
|
+
| Builder | Checks | Severity |
|
|
306
|
+
| --- | --- | --- |
|
|
307
|
+
| `includes(string \| RegExp)` | substring or match; structured values are stringified first | gate |
|
|
308
|
+
| `equals(value)` | deep equality | gate |
|
|
309
|
+
| `matches(schema)` | a Standard Schema (Zod, Valibot, ...) or anything with `safeParse` | gate |
|
|
310
|
+
| `similarity(expected)` | normalized text similarity, 0-1 | soft |
|
|
311
|
+
| `satisfies(predicate, label)` | your predicate; `label` is the failure detail | gate |
|
|
312
|
+
|
|
313
|
+
```ts
|
|
314
|
+
import { matches, satisfies } from "@cursor/july/evals";
|
|
315
|
+
import { z } from "zod";
|
|
316
|
+
|
|
317
|
+
const verdict = JSON.parse(t.reply ?? "{}");
|
|
238
318
|
t.check(
|
|
239
|
-
|
|
240
|
-
|
|
319
|
+
verdict,
|
|
320
|
+
matches(z.object({ ready: z.boolean(), blockers: z.array(z.string()) }))
|
|
321
|
+
);
|
|
322
|
+
t.check(
|
|
323
|
+
verdict.blockers.length,
|
|
324
|
+
satisfies((n) => (n as number) <= 3, "at most 3 blockers")
|
|
241
325
|
);
|
|
242
326
|
```
|
|
243
327
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
328
|
+
`normalizedSimilarity(actual, expected)` returns the same 0-1 score as
|
|
329
|
+
`similarity`, for use with `t.score`.
|
|
330
|
+
|
|
331
|
+
### Record without gating
|
|
247
332
|
|
|
248
|
-
|
|
333
|
+
- `t.metric(name, value)` records a structured score or label. It shows
|
|
334
|
+
on the CLI result, the playground case card, JUnit output, and
|
|
335
|
+
artifacts.
|
|
336
|
+
- `t.log(message)` records a debug line, streamed under `--verbose`.
|
|
337
|
+
- `t.skip(reason)` ends the case as skipped. Skipped cases report
|
|
338
|
+
separately and never change the exit code. Call it before sending
|
|
339
|
+
messages.
|
|
249
340
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
341
|
+
## Gates, soft scores, and verdicts
|
|
342
|
+
|
|
343
|
+
Every assertion returns a handle, so severity rides on the assertion
|
|
344
|
+
instead of a separate thresholds map:
|
|
345
|
+
|
|
346
|
+
```ts
|
|
347
|
+
t.succeeded(); // gate (default)
|
|
348
|
+
t.calledTool("get_weather").soft(); // tracked, never fails
|
|
349
|
+
t.check(t.reply, similarity("Sunny, 72°F")).atLeast(0.8); // soft, with a bar
|
|
350
|
+
t.judge.closedQA("cites a source").gate(0.8); // promoted to a gate
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
- `.gate(threshold?)` is hard. A miss fails the case and `eval` exits 1.
|
|
354
|
+
- `.soft(threshold?)` is tracked. With no threshold it never fails.
|
|
355
|
+
- `.atLeast(threshold)` is soft with a bar. A miss marks the case
|
|
356
|
+
`scored`.
|
|
357
|
+
|
|
358
|
+
Each case ends with one verdict:
|
|
359
|
+
|
|
360
|
+
| Verdict | Meaning | Exit code |
|
|
361
|
+
| --- | --- | --- |
|
|
362
|
+
| `passed` | every gate passed and no soft bar was missed | 0 |
|
|
363
|
+
| `failed` | a gate failed, or the test body threw | 1 |
|
|
364
|
+
| `scored` | only soft bars were missed | 0, or 1 under `--strict` |
|
|
365
|
+
| `skipped` | `t.skip(reason)`, or a judge with no credentials | 0 |
|
|
366
|
+
|
|
367
|
+
The CLI prints soft misses as `~` and gate misses as `✗`. Start a new
|
|
368
|
+
benchmark with `t.score("recall", recall)` and `.atLeast()` so its
|
|
369
|
+
number reports for a while without blocking merges. Add `--strict`
|
|
370
|
+
once the bars are trustworthy.
|
|
371
|
+
|
|
372
|
+
## Judge free-form output
|
|
373
|
+
|
|
374
|
+
When wording matters and no regex captures it, `t.judge` grades with an
|
|
375
|
+
LLM. The graders are `factuality(expected)`, `summarizes(expected)`,
|
|
376
|
+
`closedQA(criteria)`, and `sql(expected)`. Each scores `t.reply` by
|
|
377
|
+
default; pass `{ on }` to grade another value.
|
|
254
378
|
|
|
255
379
|
```ts
|
|
256
|
-
t.
|
|
380
|
+
const summary = await t.send("Why did CI fail on PR 42?");
|
|
381
|
+
t.judge.factuality("The lint step failed on src/sidebar.ts.").atLeast(0.7);
|
|
382
|
+
t.judge.closedQA("names the failing step", { on: summary.message }).gate(1);
|
|
257
383
|
```
|
|
258
384
|
|
|
259
385
|
Judge assertions are soft by default, so a judge never fails a build
|
|
260
|
-
until you give it a bar with `.atLeast(
|
|
261
|
-
|
|
386
|
+
until you give it a bar with `.atLeast()` or promote it with `.gate()`.
|
|
387
|
+
The recorded detail names the choice the judge made and its rationale.
|
|
388
|
+
|
|
389
|
+
The judge model comes from `defineEvalConfig({ judge })`,
|
|
262
390
|
`defineEval({ judge })`, a case-level `judge`, or a per-call
|
|
263
|
-
`{ model }
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
391
|
+
`{ model }`. The nearest one wins. A judge call with no model
|
|
392
|
+
configured fails the case. A judge that cannot reach a model (no
|
|
393
|
+
credential) ends the case as `skipped`, unless a deterministic gate
|
|
394
|
+
already failed.
|
|
395
|
+
|
|
396
|
+
For a domain-specific judge whose verdict is not a single score,
|
|
397
|
+
`t.judge.model(prompt)` sends a raw prompt to the same model and
|
|
398
|
+
returns the reply. Record the parsed result with `t.score` or
|
|
399
|
+
`t.check`. Anything derived from the agent under test is untrusted
|
|
400
|
+
input to your prompt: wrap it with `fenceUntrusted` and include
|
|
401
|
+
`EVAL_JUDGE_INJECTION_GUARD`, as the built-in graders do.
|
|
267
402
|
|
|
268
|
-
|
|
403
|
+
```ts
|
|
404
|
+
import {
|
|
405
|
+
EVAL_JUDGE_INJECTION_GUARD,
|
|
406
|
+
fenceUntrusted,
|
|
407
|
+
} from "@cursor/july/evals";
|
|
408
|
+
|
|
409
|
+
const gold = ["XSS in search.ts", "open redirect in login.ts"];
|
|
410
|
+
const reply = await t.judge.model(
|
|
411
|
+
[
|
|
412
|
+
"For each GOLD finding, answer whether SUBMISSION reports it.",
|
|
413
|
+
"Reply with one line per finding: <index> YES|NO.",
|
|
414
|
+
EVAL_JUDGE_INJECTION_GUARD,
|
|
415
|
+
fenceUntrusted("GOLD", gold.map((g, i) => `${i + 1}. ${g}`).join("\n")),
|
|
416
|
+
fenceUntrusted("SUBMISSION", t.reply ?? ""),
|
|
417
|
+
].join("\n\n")
|
|
418
|
+
);
|
|
419
|
+
const hits = reply.match(/\bYES\b/g)?.length ?? 0;
|
|
420
|
+
t.score("recall", hits / gold.length).atLeast(0.5);
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Keep side effects out of eval sessions
|
|
424
|
+
|
|
425
|
+
Eval sessions run the real agent, tools included. A reviewer that
|
|
426
|
+
comments on GitHub or posts to Slack will do so from an eval unless
|
|
427
|
+
the tool checks the session's purpose. Eval sessions carry
|
|
428
|
+
`purpose: "eval"`; live traffic carries `"live"`. Branch on it in the
|
|
429
|
+
tool, hook, or result handler that actuates:
|
|
430
|
+
|
|
431
|
+
```ts
|
|
432
|
+
// agent/tools/post_findings.ts
|
|
433
|
+
async execute({ findings }, ctx) {
|
|
434
|
+
if (ctx.session.purpose === "eval") {
|
|
435
|
+
return { posted: false, reason: "eval", count: findings.length };
|
|
436
|
+
}
|
|
437
|
+
// post the review
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
Return a shaped result instead of throwing, so the eval can still
|
|
442
|
+
assert `t.calledTool("post_findings", { input: ... })` on the decision.
|
|
443
|
+
The same check belongs in [hooks](./reference/hooks.md) that meter or
|
|
444
|
+
page and in `defineResult` commits.
|
|
445
|
+
|
|
446
|
+
## Worked examples
|
|
447
|
+
|
|
448
|
+
### Multi-turn: grade each turn
|
|
449
|
+
|
|
450
|
+
```ts
|
|
451
|
+
// evals/intro.eval.ts
|
|
452
|
+
import { defineEval, includes, satisfies } from "@cursor/july/evals";
|
|
453
|
+
|
|
454
|
+
export default defineEval({
|
|
455
|
+
description: "Introduces itself once; a repeat mention gets a short ack.",
|
|
456
|
+
async test(t) {
|
|
457
|
+
const intro = await t.send("Meet Jenny! @Jenny introduce yourself.");
|
|
458
|
+
intro.expectOk();
|
|
459
|
+
t.check(intro.message, includes(/jenny/i));
|
|
460
|
+
|
|
461
|
+
const repeat = await t.send("Meet, @Jenny!");
|
|
462
|
+
t.succeeded();
|
|
463
|
+
repeat.usedNoTools();
|
|
464
|
+
t.check(
|
|
465
|
+
repeat.message,
|
|
466
|
+
satisfies((r) => (r as string).trim().length <= 280, "short ack")
|
|
467
|
+
);
|
|
468
|
+
t.check(
|
|
469
|
+
repeat.message,
|
|
470
|
+
satisfies((r) => !/what i can do/i.test(r as string), "no second intro")
|
|
471
|
+
);
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
```
|
|
269
475
|
|
|
270
|
-
|
|
476
|
+
`t.succeeded()` grades the whole session. `repeat.usedNoTools()` and the
|
|
477
|
+
checks on `repeat.message` read only the second turn, even though
|
|
478
|
+
`t.reply` now holds its text.
|
|
271
479
|
|
|
272
|
-
|
|
273
|
-
|
|
480
|
+
### Approvals: assert the parked decision
|
|
481
|
+
|
|
482
|
+
For a tool with `needsApproval`, the turn parks instead of finishing.
|
|
483
|
+
Gate on `t.parked()` and on the arguments the model chose:
|
|
484
|
+
|
|
485
|
+
```ts
|
|
486
|
+
// evals/agents.eval.ts (one case; RULE and SLACK are fixture strings)
|
|
487
|
+
{
|
|
488
|
+
id: "update-rule",
|
|
489
|
+
description: "A repeated billing rule parks the AGENTS.md write.",
|
|
490
|
+
async test(t) {
|
|
491
|
+
await t.send("Weekly AGENTS.md review. Read week/ and call apply_agents once.", {
|
|
492
|
+
workspaceFiles: {
|
|
493
|
+
"week/prs.md": RULE,
|
|
494
|
+
"week/slack.md": SLACK,
|
|
495
|
+
"week/tree/AGENTS.md.txt": "# API\n\nKeep handlers thin.\n",
|
|
496
|
+
},
|
|
497
|
+
});
|
|
498
|
+
t.parked();
|
|
499
|
+
t.calledTool("apply_agents", { input: { verdict: "update" } });
|
|
500
|
+
},
|
|
501
|
+
},
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
`t.parked()` and `t.succeeded()` are exclusive: a parked run is a clean
|
|
505
|
+
stop on an unanswered approval, not a completed one. Pair the parked
|
|
506
|
+
case with a sibling that expects `verdict: "skip"` and `t.succeeded()`,
|
|
507
|
+
so both branches stay pinned.
|
|
508
|
+
|
|
509
|
+
## Pin fixtures
|
|
510
|
+
|
|
511
|
+
A fixed input is what makes an eval repeatable. Pick the fixture by the
|
|
512
|
+
surface under test.
|
|
513
|
+
|
|
514
|
+
| Agent surface | Fixture |
|
|
515
|
+
| --- | --- |
|
|
516
|
+
| Chat or domain assistant | One canonical prompt string, chosen once and frozen |
|
|
517
|
+
| Tool-heavy | Run `agent-sdk call <tool>` first to pin what the tool returns, then freeze the prompt that triggers it |
|
|
518
|
+
| GitHub webhook | `agent-sdk github replay <pr> --events '*' --dry-run --out fixtures/github` snapshots real payloads for offline replay ([GitHub guide](./guides/github.md#test-with-github-replay)) |
|
|
519
|
+
| PR reviewer with host preparation | Diff, metadata, and gold labels pinned to commit SHAs; keep any live PR matrix small |
|
|
520
|
+
| Workspace-dependent | `workspaceFiles` on the first `t.send`, never developer-machine paths |
|
|
521
|
+
|
|
522
|
+
Tag the fast, reliably passing core `smoke` and run `--tag smoke` in
|
|
523
|
+
the inner loop. Leave slow or drift-prone cases untagged for explicit
|
|
524
|
+
runs.
|
|
525
|
+
|
|
526
|
+
### Materialize API-backed fixtures
|
|
527
|
+
|
|
528
|
+
An input that only points at external data (a pull request URL, a
|
|
529
|
+
snapshot id, a pair of commit SHAs) is not self-contained. Fetch it once
|
|
530
|
+
and commit the rendered fixture before you expand the suite:
|
|
531
|
+
|
|
532
|
+
1. Save the diff, metadata, and labels under `fixtures/` at pinned
|
|
533
|
+
revisions.
|
|
534
|
+
2. Seed those files with `workspaceFiles`, or read them from the
|
|
535
|
+
fixture directory.
|
|
536
|
+
3. Assert decisions and output shape against the saved evidence.
|
|
537
|
+
4. Keep a small `smoke` subset for any remaining live checks.
|
|
538
|
+
|
|
539
|
+
`maxConcurrency` limits parallel datapoints, not the model or API
|
|
540
|
+
fan-out inside one datapoint. Materialized fixtures keep a large suite
|
|
541
|
+
from exhausting provider and GitHub rate limits.
|
|
542
|
+
|
|
543
|
+
### Load a dataset
|
|
544
|
+
|
|
545
|
+
Read committed fixtures with `loadJson`, `loadJsonl`, and `loadYaml`
|
|
546
|
+
from `@cursor/july/evals/loaders`. Relative paths resolve against the
|
|
547
|
+
project root the runner discovered, not the cwd the CLI ran from. Eval
|
|
548
|
+
files are ES modules, so top-level `await` can load a dataset and fan
|
|
549
|
+
one file out over it:
|
|
550
|
+
|
|
551
|
+
```ts
|
|
552
|
+
// evals/sql.eval.ts: sql/0000, sql/0001, ...
|
|
553
|
+
import { defineEval, equals } from "@cursor/july/evals";
|
|
554
|
+
import { loadYaml } from "@cursor/july/evals/loaders";
|
|
555
|
+
|
|
556
|
+
const rows = await loadYaml<{ task: string; prompt: string; sql: string }[]>(
|
|
557
|
+
"evals/data/cases.yaml"
|
|
558
|
+
);
|
|
559
|
+
|
|
560
|
+
export default rows.map((row) =>
|
|
561
|
+
defineEval({
|
|
562
|
+
description: row.task,
|
|
563
|
+
async test(t) {
|
|
564
|
+
await t.send(row.prompt);
|
|
565
|
+
t.succeeded();
|
|
566
|
+
t.check(t.reply, equals(row.sql));
|
|
567
|
+
},
|
|
568
|
+
})
|
|
569
|
+
);
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
## Configure eval runs
|
|
573
|
+
|
|
574
|
+
`evals/evals.config.ts` (or `.js`) holds project-wide defaults. It must
|
|
575
|
+
set `maxConcurrency`. Each case issues real model requests, so
|
|
576
|
+
concurrency is hard-capped at 200; the templates use 10.
|
|
577
|
+
`eval --list` works without the file. Running a case does not.
|
|
578
|
+
|
|
579
|
+
```ts
|
|
580
|
+
import { defineEvalConfig } from "@cursor/july/evals";
|
|
581
|
+
|
|
582
|
+
export default defineEvalConfig({
|
|
583
|
+
maxConcurrency: 20,
|
|
584
|
+
timeoutMs: 180_000,
|
|
585
|
+
judge: { model: "gpt-5.4-mini" },
|
|
586
|
+
});
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
| Option | Default | Meaning |
|
|
590
|
+
| --- | --- | --- |
|
|
591
|
+
| `maxConcurrency` | required | Datapoints in flight at once, 1-200 |
|
|
592
|
+
| `timeoutMs` | `180_000` | Per-case timeout. Precedence: case or file `timeoutMs`, then `--timeout-ms`, then this value |
|
|
593
|
+
| `judge` | unset | Default judge model for `t.judge.*` |
|
|
594
|
+
| `reporters` | unset | Destinations that observe every case; `--skip-report` suppresses them |
|
|
595
|
+
| `maxPlaygroundRuns` | `20` | Batches kept in playground history (cap 500). Counts `--prod` and `--url` batches, not the default local run |
|
|
596
|
+
|
|
597
|
+
Reporters ship results somewhere; the runner still does the grading.
|
|
598
|
+
`JUnit({ filePath, suiteName? })` writes JUnit XML and
|
|
599
|
+
`Artifacts({ dir })` writes per-case files, both from
|
|
600
|
+
`@cursor/july/evals/reporters`. A custom reporter is an object with any
|
|
601
|
+
of `onRunStart`, `onEvalComplete`, and `onRunComplete`. A reporter that
|
|
602
|
+
throws is logged and never fails the run. CI usually attaches the
|
|
603
|
+
built-in two with `--junit` and `--artifacts` instead of `reporters`,
|
|
604
|
+
so output paths stay with the pipeline, not the eval author.
|
|
605
|
+
|
|
606
|
+
Playground batches survive restarts when the project configures
|
|
607
|
+
durable storage. Otherwise they live in process
|
|
608
|
+
memory until `serve` exits.
|
|
609
|
+
|
|
610
|
+
## Run evals from the CLI
|
|
274
611
|
|
|
275
612
|
```bash
|
|
276
|
-
agent-sdk eval --dir . --list
|
|
277
|
-
agent-sdk eval --dir .
|
|
278
|
-
agent-sdk eval --dir . builds/checkout
|
|
279
|
-
agent-sdk eval --dir . builds search
|
|
280
|
-
agent-sdk eval --dir . --tag smoke --tag pull-request
|
|
281
|
-
agent-sdk eval --dir . --
|
|
282
|
-
agent-sdk eval --dir . --
|
|
613
|
+
agent-sdk eval --dir . --list # discover only
|
|
614
|
+
agent-sdk eval --dir . # run all
|
|
615
|
+
agent-sdk eval --dir . builds/checkout # one datapoint
|
|
616
|
+
agent-sdk eval --dir . builds search # several ids or prefixes
|
|
617
|
+
agent-sdk eval --dir . --tag smoke --tag pull-request # any matching tag
|
|
618
|
+
agent-sdk eval --dir . --verbose # t.log lines + reply snippets
|
|
619
|
+
agent-sdk eval --dir . --timeout-ms 300000 # override the per-case timeout
|
|
283
620
|
```
|
|
284
621
|
|
|
285
622
|
Id filters use OR semantics. Each filter selects an exact id and its
|
|
286
|
-
descendants
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
a
|
|
623
|
+
descendants: `builds` selects `builds`, `builds/checkout`, and every
|
|
624
|
+
other case below that path. Repeated tags also use OR. With both ids
|
|
625
|
+
and tags, a case must match both groups.
|
|
626
|
+
|
|
627
|
+
By default `eval` boots a throwaway server with its own state root, so
|
|
628
|
+
cases don't inherit your checkout's `AGENTS.md` and session state stays
|
|
629
|
+
out of the project. Artifacts still land in the project state
|
|
630
|
+
directory; see [Where results land](#where-results-land). `--slug`
|
|
631
|
+
picks the target in a multi-agent directory.
|
|
632
|
+
|
|
633
|
+
`--url` runs the batch on a running server instead, the same way
|
|
634
|
+
`--prod` does: that server discovers its own `evals/`, results land in
|
|
635
|
+
its playground history, and the local-only flags (`--junit`,
|
|
636
|
+
`--artifacts`, `--max-concurrency`, `--skip-report`) do not apply. See
|
|
637
|
+
[Run evals in the playground or on a deployment](#run-evals-in-the-playground-or-on-a-deployment).
|
|
295
638
|
|
|
296
639
|
```bash
|
|
297
|
-
agent-sdk eval --
|
|
298
|
-
--url http://127.0.0.1:3000/weather-agent \
|
|
640
|
+
agent-sdk eval --url http://127.0.0.1:3000/weather-agent \
|
|
299
641
|
--bearer-token "$AGENT_TOKEN"
|
|
300
642
|
```
|
|
301
643
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
`--state-root` to keep ephemeral session state at a chosen path,
|
|
306
|
-
`--timeout-ms` to override the project timeout, and `--no-stream` to
|
|
307
|
-
keep live progress off stderr. A TTY streams turn progress by default.
|
|
308
|
-
`--verbose` still writes `t.log` lines to stderr and adds reply snippets
|
|
309
|
-
to text results.
|
|
644
|
+
See [CLI: eval](./reference/cli.md#eval) for every flag.
|
|
645
|
+
|
|
646
|
+
### Credentials
|
|
310
647
|
|
|
311
|
-
Model turns need a
|
|
312
|
-
|
|
313
|
-
`CURSOR_SERVICE_ACCOUNT_KEY`,
|
|
648
|
+
Model turns need a
|
|
649
|
+
[Cursor credential](./reference/cli.md#environment-variables):
|
|
650
|
+
`CURSOR_API_KEY`, `CURSOR_SERVICE_ACCOUNT_KEY`, or a saved
|
|
651
|
+
`agent-sdk login`. The judge uses the same one. `eval --list` needs
|
|
652
|
+
none.
|
|
314
653
|
|
|
315
|
-
|
|
654
|
+
### Where results land
|
|
316
655
|
|
|
317
|
-
|
|
656
|
+
Every local run writes artifacts to a timestamped directory under
|
|
657
|
+
`evals/` in the project state directory, whatever `--state-root` says.
|
|
658
|
+
`--artifacts <dir>` chooses the path and `--no-artifacts` skips them.
|
|
659
|
+
The directory holds `summary.json`,
|
|
660
|
+
`results.jsonl`, and `evals/<case-id>.json` with every assertion, the
|
|
661
|
+
inputs, tool calls with arguments and output, the final text, and
|
|
662
|
+
`t.log` lines. Start there when a case fails. `--out <file>` also
|
|
663
|
+
writes the full results JSON to a path of your choice.
|
|
318
664
|
|
|
319
|
-
|
|
320
|
-
|
|
665
|
+
The artifact does not include the session's event stream. Pass
|
|
666
|
+
`--state-root <path>` to keep the ephemeral server's
|
|
667
|
+
[session data](./reference/sessions.md#where-does-the-agent-sdk-store-session-data)
|
|
668
|
+
on disk when you need the raw events.
|
|
669
|
+
|
|
670
|
+
## Run evals in CI
|
|
671
|
+
|
|
672
|
+
Run the suite non-interactively, write JUnit for the CI annotations,
|
|
673
|
+
and fail the job on a red gate:
|
|
674
|
+
|
|
675
|
+
```bash
|
|
676
|
+
# CURSOR_API_KEY comes from the CI secret store
|
|
677
|
+
agent-sdk eval --dir . --json --no-stream \
|
|
678
|
+
--junit reports/evals.xml \
|
|
679
|
+
--artifacts reports/evals \
|
|
680
|
+
> reports/evals.json
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
The exit code follows the
|
|
684
|
+
[verdict table](#gates-soft-scores-and-verdicts); `2` means nothing
|
|
685
|
+
matched the selection. `--max-concurrency` overrides the project
|
|
686
|
+
setting, for example to run lower on a shared runner.
|
|
687
|
+
|
|
688
|
+
The JSON on stdout carries the totals and one result per case:
|
|
321
689
|
|
|
322
690
|
```json
|
|
323
691
|
{
|
|
324
692
|
"ok": true,
|
|
325
693
|
"passed": 1,
|
|
326
694
|
"failed": 0,
|
|
695
|
+
"scored": 0,
|
|
696
|
+
"skipped": 0,
|
|
697
|
+
"strict": false,
|
|
698
|
+
"artifactsDir": "/work/my-agent/reports/evals",
|
|
327
699
|
"results": [
|
|
328
700
|
{
|
|
329
701
|
"id": "readiness",
|
|
702
|
+
"verdict": "passed",
|
|
330
703
|
"ok": true,
|
|
331
|
-
"assertions": [
|
|
704
|
+
"assertions": [
|
|
705
|
+
{ "name": "succeeded", "passed": true },
|
|
706
|
+
{ "name": "calledTool(inspect_pr)", "passed": true }
|
|
707
|
+
],
|
|
332
708
|
"sessionId": "ses_123",
|
|
333
|
-
"inputs": ["Is checkout
|
|
709
|
+
"inputs": ["Is https://github.com/acme/checkout/pull/42 ready to approve?"],
|
|
334
710
|
"toolCalls": [{ "toolName": "inspect_pr", "isError": false }],
|
|
711
|
+
"metrics": {},
|
|
335
712
|
"logs": [],
|
|
336
713
|
"durationMs": 12340
|
|
337
714
|
}
|
|
@@ -339,126 +716,64 @@ the totals and one result per case:
|
|
|
339
716
|
}
|
|
340
717
|
```
|
|
341
718
|
|
|
342
|
-
Each
|
|
343
|
-
`error`, and tool
|
|
344
|
-
|
|
719
|
+
Each result can also include `description`, `finalText`, `tools`,
|
|
720
|
+
`error`, `skipReason`, `metadata`, `tags`, and tool `args` and `output`.
|
|
721
|
+
A soft miss shows as `"severity": "soft"` with `score` and `threshold`
|
|
722
|
+
on the assertion. This shape lets CI report the failed assertion
|
|
723
|
+
without parsing terminal text.
|
|
724
|
+
|
|
725
|
+
Keep CI green without weakening gates:
|
|
726
|
+
|
|
727
|
+
- Run `--tag smoke` on every push and the full suite on a schedule.
|
|
728
|
+
- For probabilistic behavior, use `iterations` and a soft bar instead
|
|
729
|
+
of one hard gate.
|
|
345
730
|
|
|
346
|
-
## Run evals in the playground
|
|
731
|
+
## Run evals in the playground or on a deployment
|
|
347
732
|
|
|
348
|
-
Start the server, open the playground, and choose **Evals**.
|
|
349
|
-
|
|
350
|
-
|
|
733
|
+
Start the server, open the playground, and choose **Evals**. Run every
|
|
734
|
+
case or one case, watch progress, and open the resulting session trace.
|
|
735
|
+
Playground runs target the live server instead of an ephemeral one, so
|
|
736
|
+
their sessions appear in the session list. One batch runs at a time.
|
|
351
737
|
|
|
352
738
|
```bash
|
|
353
739
|
agent-sdk serve --dir .
|
|
354
740
|
```
|
|
355
741
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
[Configure eval runs](#configure-eval-runs). See
|
|
360
|
-
[Playground eval routes](./reference/http-api.md#playground-eval-routes).
|
|
361
|
-
The start request returns `202` while cases run in the background.
|
|
362
|
-
Poll until the snapshot status becomes `completed`, `failed`, or `cancelled`.
|
|
363
|
-
Configuration errors appear on a failed snapshot.
|
|
364
|
-
|
|
365
|
-
On `--prod` / `--url`, the CLI prints the Eval ID as soon as the batch is
|
|
366
|
-
accepted (and a Playground deep link with `?view=evals&evalRunId=…`):
|
|
742
|
+
`--prod` (or `--url`) starts the same server-side batch on the team's
|
|
743
|
+
hosted deployment (or the server you name), so results land in that
|
|
744
|
+
server's playground history:
|
|
367
745
|
|
|
368
746
|
```bash
|
|
369
747
|
agent-sdk eval --prod --slug vulnerability-scanner --tag deepsec
|
|
370
|
-
# Eval ID:
|
|
371
|
-
#
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
agent-sdk eval cancel evalrun_… --prod --slug vulnerability-scanner
|
|
375
|
-
agent-sdk eval status evalrun_… --prod --slug vulnerability-scanner
|
|
748
|
+
# Eval ID: <evalId>
|
|
749
|
+
# Playground: <deployment>/playground?view=evals&evalRunId=<evalId>
|
|
750
|
+
agent-sdk eval status <evalId> --prod --slug vulnerability-scanner
|
|
751
|
+
agent-sdk eval cancel <evalId> --prod --slug vulnerability-scanner
|
|
376
752
|
```
|
|
377
753
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
1. `t.succeeded()`: always, first.
|
|
385
|
-
2. The tool decision: `calledTool` for the intended path,
|
|
386
|
-
`notCalledTool` for the likely wrong alternative. The pair is
|
|
387
|
-
stronger than either alone.
|
|
388
|
-
3. Output shape: a regex for the contract (`/ready|blocked/i`, a JSON
|
|
389
|
-
marker, a findings-block fence), never exact sentences.
|
|
390
|
-
4. For structured output, parse `t.reply` and check fields with
|
|
391
|
-
`satisfies` instead of substring-matching JSON.
|
|
392
|
-
|
|
393
|
-
The common failure modes: asserting exact phrasing, packing more than
|
|
394
|
-
about five gates into one case (split it), and cases that depend on live
|
|
395
|
-
external state that drifts (pin the input; see fixtures).
|
|
396
|
-
|
|
397
|
-
## Pick fixtures by agent type
|
|
398
|
-
|
|
399
|
-
The right fixture depends on the surface under test.
|
|
400
|
-
|
|
401
|
-
| Agent surface | Fixture |
|
|
402
|
-
| --- | --- |
|
|
403
|
-
| Chat / domain assistant | A canonical prompt string, chosen once and frozen |
|
|
404
|
-
| Tool-heavy | Run `agent-sdk call <tool>` first to pin what the tool returns, then freeze the prompt that triggers it |
|
|
405
|
-
| GitHub webhook | `agent-sdk github replay <pr> --events '*' --dry-run --out fixtures/github` snapshots real payloads for offline replay ([GitHub guide](./guides/github.md)) |
|
|
406
|
-
| PR reviewer with host preparation | Diff, metadata, and gold labels pinned to commit SHAs; keep any live PR matrix small |
|
|
407
|
-
| Workspace-dependent | `workspaceFiles` in `t.send` options, never developer-machine paths |
|
|
408
|
-
|
|
409
|
-
Tag the fast, reliably passing core `smoke` and run `--tag smoke` in the
|
|
410
|
-
inner loop. Leave slow or flaky-prone cases untagged for explicit runs.
|
|
411
|
-
|
|
412
|
-
### Materialize API-backed fixtures
|
|
413
|
-
|
|
414
|
-
An input that only points at external data, such as a pull request URL,
|
|
415
|
-
snapshot id, or pair of commit SHAs, is not self-contained. Fetch it
|
|
416
|
-
once and commit the rendered fixture before you expand the suite.
|
|
417
|
-
|
|
418
|
-
1. Save the diff, metadata, and labels under `fixtures/` at pinned
|
|
419
|
-
revisions.
|
|
420
|
-
2. Seed those files with `workspaceFiles`, or read them from the fixture
|
|
421
|
-
directory.
|
|
422
|
-
3. Assert decisions and output shape against the saved evidence.
|
|
423
|
-
4. Keep a small `smoke` subset for any remaining live pipeline checks.
|
|
424
|
-
|
|
425
|
-
Read committed fixtures with `@cursor/july/evals/loaders`: `loadJson`,
|
|
426
|
-
`loadJsonl`, and `loadYaml` resolve relative paths against the project
|
|
427
|
-
root the runner discovered, not the cwd the CLI was invoked from
|
|
428
|
-
(`resolveFixturePath` and `evalFixtureRoot` expose the same
|
|
429
|
-
resolution for other file formats).
|
|
430
|
-
|
|
431
|
-
`maxConcurrency` limits parallel datapoints. It does not limit model or
|
|
432
|
-
API fan-out inside one datapoint. Materialized fixtures prevent a large
|
|
433
|
-
suite from exhausting provider and GitHub rate limits. The
|
|
434
|
-
[evals skill](./skills/evals.md) has the full fixture workflow.
|
|
754
|
+
The CLI prints the Eval ID as soon as the batch is accepted. Pass
|
|
755
|
+
`--no-wait` to return right away and poll with `eval status` later; it
|
|
756
|
+
exits `3` while the batch is still running. Hosted history follows
|
|
757
|
+
`maxPlaygroundRuns` and the persistence rule under
|
|
758
|
+
[Configure eval runs](#configure-eval-runs). The HTTP surface is under
|
|
759
|
+
[Playground eval routes](./reference/http-api.md#playground-eval-routes).
|
|
435
760
|
|
|
436
761
|
## Keep improvements with regression evals
|
|
437
762
|
|
|
438
|
-
Every [hillclimb](./hillclimbing.md) round that keeps a change must
|
|
439
|
-
an eval that would have failed before the change. If you can't
|
|
440
|
-
the improvement as a gate (a `calledTool` shift, a bounded
|
|
441
|
-
`
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
The rule cuts the other way too: never weaken an existing gate to make a
|
|
445
|
-
round pass. That's the freeze line moving, and it turns your regression
|
|
446
|
-
suite into a list of checks that no longer protect anything.
|
|
447
|
-
|
|
448
|
-
## Compare variants on live traffic
|
|
763
|
+
Every [hillclimb](./hillclimbing.md) round that keeps a change must
|
|
764
|
+
land an eval that would have failed before the change. If you can't
|
|
765
|
+
express the improvement as a gate (a `calledTool` shift, a bounded
|
|
766
|
+
`maxToolCalls`, an output-shape check), the improvement is unverified,
|
|
767
|
+
and it'll regress silently.
|
|
449
768
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
regression
|
|
453
|
-
See [Live A/B metrics](./ab.md) for assignment, behavior, collection,
|
|
454
|
-
and inspection.
|
|
769
|
+
The rule cuts the other way too: never weaken an existing gate to make
|
|
770
|
+
a round pass. That's the freeze line moving, and it turns your
|
|
771
|
+
regression suite into a list of checks that no longer protect anything.
|
|
455
772
|
|
|
456
773
|
## What's next
|
|
457
774
|
|
|
458
775
|
Continue with these pages:
|
|
459
776
|
|
|
460
|
-
- [Live A/B metrics](./ab.md): sticky variants and cumulative metrics
|
|
461
|
-
on live sessions
|
|
462
777
|
- [Hillclimbing](./hillclimbing.md): the loop evals make trustworthy
|
|
463
778
|
- [Building agents with agents](./building-with-agents.md): have a
|
|
464
779
|
coding agent write the first suite
|