@cursor/july 0.1.35 → 0.1.37

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.
Files changed (198) hide show
  1. package/AGENTS.md +5 -9
  2. package/README.md +5 -9
  3. package/dist/channels/github/github-channel.d.ts +1 -1
  4. package/dist/channels/github/github-channel.js +1 -1
  5. package/dist/channels/github/index.d.ts +1 -1
  6. package/dist/channels/github/index.js +1 -1
  7. package/dist/channels/slack/api.js +1 -1
  8. package/dist/channels/slack/index.d.ts +1 -1
  9. package/dist/channels/slack/index.js +1 -1
  10. package/dist/channels/slack/init.d.ts.map +1 -1
  11. package/dist/channels/slack/init.js +2 -1
  12. package/dist/docs/404.html +2 -2
  13. package/dist/docs/ab.html +8 -17
  14. package/dist/docs/assets/{ab.md.DAQoJ-up.js → ab.md.6cLOW7--.js} +4 -13
  15. package/dist/docs/assets/{ab.md.DAQoJ-up.lean.js → ab.md.6cLOW7--.lean.js} +1 -1
  16. package/dist/docs/assets/{app.D5Mv1T0U.js → app.Bu9SRvZ9.js} +1 -1
  17. package/dist/docs/assets/{building-with-agents.md.CnHqvYDd.js → building-with-agents.md.txrcGU2B.js} +2 -2
  18. package/dist/docs/assets/chunks/@localSearchIndexroot.pVFW7oJd.js +1 -0
  19. package/dist/docs/assets/chunks/{VPLocalSearchBox.CMq_BQce.js → VPLocalSearchBox.D9u9czHO.js} +1 -1
  20. package/dist/docs/assets/chunks/{theme.C6D9UPLK.js → theme.Bc61GzOf.js} +2 -2
  21. package/dist/docs/assets/{concepts.md.DFaQEFkA.js → concepts.md.CqOsxbMU.js} +1 -1
  22. package/dist/docs/assets/{deployment.md.9MYBuKM1.js → deployment.md.CuK5SNjN.js} +1 -1
  23. package/dist/docs/assets/{evals.md.BIUoVZ6X.js → evals.md.BQXI3rXy.js} +9 -15
  24. package/dist/docs/assets/{evals.md.BIUoVZ6X.lean.js → evals.md.BQXI3rXy.lean.js} +1 -1
  25. package/dist/docs/assets/{example-agents_approval-buddy.md.BhEfleVx.js → example-agents_approval-buddy.md.CIiZ9coo.js} +1 -1
  26. package/dist/docs/assets/{example-agents_benny.md.2Et1qa8f.js → example-agents_benny.md.l7JTmm8X.js} +1 -1
  27. package/dist/docs/assets/{example-agents_bugbot.md.ByUexi5i.js → example-agents_bugbot.md.Dp5JqHSQ.js} +2 -2
  28. package/dist/docs/assets/{example-agents_bugbot.md.ByUexi5i.lean.js → example-agents_bugbot.md.Dp5JqHSQ.lean.js} +1 -1
  29. package/dist/docs/assets/{example-agents_codebase-wiki.md.B4y-7ZVW.js → example-agents_codebase-wiki.md.D-lteFf0.js} +1 -1
  30. package/dist/docs/assets/{example-agents_codebase-wiki.md.B4y-7ZVW.lean.js → example-agents_codebase-wiki.md.D-lteFf0.lean.js} +1 -1
  31. package/dist/docs/assets/{example-agents_codeowners-review.md.D6ay4nvf.js → example-agents_codeowners-review.md.BU2ZXLf-.js} +1 -1
  32. package/dist/docs/assets/{example-agents_codeowners-review.md.D6ay4nvf.lean.js → example-agents_codeowners-review.md.BU2ZXLf-.lean.js} +1 -1
  33. package/dist/docs/assets/{example-agents_concierge.md.lL8rhYlj.js → example-agents_concierge.md.DA2al_NK.js} +2 -2
  34. package/dist/docs/assets/{example-agents_concierge.md.lL8rhYlj.lean.js → example-agents_concierge.md.DA2al_NK.lean.js} +1 -1
  35. package/dist/docs/assets/{example-agents_fsd.md.DfNKQTHz.js → example-agents_fsd.md.DPz9ezO4.js} +1 -1
  36. package/dist/docs/assets/{example-agents_knowledge-base.md.CzyZ2DCr.js → example-agents_knowledge-base.md.IneynQSR.js} +1 -1
  37. package/dist/docs/assets/{example-agents_oncall.md.wFFXXEyW.js → example-agents_oncall.md.ZE0n6ZFN.js} +1 -1
  38. package/dist/docs/assets/{example-agents_slack-agent.md.DvgvT4nn.js → example-agents_slack-agent.md.06jQXTAI.js} +1 -1
  39. package/dist/docs/assets/{example-agents_weather-agent.md.BADkPqxQ.js → example-agents_weather-agent.md.CrGZ0SqR.js} +3 -3
  40. package/dist/docs/assets/{example-agents_weather-agent.md.BADkPqxQ.lean.js → example-agents_weather-agent.md.CrGZ0SqR.lean.js} +1 -1
  41. package/dist/docs/assets/guides_cloud-runtime.md.V5igN4Sq.js +9 -0
  42. package/dist/docs/assets/guides_cloud-runtime.md.V5igN4Sq.lean.js +1 -0
  43. package/dist/docs/assets/{guides_webhooks.md.DiAwSR42.js → guides_webhooks.md.BERuBSJW.js} +1 -1
  44. package/dist/docs/assets/{hillclimbing.md.D9Y1_bYh.js → hillclimbing.md.yXqdlv2R.js} +1 -1
  45. package/dist/docs/assets/index.md.CmhptOmN.js +24 -0
  46. package/dist/docs/assets/{index.md.CZqbBJPB.lean.js → index.md.CmhptOmN.lean.js} +1 -1
  47. package/dist/docs/assets/{quickstart.md.TnEXYgYW.js → quickstart.md.C_b6ESpD.js} +7 -4
  48. package/dist/docs/assets/{quickstart.md.TnEXYgYW.lean.js → quickstart.md.C_b6ESpD.lean.js} +1 -1
  49. package/dist/docs/assets/{reference_agent-config.md.kuN6-OxK.js → reference_agent-config.md.CRmkoxd6.js} +6 -4
  50. package/dist/docs/assets/{reference_agent-config.md.kuN6-OxK.lean.js → reference_agent-config.md.CRmkoxd6.lean.js} +1 -1
  51. package/dist/docs/assets/reference_artifacts.md.BGG4bZo-.js +19 -0
  52. package/dist/docs/assets/reference_artifacts.md.BGG4bZo-.lean.js +1 -0
  53. package/dist/docs/assets/{reference_channels.md.CDhTRfUz.js → reference_channels.md.BIabFUAI.js} +2 -2
  54. package/dist/docs/assets/{reference_channels.md.CDhTRfUz.lean.js → reference_channels.md.BIabFUAI.lean.js} +1 -1
  55. package/dist/docs/assets/{reference_cli.md.sD-IUWjg.js → reference_cli.md.Byvrg8eu.js} +15 -9
  56. package/dist/docs/assets/{reference_cli.md.sD-IUWjg.lean.js → reference_cli.md.Byvrg8eu.lean.js} +1 -1
  57. package/dist/docs/assets/{reference_hooks.md.DyLVfE1O.js → reference_hooks.md.BGDw4VLm.js} +2 -2
  58. package/dist/docs/assets/{reference_hooks.md.DyLVfE1O.lean.js → reference_hooks.md.BGDw4VLm.lean.js} +1 -1
  59. package/dist/docs/assets/reference_http-api.md.DGrw_wOu.js +11 -0
  60. package/dist/docs/assets/reference_http-api.md.DGrw_wOu.lean.js +1 -0
  61. package/dist/docs/assets/{reference_project-layout.md.D8E6ZmHJ.js → reference_project-layout.md._XdeMahr.js} +2 -2
  62. package/dist/docs/assets/{reference_project-layout.md.D8E6ZmHJ.lean.js → reference_project-layout.md._XdeMahr.lean.js} +1 -1
  63. package/dist/docs/assets/{reference_sessions.md.C_ouF_uf.js → reference_sessions.md.DBVFi2Sx.js} +2 -2
  64. package/dist/docs/assets/{reference_subagents.md.zWAMNfi1.js → reference_subagents.md.DSrGLIuB.js} +2 -2
  65. package/dist/docs/assets/{reference_subagents.md.zWAMNfi1.lean.js → reference_subagents.md.DSrGLIuB.lean.js} +1 -1
  66. package/dist/docs/assets/{reference_tools.md.BswAQM41.js → reference_tools.md.lSrsTxYJ.js} +4 -4
  67. package/dist/docs/assets/{reference_tools.md.BswAQM41.lean.js → reference_tools.md.lSrsTxYJ.lean.js} +1 -1
  68. package/dist/docs/assets/scaffolding-agents.md.mkc3B_ZW.js +1 -0
  69. package/dist/docs/assets/{scaffolding-agents.md.Bsr9Pwzu.lean.js → scaffolding-agents.md.mkc3B_ZW.lean.js} +1 -1
  70. package/dist/docs/assets/{storage.md.xZoiGM58.js → storage.md.mQDtIULc.js} +3 -3
  71. package/dist/docs/assets/{storage.md.xZoiGM58.lean.js → storage.md.mQDtIULc.lean.js} +1 -1
  72. package/dist/docs/building-with-agents.html +6 -6
  73. package/dist/docs/concepts.html +5 -5
  74. package/dist/docs/deployment.html +6 -6
  75. package/dist/docs/evals.html +13 -19
  76. package/dist/docs/example-agents/approval-buddy.html +5 -5
  77. package/dist/docs/example-agents/benny.html +5 -5
  78. package/dist/docs/example-agents/bugbot.html +5 -5
  79. package/dist/docs/example-agents/codebase-wiki.html +5 -5
  80. package/dist/docs/example-agents/codeowners-review.html +5 -5
  81. package/dist/docs/example-agents/concierge.html +6 -6
  82. package/dist/docs/example-agents/fsd.html +5 -5
  83. package/dist/docs/example-agents/index.html +4 -4
  84. package/dist/docs/example-agents/knowledge-base.html +5 -5
  85. package/dist/docs/example-agents/oncall.html +5 -5
  86. package/dist/docs/example-agents/security-reviewer.html +4 -4
  87. package/dist/docs/example-agents/slack-agent.html +5 -5
  88. package/dist/docs/example-agents/weather-agent.html +6 -6
  89. package/dist/docs/guides/agent-to-agent.html +5 -5
  90. package/dist/docs/guides/cloud-runtime.html +6 -6
  91. package/dist/docs/guides/github.html +4 -4
  92. package/dist/docs/guides/human-in-the-loop.html +4 -4
  93. package/dist/docs/guides/mcp-oauth.html +5 -5
  94. package/dist/docs/guides/slack.html +4 -4
  95. package/dist/docs/guides/webhooks.html +6 -6
  96. package/dist/docs/hashmap.json +1 -1
  97. package/dist/docs/hillclimbing.html +6 -6
  98. package/dist/docs/index.html +11 -7
  99. package/dist/docs/quickstart.html +10 -7
  100. package/dist/docs/reference/agent-config.html +10 -8
  101. package/dist/docs/reference/artifacts.html +43 -0
  102. package/dist/docs/reference/channels.html +6 -6
  103. package/dist/docs/reference/cli.html +18 -12
  104. package/dist/docs/reference/connections.html +4 -4
  105. package/dist/docs/reference/hooks.html +6 -6
  106. package/dist/docs/reference/http-api.html +7 -7
  107. package/dist/docs/reference/instructions.html +4 -4
  108. package/dist/docs/reference/playground.html +4 -4
  109. package/dist/docs/reference/project-layout.html +6 -6
  110. package/dist/docs/reference/prompt.html +4 -4
  111. package/dist/docs/reference/schedules.html +4 -4
  112. package/dist/docs/reference/sessions.html +7 -7
  113. package/dist/docs/reference/skills.html +4 -4
  114. package/dist/docs/reference/subagents.html +6 -6
  115. package/dist/docs/reference/tools.html +7 -7
  116. package/dist/docs/scaffolding-agents.html +5 -5
  117. package/dist/docs/storage.html +6 -6
  118. package/dist/docs/troubleshooting.html +4 -4
  119. package/dist/files-backends/agent-store-presigned-url.d.ts.map +1 -1
  120. package/dist/files-backends/agent-store-presigned-url.js +15 -22
  121. package/dist/internal/cli-github.d.ts.map +1 -1
  122. package/dist/internal/cli-github.js +8 -7
  123. package/dist/internal/cli-slack.js +9 -9
  124. package/dist/internal/event-mapper.d.ts +3 -3
  125. package/dist/internal/event-mapper.d.ts.map +1 -1
  126. package/dist/internal/event-mapper.js +7 -4
  127. package/dist/internal/session-engine.js +3 -3
  128. package/dist/internal/workspace.d.ts +8 -6
  129. package/dist/internal/workspace.d.ts.map +1 -1
  130. package/dist/internal/workspace.js +15 -11
  131. package/dist/playground/assets/{index-D7OV8B_H.js → index-DRtusTV1.js} +38 -38
  132. package/dist/playground/assets/index-DZp6n4bv.css +1 -0
  133. package/dist/playground/index.html +2 -2
  134. package/docs/README.md +32 -13
  135. package/docs/ab.md +23 -36
  136. package/docs/building-with-agents.md +2 -2
  137. package/docs/concepts.md +3 -2
  138. package/docs/deployment.md +1 -1
  139. package/docs/evals.md +102 -33
  140. package/docs/example-agents/approval-buddy.md +2 -1
  141. package/docs/example-agents/benny.md +2 -0
  142. package/docs/example-agents/bugbot.md +3 -0
  143. package/docs/example-agents/codebase-wiki.md +2 -0
  144. package/docs/example-agents/codeowners-review.md +2 -0
  145. package/docs/example-agents/concierge.md +1 -0
  146. package/docs/example-agents/fsd.md +1 -0
  147. package/docs/example-agents/knowledge-base.md +2 -0
  148. package/docs/example-agents/oncall.md +2 -0
  149. package/docs/example-agents/slack-agent.md +1 -0
  150. package/docs/example-agents/weather-agent.md +9 -4
  151. package/docs/guides/cloud-runtime.md +11 -4
  152. package/docs/guides/webhooks.md +1 -1
  153. package/docs/hillclimbing.md +1 -1
  154. package/docs/quickstart.md +39 -7
  155. package/docs/reference/agent-config.md +74 -14
  156. package/docs/reference/artifacts.md +117 -0
  157. package/docs/reference/channels.md +45 -15
  158. package/docs/reference/cli.md +141 -20
  159. package/docs/reference/hooks.md +11 -4
  160. package/docs/reference/http-api.md +50 -4
  161. package/docs/reference/project-layout.md +6 -0
  162. package/docs/reference/sessions.md +5 -4
  163. package/docs/reference/subagents.md +5 -3
  164. package/docs/reference/tools.md +23 -7
  165. package/docs/scaffolding-agents.md +11 -2
  166. package/docs/storage.md +27 -2
  167. package/package.json +1 -1
  168. package/src/channels/github/github-channel.ts +1 -1
  169. package/src/channels/github/index.ts +1 -1
  170. package/src/channels/slack/api.ts +1 -1
  171. package/src/channels/slack/index.ts +1 -1
  172. package/src/channels/slack/init.ts +2 -1
  173. package/src/files-backends/agent-store-presigned-url.ts +2 -1
  174. package/src/internal/cli-github.ts +8 -7
  175. package/src/internal/cli-slack.ts +9 -9
  176. package/src/internal/event-mapper.ts +9 -4
  177. package/src/internal/session-engine.ts +3 -3
  178. package/src/internal/workspace.ts +15 -11
  179. package/dist/docs/assets/chunks/@localSearchIndexroot.Cu7b6o1D.js +0 -1
  180. package/dist/docs/assets/guides_cloud-runtime.md.CDJGvVC4.js +0 -9
  181. package/dist/docs/assets/guides_cloud-runtime.md.CDJGvVC4.lean.js +0 -1
  182. package/dist/docs/assets/index.md.CZqbBJPB.js +0 -20
  183. package/dist/docs/assets/reference_http-api.md.CfVM_ICa.js +0 -11
  184. package/dist/docs/assets/reference_http-api.md.CfVM_ICa.lean.js +0 -1
  185. package/dist/docs/assets/scaffolding-agents.md.Bsr9Pwzu.js +0 -1
  186. package/dist/playground/assets/index-DOb96C0M.css +0 -1
  187. /package/dist/docs/assets/{building-with-agents.md.CnHqvYDd.lean.js → building-with-agents.md.txrcGU2B.lean.js} +0 -0
  188. /package/dist/docs/assets/{concepts.md.DFaQEFkA.lean.js → concepts.md.CqOsxbMU.lean.js} +0 -0
  189. /package/dist/docs/assets/{deployment.md.9MYBuKM1.lean.js → deployment.md.CuK5SNjN.lean.js} +0 -0
  190. /package/dist/docs/assets/{example-agents_approval-buddy.md.BhEfleVx.lean.js → example-agents_approval-buddy.md.CIiZ9coo.lean.js} +0 -0
  191. /package/dist/docs/assets/{example-agents_benny.md.2Et1qa8f.lean.js → example-agents_benny.md.l7JTmm8X.lean.js} +0 -0
  192. /package/dist/docs/assets/{example-agents_fsd.md.DfNKQTHz.lean.js → example-agents_fsd.md.DPz9ezO4.lean.js} +0 -0
  193. /package/dist/docs/assets/{example-agents_knowledge-base.md.CzyZ2DCr.lean.js → example-agents_knowledge-base.md.IneynQSR.lean.js} +0 -0
  194. /package/dist/docs/assets/{example-agents_oncall.md.wFFXXEyW.lean.js → example-agents_oncall.md.ZE0n6ZFN.lean.js} +0 -0
  195. /package/dist/docs/assets/{example-agents_slack-agent.md.DvgvT4nn.lean.js → example-agents_slack-agent.md.06jQXTAI.lean.js} +0 -0
  196. /package/dist/docs/assets/{guides_webhooks.md.DiAwSR42.lean.js → guides_webhooks.md.BERuBSJW.lean.js} +0 -0
  197. /package/dist/docs/assets/{hillclimbing.md.D9Y1_bYh.lean.js → hillclimbing.md.yXqdlv2R.lean.js} +0 -0
  198. /package/dist/docs/assets/{reference_sessions.md.C_ouF_uf.lean.js → reference_sessions.md.DBVFi2Sx.lean.js} +0 -0
@@ -9,16 +9,16 @@
9
9
  <link rel="preload stylesheet" href="/docs/assets/style.Bj-IXa5W.css" as="style">
10
10
  <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/docs/assets/app.D5Mv1T0U.js"></script>
12
+ <script type="module" src="/docs/assets/app.Bu9SRvZ9.js"></script>
13
13
  <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
- <link rel="modulepreload" href="/docs/assets/chunks/theme.C6D9UPLK.js">
14
+ <link rel="modulepreload" href="/docs/assets/chunks/theme.Bc61GzOf.js">
15
15
  <link rel="modulepreload" href="/docs/assets/chunks/framework.CAZyNGu9.js">
16
- <link rel="modulepreload" href="/docs/assets/evals.md.BIUoVZ6X.lean.js">
16
+ <link rel="modulepreload" href="/docs/assets/evals.md.BQXI3rXy.lean.js">
17
17
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
18
18
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
19
19
  </head>
20
20
  <body>
21
- <div id="app"><div class="Layout" data-v-05085060><!--[--><!--]--><!--[--><span tabindex="-1" data-v-30dc752a></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-30dc752a>Skip to content</a><!--]--><!----><header class="VPNav" data-v-05085060 data-v-cbe59881><div class="VPNavBar" data-v-cbe59881 data-v-dd8a1864><div class="wrapper" data-v-dd8a1864><div class="container" data-v-dd8a1864><div class="title" data-v-dd8a1864><div class="VPNavBarTitle has-sidebar" data-v-dd8a1864 data-v-f9346b2b><a class="title" href="/docs/" data-v-f9346b2b><!--[--><!--]--><!----><span data-v-f9346b2b>Agent SDK</span><!--[--><!--]--></a></div></div><div class="content" data-v-dd8a1864><div class="content-body" data-v-dd8a1864><!--[--><!--]--><div class="VPNavBarSearch search" data-v-dd8a1864><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-dd8a1864 data-v-7ed6e5ac><span id="main-nav-aria-label" class="visually-hidden" data-v-7ed6e5ac> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/quickstart.html" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Quickstart</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/guides/webhooks.html" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/example-agents/" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Examples</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/reference/project-layout.html" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Reference</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-dd8a1864 data-v-2b2b395e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-2b2b395e data-v-182deabf data-v-2562b538><span class="check" data-v-2562b538><span class="icon" data-v-2562b538><!--[--><span class="vpi-sun sun" data-v-182deabf></span><span class="vpi-moon moon" data-v-182deabf></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-dd8a1864 data-v-f3b584b7 data-v-82133de6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-82133de6><span class="vpi-more-horizontal icon" data-v-82133de6></span></button><div class="menu" data-v-82133de6><div class="VPMenu" data-v-82133de6 data-v-759c9e19><!----><!--[--><!--[--><!----><div class="group" data-v-f3b584b7><div class="item appearance" data-v-f3b584b7><p class="label" data-v-f3b584b7>Appearance</p><div class="appearance-action" data-v-f3b584b7><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f3b584b7 data-v-182deabf data-v-2562b538><span class="check" data-v-2562b538><span class="icon" data-v-2562b538><!--[--><span class="vpi-sun sun" data-v-182deabf></span><span class="vpi-moon moon" data-v-182deabf></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-dd8a1864 data-v-ab07e844><span class="container" data-v-ab07e844><span class="top" data-v-ab07e844></span><span class="middle" data-v-ab07e844></span><span class="bottom" data-v-ab07e844></span></span></button></div></div></div></div><div class="divider" data-v-dd8a1864><div class="divider-line" data-v-dd8a1864></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-05085060 data-v-826b8761><div class="container" data-v-826b8761><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-826b8761><span class="vpi-align-left menu-icon" data-v-826b8761></span><span class="menu-text" data-v-826b8761>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-826b8761 data-v-01af9e73><button data-v-01af9e73>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-05085060 data-v-5cd5b4d8><div class="curtain" data-v-5cd5b4d8></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-5cd5b4d8><span class="visually-hidden" id="sidebar-aria-label" data-v-5cd5b4d8> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Getting started</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/quickstart.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Quickstart</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/scaffolding-agents.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Scaffold an agent with Cursor</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/concepts.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Concepts</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0 has-active" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Improving agents</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/building-with-agents.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Building agents with agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/evals.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Evals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/ab.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Live A/B metrics</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/storage.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Storage</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/hillclimbing.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Hillclimbing</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Guides</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/webhooks.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Webhooks & custom channels</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/github.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/slack.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Slack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/human-in-the-loop.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Human-in-the-loop approvals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/agent-to-agent.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Agent-to-agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/cloud-runtime.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Cloud runtime</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Example agents</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Choose an example</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/weather-agent.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Weather agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/slack-agent.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Slack agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/concierge.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Concierge</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/benny.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Playbook router</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/oncall.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Alert investigator</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/bugbot.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>PR evidence reviewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/approval-buddy.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Approval Buddy</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/security-reviewer.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Security Reviewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/fsd.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Remote PR coordinator</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/knowledge-base.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Knowledge base</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/codebase-wiki.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Codebase wiki</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/codeowners-review.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Codeowners review</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Operating</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/deployment.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/troubleshooting.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Fix common problems</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0 collapsible" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-b6893b1b><span class="vpi-chevron-right caret-icon" data-v-b6893b1b></span></div></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/project-layout.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Project layout</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/agent-config.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Agent config</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/instructions.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Instructions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/tools.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/prompt.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>prompt</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/skills.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Skills</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/connections.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>MCP Connections</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/subagents.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Subagents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/channels.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Channels</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/schedules.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Schedules & reminders</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/hooks.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/sessions.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Sessions & streaming</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/playground.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Playground</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/cli.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>CLI</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/http-api.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>HTTP API</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-05085060 data-v-8eedf2ac><div class="VPDoc has-sidebar has-aside" data-v-8eedf2ac data-v-53b9fda6><!--[--><!--]--><div class="container" data-v-53b9fda6><div class="aside" data-v-53b9fda6><div class="aside-curtain" data-v-53b9fda6></div><div class="aside-container" data-v-53b9fda6><div class="aside-content" data-v-53b9fda6><div class="VPDocAside" data-v-53b9fda6 data-v-e448ecab><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-e448ecab data-v-b0b42374><div class="content" data-v-b0b42374><div class="outline-marker" data-v-b0b42374></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-b0b42374>On this page</div><ul class="VPDocOutlineItem root" data-v-b0b42374 data-v-ae03bd52><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-e448ecab></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-53b9fda6><div class="content-container" data-v-53b9fda6><!--[--><!--]--><main class="main" data-v-53b9fda6><div style="position:relative;" class="vp-doc _docs_evals" data-v-53b9fda6><div><h1 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to &quot;Evals&quot;">​</a></h1><p>An eval is a repeatable check that runs your agent against a fixed input and gates the recorded trajectory: the run completed, the right tool ran, the reply has the right shape. Evals are how you know a prompt tweak helped, a refactor didn&#39;t regress the agent, and last month&#39;s fix is still holding.</p><p>Evals exercise the same surface your users hit. The runner starts (or targets) a real agent server, drives sessions over the public API, and grades what comes back. A passing eval means the agent started, accepted a message, and did what you asserted.</p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p>Import paths here use <code>@cursor/july/evals</code>. On projects still using <code>@cursor/july</code>, swap the import and run <code>agent-serve eval</code>. See <a href="./README.html#run-the-cli">Run the CLI</a> for the full rename table.</p></div><h2 id="define-evals-with-defineeval" tabindex="-1">Define evals with <code>defineEval</code> <a class="header-anchor" href="#define-evals-with-defineeval" aria-label="Permalink to &quot;Define evals with `defineEval`&quot;">​</a></h2><p>The Agent SDK discovers evals under the project-root <code>evals/</code> directory, in <code>.eval.ts</code> or <code>.eval.js</code> files. That&#39;s a sibling of <code>agent/</code>, never inside it (<code>agent/evals/</code> is silently ignored). TypeScript is the normal authoring format.</p><p>The file path is the eval&#39;s identity, so you don&#39;t author an id. Directories group related evals: <code>evals/builds/api.eval.ts</code> becomes id <code>builds/api</code>. An <code>index</code> filename collapses to its directory, so <code>evals/builds/index.eval.ts</code> becomes <code>builds</code>.</p><p>An eval is a single <code>async test(t)</code>. You drive the agent with <code>t</code> and assert on the run with the same <code>t</code>:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// evals/readiness.eval.ts</span></span>
21
+ <div id="app"><div class="Layout" data-v-05085060><!--[--><!--]--><!--[--><span tabindex="-1" data-v-30dc752a></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-30dc752a>Skip to content</a><!--]--><!----><header class="VPNav" data-v-05085060 data-v-cbe59881><div class="VPNavBar" data-v-cbe59881 data-v-dd8a1864><div class="wrapper" data-v-dd8a1864><div class="container" data-v-dd8a1864><div class="title" data-v-dd8a1864><div class="VPNavBarTitle has-sidebar" data-v-dd8a1864 data-v-f9346b2b><a class="title" href="/docs/" data-v-f9346b2b><!--[--><!--]--><!----><span data-v-f9346b2b>Agent SDK</span><!--[--><!--]--></a></div></div><div class="content" data-v-dd8a1864><div class="content-body" data-v-dd8a1864><!--[--><!--]--><div class="VPNavBarSearch search" data-v-dd8a1864><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-dd8a1864 data-v-7ed6e5ac><span id="main-nav-aria-label" class="visually-hidden" data-v-7ed6e5ac> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/quickstart.html" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Quickstart</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/guides/webhooks.html" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/example-agents/" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Examples</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/reference/project-layout.html" tabindex="0" data-v-7ed6e5ac data-v-65720067><!--[--><span data-v-65720067>Reference</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-dd8a1864 data-v-2b2b395e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-2b2b395e data-v-182deabf data-v-2562b538><span class="check" data-v-2562b538><span class="icon" data-v-2562b538><!--[--><span class="vpi-sun sun" data-v-182deabf></span><span class="vpi-moon moon" data-v-182deabf></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-dd8a1864 data-v-f3b584b7 data-v-82133de6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-82133de6><span class="vpi-more-horizontal icon" data-v-82133de6></span></button><div class="menu" data-v-82133de6><div class="VPMenu" data-v-82133de6 data-v-759c9e19><!----><!--[--><!--[--><!----><div class="group" data-v-f3b584b7><div class="item appearance" data-v-f3b584b7><p class="label" data-v-f3b584b7>Appearance</p><div class="appearance-action" data-v-f3b584b7><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f3b584b7 data-v-182deabf data-v-2562b538><span class="check" data-v-2562b538><span class="icon" data-v-2562b538><!--[--><span class="vpi-sun sun" data-v-182deabf></span><span class="vpi-moon moon" data-v-182deabf></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-dd8a1864 data-v-ab07e844><span class="container" data-v-ab07e844><span class="top" data-v-ab07e844></span><span class="middle" data-v-ab07e844></span><span class="bottom" data-v-ab07e844></span></span></button></div></div></div></div><div class="divider" data-v-dd8a1864><div class="divider-line" data-v-dd8a1864></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-05085060 data-v-826b8761><div class="container" data-v-826b8761><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-826b8761><span class="vpi-align-left menu-icon" data-v-826b8761></span><span class="menu-text" data-v-826b8761>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-826b8761 data-v-01af9e73><button data-v-01af9e73>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-05085060 data-v-5cd5b4d8><div class="curtain" data-v-5cd5b4d8></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-5cd5b4d8><span class="visually-hidden" id="sidebar-aria-label" data-v-5cd5b4d8> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Getting started</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/quickstart.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Quickstart</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/scaffolding-agents.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Scaffold an agent with Cursor</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/concepts.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Concepts</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0 has-active" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Improving agents</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/building-with-agents.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Building agents with agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/evals.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Evals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/ab.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Live A/B metrics</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/storage.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Storage</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/hillclimbing.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Hillclimbing</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Guides</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/webhooks.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Webhooks & custom channels</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/github.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/slack.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Slack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/human-in-the-loop.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Human-in-the-loop approvals</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/agent-to-agent.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Agent-to-agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/mcp-oauth.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Host MCP OAuth</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/guides/cloud-runtime.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Cloud runtime</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Example agents</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Choose an example</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/weather-agent.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Weather agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/slack-agent.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Slack agent</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/concierge.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Concierge</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/benny.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Playbook router</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/oncall.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Alert investigator</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/bugbot.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>PR evidence reviewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/approval-buddy.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Approval Buddy</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/security-reviewer.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Security Reviewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/fsd.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Remote PR coordinator</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/knowledge-base.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Knowledge base</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/codebase-wiki.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Codebase wiki</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/example-agents/codeowners-review.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Codeowners review</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Operating</h2><!----></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/deployment.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/troubleshooting.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Fix common problems</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-6b69f472><section class="VPSidebarItem level-0 collapsible" data-v-6b69f472 data-v-b6893b1b><div class="item" role="button" tabindex="0" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><h2 class="text" data-v-b6893b1b>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-b6893b1b><span class="vpi-chevron-right caret-icon" data-v-b6893b1b></span></div></div><div class="items" data-v-b6893b1b><!--[--><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/project-layout.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Project layout</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/agent-config.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Agent config</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/instructions.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Instructions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/tools.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/prompt.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>prompt</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/skills.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Skills</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/connections.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>MCP Connections</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/subagents.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Subagents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/channels.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Channels</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/schedules.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Schedules & reminders</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/hooks.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Hooks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/artifacts.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Artifacts</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/sessions.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Sessions & streaming</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/playground.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>Playground</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/cli.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>CLI</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-b6893b1b><div class="item" data-v-b6893b1b><div class="indicator" data-v-b6893b1b></div><a class="VPLink link link" href="/docs/reference/http-api.html" data-v-b6893b1b><!--[--><p class="text" data-v-b6893b1b>HTTP API</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-05085060 data-v-8eedf2ac><div class="VPDoc has-sidebar has-aside" data-v-8eedf2ac data-v-53b9fda6><!--[--><!--]--><div class="container" data-v-53b9fda6><div class="aside" data-v-53b9fda6><div class="aside-curtain" data-v-53b9fda6></div><div class="aside-container" data-v-53b9fda6><div class="aside-content" data-v-53b9fda6><div class="VPDocAside" data-v-53b9fda6 data-v-e448ecab><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-e448ecab data-v-b0b42374><div class="content" data-v-b0b42374><div class="outline-marker" data-v-b0b42374></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-b0b42374>On this page</div><ul class="VPDocOutlineItem root" data-v-b0b42374 data-v-ae03bd52><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-e448ecab></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-53b9fda6><div class="content-container" data-v-53b9fda6><!--[--><!--]--><main class="main" data-v-53b9fda6><div style="position:relative;" class="vp-doc _docs_evals" data-v-53b9fda6><div><h1 id="evals" tabindex="-1">Evals <a class="header-anchor" href="#evals" aria-label="Permalink to &quot;Evals&quot;">​</a></h1><p>An eval is a repeatable check that runs your agent against a fixed input and gates the recorded trajectory: the run completed, the right tool ran, the reply has the right shape. Evals are how you know a prompt tweak helped, a refactor didn&#39;t regress the agent, and last month&#39;s fix is still holding.</p><p>Evals exercise the same surface your users hit. The runner starts (or targets) a real agent server, drives sessions over the public API, and grades what comes back. A passing eval means the agent started, accepted a message, and did what you asserted.</p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p>Import paths here use <code>@cursor/july/evals</code>. On projects still using <code>@anysphere/agent-serve</code>, swap the import and run <code>agent-serve eval</code>. See <a href="./README.html#run-the-cli">Run the CLI</a> for the full rename table.</p></div><h2 id="define-evals-with-defineeval" tabindex="-1">Define evals with <code>defineEval</code> <a class="header-anchor" href="#define-evals-with-defineeval" aria-label="Permalink to &quot;Define evals with `defineEval`&quot;">​</a></h2><p>The Agent SDK discovers evals under the project-root <code>evals/</code> directory, in <code>.eval.ts</code> or <code>.eval.js</code> files. That&#39;s a sibling of <code>agent/</code>, never inside it (<code>agent/evals/</code> is silently ignored). TypeScript is the normal authoring format.</p><p>The file path is the eval&#39;s identity, so you don&#39;t author an id. Directories group related evals: <code>evals/builds/api.eval.ts</code> becomes id <code>builds/api</code>. An <code>index</code> filename collapses to its directory, so <code>evals/builds/index.eval.ts</code> becomes <code>builds</code>.</p><p>An eval is a single <code>async test(t)</code>. You drive the agent with <code>t</code> and assert on the run with the same <code>t</code>:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// evals/readiness.eval.ts</span></span>
22
22
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineEval, includes } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/july/evals&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
23
23
  <span class="line"></span>
24
24
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineEval</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
@@ -60,31 +60,25 @@
60
60
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
61
61
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
62
62
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ],</span></span>
63
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>Case ids must be single path segments, unique within the file. Each case can set its own <code>description</code>, <code>tags</code>, <code>timeoutMs</code>, and <code>iterations</code>. A case-level value replaces the file-level value for that datapoint.</p><h3 id="iterations" tabindex="-1">Iterations <a class="header-anchor" href="#iterations" aria-label="Permalink to &quot;Iterations&quot;">​</a></h3><p><code>iterations</code> (file or case, default <code>1</code>) runs a datapoint repeatedly. Discovery expands <code>iterations: 3</code> on case <code>nyc</code> to runnable ids <code>weather/nyc/1</code>, <code>weather/nyc/2</code>, <code>weather/nyc/3</code> (filter prefix <code>weather/nyc</code> still selects all three). Each expanded case exposes <code>t.iteration</code> / <code>t.iterations</code> on the test context. Cap is 100.</p><p><code>maxConcurrency</code> counts <strong>authored datapoints</strong>, not expanded iterations: siblings <code>…/1</code>…<code>…/n</code> share one concurrency slot and run sequentially. A suite with 11 cases × 3 iterations and <code>maxConcurrency: 20</code> therefore has at most 11 cases in flight, not 33.</p><h2 id="configure-eval-runs" tabindex="-1">Configure eval runs <a class="header-anchor" href="#configure-eval-runs" aria-label="Permalink to &quot;Configure eval runs&quot;">​</a></h2><p>Each project with evals needs <code>evals/evals.config.ts</code> or <code>evals/evals.config.js</code>, and it must set <code>maxConcurrency</code>. Each case issues real model-provider requests, so concurrency is capped hard at 200. Existing projects use 20. Discovery with <code>eval --list</code> works without this file, but running a case does not.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
64
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> defineEvalConfig,</span></span>
65
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> persistEvalRunsToDir,</span></span>
66
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/july/evals&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
63
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>Case ids must be single path segments, unique within the file. Each case can set its own <code>description</code>, <code>tags</code>, <code>timeoutMs</code>, and <code>iterations</code>. A case-level value replaces the file-level value for that datapoint.</p><h3 id="iterations" tabindex="-1">Iterations <a class="header-anchor" href="#iterations" aria-label="Permalink to &quot;Iterations&quot;">​</a></h3><p><code>iterations</code> (file or case, default <code>1</code>) runs a datapoint repeatedly. Discovery expands <code>iterations: 3</code> on case <code>nyc</code> to runnable ids <code>weather/nyc/1</code>, <code>weather/nyc/2</code>, <code>weather/nyc/3</code> (filter prefix <code>weather/nyc</code> still selects all three). Each expanded case exposes <code>t.iteration</code> / <code>t.iterations</code> on the test context. Cap is 100.</p><p><code>maxConcurrency</code> counts <strong>authored datapoints</strong>, not expanded iterations: siblings <code>…/1</code>…<code>…/n</code> share one concurrency slot and run sequentially. A suite with 11 cases × 3 iterations and <code>maxConcurrency: 20</code> therefore has at most 11 cases in flight, not 33.</p><h2 id="configure-eval-runs" tabindex="-1">Configure eval runs <a class="header-anchor" href="#configure-eval-runs" aria-label="Permalink to &quot;Configure eval runs&quot;">​</a></h2><p>Each project with evals needs <code>evals/evals.config.ts</code> or <code>evals/evals.config.js</code>, and it must set <code>maxConcurrency</code>. Each case issues real model-provider requests, so concurrency is capped hard at 200. Existing projects use 20. Discovery with <code>eval --list</code> works without this file, but running a case does not.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { defineEvalConfig } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;@cursor/july/evals&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
67
64
  <span class="line"></span>
68
65
  <span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> defineEvalConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">({</span></span>
69
66
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> maxConcurrency: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">20</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// required</span></span>
70
67
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // timeoutMs: 180_000,</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // optional project-wide default</span></span>
68
+ <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // judge: { model: &quot;...&quot; },</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // default judge model for t.judge.*</span></span>
69
+ <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // reporters: [],</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // destinations that observe every case</span></span>
71
70
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // maxPlaygroundRuns: 50,</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // playground /v1/dev/evals history only (default 20)</span></span>
72
- <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //</span></span>
73
- <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Playground batches default to **process memory only** — they disappear</span></span>
74
- <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // when `serve` exits. Opt into durable storage:</span></span>
75
- <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // persistRuns: persistEvalRunsToDir(&quot;.agent-serve/eval-runs&quot;),</span></span>
76
- <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Or implement { load, save, delete } yourself (S3, DB, …).</span></span>
77
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>The timeout order is case or file <code>timeoutMs</code>, CLI <code>--timeout-ms</code>, project config <code>timeoutMs</code>, then the 180-second runner default.</p><p>Playground batch retention is separate from case concurrency:</p><table tabindex="0"><thead><tr><th>Option</th><th>Default</th><th>Meaning</th></tr></thead><tbody><tr><td><code>maxPlaygroundRuns</code></td><td><code>20</code></td><td>Max batches in the playground / <code>/v1/dev/evals*</code> history (not CLI <code>eval</code>)</td></tr><tr><td><code>persistRuns</code></td><td>unset</td><td>Optional <code>{ load, save, delete }</code> so batches survive process restart (<code>delete</code> required for durable prune)</td></tr></tbody></table><p>Without <code>persistRuns</code>, navigating away and back still works while the same <code>serve</code> process is up; a restart clears history.</p><h2 id="drive-and-assert-with-t" tabindex="-1">Drive and assert with <code>t</code> <a class="header-anchor" href="#drive-and-assert-with-t" aria-label="Permalink to &quot;Drive and assert with `t`&quot;">​</a></h2><p><code>t</code> is both the driver and the assertion surface. You write ordinary control flow, sending turns and asserting inline.</p><p>Drive the agent with <code>t.send(message, options?)</code>. It runs one turn and waits for the session to park or fail. Multiple sends in one case share the session, which is how you write multi-turn evals. The return value contains the turn&#39;s <code>message</code>, <code>sessionId</code>, <code>events</code>, <code>toolCalls</code>, and <code>ok</code> state.</p><p>Read the full case state with <code>t.reply</code> (the last assistant text), <code>t.events</code> (every captured session event across turns), and <code>t.sessionId</code>.</p><p>Assert with the gates:</p><table tabindex="0"><thead><tr><th>Gate</th><th>Checks</th></tr></thead><tbody><tr><td><code>t.succeeded()</code></td><td>the captured trajectory has at least one turn and did not fail</td></tr><tr><td><code>t.calledTool(name)</code></td><td><code>name</code> appears in the captured tool calls</td></tr><tr><td><code>t.notCalledTool(name)</code></td><td><code>name</code> does not appear in the captured tool calls</td></tr><tr><td><code>t.messageIncludes(token)</code></td><td>the last assistant reply matches a string or <code>RegExp</code></td></tr><tr><td><code>t.check(value, expectation)</code></td><td>any value, against a builder</td></tr></tbody></table><p><code>calledTool</code> reads the recorded trajectory. A requested call counts even when its result has not arrived. To require a completed result, inspect <code>t.events</code> for an <code>action.result</code> event.</p><p>The expectation builders are <code>includes(string | RegExp)</code>, <code>equals(value)</code>, and <code>satisfies(predicate, label)</code>. <code>includes</code> stringifies its input, <code>equals</code> compares values deeply, and <code>satisfies</code> runs your predicate. <code>t.log(message)</code> records a debug line for the CLI and playground result.</p><p>Three <code>t.send</code> options apply on session create (first <code>t.send</code> only):</p><ul><li><code>workspaceFiles</code> — <code>{ path: contents }</code>, seeded into the local session workspace. Prefer this over machine-local paths.</li><li><code>workspaceDir</code> — absolute harness cwd (local runtime).</li><li><code>cloud</code> — per-session cloud options merged over the agent&#39;s static <code>cloud</code> config (repos / env / …). Use a pinned <code>repos</code> override to attach a fixture repo for cloud evals without putting it on the agent&#39;s default <code>cloud.repos</code>. Cloud ignores <code>workspaceFiles</code> seeds.</li></ul><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> toolResults</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> t.events.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">filter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">e</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e.type </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;action.result&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
71
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">});</span></span></code></pre></div><p>The timeout order is case or file <code>timeoutMs</code>, CLI <code>--timeout-ms</code>, project config <code>timeoutMs</code>, then the 180-second runner default.</p><p>The optional fields:</p><table tabindex="0"><thead><tr><th>Option</th><th>Default</th><th>Meaning</th></tr></thead><tbody><tr><td><code>timeoutMs</code></td><td><code>180_000</code></td><td>Project-wide per-case timeout</td></tr><tr><td><code>judge</code></td><td>unset</td><td>Default judge model for <code>t.judge.*</code>; see <a href="#judge-free-form-output">Judge free-form output</a></td></tr><tr><td><code>reporters</code></td><td>unset</td><td>Destinations that observe every case; <code>--skip-report</code> suppresses them</td></tr><tr><td><code>maxPlaygroundRuns</code></td><td><code>20</code></td><td>Max batches in the playground / <code>/v1/dev/evals*</code> history (not CLI <code>eval</code>)</td></tr></tbody></table><p>Reporters come from <code>@cursor/july/evals/reporters</code>: <code>JUnit</code> writes a JUnit XML file for CI, <code>Artifacts</code> writes per-case files, and <code>combineReporters</code> merges several into one (<code>renderJUnitXml</code> renders the XML for a custom destination). A file or case can add its own <code>reporters</code> on top of the config list.</p><p>Playground batches live in process memory and disappear when <code>serve</code> exits. Navigating away and back still works while the process is up. To keep batches across restarts, declare an <code>evals</code> table in <code>agent/storage.ts</code>; see <a href="./storage.html#eval-and-ab-tables">Storage</a>.</p><h2 id="drive-and-assert-with-t" tabindex="-1">Drive and assert with <code>t</code> <a class="header-anchor" href="#drive-and-assert-with-t" aria-label="Permalink to &quot;Drive and assert with `t`&quot;">​</a></h2><p><code>t</code> is both the driver and the assertion surface. You write ordinary control flow, sending turns and asserting inline.</p><p>Drive the agent with <code>t.send(message, options?)</code>. It runs one turn and waits for the session to park or fail. Multiple sends in one case share the session, which is how you write multi-turn evals.</p><p>Each <code>t.send</code> resolves to a turn result with <code>message</code>, <code>sessionId</code>, <code>events</code>, <code>toolCalls</code>, <code>ok</code>, and <code>index</code>. The turn carries the same assertion vocabulary as <code>t</code>, scoped to that turn, so you can grade an intermediate turn before the next send overwrites <code>t.reply</code>. <code>turn.expectOk()</code> throws when the turn failed, for later steps that depend on it.</p><p>Read the full case state with <code>t.reply</code> (the last assistant text), <code>t.events</code> (every captured session event across turns), <code>t.turns</code> (settled turns, oldest first), and <code>t.sessionId</code>. <code>t.signal</code> aborts when the case hits its timeout; pass it to your own async work.</p><p>Assert with the gates:</p><table tabindex="0"><thead><tr><th>Gate</th><th>Checks</th></tr></thead><tbody><tr><td><code>t.succeeded()</code></td><td>the run did not fail and is not parked on an unanswered approval</td></tr><tr><td><code>t.parked()</code></td><td>the run cleanly parked on an unanswered approval request</td></tr><tr><td><code>t.messageIncludes(token)</code></td><td>the joined assistant text matches a string or <code>RegExp</code></td></tr><tr><td><code>t.calledTool(name, matcher?)</code></td><td>a matching call to <code>name</code> happened</td></tr><tr><td><code>t.notCalledTool(name)</code></td><td>no request for <code>name</code>, in any lifecycle state</td></tr><tr><td><code>t.loadedSkill(name)</code></td><td>the agent opened the skill&#39;s <code>SKILL.md</code> (read, grep, or shell <code>cat</code>)</td></tr><tr><td><code>t.toolOrder(names)</code></td><td>tool requests appear in this relative order (extra calls allowed)</td></tr><tr><td><code>t.usedNoTools()</code></td><td>no tool calls at all</td></tr><tr><td><code>t.maxToolCalls(max)</code></td><td>at most <code>max</code> tool calls</td></tr><tr><td><code>t.noFailedActions()</code></td><td>no tool call reported an error</td></tr><tr><td><code>t.calledSubagent(name, matcher?)</code></td><td>a matching subagent delegation happened</td></tr><tr><td><code>t.taggedArtifact(kind?, predicate?)</code></td><td>at least one <a href="./reference/artifacts.html">artifact</a> was tagged</td></tr><tr><td><code>t.event(type, matcher?)</code></td><td>at least one matching event of <code>type</code> occurred</td></tr><tr><td><code>t.notEvent(type, matcher?)</code></td><td>no matching event of <code>type</code> occurred</td></tr><tr><td><code>t.eventOrder(matchers)</code></td><td>matching event groups occur in this relative order</td></tr><tr><td><code>t.eventsSatisfy(label, predicate)</code></td><td>your predicate over the typed event stream</td></tr><tr><td><code>t.check(value, expectation)</code></td><td>any value, against a builder</td></tr><tr><td><code>t.score(name, value)</code></td><td>records a 0–1 score you computed; soft until you add a bar</td></tr><tr><td><code>t.requireToolCall(name, matcher?)</code></td><td>gates on a matching call and returns it, so later code can read its input and output</td></tr><tr><td><code>t.requireInputRequest(filter?)</code></td><td>gates on exactly one pending approval request and returns it</td></tr></tbody></table><p>Every gate returns a handle: <code>.soft()</code> demotes it to tracked-only, <code>.atLeast(0.7)</code> adds a soft score bar, and <code>.gate(0.8)</code> promotes a scored assertion into a hard gate.</p><p>With no matcher, <code>calledTool</code> is request-based: a requested call counts even when its result has not arrived. Pass <code>t.calledTool(&quot;inspect_pr&quot;, { status: &quot;completed&quot; })</code> to require the call to return. <code>input</code>, <code>output</code>, and <code>count</code> matcher fields accept a literal, a <code>RegExp</code>, or a predicate.</p><p>The expectation builders are <code>includes(string | RegExp)</code>, <code>equals(value)</code>, <code>matches(schema)</code>, <code>similarity(expected)</code>, and <code>satisfies(predicate, label)</code>. <code>includes</code> stringifies its input, <code>equals</code> compares values deeply, <code>matches</code> validates against a Standard Schema (or anything with <code>safeParse</code>, like Zod), <code>similarity</code> scores normalized text similarity, and <code>satisfies</code> runs your predicate. The plain function <code>normalizedSimilarity(actual, expected)</code> returns the same 0–1 score for use with <code>t.score</code>.</p><p>A few more context members shape a case: <code>t.require(value, expectation)</code> records a gate and stops the test body when it fails, without a duplicate execution error. <code>t.skip(reason)</code> ends the case as skipped (reported separately, never changes the exit code; call it before sending messages). <code>t.metric(name, value)</code> records a structured score for the playground case card. <code>t.log(message)</code> records a debug line for the CLI and playground result.</p><p>Three <code>t.send</code> options apply on session create (first <code>t.send</code> only):</p><ul><li><code>workspaceFiles</code> — <code>{ path: contents }</code>, seeded into the local session workspace. Prefer this over machine-local paths.</li><li><code>workspaceDir</code> — absolute harness cwd (local runtime).</li><li><code>cloud</code> — per-session cloud options merged over the agent&#39;s static <code>cloud</code> config (repos / env / …). Use a pinned <code>repos</code> override to attach a fixture repo for cloud evals without putting it on the agent&#39;s default <code>cloud.repos</code>. Cloud ignores <code>workspaceFiles</code> seeds.</li></ul><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> toolResults</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> t.events.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">filter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">e</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> e.type </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;action.result&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
78
72
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">t.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">check</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span></span>
79
73
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> toolResults.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
80
74
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> satisfies</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">n</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (n </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;at most 4 tool calls&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
81
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p>A case with no explicit gates falls back to whether at least one turn completed successfully. Add <code>t.succeeded()</code> and behavior-specific gates anyway. They make the contract visible during review.</p><h2 id="run-evals-from-the-cli" tabindex="-1">Run evals from the CLI <a class="header-anchor" href="#run-evals-from-the-cli" aria-label="Permalink to &quot;Run evals from the CLI&quot;">​</a></h2><p>The <code>eval</code> command discovers, filters, and runs cases.</p><p>Run the CLI under Node 22.13 or newer. Do not use Bun. Its HTTP/2 client breaks tool-result streams and causes eval turns to fail.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --list</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # discover only</span></span>
75
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p>A case with no explicit gates falls back to whether at least one turn completed successfully. Add <code>t.succeeded()</code> and behavior-specific gates anyway. They make the contract visible during review.</p><h3 id="judge-free-form-output" tabindex="-1">Judge free-form output <a class="header-anchor" href="#judge-free-form-output" aria-label="Permalink to &quot;Judge free-form output&quot;">​</a></h3><p>When wording matters and no regex captures it, <code>t.judge</code> grades the reply with an LLM. The built-in graders are <code>factuality(expected)</code>, <code>summarizes(expected)</code>, <code>closedQA(criteria)</code>, and <code>sql(expected)</code>. Each scores <code>t.reply</code> by default; pass <code>{ on }</code> to grade another value.</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">t.judge.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">factuality</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;It is 54°F in NYC right now.&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">atLeast</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0.7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p>Judge assertions are soft by default, so a judge never fails a build until you give it a bar with <code>.atLeast(0.7)</code> or promote it with <code>.gate(0.8)</code>. The judge model comes from <code>defineEvalConfig({ judge })</code>, <code>defineEval({ judge })</code>, a case-level <code>judge</code>, or a per-call <code>{ model }</code> override; the nearest one wins. For a domain-specific judge whose verdict is not a single score, <code>t.judge.model(prompt)</code> sends a raw prompt to the same model and returns the reply. You then record the parsed result with <code>t.score</code> or <code>t.check</code>.</p><h2 id="run-evals-from-the-cli" tabindex="-1">Run evals from the CLI <a class="header-anchor" href="#run-evals-from-the-cli" aria-label="Permalink to &quot;Run evals from the CLI&quot;">​</a></h2><p>The <code>eval</code> command discovers, filters, and runs cases.</p><p>Run the CLI under Node 22.13 or newer. Do not use Bun. Its HTTP/2 client breaks tool-result streams and causes eval turns to fail.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --list</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # discover only</span></span>
82
76
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # run all</span></span>
83
77
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> builds/checkout</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # one datapoint</span></span>
84
78
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> builds</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> search</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # several ids or prefixes</span></span>
85
79
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> smoke</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pull-request</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # any matching tag</span></span>
86
80
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --json</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --no-stream</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # machine-readable results</span></span>
87
- <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --verbose</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # logs + reply snippets</span></span></code></pre></div><p>Id filters use OR semantics. Each filter selects an exact id and its descendants. For example, <code>builds</code> selects <code>builds</code>, <code>builds/checkout</code>, and every other case below that path. Repeated tags also use OR semantics. When you provide both ids and tags, a case must match both groups.</p><p><code>eval</code> boots an ephemeral server on port 0 with a temp state root outside the project, so cases don&#39;t inherit ambient monorepo rules and don&#39;t pollute <code>.agent-sdk/</code>. Point <code>--url</code> at a running server to eval a live agent instead:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \</span></span>
81
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --verbose</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # logs + reply snippets</span></span></code></pre></div><p>Id filters use OR semantics. Each filter selects an exact id and its descendants. For example, <code>builds</code> selects <code>builds</code>, <code>builds/checkout</code>, and every other case below that path. Repeated tags also use OR semantics. When you provide both ids and tags, a case must match both groups.</p><p><code>eval</code> boots an ephemeral server on port 0 with a temp state root outside the project, so cases don&#39;t inherit ambient monorepo rules and don&#39;t pollute <code>.agent-serve/</code>. Point <code>--url</code> at a running server to eval a live agent instead:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \</span></span>
88
82
  <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> http://127.0.0.1:3000/weather-agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \</span></span>
89
83
  <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --bearer-token</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">$AGENT_TOKEN</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span></span></code></pre></div><p>The eval definitions still come from <code>--dir</code>; <code>--url</code> only changes the agent that receives the turns. For a locally mounted multi-agent directory, <code>--slug weather-agent</code> chooses the target. Use <code>--state-root</code> to keep ephemeral session state at a chosen path, <code>--timeout-ms</code> to override the project timeout, and <code>--no-stream</code> to keep live progress off stderr. A TTY streams turn progress by default. <code>--verbose</code> still writes <code>t.log</code> lines to stderr and adds reply snippets to text results.</p><p>Model turns need a Cursor credential from <code>agent-sdk login</code> or <code>CURSOR_API_KEY</code>.</p><p>The exit code is <code>0</code> when every selected case passes, <code>1</code> when any case fails, and <code>2</code> when no case matches. <code>--list</code> exits <code>0</code>, including when it finds no cases.</p><p>For a compact command index, see <a href="./reference/cli.html#eval">CLI: eval</a>.</p><h3 id="json-results" tabindex="-1">JSON results <a class="header-anchor" href="#json-results" aria-label="Permalink to &quot;JSON results&quot;">​</a></h3><p>Use <code>--json --no-stream</code> in scripts and CI. The top-level result carries the totals and one result per case:</p><div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
90
84
  <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;ok&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
@@ -102,14 +96,14 @@
102
96
  <span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> &quot;durationMs&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">12340</span></span>
103
97
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
104
98
  <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ]</span></span>
105
- <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>Each case result can also include <code>description</code>, <code>finalText</code>, <code>tools</code>, <code>error</code>, and tool arguments or output. This shape lets CI report the failed assertion without parsing terminal text.</p><h2 id="run-evals-in-the-playground" tabindex="-1">Run evals in the playground <a class="header-anchor" href="#run-evals-in-the-playground" aria-label="Permalink to &quot;Run evals in the playground&quot;">​</a></h2><p>Start the server with <code>--dev</code>, open the playground, and choose <strong>Evals</strong>. You can run every case or one case, watch progress, and open the resulting session trace.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dev</span></span></code></pre></div><p>Playground runs target the live server instead of an ephemeral one. Their sessions appear in the session list. One eval batch can run at a time. By default those batches are <strong>in-memory only</strong> (capped by <code>maxPlaygroundRuns</code>); set <code>persistRuns</code> in <code>evals.config.ts</code> if you need them after a serve restart — see <a href="#configure-eval-runs">Configure eval runs</a>.</p><p>The UI uses the playground eval routes (available without <code>--dev</code>): <code>GET /v1/dev/evals</code> lists datapoints and config (includes <code>maxPlaygroundRuns</code> / <code>durableRuns</code>), <code>GET /v1/dev/evals/runs</code> rehydrates recent batches after navigation, <code>POST /v1/dev/evals/runs</code> starts a batch (returns an <strong>Eval ID</strong> / <code>runId</code>), <code>GET /v1/dev/evals/runs/:runId</code> polls it, and <code>POST /v1/dev/evals/runs/:runId/cancel</code> cancels a running batch. See <a href="./reference/http-api.html#playground-eval-routes">Playground eval routes</a>. The start request returns <code>202</code> while cases run in the background. Poll until the snapshot status becomes <code>completed</code>, <code>failed</code>, or <code>cancelled</code>. Configuration errors appear on a failed snapshot.</p><p>On <code>--prod</code> / <code>--url</code>, the CLI prints the Eval ID as soon as the batch is accepted (and a Playground deep link with <code>?view=evals&amp;evalRunId=…</code>):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --slug</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> vulnerability-scanner</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> deepsec</span></span>
99
+ <span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>Each case result can also include <code>description</code>, <code>finalText</code>, <code>tools</code>, <code>error</code>, and tool arguments or output. This shape lets CI report the failed assertion without parsing terminal text.</p><h2 id="run-evals-in-the-playground" tabindex="-1">Run evals in the playground <a class="header-anchor" href="#run-evals-in-the-playground" aria-label="Permalink to &quot;Run evals in the playground&quot;">​</a></h2><p>Start the server with <code>--dev</code>, open the playground, and choose <strong>Evals</strong>. You can run every case or one case, watch progress, and open the resulting session trace.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> serve</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dir</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --dev</span></span></code></pre></div><p>Playground runs target the live server instead of an ephemeral one. Their sessions appear in the session list. One eval batch can run at a time. By default those batches are <strong>in-memory only</strong> (capped by <code>maxPlaygroundRuns</code>); declare an <code>evals</code> table in <code>agent/storage.ts</code> if you need them after a serve restart — see <a href="./storage.html#eval-and-ab-tables">Storage</a>.</p><p>The UI uses the playground eval routes (available without <code>--dev</code>): <code>GET /v1/dev/evals</code> lists datapoints and config (includes <code>maxPlaygroundRuns</code> / <code>durableRuns</code>), <code>GET /v1/dev/evals/runs</code> rehydrates recent batches after navigation, <code>POST /v1/dev/evals/runs</code> starts a batch (returns an <strong>Eval ID</strong> / <code>runId</code>), <code>GET /v1/dev/evals/runs/:runId</code> polls it, and <code>POST /v1/dev/evals/runs/:runId/cancel</code> cancels a running batch. See <a href="./reference/http-api.html#playground-eval-routes">Playground eval routes</a>. The start request returns <code>202</code> while cases run in the background. Poll until the snapshot status becomes <code>completed</code>, <code>failed</code>, or <code>cancelled</code>. Configuration errors appear on a failed snapshot.</p><p>On <code>--prod</code> / <code>--url</code>, the CLI prints the Eval ID as soon as the batch is accepted (and a Playground deep link with <code>?view=evals&amp;evalRunId=…</code>):</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --slug</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> vulnerability-scanner</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --tag</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> deepsec</span></span>
106
100
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Eval ID: evalrun_…</span></span>
107
101
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Cancel: agent-sdk eval cancel evalrun_… --prod --slug vulnerability-scanner</span></span>
108
102
  <span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Playground: https://…/playground?view=evals&amp;evalRunId=evalrun_…</span></span>
109
103
  <span class="line"></span>
110
104
  <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cancel</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> evalrun_…</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --slug</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> vulnerability-scanner</span></span>
111
- <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> evalrun_…</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --slug</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> vulnerability-scanner</span></span></code></pre></div><p>The Evals tab prefers the server’s in-flight batch (<code>activeRunId</code>) over a stale tab-local remembered id, so CLI / Slack kicks show up without an incognito window.</p><h2 id="what-good-cases-assert" tabindex="-1">What good cases assert <a class="header-anchor" href="#what-good-cases-assert" aria-label="Permalink to &quot;What good cases assert&quot;">​</a></h2><p>Gate decisions and shape, not prose. Model wording varies run to run. Tool choice, tool avoidance, and output structure are the stable contract.</p><ol><li><code>t.succeeded()</code>: always, first.</li><li>The tool decision: <code>calledTool</code> for the intended path, <code>notCalledTool</code> for the likely wrong alternative. The pair is stronger than either alone.</li><li>Output shape: a regex for the contract (<code>/ready|blocked/i</code>, a JSON marker, a findings-block fence), never exact sentences.</li><li>For structured output, parse <code>t.reply</code> and check fields with <code>satisfies</code> instead of substring-matching JSON.</li></ol><p>The common failure modes: asserting exact phrasing, packing more than about five gates into one case (split it), and cases that depend on live external state that drifts (pin the input; see fixtures).</p><h2 id="pick-fixtures-by-agent-type" tabindex="-1">Pick fixtures by agent type <a class="header-anchor" href="#pick-fixtures-by-agent-type" aria-label="Permalink to &quot;Pick fixtures by agent type&quot;">​</a></h2><p>The right fixture depends on the surface under test.</p><table tabindex="0"><thead><tr><th>Agent surface</th><th>Fixture</th></tr></thead><tbody><tr><td>Chat / domain assistant</td><td>A canonical prompt string, chosen once and frozen</td></tr><tr><td>Tool-heavy</td><td>Run <code>agent-sdk call &lt;tool&gt;</code> first to pin what the tool returns, then freeze the prompt that triggers it</td></tr><tr><td>GitHub webhook</td><td><code>agent-sdk github replay &lt;pr&gt; --events &#39;*&#39; --dry-run --out fixtures/github</code> snapshots real payloads for offline replay (<a href="./guides/github.html">GitHub guide</a>)</td></tr><tr><td>PR reviewer with host preparation</td><td>Diff, metadata, and gold labels pinned to commit SHAs; keep any live PR matrix small</td></tr><tr><td>Workspace-dependent</td><td><code>workspaceFiles</code> in <code>t.send</code> options, never developer-machine paths</td></tr></tbody></table><p>Tag the fast, reliably passing core <code>smoke</code> and run <code>--tag smoke</code> in the inner loop. Leave slow or flaky-prone cases untagged for explicit runs.</p><h3 id="materialize-api-backed-fixtures" tabindex="-1">Materialize API-backed fixtures <a class="header-anchor" href="#materialize-api-backed-fixtures" aria-label="Permalink to &quot;Materialize API-backed fixtures&quot;">​</a></h3><p>An input that only points at external data, such as a pull request URL, snapshot id, or pair of commit SHAs, is not self-contained. Fetch it once and commit the rendered fixture before you expand the suite.</p><ol><li>Save the diff, metadata, and labels under <code>fixtures/</code> at pinned revisions.</li><li>Seed those files with <code>workspaceFiles</code>, or read them from the fixture directory.</li><li>Assert decisions and output shape against the saved evidence.</li><li>Keep a small <code>smoke</code> subset for any remaining live pipeline checks.</li></ol><p><code>maxConcurrency</code> limits parallel datapoints. It does not limit model or API fan-out inside one datapoint. Materialized fixtures prevent a large suite from exhausting provider and GitHub rate limits. The <a href="./../skills/evals/SKILL.html">evals skill</a> has the full fixture workflow.</p><h2 id="keep-improvements-with-regression-evals" tabindex="-1">Keep improvements with regression evals <a class="header-anchor" href="#keep-improvements-with-regression-evals" aria-label="Permalink to &quot;Keep improvements with regression evals&quot;">​</a></h2><p>Every <a href="./hillclimbing.html">hillclimb</a> round that keeps a change must land an eval that would have failed before the change. If you can&#39;t express the improvement as a gate (a <code>calledTool</code> shift, a bounded <code>action.result</code> count, an output-shape regex), the improvement is unverified, and it&#39;ll regress silently.</p><p>The rule cuts the other way too: never weaken an existing gate to make a round pass. That&#39;s the freeze line moving, and it turns your regression suite into a list of checks that no longer protect anything.</p><h2 id="compare-variants-on-live-traffic" tabindex="-1">Compare variants on live traffic <a class="header-anchor" href="#compare-variants-on-live-traffic" aria-label="Permalink to &quot;Compare variants on live traffic&quot;">​</a></h2><p>Use <code>defineAB</code> to compare variant metrics on live sessions. It is not a test runner and has no <code>agent-sdk ab</code> command. Keep <code>defineEval</code> as the regression ratchet. Eval sessions do not enroll or change live metrics. See <a href="./ab.html">Live A/B metrics</a> for assignment, behavior, collection, and inspection.</p><h2 id="what-s-next" tabindex="-1">What&#39;s next <a class="header-anchor" href="#what-s-next" aria-label="Permalink to &quot;What&#39;s next&quot;">​</a></h2><p>Continue with these pages:</p><ul><li><a href="./ab.html">Live A/B metrics</a>: sticky variants and cumulative metrics on live sessions</li><li><a href="./hillclimbing.html">Hillclimbing</a>: the loop evals make trustworthy</li><li><a href="./building-with-agents.html">Building agents with agents</a>: have a coding agent write the first suite</li><li><a href="./guides/github.html">GitHub guide</a>: deterministic webhook fixtures with <code>github replay</code></li><li><a href="./reference/sessions.html">Sessions and streaming</a>: the events <code>t.events</code> contains</li></ul></div></div></main><footer class="VPDocFooter" data-v-53b9fda6 data-v-3958cc3f><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-3958cc3f><span class="visually-hidden" id="doc-footer-aria-label" data-v-3958cc3f>Pager</span><div class="pager" data-v-3958cc3f><a class="VPLink link pager-link prev" href="/docs/building-with-agents.html" data-v-3958cc3f><!--[--><span class="desc" data-v-3958cc3f>Previous page</span><span class="title" data-v-3958cc3f>Building agents with agents</span><!--]--></a></div><div class="pager" data-v-3958cc3f><a class="VPLink link pager-link next" href="/docs/ab.html" data-v-3958cc3f><!--[--><span class="desc" data-v-3958cc3f>Next page</span><span class="title" data-v-3958cc3f>Live A/B metrics</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
112
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"ab.md\":\"DAQoJ-up\",\"building-with-agents.md\":\"CnHqvYDd\",\"concepts.md\":\"DFaQEFkA\",\"deployment.md\":\"9MYBuKM1\",\"evals.md\":\"BIUoVZ6X\",\"example-agents_approval-buddy.md\":\"BhEfleVx\",\"example-agents_benny.md\":\"2Et1qa8f\",\"example-agents_bugbot.md\":\"ByUexi5i\",\"example-agents_codebase-wiki.md\":\"B4y-7ZVW\",\"example-agents_codeowners-review.md\":\"D6ay4nvf\",\"example-agents_concierge.md\":\"lL8rhYlj\",\"example-agents_fsd.md\":\"DfNKQTHz\",\"example-agents_index.md\":\"DgGBwckv\",\"example-agents_knowledge-base.md\":\"CzyZ2DCr\",\"example-agents_oncall.md\":\"wFFXXEyW\",\"example-agents_security-reviewer.md\":\"Dkf1gyo6\",\"example-agents_slack-agent.md\":\"DvgvT4nn\",\"example-agents_weather-agent.md\":\"BADkPqxQ\",\"guides_agent-to-agent.md\":\"Bmbxy-FA\",\"guides_cloud-runtime.md\":\"CDJGvVC4\",\"guides_github.md\":\"R2QlpR75\",\"guides_human-in-the-loop.md\":\"BWvT7UqY\",\"guides_mcp-oauth.md\":\"C7G7IykG\",\"guides_slack.md\":\"zriQpU_9\",\"guides_webhooks.md\":\"DiAwSR42\",\"hillclimbing.md\":\"D9Y1_bYh\",\"index.md\":\"CZqbBJPB\",\"quickstart.md\":\"TnEXYgYW\",\"reference_agent-config.md\":\"kuN6-OxK\",\"reference_channels.md\":\"CDhTRfUz\",\"reference_cli.md\":\"sD-IUWjg\",\"reference_connections.md\":\"DGqAsFXb\",\"reference_hooks.md\":\"DyLVfE1O\",\"reference_http-api.md\":\"CfVM_ICa\",\"reference_instructions.md\":\"CgoV-YEb\",\"reference_playground.md\":\"CPZhfYaO\",\"reference_project-layout.md\":\"D8E6ZmHJ\",\"reference_prompt.md\":\"BaiweQxE\",\"reference_schedules.md\":\"gmfYzf_I\",\"reference_sessions.md\":\"C_ouF_uf\",\"reference_skills.md\":\"B_jHN7JL\",\"reference_subagents.md\":\"zWAMNfi1\",\"reference_tools.md\":\"BswAQM41\",\"scaffolding-agents.md\":\"Bsr9Pwzu\",\"storage.md\":\"xZoiGM58\",\"troubleshooting.md\":\"B5RVX_tL\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Agent SDK\",\"description\":\"Filesystem-first framework for building and serving Cursor agents.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/webhooks\"},{\"text\":\"Examples\",\"link\":\"/example-agents/\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Scaffold an agent with Cursor\",\"link\":\"/scaffolding-agents\"},{\"text\":\"Concepts\",\"link\":\"/concepts\"}]},{\"text\":\"Improving agents\",\"items\":[{\"text\":\"Building agents with agents\",\"link\":\"/building-with-agents\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Live A/B metrics\",\"link\":\"/ab\"},{\"text\":\"Storage\",\"link\":\"/storage\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"}]},{\"text\":\"Guides\",\"items\":[{\"text\":\"Webhooks & custom channels\",\"link\":\"/guides/webhooks\"},{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Human-in-the-loop approvals\",\"link\":\"/guides/human-in-the-loop\"},{\"text\":\"Agent-to-agent\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Cloud runtime\",\"link\":\"/guides/cloud-runtime\"}]},{\"text\":\"Example agents\",\"items\":[{\"text\":\"Choose an example\",\"link\":\"/example-agents/\"},{\"text\":\"Weather agent\",\"link\":\"/example-agents/weather-agent\"},{\"text\":\"Slack agent\",\"link\":\"/example-agents/slack-agent\"},{\"text\":\"Concierge\",\"link\":\"/example-agents/concierge\"},{\"text\":\"Playbook router\",\"link\":\"/example-agents/benny\"},{\"text\":\"Alert investigator\",\"link\":\"/example-agents/oncall\"},{\"text\":\"PR evidence reviewer\",\"link\":\"/example-agents/bugbot\"},{\"text\":\"Approval Buddy\",\"link\":\"/example-agents/approval-buddy\"},{\"text\":\"Security Reviewer\",\"link\":\"/example-agents/security-reviewer\"},{\"text\":\"Remote PR coordinator\",\"link\":\"/example-agents/fsd\"},{\"text\":\"Knowledge base\",\"link\":\"/example-agents/knowledge-base\"},{\"text\":\"Codebase wiki\",\"link\":\"/example-agents/codebase-wiki\"},{\"text\":\"Codeowners review\",\"link\":\"/example-agents/codeowners-review\"}]},{\"text\":\"Operating\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Fix common problems\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"prompt\",\"link\":\"/reference/prompt\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
105
+ <span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">agent-sdk</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> eval</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> evalrun_…</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --prod</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --slug</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> vulnerability-scanner</span></span></code></pre></div><p>The Evals tab prefers the server’s in-flight batch (<code>activeRunId</code>) over a stale tab-local remembered id, so CLI / Slack kicks show up without an incognito window.</p><h2 id="what-good-cases-assert" tabindex="-1">What good cases assert <a class="header-anchor" href="#what-good-cases-assert" aria-label="Permalink to &quot;What good cases assert&quot;">​</a></h2><p>Gate decisions and shape, not prose. Model wording varies run to run. Tool choice, tool avoidance, and output structure are the stable contract.</p><ol><li><code>t.succeeded()</code>: always, first.</li><li>The tool decision: <code>calledTool</code> for the intended path, <code>notCalledTool</code> for the likely wrong alternative. The pair is stronger than either alone.</li><li>Output shape: a regex for the contract (<code>/ready|blocked/i</code>, a JSON marker, a findings-block fence), never exact sentences.</li><li>For structured output, parse <code>t.reply</code> and check fields with <code>satisfies</code> instead of substring-matching JSON.</li></ol><p>The common failure modes: asserting exact phrasing, packing more than about five gates into one case (split it), and cases that depend on live external state that drifts (pin the input; see fixtures).</p><h2 id="pick-fixtures-by-agent-type" tabindex="-1">Pick fixtures by agent type <a class="header-anchor" href="#pick-fixtures-by-agent-type" aria-label="Permalink to &quot;Pick fixtures by agent type&quot;">​</a></h2><p>The right fixture depends on the surface under test.</p><table tabindex="0"><thead><tr><th>Agent surface</th><th>Fixture</th></tr></thead><tbody><tr><td>Chat / domain assistant</td><td>A canonical prompt string, chosen once and frozen</td></tr><tr><td>Tool-heavy</td><td>Run <code>agent-sdk call &lt;tool&gt;</code> first to pin what the tool returns, then freeze the prompt that triggers it</td></tr><tr><td>GitHub webhook</td><td><code>agent-sdk github replay &lt;pr&gt; --events &#39;*&#39; --dry-run --out fixtures/github</code> snapshots real payloads for offline replay (<a href="./guides/github.html">GitHub guide</a>)</td></tr><tr><td>PR reviewer with host preparation</td><td>Diff, metadata, and gold labels pinned to commit SHAs; keep any live PR matrix small</td></tr><tr><td>Workspace-dependent</td><td><code>workspaceFiles</code> in <code>t.send</code> options, never developer-machine paths</td></tr></tbody></table><p>Tag the fast, reliably passing core <code>smoke</code> and run <code>--tag smoke</code> in the inner loop. Leave slow or flaky-prone cases untagged for explicit runs.</p><h3 id="materialize-api-backed-fixtures" tabindex="-1">Materialize API-backed fixtures <a class="header-anchor" href="#materialize-api-backed-fixtures" aria-label="Permalink to &quot;Materialize API-backed fixtures&quot;">​</a></h3><p>An input that only points at external data, such as a pull request URL, snapshot id, or pair of commit SHAs, is not self-contained. Fetch it once and commit the rendered fixture before you expand the suite.</p><ol><li>Save the diff, metadata, and labels under <code>fixtures/</code> at pinned revisions.</li><li>Seed those files with <code>workspaceFiles</code>, or read them from the fixture directory.</li><li>Assert decisions and output shape against the saved evidence.</li><li>Keep a small <code>smoke</code> subset for any remaining live pipeline checks.</li></ol><p>Read committed fixtures with <code>@cursor/july/evals/loaders</code>: <code>loadJson</code>, <code>loadJsonl</code>, and <code>loadYaml</code> resolve relative paths against the project root the runner discovered, not the cwd the CLI was invoked from (<code>resolveFixturePath</code> and <code>evalFixtureRoot</code> expose the same resolution for other file formats).</p><p><code>maxConcurrency</code> limits parallel datapoints. It does not limit model or API fan-out inside one datapoint. Materialized fixtures prevent a large suite from exhausting provider and GitHub rate limits. The <a href="./../skills/evals/SKILL.html">evals skill</a> has the full fixture workflow.</p><h2 id="keep-improvements-with-regression-evals" tabindex="-1">Keep improvements with regression evals <a class="header-anchor" href="#keep-improvements-with-regression-evals" aria-label="Permalink to &quot;Keep improvements with regression evals&quot;">​</a></h2><p>Every <a href="./hillclimbing.html">hillclimb</a> round that keeps a change must land an eval that would have failed before the change. If you can&#39;t express the improvement as a gate (a <code>calledTool</code> shift, a bounded <code>action.result</code> count, an output-shape regex), the improvement is unverified, and it&#39;ll regress silently.</p><p>The rule cuts the other way too: never weaken an existing gate to make a round pass. That&#39;s the freeze line moving, and it turns your regression suite into a list of checks that no longer protect anything.</p><h2 id="compare-variants-on-live-traffic" tabindex="-1">Compare variants on live traffic <a class="header-anchor" href="#compare-variants-on-live-traffic" aria-label="Permalink to &quot;Compare variants on live traffic&quot;">​</a></h2><p>Use <code>defineAB</code> to compare variant metrics on live sessions. It is not a test runner and has no <code>agent-sdk ab</code> command. Keep <code>defineEval</code> as the regression ratchet. Eval sessions do not enroll or change live metrics. See <a href="./ab.html">Live A/B metrics</a> for assignment, behavior, collection, and inspection.</p><h2 id="what-s-next" tabindex="-1">What&#39;s next <a class="header-anchor" href="#what-s-next" aria-label="Permalink to &quot;What&#39;s next&quot;">​</a></h2><p>Continue with these pages:</p><ul><li><a href="./ab.html">Live A/B metrics</a>: sticky variants and cumulative metrics on live sessions</li><li><a href="./hillclimbing.html">Hillclimbing</a>: the loop evals make trustworthy</li><li><a href="./building-with-agents.html">Building agents with agents</a>: have a coding agent write the first suite</li><li><a href="./guides/github.html">GitHub guide</a>: deterministic webhook fixtures with <code>github replay</code></li><li><a href="./reference/sessions.html">Sessions and streaming</a>: the events <code>t.events</code> contains</li></ul></div></div></main><footer class="VPDocFooter" data-v-53b9fda6 data-v-3958cc3f><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-3958cc3f><span class="visually-hidden" id="doc-footer-aria-label" data-v-3958cc3f>Pager</span><div class="pager" data-v-3958cc3f><a class="VPLink link pager-link prev" href="/docs/building-with-agents.html" data-v-3958cc3f><!--[--><span class="desc" data-v-3958cc3f>Previous page</span><span class="title" data-v-3958cc3f>Building agents with agents</span><!--]--></a></div><div class="pager" data-v-3958cc3f><a class="VPLink link pager-link next" href="/docs/ab.html" data-v-3958cc3f><!--[--><span class="desc" data-v-3958cc3f>Next page</span><span class="title" data-v-3958cc3f>Live A/B metrics</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
106
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"ab.md\":\"6cLOW7--\",\"building-with-agents.md\":\"txrcGU2B\",\"concepts.md\":\"CqOsxbMU\",\"deployment.md\":\"CuK5SNjN\",\"evals.md\":\"BQXI3rXy\",\"example-agents_approval-buddy.md\":\"CIiZ9coo\",\"example-agents_benny.md\":\"l7JTmm8X\",\"example-agents_bugbot.md\":\"Dp5JqHSQ\",\"example-agents_codebase-wiki.md\":\"D-lteFf0\",\"example-agents_codeowners-review.md\":\"BU2ZXLf-\",\"example-agents_concierge.md\":\"DA2al_NK\",\"example-agents_fsd.md\":\"DPz9ezO4\",\"example-agents_index.md\":\"DgGBwckv\",\"example-agents_knowledge-base.md\":\"IneynQSR\",\"example-agents_oncall.md\":\"ZE0n6ZFN\",\"example-agents_security-reviewer.md\":\"Dkf1gyo6\",\"example-agents_slack-agent.md\":\"06jQXTAI\",\"example-agents_weather-agent.md\":\"CrGZ0SqR\",\"guides_agent-to-agent.md\":\"Bmbxy-FA\",\"guides_cloud-runtime.md\":\"V5igN4Sq\",\"guides_github.md\":\"R2QlpR75\",\"guides_human-in-the-loop.md\":\"BWvT7UqY\",\"guides_mcp-oauth.md\":\"C7G7IykG\",\"guides_slack.md\":\"zriQpU_9\",\"guides_webhooks.md\":\"BERuBSJW\",\"hillclimbing.md\":\"yXqdlv2R\",\"index.md\":\"CmhptOmN\",\"quickstart.md\":\"C_b6ESpD\",\"reference_agent-config.md\":\"CRmkoxd6\",\"reference_artifacts.md\":\"BGG4bZo-\",\"reference_channels.md\":\"BIabFUAI\",\"reference_cli.md\":\"Byvrg8eu\",\"reference_connections.md\":\"DGqAsFXb\",\"reference_hooks.md\":\"BGDw4VLm\",\"reference_http-api.md\":\"DGrw_wOu\",\"reference_instructions.md\":\"CgoV-YEb\",\"reference_playground.md\":\"CPZhfYaO\",\"reference_project-layout.md\":\"_XdeMahr\",\"reference_prompt.md\":\"BaiweQxE\",\"reference_schedules.md\":\"gmfYzf_I\",\"reference_sessions.md\":\"DBVFi2Sx\",\"reference_skills.md\":\"B_jHN7JL\",\"reference_subagents.md\":\"DSrGLIuB\",\"reference_tools.md\":\"lSrsTxYJ\",\"scaffolding-agents.md\":\"mkc3B_ZW\",\"storage.md\":\"mQDtIULc\",\"troubleshooting.md\":\"B5RVX_tL\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Agent SDK\",\"description\":\"Filesystem-first framework for building and serving Cursor agents.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Guides\",\"link\":\"/guides/webhooks\"},{\"text\":\"Examples\",\"link\":\"/example-agents/\"},{\"text\":\"Reference\",\"link\":\"/reference/project-layout\"}],\"search\":{\"provider\":\"local\"},\"outline\":{\"level\":[2,3]},\"sidebar\":[{\"text\":\"Getting started\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Quickstart\",\"link\":\"/quickstart\"},{\"text\":\"Scaffold an agent with Cursor\",\"link\":\"/scaffolding-agents\"},{\"text\":\"Concepts\",\"link\":\"/concepts\"}]},{\"text\":\"Improving agents\",\"items\":[{\"text\":\"Building agents with agents\",\"link\":\"/building-with-agents\"},{\"text\":\"Evals\",\"link\":\"/evals\"},{\"text\":\"Live A/B metrics\",\"link\":\"/ab\"},{\"text\":\"Storage\",\"link\":\"/storage\"},{\"text\":\"Hillclimbing\",\"link\":\"/hillclimbing\"}]},{\"text\":\"Guides\",\"items\":[{\"text\":\"Webhooks & custom channels\",\"link\":\"/guides/webhooks\"},{\"text\":\"GitHub\",\"link\":\"/guides/github\"},{\"text\":\"Slack\",\"link\":\"/guides/slack\"},{\"text\":\"Human-in-the-loop approvals\",\"link\":\"/guides/human-in-the-loop\"},{\"text\":\"Agent-to-agent\",\"link\":\"/guides/agent-to-agent\"},{\"text\":\"Host MCP OAuth\",\"link\":\"/guides/mcp-oauth\"},{\"text\":\"Cloud runtime\",\"link\":\"/guides/cloud-runtime\"}]},{\"text\":\"Example agents\",\"items\":[{\"text\":\"Choose an example\",\"link\":\"/example-agents/\"},{\"text\":\"Weather agent\",\"link\":\"/example-agents/weather-agent\"},{\"text\":\"Slack agent\",\"link\":\"/example-agents/slack-agent\"},{\"text\":\"Concierge\",\"link\":\"/example-agents/concierge\"},{\"text\":\"Playbook router\",\"link\":\"/example-agents/benny\"},{\"text\":\"Alert investigator\",\"link\":\"/example-agents/oncall\"},{\"text\":\"PR evidence reviewer\",\"link\":\"/example-agents/bugbot\"},{\"text\":\"Approval Buddy\",\"link\":\"/example-agents/approval-buddy\"},{\"text\":\"Security Reviewer\",\"link\":\"/example-agents/security-reviewer\"},{\"text\":\"Remote PR coordinator\",\"link\":\"/example-agents/fsd\"},{\"text\":\"Knowledge base\",\"link\":\"/example-agents/knowledge-base\"},{\"text\":\"Codebase wiki\",\"link\":\"/example-agents/codebase-wiki\"},{\"text\":\"Codeowners review\",\"link\":\"/example-agents/codeowners-review\"}]},{\"text\":\"Operating\",\"items\":[{\"text\":\"Deployment\",\"link\":\"/deployment\"},{\"text\":\"Fix common problems\",\"link\":\"/troubleshooting\"}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Project layout\",\"link\":\"/reference/project-layout\"},{\"text\":\"Agent config\",\"link\":\"/reference/agent-config\"},{\"text\":\"Instructions\",\"link\":\"/reference/instructions\"},{\"text\":\"Tools\",\"link\":\"/reference/tools\"},{\"text\":\"prompt\",\"link\":\"/reference/prompt\"},{\"text\":\"Skills\",\"link\":\"/reference/skills\"},{\"text\":\"MCP Connections\",\"link\":\"/reference/connections\"},{\"text\":\"Subagents\",\"link\":\"/reference/subagents\"},{\"text\":\"Channels\",\"link\":\"/reference/channels\"},{\"text\":\"Schedules & reminders\",\"link\":\"/reference/schedules\"},{\"text\":\"Hooks\",\"link\":\"/reference/hooks\"},{\"text\":\"Artifacts\",\"link\":\"/reference/artifacts\"},{\"text\":\"Sessions & streaming\",\"link\":\"/reference/sessions\"},{\"text\":\"Playground\",\"link\":\"/reference/playground\"},{\"text\":\"CLI\",\"link\":\"/reference/cli\"},{\"text\":\"HTTP API\",\"link\":\"/reference/http-api\"}]}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
113
107
 
114
108
  </body>
115
109
  </html>