@cursor/july 0.1.107 → 0.1.109

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 (523) hide show
  1. package/AGENTS.md +2 -6
  2. package/README.md +13 -11
  3. package/dist/bin/agent-serve.js +30 -8
  4. package/dist/channels/bitbucket/api.d.ts +41 -0
  5. package/dist/channels/bitbucket/api.d.ts.map +1 -1
  6. package/dist/channels/bitbucket/api.js +260 -0
  7. package/dist/channels/bitbucket/binding.d.ts +4 -0
  8. package/dist/channels/bitbucket/binding.d.ts.map +1 -1
  9. package/dist/channels/bitbucket/binding.js +16 -0
  10. package/dist/channels/bitbucket/index.d.ts +1 -1
  11. package/dist/channels/bitbucket/index.d.ts.map +1 -1
  12. package/dist/channels/bitbucket/index.js +1 -1
  13. package/dist/channels/github/github-channel.js +8 -5
  14. package/dist/channels/github/types.d.ts +5 -1
  15. package/dist/channels/github/types.d.ts.map +1 -1
  16. package/dist/channels/gitlab/api.d.ts +27 -0
  17. package/dist/channels/gitlab/api.d.ts.map +1 -1
  18. package/dist/channels/gitlab/api.js +88 -0
  19. package/dist/channels/gitlab/binding.d.ts +5 -0
  20. package/dist/channels/gitlab/binding.d.ts.map +1 -1
  21. package/dist/channels/gitlab/binding.js +10 -0
  22. package/dist/channels/gitlab/index.d.ts +1 -1
  23. package/dist/channels/gitlab/index.d.ts.map +1 -1
  24. package/dist/channels/gitlab/index.js +1 -1
  25. package/dist/channels/origin/origin-channel.d.ts.map +1 -1
  26. package/dist/channels/origin/origin-channel.js +27 -13
  27. package/dist/channels/origin/types.d.ts +5 -1
  28. package/dist/channels/origin/types.d.ts.map +1 -1
  29. package/dist/channels/slack/dispatch.d.ts +10 -0
  30. package/dist/channels/slack/dispatch.d.ts.map +1 -1
  31. package/dist/channels/slack/dispatch.js +20 -3
  32. package/dist/channels/slack/slack-channel.d.ts +12 -5
  33. package/dist/channels/slack/slack-channel.d.ts.map +1 -1
  34. package/dist/channels/slack/slack-channel.js +59 -8
  35. package/dist/channels.d.ts +45 -0
  36. package/dist/channels.d.ts.map +1 -1
  37. package/dist/channels.js +106 -7
  38. package/dist/connections.d.ts +2 -1
  39. package/dist/connections.d.ts.map +1 -1
  40. package/dist/connections.js +2 -1
  41. package/dist/docs/404.html +2 -2
  42. package/dist/docs/assets/{app.CtuckIiL.js → app.Cr-wVbnB.js} +1 -1
  43. package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.js → building-with-agents.md.D0KbSkJn.js} +2 -2
  44. package/dist/docs/assets/{building-with-agents.md.CUSWxlP_.lean.js → building-with-agents.md.D0KbSkJn.lean.js} +1 -1
  45. package/dist/docs/assets/chunks/@localSearchIndexroot.CFVQ4S17.js +1 -0
  46. package/dist/docs/assets/chunks/{VPLocalSearchBox.Bkkhnu8K.js → VPLocalSearchBox.CVQERt56.js} +1 -1
  47. package/dist/docs/assets/chunks/{theme.DhpIe0Pa.js → theme.Dnsd3XOn.js} +2 -2
  48. package/dist/docs/assets/concepts.md.B4o63Gul.js +1 -0
  49. package/dist/docs/assets/{deployment.md.MFPKqsqI.js → deployment.md.JenwuCCB.js} +4 -4
  50. package/dist/docs/assets/{deployment.md.MFPKqsqI.lean.js → deployment.md.JenwuCCB.lean.js} +1 -1
  51. package/dist/docs/assets/evals.md.C7JLjoEP.js +211 -0
  52. package/dist/docs/assets/evals.md.C7JLjoEP.lean.js +1 -0
  53. package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.js +10 -0
  54. package/dist/docs/assets/guides_bitbucket.md.DZPzmUjU.lean.js +1 -0
  55. package/dist/docs/assets/guides_cloud-agents.md.BsloyHdY.js +9 -0
  56. package/dist/docs/assets/{guides_cloud-agents.md.DS8RIjwx.lean.js → guides_cloud-agents.md.BsloyHdY.lean.js} +1 -1
  57. package/dist/docs/assets/{guides_github.md.c0gdGJ-D.js → guides_github.md.TZaTZlfz.js} +13 -3
  58. package/dist/docs/assets/{guides_github.md.c0gdGJ-D.lean.js → guides_github.md.TZaTZlfz.lean.js} +1 -1
  59. package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.js +14 -0
  60. package/dist/docs/assets/guides_gitlab.md.BmqwQfdG.lean.js +1 -0
  61. package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.js → guides_grokbot-agents.md.DyV-WArv.js} +1 -1
  62. package/dist/docs/assets/guides_improve.md.BGVk32bK.js +14 -0
  63. package/dist/docs/assets/guides_improve.md.BGVk32bK.lean.js +1 -0
  64. package/dist/docs/assets/{guides_slack.md.9oHPye9o.js → guides_slack.md.D4RVMM4G.js} +3 -3
  65. package/dist/docs/assets/{guides_slack.md.9oHPye9o.lean.js → guides_slack.md.D4RVMM4G.lean.js} +1 -1
  66. package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.js → guides_webhooks.md.CJK484ex.js} +2 -2
  67. package/dist/docs/assets/{hillclimbing.md.CpTGTCle.js → hillclimbing.md.BOiVo1tf.js} +1 -1
  68. package/dist/docs/assets/index.md.DD9Q2XuJ.js +5 -0
  69. package/dist/docs/assets/{index.md.BW_6tOgR.lean.js → index.md.DD9Q2XuJ.lean.js} +1 -1
  70. package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.js → reference_agent-config.md.CvoL6pof.js} +1 -1
  71. package/dist/docs/assets/{reference_channels.md.D-qTqwcq.js → reference_channels.md.CAo-iK4j.js} +2 -2
  72. package/dist/docs/assets/{reference_channels.md.D-qTqwcq.lean.js → reference_channels.md.CAo-iK4j.lean.js} +1 -1
  73. package/dist/docs/assets/{reference_cli.md.Dm67hd2D.js → reference_cli.md.Deg7849l.js} +7 -7
  74. package/dist/docs/assets/{reference_cli.md.Dm67hd2D.lean.js → reference_cli.md.Deg7849l.lean.js} +1 -1
  75. package/dist/docs/assets/{reference_connections.md.Di6jJAXF.js → reference_connections.md.BojkC6c5.js} +1 -1
  76. package/dist/docs/assets/{reference_extensions.md.CGmMLblt.js → reference_extensions.md.ZAVUyuEX.js} +3 -3
  77. package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.js → reference_hooks.md.BlM_bOg6.js} +3 -3
  78. package/dist/docs/assets/{reference_hooks.md.Ddt5DdgJ.lean.js → reference_hooks.md.BlM_bOg6.lean.js} +1 -1
  79. package/dist/docs/assets/{reference_http-api.md.oySXBO8o.js → reference_http-api.md.BwaCo-VO.js} +1 -1
  80. package/dist/docs/assets/{reference_playground.md.4myJPxrf.js → reference_playground.md.DLnoaczX.js} +1 -1
  81. package/dist/docs/assets/{reference_playground.md.4myJPxrf.lean.js → reference_playground.md.DLnoaczX.lean.js} +1 -1
  82. package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.js → reference_project-layout.md.BEU8MtQV.js} +3 -3
  83. package/dist/docs/assets/{reference_project-layout.md.DuBu9a96.lean.js → reference_project-layout.md.BEU8MtQV.lean.js} +1 -1
  84. package/dist/docs/assets/reference_sessions.md.CyXV1MUw.js +1 -0
  85. package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.js → scaffolding-agents.md.Kctn3OVb.js} +1 -1
  86. package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.js → skills_create-agent.md.Q3h6Je-e.js} +1 -1
  87. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.js → skills_debug.md.CVjCXMFF.js} +1 -1
  88. package/dist/docs/assets/{skills_debug.md.CDbPhHfg.lean.js → skills_debug.md.CVjCXMFF.lean.js} +1 -1
  89. package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.js +35 -0
  90. package/dist/docs/assets/skills_deploy.md.CWqi_ZxW.lean.js +1 -0
  91. package/dist/docs/assets/skills_evals.md.DFxYPErF.js +25 -0
  92. package/dist/docs/assets/skills_evals.md.DFxYPErF.lean.js +1 -0
  93. package/dist/docs/assets/skills_framework-map.md.BxLSOhSY.js +1 -0
  94. package/dist/docs/assets/{skills_framework-map.md.haibFyoB.lean.js → skills_framework-map.md.BxLSOhSY.lean.js} +1 -1
  95. package/dist/docs/assets/{skills_github.md.D0JahM8c.js → skills_github.md.hgFX_oKY.js} +1 -1
  96. package/dist/docs/assets/skills_index.md.DL7EHaQ-.js +1 -0
  97. package/dist/docs/assets/skills_index.md.DL7EHaQ-.lean.js +1 -0
  98. package/dist/docs/assets/{storage.md.BOHeqk2M.js → storage.md.BUrhJ-Zz.js} +4 -4
  99. package/dist/docs/assets/{storage.md.BOHeqk2M.lean.js → storage.md.BUrhJ-Zz.lean.js} +1 -1
  100. package/dist/docs/assets/troubleshooting.md.CYEAO9bM.js +1 -0
  101. package/dist/docs/building-with-agents.html +5 -5
  102. package/dist/docs/building-with-agents.md +3 -2
  103. package/dist/docs/concepts.html +5 -5
  104. package/dist/docs/concepts.md +2 -4
  105. package/dist/docs/deployment.html +7 -7
  106. package/dist/docs/deployment.md +7 -2
  107. package/dist/docs/evals.html +161 -35
  108. package/dist/docs/evals.md +612 -296
  109. package/dist/docs/guides/agent-to-agent.html +4 -4
  110. package/dist/docs/guides/bitbucket.html +36 -0
  111. package/dist/docs/guides/bitbucket.md +84 -0
  112. package/dist/docs/guides/cloud-agents.html +6 -6
  113. package/dist/docs/guides/cloud-agents.md +4 -3
  114. package/dist/docs/guides/convert-automation.html +4 -4
  115. package/dist/docs/guides/github.html +17 -7
  116. package/dist/docs/guides/github.md +33 -1
  117. package/dist/docs/guides/gitlab.html +40 -0
  118. package/dist/docs/guides/gitlab.md +92 -0
  119. package/dist/docs/guides/grokbot-agents.html +6 -6
  120. package/dist/docs/guides/grokbot-agents.md +2 -2
  121. package/dist/docs/guides/human-in-the-loop.html +4 -4
  122. package/dist/docs/guides/improve.html +40 -0
  123. package/dist/docs/guides/improve.md +91 -0
  124. package/dist/docs/guides/mcp-oauth.html +4 -4
  125. package/dist/docs/guides/opentelemetry.html +5 -5
  126. package/dist/docs/guides/slack.html +7 -7
  127. package/dist/docs/guides/slack.md +2 -1
  128. package/dist/docs/guides/webhooks.html +6 -6
  129. package/dist/docs/guides/webhooks.md +4 -2
  130. package/dist/docs/hashmap.json +1 -1
  131. package/dist/docs/hillclimbing.html +6 -6
  132. package/dist/docs/hillclimbing.md +2 -2
  133. package/dist/docs/index.html +6 -6
  134. package/dist/docs/index.md +14 -6
  135. package/dist/docs/llms-full.txt +1274 -814
  136. package/dist/docs/llms.txt +7 -5
  137. package/dist/docs/quickstart.html +4 -4
  138. package/dist/docs/reference/agent-config.html +6 -6
  139. package/dist/docs/reference/agent-config.md +5 -2
  140. package/dist/docs/reference/artifacts.html +4 -4
  141. package/dist/docs/reference/channels.html +6 -6
  142. package/dist/docs/reference/channels.md +16 -3
  143. package/dist/docs/reference/cli.html +11 -11
  144. package/dist/docs/reference/cli.md +24 -15
  145. package/dist/docs/reference/connections.html +6 -6
  146. package/dist/docs/reference/connections.md +2 -1
  147. package/dist/docs/reference/extensions.html +8 -8
  148. package/dist/docs/reference/extensions.md +2 -3
  149. package/dist/docs/reference/hooks.html +7 -7
  150. package/dist/docs/reference/hooks.md +9 -12
  151. package/dist/docs/reference/http-api.html +6 -6
  152. package/dist/docs/reference/http-api.md +2 -3
  153. package/dist/docs/reference/instructions.html +4 -4
  154. package/dist/docs/reference/playground.html +5 -5
  155. package/dist/docs/reference/playground.md +0 -4
  156. package/dist/docs/reference/project-layout.html +7 -7
  157. package/dist/docs/reference/project-layout.md +1 -8
  158. package/dist/docs/reference/prompt.html +4 -4
  159. package/dist/docs/reference/result.html +4 -4
  160. package/dist/docs/reference/schedules.html +4 -4
  161. package/dist/docs/reference/sessions.html +5 -5
  162. package/dist/docs/reference/sessions.md +1 -2
  163. package/dist/docs/reference/skills.html +4 -4
  164. package/dist/docs/reference/subagents.html +4 -4
  165. package/dist/docs/reference/tools.html +4 -4
  166. package/dist/docs/scaffolding-agents.html +5 -5
  167. package/dist/docs/scaffolding-agents.md +2 -1
  168. package/dist/docs/skills/create-agent.html +6 -6
  169. package/dist/docs/skills/create-agent.md +1 -1
  170. package/dist/docs/skills/debug.html +5 -5
  171. package/dist/docs/skills/debug.md +1 -1
  172. package/dist/docs/skills/deploy.html +61 -0
  173. package/dist/docs/skills/deploy.md +161 -0
  174. package/dist/docs/skills/evals.html +8 -8
  175. package/dist/docs/skills/evals.md +44 -6
  176. package/dist/docs/skills/framework-map.html +5 -5
  177. package/dist/docs/skills/framework-map.md +5 -4
  178. package/dist/docs/skills/github.html +6 -6
  179. package/dist/docs/skills/github.md +1 -1
  180. package/dist/docs/skills/hillclimb.html +4 -4
  181. package/dist/docs/skills/index.html +6 -6
  182. package/dist/docs/skills/index.md +1 -1
  183. package/dist/docs/skills/mcp-auth.html +4 -4
  184. package/dist/docs/skills/otel.html +4 -4
  185. package/dist/docs/skills/setup-slack.html +4 -4
  186. package/dist/docs/storage.html +8 -8
  187. package/dist/docs/storage.md +15 -24
  188. package/dist/docs/templates/agentic-owners.html +4 -4
  189. package/dist/docs/templates/agents-md.html +4 -4
  190. package/dist/docs/templates/code-wiki.html +4 -4
  191. package/dist/docs/templates/demo.html +4 -4
  192. package/dist/docs/templates/grokbot-agents.html +4 -4
  193. package/dist/docs/templates/pr-autofixer.html +4 -4
  194. package/dist/docs/templates/security-help.html +4 -4
  195. package/dist/docs/templates/security-reviewer.html +4 -4
  196. package/dist/docs/templates/triage.html +4 -4
  197. package/dist/docs/troubleshooting.html +5 -5
  198. package/dist/docs/troubleshooting.md +1 -1
  199. package/dist/extensions/improve/extension.d.ts +46 -0
  200. package/dist/extensions/improve/extension.d.ts.map +1 -0
  201. package/dist/extensions/improve/extension.js +41 -0
  202. package/dist/extensions/improve/skills/yourself.d.ts +4 -0
  203. package/dist/extensions/improve/skills/yourself.d.ts.map +1 -0
  204. package/dist/extensions/improve/skills/yourself.js +43 -0
  205. package/dist/extensions.d.ts +2 -3
  206. package/dist/extensions.d.ts.map +1 -1
  207. package/dist/extensions.js +2 -5
  208. package/dist/index.d.ts +2 -3
  209. package/dist/index.d.ts.map +1 -1
  210. package/dist/index.js +1 -2
  211. package/dist/internal/authored-alias-hooks.d.ts +5 -0
  212. package/dist/internal/authored-alias-hooks.d.ts.map +1 -1
  213. package/dist/internal/authored-alias-hooks.js +17 -0
  214. package/dist/internal/authored-loaders.d.ts +4 -0
  215. package/dist/internal/authored-loaders.d.ts.map +1 -1
  216. package/dist/internal/authored-loaders.js +21 -2
  217. package/dist/internal/builtin-tools/artifacts.d.ts.map +1 -1
  218. package/dist/internal/builtin-tools/artifacts.js +2 -3
  219. package/dist/internal/channel-route-dispatch.d.ts +13 -0
  220. package/dist/internal/channel-route-dispatch.d.ts.map +1 -0
  221. package/dist/internal/channel-route-dispatch.js +62 -0
  222. package/dist/internal/channel-state.d.ts +17 -0
  223. package/dist/internal/channel-state.d.ts.map +1 -0
  224. package/dist/internal/channel-state.js +78 -0
  225. package/dist/internal/cli-ax.d.ts +8 -2
  226. package/dist/internal/cli-ax.d.ts.map +1 -1
  227. package/dist/internal/cli-ax.js +100 -3
  228. package/dist/internal/cli-cursor.d.ts.map +1 -1
  229. package/dist/internal/cli-cursor.js +2 -0
  230. package/dist/internal/cli-deploy.d.ts.map +1 -1
  231. package/dist/internal/cli-deploy.js +38 -14
  232. package/dist/internal/cli-mcp-oauth.d.ts.map +1 -1
  233. package/dist/internal/cli-mcp-oauth.js +15 -0
  234. package/dist/internal/cli-mcp.d.ts.map +1 -1
  235. package/dist/internal/cli-mcp.js +12 -0
  236. package/dist/internal/cli-slack.d.ts.map +1 -1
  237. package/dist/internal/cli-slack.js +8 -2
  238. package/dist/internal/continuation-channel.d.ts.map +1 -1
  239. package/dist/internal/continuation-channel.js +2 -2
  240. package/dist/internal/continuation-identity.js +8 -3
  241. package/dist/internal/cursor/credentials.d.ts +8 -2
  242. package/dist/internal/cursor/credentials.d.ts.map +1 -1
  243. package/dist/internal/cursor/credentials.js +27 -5
  244. package/dist/internal/deploy-client.d.ts +27 -0
  245. package/dist/internal/deploy-client.d.ts.map +1 -1
  246. package/dist/internal/deploy-client.js +32 -0
  247. package/dist/internal/deploy-manifest.d.ts +23 -0
  248. package/dist/internal/deploy-manifest.d.ts.map +1 -1
  249. package/dist/internal/deploy-manifest.js +84 -1
  250. package/dist/internal/describe-error.d.ts +1 -0
  251. package/dist/internal/describe-error.d.ts.map +1 -1
  252. package/dist/internal/describe-error.js +25 -0
  253. package/dist/internal/discovery/agent.d.ts +1 -1
  254. package/dist/internal/discovery/agent.d.ts.map +1 -1
  255. package/dist/internal/discovery/agent.js +0 -5
  256. package/dist/internal/discovery/extension-overlay.d.ts +1 -2
  257. package/dist/internal/discovery/extension-overlay.d.ts.map +1 -1
  258. package/dist/internal/discovery/extension-overlay.js +0 -14
  259. package/dist/internal/discovery/extensions.d.ts +1 -2
  260. package/dist/internal/discovery/extensions.d.ts.map +1 -1
  261. package/dist/internal/discovery/extensions.js +4 -22
  262. package/dist/internal/discovery/info.d.ts.map +1 -1
  263. package/dist/internal/discovery/info.js +42 -24
  264. package/dist/internal/discovery/modules.js +0 -1
  265. package/dist/internal/discovery/project.d.ts.map +1 -1
  266. package/dist/internal/discovery/project.js +0 -16
  267. package/dist/internal/eval-runner.js +0 -1
  268. package/dist/internal/framework-file-storage.d.ts +4 -5
  269. package/dist/internal/framework-file-storage.d.ts.map +1 -1
  270. package/dist/internal/framework-file-storage.js +4 -5
  271. package/dist/internal/framework-storage-selection.d.ts +2 -2
  272. package/dist/internal/framework-storage-selection.js +2 -2
  273. package/dist/internal/guest-network.d.ts +4 -10
  274. package/dist/internal/guest-network.d.ts.map +1 -1
  275. package/dist/internal/guest-network.js +42 -26
  276. package/dist/internal/hosted-admission-adapter.d.ts +2 -0
  277. package/dist/internal/hosted-admission-adapter.d.ts.map +1 -1
  278. package/dist/internal/hosted-catch-protocol.d.ts +51 -0
  279. package/dist/internal/hosted-catch-protocol.d.ts.map +1 -0
  280. package/dist/internal/hosted-catch-protocol.js +103 -0
  281. package/dist/internal/hosted-catch.d.ts +40 -0
  282. package/dist/internal/hosted-catch.d.ts.map +1 -0
  283. package/dist/internal/hosted-catch.js +149 -0
  284. package/dist/internal/hosted-delivery-protocol.d.ts +41 -0
  285. package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
  286. package/dist/internal/hosted-delivery-protocol.js +249 -0
  287. package/dist/internal/hosted-delivery.d.ts +10 -1
  288. package/dist/internal/hosted-delivery.d.ts.map +1 -1
  289. package/dist/internal/hosted-delivery.js +100 -22
  290. package/dist/internal/hosted-execution-diag.d.ts +4 -1
  291. package/dist/internal/hosted-execution-diag.d.ts.map +1 -1
  292. package/dist/internal/hosted-execution-diag.js +13 -4
  293. package/dist/internal/hosted-execution-flush.d.ts +3 -0
  294. package/dist/internal/hosted-execution-flush.d.ts.map +1 -1
  295. package/dist/internal/hosted-execution-flush.js +2 -4
  296. package/dist/internal/http-control-plane-session.d.ts +30 -0
  297. package/dist/internal/http-control-plane-session.d.ts.map +1 -0
  298. package/dist/internal/http-control-plane-session.js +83 -0
  299. package/dist/internal/init-scaffold.d.ts.map +1 -1
  300. package/dist/internal/init-scaffold.js +1 -2
  301. package/dist/internal/install-cursor-skills.d.ts +5 -2
  302. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  303. package/dist/internal/install-cursor-skills.js +25 -5
  304. package/dist/internal/legacy-command-guard.d.ts +22 -0
  305. package/dist/internal/legacy-command-guard.d.ts.map +1 -0
  306. package/dist/internal/legacy-command-guard.js +51 -0
  307. package/dist/internal/platform-timers.d.ts +7 -0
  308. package/dist/internal/platform-timers.d.ts.map +1 -1
  309. package/dist/internal/platform-timers.js +139 -0
  310. package/dist/internal/reminder-control-plane-protocol.d.ts +2 -0
  311. package/dist/internal/reminder-control-plane-protocol.d.ts.map +1 -1
  312. package/dist/internal/reminder-control-plane-protocol.js +9 -2
  313. package/dist/internal/reminder-runner.d.ts +8 -0
  314. package/dist/internal/reminder-runner.d.ts.map +1 -1
  315. package/dist/internal/reminder-runner.js +36 -9
  316. package/dist/internal/resolve-prod-target.d.ts +2 -0
  317. package/dist/internal/resolve-prod-target.d.ts.map +1 -1
  318. package/dist/internal/resolve-prod-target.js +13 -0
  319. package/dist/internal/run-client.d.ts +1 -1
  320. package/dist/internal/sdk-runner.d.ts.map +1 -1
  321. package/dist/internal/sdk-runner.js +5 -4
  322. package/dist/internal/server.d.ts.map +1 -1
  323. package/dist/internal/server.js +57 -70
  324. package/dist/internal/session-engine.d.ts +7 -41
  325. package/dist/internal/session-engine.d.ts.map +1 -1
  326. package/dist/internal/session-engine.js +110 -227
  327. package/dist/internal/storage-coordinator.d.ts +5 -19
  328. package/dist/internal/storage-coordinator.d.ts.map +1 -1
  329. package/dist/internal/storage-coordinator.js +3 -62
  330. package/dist/internal/storage-roles.d.ts +4 -9
  331. package/dist/internal/storage-roles.d.ts.map +1 -1
  332. package/dist/internal/storage-roles.js +2 -2
  333. package/dist/playground/assets/index-Bhxzrcf6.css +1 -0
  334. package/dist/playground/assets/index-CqLX5uF3.js +67 -0
  335. package/dist/playground/index.html +2 -2
  336. package/dist/storage-backends/cursor-hosted-v2.d.ts +4 -5
  337. package/dist/storage-backends/cursor-hosted-v2.d.ts.map +1 -1
  338. package/dist/storage-backends/cursor-hosted-v2.js +4 -5
  339. package/dist/storage-backends/cursor-hosted.d.ts +7 -2
  340. package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
  341. package/dist/storage-backends/cursor-hosted.js +29 -31
  342. package/dist/storage-backends/file-kv.d.ts +9 -12
  343. package/dist/storage-backends/file-kv.d.ts.map +1 -1
  344. package/dist/storage-backends/file-kv.js +11 -47
  345. package/dist/storage-protocol.d.ts +3 -11
  346. package/dist/storage-protocol.d.ts.map +1 -1
  347. package/dist/storage-protocol.js +3 -11
  348. package/dist/storage.d.ts +8 -36
  349. package/dist/storage.d.ts.map +1 -1
  350. package/dist/storage.js +8 -44
  351. package/dist/types.d.ts +53 -62
  352. package/dist/types.d.ts.map +1 -1
  353. package/docs/README.md +14 -6
  354. package/docs/building-with-agents.md +3 -2
  355. package/docs/concepts.md +2 -4
  356. package/docs/deployment.md +7 -2
  357. package/docs/evals.md +613 -297
  358. package/docs/guides/bitbucket.md +89 -0
  359. package/docs/guides/cloud-agents.md +4 -3
  360. package/docs/guides/github.md +33 -1
  361. package/docs/guides/gitlab.md +97 -0
  362. package/docs/guides/grokbot-agents.md +2 -2
  363. package/docs/guides/improve.md +96 -0
  364. package/docs/guides/slack.md +2 -1
  365. package/docs/guides/webhooks.md +4 -2
  366. package/docs/hillclimbing.md +2 -2
  367. package/docs/reference/agent-config.md +5 -2
  368. package/docs/reference/channels.md +16 -3
  369. package/docs/reference/cli.md +24 -15
  370. package/docs/reference/connections.md +2 -1
  371. package/docs/reference/extensions.md +2 -3
  372. package/docs/reference/hooks.md +9 -12
  373. package/docs/reference/http-api.md +2 -3
  374. package/docs/reference/playground.md +0 -4
  375. package/docs/reference/project-layout.md +1 -8
  376. package/docs/reference/sessions.md +1 -2
  377. package/docs/scaffolding-agents.md +2 -1
  378. package/docs/skills/index.md +2 -2
  379. package/docs/storage.md +15 -24
  380. package/docs/troubleshooting.md +1 -1
  381. package/package.json +8 -7
  382. package/skills/create-agent/SKILL.md +1 -1
  383. package/skills/debug/SKILL.md +1 -1
  384. package/skills/deploy/SKILL.md +169 -0
  385. package/skills/evals/SKILL.md +45 -8
  386. package/skills/framework-map/SKILL.md +5 -4
  387. package/skills/github/SKILL.md +1 -1
  388. package/src/bin/agent-serve.ts +27 -2
  389. package/src/channels/bitbucket/api.ts +341 -0
  390. package/src/channels/bitbucket/binding.ts +25 -0
  391. package/src/channels/bitbucket/index.ts +2 -0
  392. package/src/channels/github/github-channel.ts +8 -8
  393. package/src/channels/github/types.ts +5 -0
  394. package/src/channels/gitlab/api.ts +123 -0
  395. package/src/channels/gitlab/binding.ts +12 -0
  396. package/src/channels/gitlab/index.ts +1 -0
  397. package/src/channels/origin/origin-channel.ts +29 -13
  398. package/src/channels/origin/types.ts +5 -0
  399. package/src/channels/slack/dispatch.ts +30 -0
  400. package/src/channels/slack/slack-channel.ts +69 -7
  401. package/src/channels.ts +157 -10
  402. package/src/connections.ts +2 -1
  403. package/src/extensions/improve/extension.ts +70 -0
  404. package/src/extensions/improve/skills/yourself.ts +50 -0
  405. package/src/extensions.ts +2 -6
  406. package/src/index.ts +0 -3
  407. package/src/internal/authored-alias-hooks.ts +32 -0
  408. package/src/internal/authored-loaders.ts +26 -2
  409. package/src/internal/builtin-tools/artifacts.ts +2 -3
  410. package/src/internal/channel-route-dispatch.ts +66 -0
  411. package/src/internal/channel-state.ts +96 -0
  412. package/src/internal/cli-ax.ts +111 -3
  413. package/src/internal/cli-cursor.ts +4 -1
  414. package/src/internal/cli-deploy.ts +50 -10
  415. package/src/internal/cli-mcp-oauth.ts +18 -0
  416. package/src/internal/cli-mcp.ts +11 -0
  417. package/src/internal/cli-slack.ts +15 -2
  418. package/src/internal/continuation-channel.ts +2 -1
  419. package/src/internal/continuation-identity.ts +10 -2
  420. package/src/internal/cursor/credentials.ts +35 -7
  421. package/src/internal/deploy-client.ts +54 -0
  422. package/src/internal/deploy-manifest.ts +115 -1
  423. package/src/internal/describe-error.ts +28 -0
  424. package/src/internal/discovery/agent.ts +1 -7
  425. package/src/internal/discovery/extension-overlay.ts +0 -18
  426. package/src/internal/discovery/extensions.ts +2 -26
  427. package/src/internal/discovery/info.ts +3 -13
  428. package/src/internal/discovery/modules.ts +0 -1
  429. package/src/internal/discovery/project.ts +0 -16
  430. package/src/internal/eval-runner.ts +0 -1
  431. package/src/internal/framework-file-storage.ts +4 -5
  432. package/src/internal/framework-storage-selection.ts +2 -2
  433. package/src/internal/guest-network.ts +43 -29
  434. package/src/internal/hosted-admission-adapter.ts +2 -0
  435. package/src/internal/hosted-catch-protocol.ts +130 -0
  436. package/src/internal/hosted-catch.ts +192 -0
  437. package/src/internal/hosted-delivery-protocol.ts +387 -0
  438. package/src/internal/hosted-delivery.ts +155 -22
  439. package/src/internal/hosted-execution-diag.ts +21 -3
  440. package/src/internal/hosted-execution-flush.ts +6 -3
  441. package/src/internal/http-control-plane-session.ts +104 -0
  442. package/src/internal/init-scaffold.ts +1 -2
  443. package/src/internal/install-cursor-skills.ts +38 -5
  444. package/src/internal/legacy-command-guard.ts +59 -0
  445. package/src/internal/platform-timers.ts +191 -0
  446. package/src/internal/reminder-control-plane-protocol.ts +15 -2
  447. package/src/internal/reminder-runner.ts +60 -9
  448. package/src/internal/resolve-prod-target.ts +15 -0
  449. package/src/internal/run-client.ts +1 -1
  450. package/src/internal/sdk-runner.ts +3 -2
  451. package/src/internal/server.ts +89 -95
  452. package/src/internal/session-engine.ts +155 -285
  453. package/src/internal/storage-coordinator.ts +5 -76
  454. package/src/internal/storage-roles.ts +4 -9
  455. package/src/storage-backends/cursor-hosted-v2.ts +4 -7
  456. package/src/storage-backends/cursor-hosted.ts +40 -38
  457. package/src/storage-backends/file-kv.ts +10 -51
  458. package/src/storage-protocol.ts +3 -17
  459. package/src/storage.ts +10 -101
  460. package/src/types.ts +58 -62
  461. package/templates/demo/README.md +10 -6
  462. package/templates/demo/agent/channels/github.ts +2 -0
  463. package/templates/demo/agent/channels/queue.ts +6 -2
  464. package/templates/demo/agent/lib/repos.ts +5 -0
  465. package/templates/demo/init.json +25 -0
  466. package/dist/ab.d.ts +0 -209
  467. package/dist/ab.d.ts.map +0 -1
  468. package/dist/ab.js +0 -246
  469. package/dist/docs/ab.html +0 -80
  470. package/dist/docs/ab.md +0 -332
  471. package/dist/docs/assets/ab.md.mlVgqvSk.js +0 -54
  472. package/dist/docs/assets/ab.md.mlVgqvSk.lean.js +0 -1
  473. package/dist/docs/assets/chunks/@localSearchIndexroot.DXXZxiMv.js +0 -1
  474. package/dist/docs/assets/concepts.md.DgEcZOfT.js +0 -1
  475. package/dist/docs/assets/evals.md.CbMoebP1.js +0 -85
  476. package/dist/docs/assets/evals.md.CbMoebP1.lean.js +0 -1
  477. package/dist/docs/assets/guides_cloud-agents.md.DS8RIjwx.js +0 -9
  478. package/dist/docs/assets/index.md.BW_6tOgR.js +0 -5
  479. package/dist/docs/assets/reference_sessions.md.CueyOHSL.js +0 -1
  480. package/dist/docs/assets/skills_ab.md.CsFNatVx.js +0 -26
  481. package/dist/docs/assets/skills_ab.md.CsFNatVx.lean.js +0 -1
  482. package/dist/docs/assets/skills_evals.md.723kpUmA.js +0 -25
  483. package/dist/docs/assets/skills_evals.md.723kpUmA.lean.js +0 -1
  484. package/dist/docs/assets/skills_framework-map.md.haibFyoB.js +0 -1
  485. package/dist/docs/assets/skills_index.md.DKwIxzGg.js +0 -1
  486. package/dist/docs/assets/skills_index.md.DKwIxzGg.lean.js +0 -1
  487. package/dist/docs/assets/troubleshooting.md.Cus_YZga.js +0 -1
  488. package/dist/docs/skills/ab.html +0 -52
  489. package/dist/docs/skills/ab.md +0 -50
  490. package/dist/internal/ab-collector.d.ts +0 -44
  491. package/dist/internal/ab-collector.d.ts.map +0 -1
  492. package/dist/internal/ab-collector.js +0 -142
  493. package/dist/internal/ab-fold.d.ts +0 -36
  494. package/dist/internal/ab-fold.d.ts.map +0 -1
  495. package/dist/internal/ab-fold.js +0 -175
  496. package/dist/internal/ab-snapshot.d.ts +0 -68
  497. package/dist/internal/ab-snapshot.d.ts.map +0 -1
  498. package/dist/internal/ab-snapshot.js +0 -208
  499. package/dist/internal/discovery/ab.d.ts +0 -9
  500. package/dist/internal/discovery/ab.d.ts.map +0 -1
  501. package/dist/internal/discovery/ab.js +0 -113
  502. package/dist/playground/assets/index-Bq2HpEQB.js +0 -67
  503. package/dist/playground/assets/index-CZKKNlmb.css +0 -1
  504. package/docs/ab.md +0 -337
  505. package/skills/ab/SKILL.md +0 -58
  506. package/src/ab.ts +0 -430
  507. package/src/internal/ab-collector.ts +0 -200
  508. package/src/internal/ab-fold.ts +0 -232
  509. package/src/internal/ab-snapshot.ts +0 -331
  510. package/src/internal/discovery/ab.ts +0 -131
  511. /package/dist/docs/assets/{concepts.md.DgEcZOfT.lean.js → concepts.md.B4o63Gul.lean.js} +0 -0
  512. /package/dist/docs/assets/{guides_grokbot-agents.md.DVqdhBKb.lean.js → guides_grokbot-agents.md.DyV-WArv.lean.js} +0 -0
  513. /package/dist/docs/assets/{guides_webhooks.md.DKdA43Qm.lean.js → guides_webhooks.md.CJK484ex.lean.js} +0 -0
  514. /package/dist/docs/assets/{hillclimbing.md.CpTGTCle.lean.js → hillclimbing.md.BOiVo1tf.lean.js} +0 -0
  515. /package/dist/docs/assets/{reference_agent-config.md.CHNpiyp4.lean.js → reference_agent-config.md.CvoL6pof.lean.js} +0 -0
  516. /package/dist/docs/assets/{reference_connections.md.Di6jJAXF.lean.js → reference_connections.md.BojkC6c5.lean.js} +0 -0
  517. /package/dist/docs/assets/{reference_extensions.md.CGmMLblt.lean.js → reference_extensions.md.ZAVUyuEX.lean.js} +0 -0
  518. /package/dist/docs/assets/{reference_http-api.md.oySXBO8o.lean.js → reference_http-api.md.BwaCo-VO.lean.js} +0 -0
  519. /package/dist/docs/assets/{reference_sessions.md.CueyOHSL.lean.js → reference_sessions.md.CyXV1MUw.lean.js} +0 -0
  520. /package/dist/docs/assets/{scaffolding-agents.md.em43xlY1.lean.js → scaffolding-agents.md.Kctn3OVb.lean.js} +0 -0
  521. /package/dist/docs/assets/{skills_create-agent.md.BVoWPcan.lean.js → skills_create-agent.md.Q3h6Je-e.lean.js} +0 -0
  522. /package/dist/docs/assets/{skills_github.md.D0JahM8c.lean.js → skills_github.md.hgFX_oKY.lean.js} +0 -0
  523. /package/dist/docs/assets/{troubleshooting.md.Cus_YZga.lean.js → troubleshooting.md.CYEAO9bM.lean.js} +0 -0
package/src/ab.ts DELETED
@@ -1,430 +0,0 @@
1
- /**
2
- * Live A/B metrics plug-in for agent-serve.
3
- *
4
- * Author `agent/ab.ts` (or `agent/ab/<name>.ts`) with {@link defineAB}. At
5
- * session creation the engine runs {@link ABConfig.split} and appends durable
6
- * `ab.assigned` events; arms are exposed on {@link SessionInfo.abs} for the
7
- * agent loop (tools / optional per-variant `instructions`). {@link ABCollector}
8
- * folds the event stream into metrics and calls {@link ABConfig.onSample}.
9
- * There is no `agent-sdk ab` test runner.
10
- *
11
- * Assignments and foldable metrics live in each session's `events.ndjson`
12
- * (survive serve restart). Optional project defaults in `agent/ab.config.ts`
13
- * ({@link defineABConfig}) cap the playground fold window; durable
14
- * sample/snapshot export lives on the `defineStorage` `abs` table.
15
- *
16
- * ```ts
17
- * import { defineAB, splitBySessionHash } from "@cursor/july/ab";
18
- *
19
- * export default defineAB({
20
- * name: "concise-instructions",
21
- * variants: {
22
- * control: { label: "Baseline" },
23
- * treatment: { label: "Shorter" },
24
- * },
25
- * split: splitBySessionHash({ holdout: 0.1 }),
26
- * onSample(sample) {
27
- * console.log(sample.variant, sample.metrics);
28
- * },
29
- * });
30
- * ```
31
- */
32
-
33
- import { normalizePositiveInt } from "./internal/bounded-int.js";
34
- import { brandDefinition } from "./internal/brand.js";
35
- import type { SessionEvent, SessionInfo } from "./types.js";
36
-
37
- export type { ABSnapshot } from "./internal/ab-snapshot.js";
38
-
39
- export interface ABVariantMeta {
40
- label?: string;
41
- description?: string;
42
- /**
43
- * Optional prompt overlay for this arm. Appended to the agent's
44
- * instructions for the session (local `AGENTS.md` + cloud first-turn
45
- * preamble) after sticky enrollment.
46
- */
47
- instructions?: string;
48
- }
49
-
50
- export interface ABSplitContext {
51
- agent: { name: string };
52
- channel: { id: string };
53
- /**
54
- * Live sessions only — the engine never calls `split` for
55
- * `purpose: "eval"` harness sessions.
56
- */
57
- session: SessionInfo;
58
- experiment: string;
59
- /** Variant keys from {@link ABConfig.variants}, in declaration order. */
60
- variants: string[];
61
- }
62
-
63
- export interface ABCollectContext {
64
- agent: { name: string };
65
- channel: { id: string };
66
- session: SessionInfo;
67
- experiment: string;
68
- variant: string;
69
- }
70
-
71
- /** Cumulative per-session metrics for one experiment arm. */
72
- export interface ABMetrics {
73
- turns: number;
74
- turnFailures: number;
75
- toolCalls: number;
76
- toolErrors: number;
77
- inputTokens: number;
78
- outputTokens: number;
79
- cacheReadTokens: number;
80
- cacheWriteTokens: number;
81
- /**
82
- * Sum of estimated turn costs in USD (the `cost.totalUsd` recorded on
83
- * `turn.completed` events). Turns whose model has no known rates
84
- * contribute 0.
85
- */
86
- costUsd: number;
87
- /** Sum of turn wall times (turn.started → turn.completed/failed). */
88
- wallTimeMs: number;
89
- /** Custom counters from {@link ABConfig.derive}. */
90
- custom: Record<string, number>;
91
- }
92
-
93
- export type ABSampleReason = "turn.completed" | "turn.failed";
94
-
95
- export interface ABMetricSample {
96
- experiment: string;
97
- variant: string;
98
- variantLabel?: string;
99
- sessionId: string;
100
- channelId: string;
101
- metrics: ABMetrics;
102
- reason: ABSampleReason;
103
- at: string;
104
- }
105
-
106
- /** Variant key to enroll, or `null` to leave the session out (sticky). */
107
- export type ABSplitResult = string | null;
108
-
109
- /**
110
- * Sticky enrollment decision. Return a variant key, or `null` to skip.
111
- * Prefer helpers ({@link splitBySessionHash}, {@link splitIf}, …).
112
- */
113
- export type ABSplit = (
114
- ctx: ABSplitContext
115
- ) => ABSplitResult | Promise<ABSplitResult>;
116
-
117
- export interface ABSplitOptions {
118
- /** Relative weights per variant key (default: equal). */
119
- weights?: Record<string, number>;
120
- /** Fraction of sessions left out (`0`–`1`, sticky). */
121
- holdout?: number;
122
- /** Salt so a new rollout reshuffles without renaming the experiment. */
123
- salt?: string;
124
- }
125
-
126
- /** Sticky hash of session id → arm (recommended default). */
127
- export function splitBySessionHash(options?: ABSplitOptions): ABSplit {
128
- assertHoldout(options?.holdout);
129
- return (ctx) =>
130
- pickArm(
131
- ctx.variants,
132
- options?.weights,
133
- hashToUnitInterval(`${options?.salt ?? ""}\0${ctx.session.id}`),
134
- options?.holdout
135
- );
136
- }
137
-
138
- /** Random draw once per new session (then sticky via persistence). */
139
- export function splitByRandom(options?: Omit<ABSplitOptions, "salt">): ABSplit {
140
- assertHoldout(options?.holdout);
141
- return (ctx) =>
142
- pickArm(ctx.variants, options?.weights, Math.random(), options?.holdout);
143
- }
144
-
145
- /** Pin every new session to one arm. */
146
- export function splitAlways(variant: string): ABSplit {
147
- return () => variant;
148
- }
149
-
150
- /** Skip every session (pause without deleting the experiment). */
151
- export function splitNone(): ABSplit {
152
- return () => null;
153
- }
154
-
155
- /** Run `inner` only when `predicate` is true; otherwise skip. */
156
- export function splitIf(
157
- predicate: (ctx: ABSplitContext) => boolean | Promise<boolean>,
158
- inner: ABSplit
159
- ): ABSplit {
160
- return async (ctx) => ((await predicate(ctx)) ? inner(ctx) : null);
161
- }
162
-
163
- export interface ABConfig {
164
- /** Experiment id. Defaults to the file stem (`ab/concise.ts` → `concise`). */
165
- name?: string;
166
- /**
167
- * Named arms (at least two). Prefer `control` / `treatment` over `a` / `b`.
168
- */
169
- variants: Record<string, ABVariantMeta>;
170
- /**
171
- * Choose an arm at session creation, or return `null` to skip. The engine
172
- * appends a durable `ab.assigned` event; the collector folds that stream.
173
- */
174
- split: ABSplit;
175
- /**
176
- * Optional custom metric extractors. Return a numeric delta, or
177
- * `null`/`undefined` to skip. Called on **every** session event (including
178
- * high-frequency `message.appended` deltas) — keep these synchronous and
179
- * cheap; do not await I/O.
180
- */
181
- derive?: Record<
182
- string,
183
- (
184
- event: SessionEvent,
185
- ctx: ABCollectContext
186
- ) => number | null | undefined | Promise<number | null | undefined>
187
- >;
188
- /**
189
- * Called on turn complete/fail for enrolled sessions only. Observe-only;
190
- * errors are logged and never fatal.
191
- */
192
- onSample: (sample: ABMetricSample) => void | Promise<void>;
193
- }
194
-
195
- export type ABDefinition = ABConfig & { readonly __agentServe: "ab" };
196
-
197
- /** Author a live A/B metrics experiment under `agent/ab`. */
198
- export function defineAB(config: ABConfig): ABDefinition {
199
- const keys = Object.keys(config.variants ?? {});
200
- if (keys.length < 2) {
201
- throw new Error(
202
- `defineAB: variants needs at least two arms (got ${keys.length})`
203
- );
204
- }
205
- for (const key of keys) {
206
- if (key.length === 0 || key.includes("/") || key.includes("\\")) {
207
- throw new Error(
208
- `defineAB: invalid variant key ${JSON.stringify(key)} (single segment)`
209
- );
210
- }
211
- }
212
- if (typeof config.split !== "function") {
213
- throw new Error(
214
- "defineAB: split must be a function (splitBySessionHash(), splitIf(...), or custom)"
215
- );
216
- }
217
- if (typeof config.onSample !== "function") {
218
- throw new Error("defineAB: onSample(sample) is required");
219
- }
220
- if (config.derive !== undefined) {
221
- for (const [key, fn] of Object.entries(config.derive)) {
222
- if (typeof fn !== "function") {
223
- throw new Error(`defineAB: derive.${key} must be a function`);
224
- }
225
- }
226
- }
227
- return brandDefinition("ab", config);
228
- }
229
-
230
- /** Resolve {@link ABConfig.split} to a variant key or `null`. */
231
- export async function resolveABSplit(
232
- split: ABSplit,
233
- ctx: ABSplitContext
234
- ): Promise<ABSplitResult> {
235
- const result = await split(ctx);
236
- if (result === null || result === undefined) {
237
- return null;
238
- }
239
- if (typeof result === "string") {
240
- return result;
241
- }
242
- throw new Error(
243
- `defineAB: split must return a variant key or null (got ${typeof result})`
244
- );
245
- }
246
-
247
- function assertHoldout(holdout: number | undefined): void {
248
- if (holdout === undefined) {
249
- return;
250
- }
251
- if (!Number.isFinite(holdout) || holdout < 0 || holdout > 1) {
252
- throw new Error("defineAB: holdout must be a finite number in [0, 1]");
253
- }
254
- }
255
-
256
- /** Pick a variant (or `null` via holdout) from a unit interval in `[0, 1)`. */
257
- function pickArm(
258
- variantKeys: readonly string[],
259
- weights: Record<string, number> | undefined,
260
- unitInterval: number,
261
- holdout: number | undefined
262
- ): ABSplitResult {
263
- const u = clampUnit(unitInterval);
264
- const out = holdout ?? 0;
265
- if (out >= 1 || (out > 0 && u < out)) {
266
- return null;
267
- }
268
- const remapped = out > 0 ? (u - out) / (1 - out) : u;
269
- return pickWeightedVariant(variantKeys, weights, remapped);
270
- }
271
-
272
- /** FNV-1a → [0, 1). */
273
- export function hashToUnitInterval(input: string): number {
274
- let h = 2166136261;
275
- for (let i = 0; i < input.length; i++) {
276
- h ^= input.charCodeAt(i);
277
- h = Math.imul(h, 16777619);
278
- }
279
- return (h >>> 0) / 0x1_0000_0000;
280
- }
281
-
282
- export function pickWeightedVariant(
283
- variantKeys: readonly string[],
284
- weights: Record<string, number> | undefined,
285
- unitInterval: number
286
- ): string {
287
- const u = clampUnit(unitInterval);
288
- const rows: Array<{ key: string; weight: number }> = [];
289
- let total = 0;
290
- for (const key of variantKeys) {
291
- const weight = weights?.[key] ?? 1;
292
- if (weight > 0 && Number.isFinite(weight)) {
293
- rows.push({ key, weight });
294
- total += weight;
295
- }
296
- }
297
- if (rows.length === 0 || total <= 0) {
298
- throw new Error("defineAB: no positive-weight variants to split across");
299
- }
300
- let cursor = u * total;
301
- for (const row of rows) {
302
- cursor -= row.weight;
303
- if (cursor < 0) {
304
- return row.key;
305
- }
306
- }
307
- return rows[rows.length - 1]!.key;
308
- }
309
-
310
- function clampUnit(unitInterval: number): number {
311
- return Math.min(Math.max(unitInterval, 0), 0.999999999);
312
- }
313
-
314
- export function emptyABMetrics(): ABMetrics {
315
- return {
316
- turns: 0,
317
- turnFailures: 0,
318
- toolCalls: 0,
319
- toolErrors: 0,
320
- inputTokens: 0,
321
- outputTokens: 0,
322
- cacheReadTokens: 0,
323
- cacheWriteTokens: 0,
324
- costUsd: 0,
325
- wallTimeMs: 0,
326
- custom: {},
327
- };
328
- }
329
-
330
- export function cloneABMetrics(metrics: ABMetrics): ABMetrics {
331
- return { ...metrics, custom: { ...metrics.custom } };
332
- }
333
-
334
- /**
335
- * Append enrolled per-variant `instructions` overlays onto the base agent
336
- * prompt. Used by the session engine before materializing the harness.
337
- */
338
- export function mergeABInstructions(
339
- base: string | undefined,
340
- abs: Readonly<Record<string, string | null>> | undefined,
341
- experiments: ReadonlyArray<{ name: string; definition: ABDefinition }>
342
- ): string | undefined {
343
- if (abs === undefined) {
344
- return base;
345
- }
346
- const extras: string[] = [];
347
- for (const experiment of experiments) {
348
- const variant = abs[experiment.name];
349
- if (variant === undefined || variant === null) {
350
- continue;
351
- }
352
- const extra = experiment.definition.variants[variant]?.instructions;
353
- if (typeof extra === "string" && extra.trim() !== "") {
354
- extras.push(extra.trim());
355
- }
356
- }
357
- if (extras.length === 0) {
358
- return base;
359
- }
360
- const baseText = base?.trim() ?? "";
361
- return baseText === ""
362
- ? extras.join("\n\n")
363
- : `${baseText}\n\n${extras.join("\n\n")}`;
364
- }
365
-
366
- // ---------------------------------------------------------------------------
367
- // Project config (`agent/ab.config.ts`) — playground fold window
368
- // ---------------------------------------------------------------------------
369
-
370
- /** Default sessions folded into `GET /v1/abs` / the A/Bs tab. */
371
- export const AB_DEFAULT_MAX_PLAYGROUND_SESSIONS = 200;
372
-
373
- /** Hard ceiling for {@link ABConfigFile.maxPlaygroundSessions}. */
374
- export const AB_MAX_PLAYGROUND_SESSIONS = 10_000;
375
-
376
- /**
377
- * Project-wide A/B defaults (`agent/ab.config.ts`).
378
- *
379
- * **Assignments and foldable metrics** already persist in each session's
380
- * `events.ndjson` under `--state-root`; durable sample/snapshot export
381
- * lives on the `defineStorage` `abs` table (`agent/storage.ts`). This
382
- * config only caps how many sessions the playground / `GET /v1/abs` folds.
383
- */
384
- export interface ABConfigFile {
385
- /**
386
- * Optional. Max newest sessions folded into **`GET /v1/abs` / the A/Bs
387
- * tab**. Does not prune session logs or change assignment.
388
- *
389
- * Default {@link AB_DEFAULT_MAX_PLAYGROUND_SESSIONS}; hard-capped at
390
- * {@link AB_MAX_PLAYGROUND_SESSIONS}.
391
- */
392
- maxPlaygroundSessions?: number;
393
- }
394
-
395
- /**
396
- * Defaults for every experiment under `agent/ab*` (`agent/ab.config.ts`).
397
- *
398
- * Session event logs remain the assignment/metrics source of truth;
399
- * durable exports go through the `defineStorage` `abs` table.
400
- */
401
- export function defineABConfig(config: ABConfigFile): ABConfigFile {
402
- return {
403
- maxPlaygroundSessions: normalizeABMaxPlaygroundSessions(
404
- config.maxPlaygroundSessions ?? AB_DEFAULT_MAX_PLAYGROUND_SESSIONS
405
- ),
406
- };
407
- }
408
-
409
- /** Validate {@link ABConfigFile.maxPlaygroundSessions}. */
410
- export function normalizeABMaxPlaygroundSessions(value: unknown): number {
411
- return normalizePositiveInt(value, {
412
- label: "ab.config.ts: maxPlaygroundSessions",
413
- max: AB_MAX_PLAYGROUND_SESSIONS,
414
- });
415
- }
416
-
417
- /**
418
- * Effective `GET /v1/abs` fold window. Invalid values fall back to
419
- * {@link AB_DEFAULT_MAX_PLAYGROUND_SESSIONS}.
420
- */
421
- export function resolveABMaxPlaygroundSessions(value: unknown): number {
422
- if (value === undefined) {
423
- return AB_DEFAULT_MAX_PLAYGROUND_SESSIONS;
424
- }
425
- try {
426
- return normalizeABMaxPlaygroundSessions(value);
427
- } catch {
428
- return AB_DEFAULT_MAX_PLAYGROUND_SESSIONS;
429
- }
430
- }
@@ -1,200 +0,0 @@
1
- /**
2
- * Stream-native collector for {@link defineAB} experiments.
3
- *
4
- * Pure fold over the session event log:
5
- * - sticky arm = last `ab.assigned` for that experiment
6
- * - metrics accumulate from the stream; `onSample` on turn complete/fail
7
- *
8
- * Enrollment is written by the engine at session creation (not here).
9
- * In-memory state is a cache: on cold start (or after park eviction) the
10
- * collector replays `events.ndjson` so counters survive restart.
11
- *
12
- * Hydration note: the engine appends before dispatch, so the first-touch
13
- * replay already includes the current event — after rebuild we return
14
- * without folding it again (and without re-firing `onSample`).
15
- */
16
-
17
- import {
18
- type ABDefinition,
19
- type ABMetricSample,
20
- type ABSampleReason,
21
- cloneABMetrics,
22
- } from "../ab.js";
23
- import type { DiscoveredAB, SessionEvent, SessionInfo } from "../types.js";
24
- import {
25
- applyDeriveForEvent,
26
- emptyFoldedABSession,
27
- ensureArmAccum,
28
- type FoldedABSession,
29
- foldABEvent,
30
- } from "./ab-fold.js";
31
- import { describeError } from "./describe-error.js";
32
-
33
- export type { DiscoveredAB };
34
-
35
- export interface ABCollectorOptions {
36
- /**
37
- * Durable sample export (the `defineStorage` `abs` table, via the
38
- * coordinator). Fire-and-forget; must never throw.
39
- */
40
- persistSample?: (sample: ABMetricSample) => void;
41
- }
42
-
43
- /** Drop cache after these — next event rehydrates from the durable log. */
44
- const EVICT_ON: ReadonlySet<SessionEvent["type"]> = new Set([
45
- "session.waiting",
46
- "session.completed",
47
- "session.failed",
48
- ]);
49
-
50
- export class ABCollector {
51
- private readonly state = new Map<string, FoldedABSession>();
52
- private readonly hydrated = new Set<string>();
53
- private readonly persistSample:
54
- | ((sample: ABMetricSample) => void)
55
- | undefined;
56
-
57
- constructor(
58
- private readonly experiments: readonly DiscoveredAB[],
59
- private readonly logger: (line: string) => void,
60
- private readonly loadEvents: (sessionId: string) => Promise<SessionEvent[]>,
61
- options?: ABCollectorOptions
62
- ) {
63
- this.persistSample = options?.persistSample;
64
- }
65
-
66
- get enabled(): boolean {
67
- return this.experiments.length > 0;
68
- }
69
-
70
- /**
71
- * Fold one live event. On first touch (or after eviction), replays the
72
- * durable log first so enrollment + metrics match disk.
73
- */
74
- async onEvent(
75
- event: SessionEvent,
76
- sessionInfo: SessionInfo,
77
- agentName: string
78
- ): Promise<void> {
79
- if (!this.enabled) {
80
- return;
81
- }
82
-
83
- if (!this.hydrated.has(event.sessionId)) {
84
- const history = await this.loadEvents(event.sessionId);
85
- // Rebuild arms + metrics only — do not re-fire onSample for past turns.
86
- // History already includes `event` (append-before-dispatch).
87
- for (const past of history) {
88
- await this.fold(past, sessionInfo, agentName, { emitSamples: false });
89
- }
90
- this.hydrated.add(event.sessionId);
91
- if (EVICT_ON.has(event.type)) {
92
- this.drop(event.sessionId);
93
- }
94
- return;
95
- }
96
-
97
- await this.fold(event, sessionInfo, agentName, { emitSamples: true });
98
- if (EVICT_ON.has(event.type)) {
99
- this.drop(event.sessionId);
100
- }
101
- }
102
-
103
- private drop(sessionId: string): void {
104
- this.state.delete(sessionId);
105
- this.hydrated.delete(sessionId);
106
- }
107
-
108
- private async fold(
109
- event: SessionEvent,
110
- sessionInfo: SessionInfo,
111
- agentName: string,
112
- options: { emitSamples: boolean }
113
- ): Promise<void> {
114
- const session = this.sessionAccum(event.sessionId);
115
-
116
- if (event.type === "ab.assigned") {
117
- foldABEvent(session, event);
118
- return;
119
- }
120
-
121
- if (session.arms.size === 0) {
122
- return;
123
- }
124
-
125
- // Built-ins for every enrolled arm (shared fold).
126
- foldABEvent(session, event);
127
-
128
- for (const experiment of this.experiments) {
129
- const variant = session.arms.get(experiment.name);
130
- if (variant === undefined || variant === null) {
131
- continue;
132
- }
133
- const def = experiment.definition as ABDefinition;
134
- const accum = ensureArmAccum(session, experiment.name, variant);
135
-
136
- if (def.derive !== undefined) {
137
- await applyDeriveForEvent(
138
- accum.metrics.custom,
139
- def.derive,
140
- event,
141
- {
142
- agent: { name: agentName },
143
- channel: { id: sessionInfo.channelId },
144
- session: sessionInfo,
145
- experiment: experiment.name,
146
- variant,
147
- },
148
- (key, error) => {
149
- this.logger(
150
- `[agent-sdk] ab "${experiment.name}" derive.${key} threw: ${describeError(error)}`
151
- );
152
- }
153
- );
154
- }
155
-
156
- if (!options.emitSamples) {
157
- continue;
158
- }
159
- const reason = sampleReason(event);
160
- if (reason !== undefined) {
161
- const sample: ABMetricSample = {
162
- experiment: experiment.name,
163
- variant,
164
- ...(def.variants[variant]?.label !== undefined
165
- ? { variantLabel: def.variants[variant].label }
166
- : {}),
167
- sessionId: event.sessionId,
168
- channelId: sessionInfo.channelId,
169
- metrics: cloneABMetrics(accum.metrics),
170
- reason,
171
- at: event.at,
172
- };
173
- try {
174
- await def.onSample(sample);
175
- } catch (error) {
176
- this.logger(
177
- `[agent-sdk] ab "${experiment.name}" onSample threw: ${describeError(error)}`
178
- );
179
- }
180
- this.persistSample?.(sample);
181
- }
182
- }
183
- }
184
-
185
- private sessionAccum(sessionId: string): FoldedABSession {
186
- let session = this.state.get(sessionId);
187
- if (session === undefined) {
188
- session = emptyFoldedABSession();
189
- this.state.set(sessionId, session);
190
- }
191
- return session;
192
- }
193
- }
194
-
195
- function sampleReason(event: SessionEvent): ABSampleReason | undefined {
196
- if (event.type === "turn.completed" || event.type === "turn.failed") {
197
- return event.type;
198
- }
199
- return undefined;
200
- }