@cursor/july 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (623) hide show
  1. package/AGENTS.md +290 -0
  2. package/LICENSE.md +3 -0
  3. package/README.md +1233 -0
  4. package/dist/ab.d.ts +290 -0
  5. package/dist/ab.d.ts.map +1 -0
  6. package/dist/ab.js +386 -0
  7. package/dist/bin/agent-serve.d.ts +15 -0
  8. package/dist/bin/agent-serve.d.ts.map +1 -0
  9. package/dist/bin/agent-serve.js +754 -0
  10. package/dist/channels/github/api.d.ts +101 -0
  11. package/dist/channels/github/api.d.ts.map +1 -0
  12. package/dist/channels/github/api.js +229 -0
  13. package/dist/channels/github/auth.d.ts +67 -0
  14. package/dist/channels/github/auth.d.ts.map +1 -0
  15. package/dist/channels/github/auth.js +239 -0
  16. package/dist/channels/github/binding.d.ts +73 -0
  17. package/dist/channels/github/binding.d.ts.map +1 -0
  18. package/dist/channels/github/binding.js +114 -0
  19. package/dist/channels/github/defaults.d.ts +24 -0
  20. package/dist/channels/github/defaults.d.ts.map +1 -0
  21. package/dist/channels/github/defaults.js +100 -0
  22. package/dist/channels/github/events.d.ts +18 -0
  23. package/dist/channels/github/events.d.ts.map +1 -0
  24. package/dist/channels/github/events.js +59 -0
  25. package/dist/channels/github/forward.d.ts +137 -0
  26. package/dist/channels/github/forward.d.ts.map +1 -0
  27. package/dist/channels/github/forward.js +271 -0
  28. package/dist/channels/github/github-channel.d.ts +127 -0
  29. package/dist/channels/github/github-channel.d.ts.map +1 -0
  30. package/dist/channels/github/github-channel.js +1688 -0
  31. package/dist/channels/github/index.d.ts +52 -0
  32. package/dist/channels/github/index.d.ts.map +1 -0
  33. package/dist/channels/github/index.js +51 -0
  34. package/dist/channels/github/replay.d.ts +115 -0
  35. package/dist/channels/github/replay.d.ts.map +1 -0
  36. package/dist/channels/github/replay.js +282 -0
  37. package/dist/channels/github/state.d.ts +26 -0
  38. package/dist/channels/github/state.d.ts.map +1 -0
  39. package/dist/channels/github/state.js +50 -0
  40. package/dist/channels/github/types.d.ts +385 -0
  41. package/dist/channels/github/types.d.ts.map +1 -0
  42. package/dist/channels/github/types.js +1 -0
  43. package/dist/channels/slack/api.d.ts +117 -0
  44. package/dist/channels/slack/api.d.ts.map +1 -0
  45. package/dist/channels/slack/api.js +437 -0
  46. package/dist/channels/slack/approvals.d.ts +32 -0
  47. package/dist/channels/slack/approvals.d.ts.map +1 -0
  48. package/dist/channels/slack/approvals.js +157 -0
  49. package/dist/channels/slack/assistant.d.ts +23 -0
  50. package/dist/channels/slack/assistant.d.ts.map +1 -0
  51. package/dist/channels/slack/assistant.js +67 -0
  52. package/dist/channels/slack/auth.d.ts +40 -0
  53. package/dist/channels/slack/auth.d.ts.map +1 -0
  54. package/dist/channels/slack/auth.js +71 -0
  55. package/dist/channels/slack/channel-watch.d.ts +46 -0
  56. package/dist/channels/slack/channel-watch.d.ts.map +1 -0
  57. package/dist/channels/slack/channel-watch.js +180 -0
  58. package/dist/channels/slack/constants.d.ts +17 -0
  59. package/dist/channels/slack/constants.d.ts.map +1 -0
  60. package/dist/channels/slack/constants.js +27 -0
  61. package/dist/channels/slack/credentials.d.ts +35 -0
  62. package/dist/channels/slack/credentials.d.ts.map +1 -0
  63. package/dist/channels/slack/credentials.js +88 -0
  64. package/dist/channels/slack/cursor-account.d.ts +76 -0
  65. package/dist/channels/slack/cursor-account.d.ts.map +1 -0
  66. package/dist/channels/slack/cursor-account.js +88 -0
  67. package/dist/channels/slack/defaults.d.ts +32 -0
  68. package/dist/channels/slack/defaults.d.ts.map +1 -0
  69. package/dist/channels/slack/defaults.js +380 -0
  70. package/dist/channels/slack/dispatch.d.ts +43 -0
  71. package/dist/channels/slack/dispatch.d.ts.map +1 -0
  72. package/dist/channels/slack/dispatch.js +185 -0
  73. package/dist/channels/slack/doctor.d.ts +24 -0
  74. package/dist/channels/slack/doctor.d.ts.map +1 -0
  75. package/dist/channels/slack/doctor.js +115 -0
  76. package/dist/channels/slack/event-id-dedupe.d.ts +10 -0
  77. package/dist/channels/slack/event-id-dedupe.d.ts.map +1 -0
  78. package/dist/channels/slack/event-id-dedupe.js +23 -0
  79. package/dist/channels/slack/inbound.d.ts +41 -0
  80. package/dist/channels/slack/inbound.d.ts.map +1 -0
  81. package/dist/channels/slack/inbound.js +166 -0
  82. package/dist/channels/slack/index.d.ts +45 -0
  83. package/dist/channels/slack/index.d.ts.map +1 -0
  84. package/dist/channels/slack/index.js +44 -0
  85. package/dist/channels/slack/init.d.ts +32 -0
  86. package/dist/channels/slack/init.d.ts.map +1 -0
  87. package/dist/channels/slack/init.js +82 -0
  88. package/dist/channels/slack/interactive.d.ts +19 -0
  89. package/dist/channels/slack/interactive.d.ts.map +1 -0
  90. package/dist/channels/slack/interactive.js +142 -0
  91. package/dist/channels/slack/links.d.ts +10 -0
  92. package/dist/channels/slack/links.d.ts.map +1 -0
  93. package/dist/channels/slack/links.js +19 -0
  94. package/dist/channels/slack/live-delivery.d.ts +75 -0
  95. package/dist/channels/slack/live-delivery.d.ts.map +1 -0
  96. package/dist/channels/slack/live-delivery.js +143 -0
  97. package/dist/channels/slack/log.d.ts +25 -0
  98. package/dist/channels/slack/log.d.ts.map +1 -0
  99. package/dist/channels/slack/log.js +47 -0
  100. package/dist/channels/slack/manifest.d.ts +57 -0
  101. package/dist/channels/slack/manifest.d.ts.map +1 -0
  102. package/dist/channels/slack/manifest.js +110 -0
  103. package/dist/channels/slack/pr-ref.d.ts +18 -0
  104. package/dist/channels/slack/pr-ref.d.ts.map +1 -0
  105. package/dist/channels/slack/pr-ref.js +36 -0
  106. package/dist/channels/slack/setup.d.ts +14 -0
  107. package/dist/channels/slack/setup.d.ts.map +1 -0
  108. package/dist/channels/slack/setup.js +86 -0
  109. package/dist/channels/slack/slack-channel.d.ts +15 -0
  110. package/dist/channels/slack/slack-channel.d.ts.map +1 -0
  111. package/dist/channels/slack/slack-channel.js +281 -0
  112. package/dist/channels/slack/socket-mode.d.ts +26 -0
  113. package/dist/channels/slack/socket-mode.d.ts.map +1 -0
  114. package/dist/channels/slack/socket-mode.js +116 -0
  115. package/dist/channels/slack/stream.d.ts +26 -0
  116. package/dist/channels/slack/stream.d.ts.map +1 -0
  117. package/dist/channels/slack/stream.js +39 -0
  118. package/dist/channels/slack/tool-approval-events.d.ts +33 -0
  119. package/dist/channels/slack/tool-approval-events.d.ts.map +1 -0
  120. package/dist/channels/slack/tool-approval-events.js +129 -0
  121. package/dist/channels/slack/types.d.ts +326 -0
  122. package/dist/channels/slack/types.d.ts.map +1 -0
  123. package/dist/channels/slack/types.js +4 -0
  124. package/dist/channels.d.ts +116 -0
  125. package/dist/channels.d.ts.map +1 -0
  126. package/dist/channels.js +294 -0
  127. package/dist/connections.d.ts +75 -0
  128. package/dist/connections.d.ts.map +1 -0
  129. package/dist/connections.js +75 -0
  130. package/dist/docs/404.html +22 -0
  131. package/dist/docs/ab.html +87 -0
  132. package/dist/docs/assets/ab.md.COdXkces.js +63 -0
  133. package/dist/docs/assets/ab.md.COdXkces.lean.js +1 -0
  134. package/dist/docs/assets/app.DqfFEmJd.js +1 -0
  135. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +13 -0
  136. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.lean.js +1 -0
  137. package/dist/docs/assets/chunks/@localSearchIndexroot.CcVk1uKq.js +1 -0
  138. package/dist/docs/assets/chunks/VPLocalSearchBox.BaLEdS15.js +9 -0
  139. package/dist/docs/assets/chunks/framework.CAZyNGu9.js +19 -0
  140. package/dist/docs/assets/chunks/theme.CZRvu_0q.js +2 -0
  141. package/dist/docs/assets/concepts.md.Cfb9b-k1.js +4 -0
  142. package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +1 -0
  143. package/dist/docs/assets/deployment.md.Dx1TYNk5.js +14 -0
  144. package/dist/docs/assets/deployment.md.Dx1TYNk5.lean.js +1 -0
  145. package/dist/docs/assets/evals.md.DPZ_MAnI.js +85 -0
  146. package/dist/docs/assets/evals.md.DPZ_MAnI.lean.js +1 -0
  147. package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.js +10 -0
  148. package/dist/docs/assets/guides_agent-to-agent.md.CrtrsySy.lean.js +1 -0
  149. package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.js +9 -0
  150. package/dist/docs/assets/guides_cloud-runtime.md.CYlNMTNp.lean.js +1 -0
  151. package/dist/docs/assets/guides_github.md.DwbKhCeS.js +20 -0
  152. package/dist/docs/assets/guides_github.md.DwbKhCeS.lean.js +1 -0
  153. package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.js +28 -0
  154. package/dist/docs/assets/guides_human-in-the-loop.md.Dvuctx7s.lean.js +1 -0
  155. package/dist/docs/assets/guides_slack.md.bv41fHfW.js +37 -0
  156. package/dist/docs/assets/guides_slack.md.bv41fHfW.lean.js +1 -0
  157. package/dist/docs/assets/guides_webhooks.md.hFTik3lf.js +50 -0
  158. package/dist/docs/assets/guides_webhooks.md.hFTik3lf.lean.js +1 -0
  159. package/dist/docs/assets/hillclimbing.md.DHNast08.js +4 -0
  160. package/dist/docs/assets/hillclimbing.md.DHNast08.lean.js +1 -0
  161. package/dist/docs/assets/index.md.BPKcj5AI.js +20 -0
  162. package/dist/docs/assets/index.md.BPKcj5AI.lean.js +1 -0
  163. package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  164. package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  165. package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  166. package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  167. package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  168. package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  169. package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  170. package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  171. package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  172. package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  173. package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  174. package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  175. package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  176. package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  177. package/dist/docs/assets/quickstart.md.tVPiGK_L.js +35 -0
  178. package/dist/docs/assets/quickstart.md.tVPiGK_L.lean.js +1 -0
  179. package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.js +34 -0
  180. package/dist/docs/assets/reference_agent-config.md.Bpd7HQwf.lean.js +1 -0
  181. package/dist/docs/assets/reference_channels.md.D7JTR03W.js +53 -0
  182. package/dist/docs/assets/reference_channels.md.D7JTR03W.lean.js +1 -0
  183. package/dist/docs/assets/reference_cli.md.DA730zCu.js +33 -0
  184. package/dist/docs/assets/reference_cli.md.DA730zCu.lean.js +1 -0
  185. package/dist/docs/assets/reference_connections.md.C3vNH_DE.js +26 -0
  186. package/dist/docs/assets/reference_connections.md.C3vNH_DE.lean.js +1 -0
  187. package/dist/docs/assets/reference_hooks.md.BCEc3MyM.js +12 -0
  188. package/dist/docs/assets/reference_hooks.md.BCEc3MyM.lean.js +1 -0
  189. package/dist/docs/assets/reference_http-api.md.DBAahtdz.js +11 -0
  190. package/dist/docs/assets/reference_http-api.md.DBAahtdz.lean.js +1 -0
  191. package/dist/docs/assets/reference_instructions.md.BC05LEQ8.js +12 -0
  192. package/dist/docs/assets/reference_instructions.md.BC05LEQ8.lean.js +1 -0
  193. package/dist/docs/assets/reference_playground.md.CPZhfYaO.js +1 -0
  194. package/dist/docs/assets/reference_playground.md.CPZhfYaO.lean.js +1 -0
  195. package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.js +31 -0
  196. package/dist/docs/assets/reference_project-layout.md.Bd_CKtNS.lean.js +1 -0
  197. package/dist/docs/assets/reference_schedules.md.D7qijxLk.js +82 -0
  198. package/dist/docs/assets/reference_schedules.md.D7qijxLk.lean.js +1 -0
  199. package/dist/docs/assets/reference_sessions.md.DdjWabnN.js +8 -0
  200. package/dist/docs/assets/reference_sessions.md.DdjWabnN.lean.js +1 -0
  201. package/dist/docs/assets/reference_skills.md.VQnlBT3Q.js +15 -0
  202. package/dist/docs/assets/reference_skills.md.VQnlBT3Q.lean.js +1 -0
  203. package/dist/docs/assets/reference_subagents.md.CIRAVcPK.js +10 -0
  204. package/dist/docs/assets/reference_subagents.md.CIRAVcPK.lean.js +1 -0
  205. package/dist/docs/assets/reference_tools.md.DF5kwlt0.js +46 -0
  206. package/dist/docs/assets/reference_tools.md.DF5kwlt0.lean.js +1 -0
  207. package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.js +1 -0
  208. package/dist/docs/assets/scaffolding-agents.md.CyYfWGdc.lean.js +1 -0
  209. package/dist/docs/assets/style.Bj-IXa5W.css +1 -0
  210. package/dist/docs/assets/troubleshooting.md.DkovjS7h.js +1 -0
  211. package/dist/docs/assets/troubleshooting.md.DkovjS7h.lean.js +1 -0
  212. package/dist/docs/building-with-agents.html +37 -0
  213. package/dist/docs/concepts.html +28 -0
  214. package/dist/docs/deployment.html +38 -0
  215. package/dist/docs/evals.html +109 -0
  216. package/dist/docs/guides/agent-to-agent.html +34 -0
  217. package/dist/docs/guides/cloud-runtime.html +33 -0
  218. package/dist/docs/guides/github.html +44 -0
  219. package/dist/docs/guides/human-in-the-loop.html +52 -0
  220. package/dist/docs/guides/slack.html +61 -0
  221. package/dist/docs/guides/webhooks.html +74 -0
  222. package/dist/docs/hashmap.json +1 -0
  223. package/dist/docs/hillclimbing.html +28 -0
  224. package/dist/docs/index.html +44 -0
  225. package/dist/docs/quickstart.html +59 -0
  226. package/dist/docs/reference/agent-config.html +58 -0
  227. package/dist/docs/reference/channels.html +77 -0
  228. package/dist/docs/reference/cli.html +57 -0
  229. package/dist/docs/reference/connections.html +50 -0
  230. package/dist/docs/reference/hooks.html +36 -0
  231. package/dist/docs/reference/http-api.html +35 -0
  232. package/dist/docs/reference/instructions.html +36 -0
  233. package/dist/docs/reference/playground.html +25 -0
  234. package/dist/docs/reference/project-layout.html +55 -0
  235. package/dist/docs/reference/schedules.html +106 -0
  236. package/dist/docs/reference/sessions.html +32 -0
  237. package/dist/docs/reference/skills.html +39 -0
  238. package/dist/docs/reference/subagents.html +34 -0
  239. package/dist/docs/reference/tools.html +70 -0
  240. package/dist/docs/scaffolding-agents.html +25 -0
  241. package/dist/docs/troubleshooting.html +25 -0
  242. package/dist/docs/vp-icons.css +0 -0
  243. package/dist/evals.d.ts +312 -0
  244. package/dist/evals.d.ts.map +1 -0
  245. package/dist/evals.js +254 -0
  246. package/dist/hooks.d.ts +23 -0
  247. package/dist/hooks.d.ts.map +1 -0
  248. package/dist/hooks.js +23 -0
  249. package/dist/index.d.ts +71 -0
  250. package/dist/index.d.ts.map +1 -0
  251. package/dist/index.js +101 -0
  252. package/dist/internal/ab-collector.d.ts +42 -0
  253. package/dist/internal/ab-collector.d.ts.map +1 -0
  254. package/dist/internal/ab-collector.js +153 -0
  255. package/dist/internal/ab-fold.d.ts +36 -0
  256. package/dist/internal/ab-fold.d.ts.map +1 -0
  257. package/dist/internal/ab-fold.js +171 -0
  258. package/dist/internal/ab-snapshot.d.ts +70 -0
  259. package/dist/internal/ab-snapshot.d.ts.map +1 -0
  260. package/dist/internal/ab-snapshot.js +208 -0
  261. package/dist/internal/approval-gate.d.ts +34 -0
  262. package/dist/internal/approval-gate.d.ts.map +1 -0
  263. package/dist/internal/approval-gate.js +85 -0
  264. package/dist/internal/auth.d.ts +8 -0
  265. package/dist/internal/auth.d.ts.map +1 -0
  266. package/dist/internal/auth.js +27 -0
  267. package/dist/internal/authored-alias-hooks.d.ts +31 -0
  268. package/dist/internal/authored-alias-hooks.d.ts.map +1 -0
  269. package/dist/internal/authored-alias-hooks.js +43 -0
  270. package/dist/internal/authored-loaders.d.ts +25 -0
  271. package/dist/internal/authored-loaders.d.ts.map +1 -0
  272. package/dist/internal/authored-loaders.js +129 -0
  273. package/dist/internal/bounded-int.d.ts +11 -0
  274. package/dist/internal/bounded-int.d.ts.map +1 -0
  275. package/dist/internal/bounded-int.js +13 -0
  276. package/dist/internal/brand.d.ts +6 -0
  277. package/dist/internal/brand.d.ts.map +1 -0
  278. package/dist/internal/brand.js +17 -0
  279. package/dist/internal/chat-client.d.ts +19 -0
  280. package/dist/internal/chat-client.d.ts.map +1 -0
  281. package/dist/internal/chat-client.js +327 -0
  282. package/dist/internal/cli-ax.d.ts +58 -0
  283. package/dist/internal/cli-ax.d.ts.map +1 -0
  284. package/dist/internal/cli-ax.js +345 -0
  285. package/dist/internal/cli-cursor.d.ts +20 -0
  286. package/dist/internal/cli-cursor.d.ts.map +1 -0
  287. package/dist/internal/cli-cursor.js +227 -0
  288. package/dist/internal/cli-github.d.ts +47 -0
  289. package/dist/internal/cli-github.d.ts.map +1 -0
  290. package/dist/internal/cli-github.js +644 -0
  291. package/dist/internal/cli-slack.d.ts +18 -0
  292. package/dist/internal/cli-slack.d.ts.map +1 -0
  293. package/dist/internal/cli-slack.js +144 -0
  294. package/dist/internal/cloud-merge.d.ts +23 -0
  295. package/dist/internal/cloud-merge.d.ts.map +1 -0
  296. package/dist/internal/cloud-merge.js +28 -0
  297. package/dist/internal/cron.d.ts +17 -0
  298. package/dist/internal/cron.d.ts.map +1 -0
  299. package/dist/internal/cron.js +60 -0
  300. package/dist/internal/cursor/account-mcp.d.ts +95 -0
  301. package/dist/internal/cursor/account-mcp.d.ts.map +1 -0
  302. package/dist/internal/cursor/account-mcp.js +342 -0
  303. package/dist/internal/cursor/backend-client.d.ts +118 -0
  304. package/dist/internal/cursor/backend-client.d.ts.map +1 -0
  305. package/dist/internal/cursor/backend-client.js +477 -0
  306. package/dist/internal/cursor/credentials.d.ts +112 -0
  307. package/dist/internal/cursor/credentials.d.ts.map +1 -0
  308. package/dist/internal/cursor/credentials.js +329 -0
  309. package/dist/internal/cursor-event-relay.d.ts +111 -0
  310. package/dist/internal/cursor-event-relay.d.ts.map +1 -0
  311. package/dist/internal/cursor-event-relay.js +181 -0
  312. package/dist/internal/cursor-relay-core.d.ts +113 -0
  313. package/dist/internal/cursor-relay-core.d.ts.map +1 -0
  314. package/dist/internal/cursor-relay-core.js +364 -0
  315. package/dist/internal/cursor-slack-relay.d.ts +94 -0
  316. package/dist/internal/cursor-slack-relay.d.ts.map +1 -0
  317. package/dist/internal/cursor-slack-relay.js +171 -0
  318. package/dist/internal/describe-error.d.ts +3 -0
  319. package/dist/internal/describe-error.d.ts.map +1 -0
  320. package/dist/internal/describe-error.js +4 -0
  321. package/dist/internal/dev-mode.d.ts +13 -0
  322. package/dist/internal/dev-mode.d.ts.map +1 -0
  323. package/dist/internal/dev-mode.js +17 -0
  324. package/dist/internal/discovery.d.ts +55 -0
  325. package/dist/internal/discovery.d.ts.map +1 -0
  326. package/dist/internal/discovery.js +1427 -0
  327. package/dist/internal/distribution.d.ts +47 -0
  328. package/dist/internal/distribution.d.ts.map +1 -0
  329. package/dist/internal/distribution.js +82 -0
  330. package/dist/internal/docs-site.d.ts +28 -0
  331. package/dist/internal/docs-site.d.ts.map +1 -0
  332. package/dist/internal/docs-site.js +169 -0
  333. package/dist/internal/duration.d.ts +8 -0
  334. package/dist/internal/duration.d.ts.map +1 -0
  335. package/dist/internal/duration.js +35 -0
  336. package/dist/internal/eval-run-store.d.ts +81 -0
  337. package/dist/internal/eval-run-store.d.ts.map +1 -0
  338. package/dist/internal/eval-run-store.js +396 -0
  339. package/dist/internal/eval-runner.d.ts +76 -0
  340. package/dist/internal/eval-runner.d.ts.map +1 -0
  341. package/dist/internal/eval-runner.js +336 -0
  342. package/dist/internal/event-log.d.ts +51 -0
  343. package/dist/internal/event-log.d.ts.map +1 -0
  344. package/dist/internal/event-log.js +167 -0
  345. package/dist/internal/event-mapper.d.ts +46 -0
  346. package/dist/internal/event-mapper.d.ts.map +1 -0
  347. package/dist/internal/event-mapper.js +226 -0
  348. package/dist/internal/frontmatter.d.ts +12 -0
  349. package/dist/internal/frontmatter.d.ts.map +1 -0
  350. package/dist/internal/frontmatter.js +61 -0
  351. package/dist/internal/github-fanout.d.ts +32 -0
  352. package/dist/internal/github-fanout.d.ts.map +1 -0
  353. package/dist/internal/github-fanout.js +122 -0
  354. package/dist/internal/handleAgentServeTrigger.d.ts +59 -0
  355. package/dist/internal/handleAgentServeTrigger.d.ts.map +1 -0
  356. package/dist/internal/handleAgentServeTrigger.js +115 -0
  357. package/dist/internal/host-platforms.d.ts +40 -0
  358. package/dist/internal/host-platforms.d.ts.map +1 -0
  359. package/dist/internal/host-platforms.js +113 -0
  360. package/dist/internal/http-channel.d.ts +54 -0
  361. package/dist/internal/http-channel.d.ts.map +1 -0
  362. package/dist/internal/http-channel.js +382 -0
  363. package/dist/internal/ids.d.ts +19 -0
  364. package/dist/internal/ids.d.ts.map +1 -0
  365. package/dist/internal/ids.js +34 -0
  366. package/dist/internal/init-project.d.ts +22 -0
  367. package/dist/internal/init-project.d.ts.map +1 -0
  368. package/dist/internal/init-project.js +125 -0
  369. package/dist/internal/json-dir-store.d.ts +32 -0
  370. package/dist/internal/json-dir-store.d.ts.map +1 -0
  371. package/dist/internal/json-dir-store.js +100 -0
  372. package/dist/internal/json-schema.d.ts +18 -0
  373. package/dist/internal/json-schema.d.ts.map +1 -0
  374. package/dist/internal/json-schema.js +53 -0
  375. package/dist/internal/log-ring.d.ts +23 -0
  376. package/dist/internal/log-ring.d.ts.map +1 -0
  377. package/dist/internal/log-ring.js +42 -0
  378. package/dist/internal/map-pool.d.ts +6 -0
  379. package/dist/internal/map-pool.d.ts.map +1 -0
  380. package/dist/internal/map-pool.js +41 -0
  381. package/dist/internal/mcp-endpoint.d.ts +59 -0
  382. package/dist/internal/mcp-endpoint.d.ts.map +1 -0
  383. package/dist/internal/mcp-endpoint.js +355 -0
  384. package/dist/internal/mcp-host.d.ts +28 -0
  385. package/dist/internal/mcp-host.d.ts.map +1 -0
  386. package/dist/internal/mcp-host.js +162 -0
  387. package/dist/internal/net.d.ts +5 -0
  388. package/dist/internal/net.d.ts.map +1 -0
  389. package/dist/internal/net.js +30 -0
  390. package/dist/internal/peer-connections.d.ts +44 -0
  391. package/dist/internal/peer-connections.d.ts.map +1 -0
  392. package/dist/internal/peer-connections.js +67 -0
  393. package/dist/internal/playground/static.d.ts +35 -0
  394. package/dist/internal/playground/static.d.ts.map +1 -0
  395. package/dist/internal/playground/static.js +162 -0
  396. package/dist/internal/playground/toolchain.d.ts +57 -0
  397. package/dist/internal/playground/toolchain.d.ts.map +1 -0
  398. package/dist/internal/playground/toolchain.js +226 -0
  399. package/dist/internal/reminder-runner.d.ts +62 -0
  400. package/dist/internal/reminder-runner.d.ts.map +1 -0
  401. package/dist/internal/reminder-runner.js +582 -0
  402. package/dist/internal/reminder-schedule.d.ts +22 -0
  403. package/dist/internal/reminder-schedule.d.ts.map +1 -0
  404. package/dist/internal/reminder-schedule.js +82 -0
  405. package/dist/internal/reminder-store.d.ts +58 -0
  406. package/dist/internal/reminder-store.d.ts.map +1 -0
  407. package/dist/internal/reminder-store.js +106 -0
  408. package/dist/internal/resolved-connections.d.ts +41 -0
  409. package/dist/internal/resolved-connections.d.ts.map +1 -0
  410. package/dist/internal/resolved-connections.js +73 -0
  411. package/dist/internal/review-comments.d.ts +50 -0
  412. package/dist/internal/review-comments.d.ts.map +1 -0
  413. package/dist/internal/review-comments.js +194 -0
  414. package/dist/internal/router.d.ts +33 -0
  415. package/dist/internal/router.d.ts.map +1 -0
  416. package/dist/internal/router.js +93 -0
  417. package/dist/internal/run-client.d.ts +49 -0
  418. package/dist/internal/run-client.d.ts.map +1 -0
  419. package/dist/internal/run-client.js +208 -0
  420. package/dist/internal/schedule-runner.d.ts +31 -0
  421. package/dist/internal/schedule-runner.d.ts.map +1 -0
  422. package/dist/internal/schedule-runner.js +126 -0
  423. package/dist/internal/sdk-runner.d.ts +41 -0
  424. package/dist/internal/sdk-runner.d.ts.map +1 -0
  425. package/dist/internal/sdk-runner.js +221 -0
  426. package/dist/internal/server.d.ts +25 -0
  427. package/dist/internal/server.d.ts.map +1 -0
  428. package/dist/internal/server.js +1374 -0
  429. package/dist/internal/session-engine.d.ts +287 -0
  430. package/dist/internal/session-engine.d.ts.map +1 -0
  431. package/dist/internal/session-engine.js +1377 -0
  432. package/dist/internal/session-store.d.ts +29 -0
  433. package/dist/internal/session-store.d.ts.map +1 -0
  434. package/dist/internal/session-store.js +140 -0
  435. package/dist/internal/session-urls.d.ts +10 -0
  436. package/dist/internal/session-urls.d.ts.map +1 -0
  437. package/dist/internal/session-urls.js +25 -0
  438. package/dist/internal/stream-progress.d.ts +14 -0
  439. package/dist/internal/stream-progress.d.ts.map +1 -0
  440. package/dist/internal/stream-progress.js +195 -0
  441. package/dist/internal/tool-result.d.ts +20 -0
  442. package/dist/internal/tool-result.d.ts.map +1 -0
  443. package/dist/internal/tool-result.js +45 -0
  444. package/dist/internal/trajectory.d.ts +56 -0
  445. package/dist/internal/trajectory.d.ts.map +1 -0
  446. package/dist/internal/trajectory.js +248 -0
  447. package/dist/internal/workspace.d.ts +42 -0
  448. package/dist/internal/workspace.d.ts.map +1 -0
  449. package/dist/internal/workspace.js +199 -0
  450. package/dist/playground/assets/cursor-icons-outline-oY2V_mvK.woff2 +0 -0
  451. package/dist/playground/assets/index-1K-hG-7p.css +1 -0
  452. package/dist/playground/assets/index-FlWjhg3x.js +79 -0
  453. package/dist/playground/index.html +17 -0
  454. package/dist/reminders.d.ts +23 -0
  455. package/dist/reminders.d.ts.map +1 -0
  456. package/dist/reminders.js +22 -0
  457. package/dist/schedules.d.ts +23 -0
  458. package/dist/schedules.d.ts.map +1 -0
  459. package/dist/schedules.js +26 -0
  460. package/dist/skills.d.ts +22 -0
  461. package/dist/skills.d.ts.map +1 -0
  462. package/dist/skills.js +22 -0
  463. package/dist/tools.d.ts +92 -0
  464. package/dist/tools.d.ts.map +1 -0
  465. package/dist/tools.js +68 -0
  466. package/dist/types.d.ts +1609 -0
  467. package/dist/types.d.ts.map +1 -0
  468. package/dist/types.js +80 -0
  469. package/docs/README.md +174 -0
  470. package/docs/ab.md +355 -0
  471. package/docs/building-with-agents.md +129 -0
  472. package/docs/concepts.md +177 -0
  473. package/docs/deployment.md +218 -0
  474. package/docs/evals.md +383 -0
  475. package/docs/guides/agent-to-agent.md +118 -0
  476. package/docs/guides/cloud-runtime.md +122 -0
  477. package/docs/guides/github.md +172 -0
  478. package/docs/guides/human-in-the-loop.md +131 -0
  479. package/docs/guides/slack.md +245 -0
  480. package/docs/guides/webhooks.md +201 -0
  481. package/docs/hillclimbing.md +93 -0
  482. package/docs/quickstart.md +183 -0
  483. package/docs/reference/agent-config.md +154 -0
  484. package/docs/reference/channels.md +206 -0
  485. package/docs/reference/cli.md +257 -0
  486. package/docs/reference/connections.md +137 -0
  487. package/docs/reference/hooks.md +74 -0
  488. package/docs/reference/http-api.md +219 -0
  489. package/docs/reference/instructions.md +77 -0
  490. package/docs/reference/playground.md +67 -0
  491. package/docs/reference/project-layout.md +119 -0
  492. package/docs/reference/schedules.md +220 -0
  493. package/docs/reference/sessions.md +165 -0
  494. package/docs/reference/skills.md +79 -0
  495. package/docs/reference/subagents.md +74 -0
  496. package/docs/reference/tools.md +203 -0
  497. package/docs/scaffolding-agents.md +113 -0
  498. package/docs/troubleshooting.md +95 -0
  499. package/package.json +185 -0
  500. package/skills/ab/SKILL.md +139 -0
  501. package/skills/create-agent/SKILL.md +219 -0
  502. package/skills/debug/SKILL.md +71 -0
  503. package/skills/evals/SKILL.md +217 -0
  504. package/skills/framework-map/SKILL.md +142 -0
  505. package/skills/github/SKILL.md +144 -0
  506. package/skills/hillclimb/SKILL.md +162 -0
  507. package/skills/setup-slack/SKILL.md +180 -0
  508. package/src/ab.ts +675 -0
  509. package/src/bin/agent-serve.ts +949 -0
  510. package/src/channels/github/api.ts +374 -0
  511. package/src/channels/github/auth.ts +275 -0
  512. package/src/channels/github/binding.ts +223 -0
  513. package/src/channels/github/defaults.ts +111 -0
  514. package/src/channels/github/events.ts +72 -0
  515. package/src/channels/github/forward.ts +381 -0
  516. package/src/channels/github/github-channel.ts +2270 -0
  517. package/src/channels/github/index.ts +52 -0
  518. package/src/channels/github/replay.ts +387 -0
  519. package/src/channels/github/state.ts +95 -0
  520. package/src/channels/github/types.ts +490 -0
  521. package/src/channels/slack/api.ts +580 -0
  522. package/src/channels/slack/approvals.ts +198 -0
  523. package/src/channels/slack/assistant.ts +76 -0
  524. package/src/channels/slack/auth.ts +112 -0
  525. package/src/channels/slack/channel-watch.ts +219 -0
  526. package/src/channels/slack/constants.ts +30 -0
  527. package/src/channels/slack/credentials.ts +90 -0
  528. package/src/channels/slack/cursor-account.ts +166 -0
  529. package/src/channels/slack/defaults.ts +450 -0
  530. package/src/channels/slack/dispatch.ts +293 -0
  531. package/src/channels/slack/doctor.ts +135 -0
  532. package/src/channels/slack/event-id-dedupe.ts +30 -0
  533. package/src/channels/slack/inbound.ts +219 -0
  534. package/src/channels/slack/index.ts +45 -0
  535. package/src/channels/slack/init.ts +133 -0
  536. package/src/channels/slack/interactive.ts +194 -0
  537. package/src/channels/slack/links.ts +23 -0
  538. package/src/channels/slack/live-delivery.ts +201 -0
  539. package/src/channels/slack/log.ts +83 -0
  540. package/src/channels/slack/manifest.ts +179 -0
  541. package/src/channels/slack/pr-ref.ts +50 -0
  542. package/src/channels/slack/setup.ts +97 -0
  543. package/src/channels/slack/slack-channel.ts +374 -0
  544. package/src/channels/slack/socket-mode.ts +154 -0
  545. package/src/channels/slack/stream.ts +63 -0
  546. package/src/channels/slack/tool-approval-events.ts +136 -0
  547. package/src/channels/slack/types.ts +349 -0
  548. package/src/channels.ts +385 -0
  549. package/src/connections.ts +89 -0
  550. package/src/evals.ts +501 -0
  551. package/src/hooks.ts +33 -0
  552. package/src/index.ts +184 -0
  553. package/src/internal/ab-collector.ts +210 -0
  554. package/src/internal/ab-fold.ts +228 -0
  555. package/src/internal/ab-snapshot.ts +335 -0
  556. package/src/internal/approval-gate.ts +115 -0
  557. package/src/internal/auth.ts +39 -0
  558. package/src/internal/authored-alias-hooks.ts +69 -0
  559. package/src/internal/authored-loaders.ts +138 -0
  560. package/src/internal/bounded-int.ts +27 -0
  561. package/src/internal/brand.ts +29 -0
  562. package/src/internal/chat-client.ts +407 -0
  563. package/src/internal/cli-ax.ts +474 -0
  564. package/src/internal/cli-cursor.ts +275 -0
  565. package/src/internal/cli-github.ts +849 -0
  566. package/src/internal/cli-slack.ts +175 -0
  567. package/src/internal/cloud-merge.ts +41 -0
  568. package/src/internal/cron.ts +78 -0
  569. package/src/internal/cursor/account-mcp.ts +472 -0
  570. package/src/internal/cursor/backend-client.ts +614 -0
  571. package/src/internal/cursor/credentials.ts +401 -0
  572. package/src/internal/cursor-event-relay.ts +281 -0
  573. package/src/internal/cursor-relay-core.ts +444 -0
  574. package/src/internal/cursor-slack-relay.ts +242 -0
  575. package/src/internal/describe-error.ts +4 -0
  576. package/src/internal/dev-mode.ts +20 -0
  577. package/src/internal/discovery.ts +1709 -0
  578. package/src/internal/distribution.ts +97 -0
  579. package/src/internal/docs-site.ts +191 -0
  580. package/src/internal/duration.ts +39 -0
  581. package/src/internal/eval-run-store.ts +519 -0
  582. package/src/internal/eval-runner.ts +522 -0
  583. package/src/internal/event-log.ts +175 -0
  584. package/src/internal/event-mapper.ts +272 -0
  585. package/src/internal/frontmatter.ts +77 -0
  586. package/src/internal/github-fanout.ts +159 -0
  587. package/src/internal/handleAgentServeTrigger.ts +156 -0
  588. package/src/internal/host-platforms.ts +144 -0
  589. package/src/internal/http-channel.ts +546 -0
  590. package/src/internal/ids.ts +44 -0
  591. package/src/internal/init-project.ts +165 -0
  592. package/src/internal/json-dir-store.ts +109 -0
  593. package/src/internal/json-schema.ts +69 -0
  594. package/src/internal/log-ring.ts +59 -0
  595. package/src/internal/map-pool.ts +32 -0
  596. package/src/internal/mcp-endpoint.ts +518 -0
  597. package/src/internal/mcp-host.ts +211 -0
  598. package/src/internal/net.ts +31 -0
  599. package/src/internal/peer-connections.ts +100 -0
  600. package/src/internal/playground/static.ts +189 -0
  601. package/src/internal/playground/toolchain.ts +277 -0
  602. package/src/internal/reminder-runner.ts +756 -0
  603. package/src/internal/reminder-schedule.ts +106 -0
  604. package/src/internal/reminder-store.ts +145 -0
  605. package/src/internal/resolved-connections.ts +145 -0
  606. package/src/internal/review-comments.ts +268 -0
  607. package/src/internal/router.ts +145 -0
  608. package/src/internal/run-client.ts +320 -0
  609. package/src/internal/schedule-runner.ts +161 -0
  610. package/src/internal/sdk-runner.ts +315 -0
  611. package/src/internal/server.ts +1737 -0
  612. package/src/internal/session-engine.ts +1810 -0
  613. package/src/internal/session-store.ts +147 -0
  614. package/src/internal/session-urls.ts +40 -0
  615. package/src/internal/stream-progress.ts +254 -0
  616. package/src/internal/tool-result.ts +54 -0
  617. package/src/internal/trajectory.ts +306 -0
  618. package/src/internal/workspace.ts +223 -0
  619. package/src/reminders.ts +35 -0
  620. package/src/schedules.ts +37 -0
  621. package/src/skills.ts +27 -0
  622. package/src/tools.ts +127 -0
  623. package/src/types.ts +1848 -0
package/src/evals.ts ADDED
@@ -0,0 +1,501 @@
1
+ /**
2
+ * Filesystem-first evals for agent-serve projects.
3
+ *
4
+ * Author cases under evals/ as `*.eval.ts` files with {@link defineEval}.
5
+ * One file may hold a single datapoint (`test`) or many (`cases`). Drive the
6
+ * agent with `t.send(...)` and assert with `t.succeeded()`, `t.calledTool()`,
7
+ * `t.messageIncludes(...)`, or `t.check(value, includes(...))`.
8
+ *
9
+ * ```ts
10
+ * import { defineEval, includes } from "@anysphere/agent-serve/evals";
11
+ *
12
+ * // One datapoint — id is the file path (evals/weather/nyc.eval.ts → weather/nyc)
13
+ * export default defineEval({
14
+ * description: "Weather tool is used for temperature questions.",
15
+ * async test(t) {
16
+ * await t.send("What's the temperature in NYC?");
17
+ * t.succeeded();
18
+ * t.calledTool("get_weather");
19
+ * t.check(t.reply, includes(/°|F|C/));
20
+ * },
21
+ * });
22
+ *
23
+ * // Many datapoints in one file — ids are <fileId>/<case.id>
24
+ * // evals/weather.eval.ts → weather/nyc, weather/paris
25
+ * export default defineEval({
26
+ * tags: ["smoke", "weather"],
27
+ * cases: [
28
+ * {
29
+ * id: "nyc",
30
+ * async test(t) {
31
+ * await t.send("What's the temperature in NYC?");
32
+ * t.succeeded();
33
+ * t.calledTool("get_weather");
34
+ * },
35
+ * },
36
+ * {
37
+ * id: "paris",
38
+ * async test(t) {
39
+ * await t.send("What's the weather in Paris?");
40
+ * t.succeeded();
41
+ * t.calledTool("get_weather");
42
+ * },
43
+ * },
44
+ * ],
45
+ * });
46
+ * ```
47
+ */
48
+
49
+ import { normalizePositiveInt } from "./internal/bounded-int.js";
50
+ import { brandDefinition } from "./internal/brand.js";
51
+ import {
52
+ assertNonEmptyDir,
53
+ deleteFileInDir,
54
+ readJsonDir,
55
+ resolveProjectRelativeDir,
56
+ writeJsonFile,
57
+ } from "./internal/json-dir-store.js";
58
+ import type { SessionEvent } from "./types.js";
59
+
60
+ export type Expectation =
61
+ | { kind: "includes"; value: string | RegExp }
62
+ | { kind: "equals"; value: unknown }
63
+ | {
64
+ kind: "satisfies";
65
+ predicate: (value: unknown) => boolean;
66
+ label: string;
67
+ };
68
+
69
+ export function includes(value: string | RegExp): Expectation {
70
+ return { kind: "includes", value };
71
+ }
72
+
73
+ export function equals(value: unknown): Expectation {
74
+ return { kind: "equals", value };
75
+ }
76
+
77
+ export function satisfies(
78
+ predicate: (value: unknown) => boolean,
79
+ label: string
80
+ ): Expectation {
81
+ return { kind: "satisfies", predicate, label };
82
+ }
83
+
84
+ export interface EvalAssertionResult {
85
+ name: string;
86
+ passed: boolean;
87
+ detail?: string;
88
+ }
89
+
90
+ export interface EvalTurnResult {
91
+ message: string;
92
+ sessionId: string;
93
+ events: SessionEvent[];
94
+ toolCalls: string[];
95
+ ok: boolean;
96
+ }
97
+
98
+ export interface EvalSendOptions {
99
+ /** Absolute harness `cwd` for a new session (`SendMessageOptions.workspaceDir`). */
100
+ workspaceDir?: string;
101
+ /** Files seeded into the session workspace before the first turn. */
102
+ workspaceFiles?: Record<string, string>;
103
+ }
104
+
105
+ export interface EvalTestContext {
106
+ /** Send a turn and wait until the session parks (or fails). */
107
+ send(message: string, options?: EvalSendOptions): Promise<EvalTurnResult>;
108
+ /** Last assistant text, or null before the first send. */
109
+ readonly reply: string | null;
110
+ readonly sessionId: string | undefined;
111
+ /** All events captured so far across turns. */
112
+ readonly events: SessionEvent[];
113
+ /** Gate: run did not fail. */
114
+ succeeded(): void;
115
+ /** Gate: at least one completed call to `name`. */
116
+ calledTool(name: string): void;
117
+ /** Gate: no call to `name`. */
118
+ notCalledTool(name: string): void;
119
+ /** Gate: joined assistant text matches. */
120
+ messageIncludes(token: string | RegExp): void;
121
+ /** Gate a value with an {@link Expectation} builder. */
122
+ check(value: unknown, assertion: Expectation): void;
123
+ /** Debug line (surfaced under `agent-serve eval --verbose`). */
124
+ log(message: string): void;
125
+ }
126
+
127
+ /** One runnable datapoint inside a multi-case {@link defineEval} file. */
128
+ export interface EvalDatapoint {
129
+ /**
130
+ * Path segment under the file id. Must be a single segment (no `/`).
131
+ * Full case id = `<fileId>/<id>` (e.g. file `weather.eval.ts` + `nyc` →
132
+ * `weather/nyc`).
133
+ */
134
+ id: string;
135
+ description?: string;
136
+ tags?: string[];
137
+ timeoutMs?: number;
138
+ test: (t: EvalTestContext) => Promise<void>;
139
+ }
140
+
141
+ /**
142
+ * Eval file config. Provide either a single {@link test} or a {@link cases}
143
+ * array — not both.
144
+ */
145
+ export interface EvalConfig {
146
+ description?: string;
147
+ tags?: string[];
148
+ timeoutMs?: number;
149
+ /** Single-datapoint shorthand. Case id = file path under `evals/`. */
150
+ test?: (t: EvalTestContext) => Promise<void>;
151
+ /** Multiple datapoints in this file. Each id = `<fileId>/<case.id>`. */
152
+ cases?: EvalDatapoint[];
153
+ }
154
+
155
+ /** Normalized single datapoint used by the runner after discovery. */
156
+ export interface EvalCaseDefinition {
157
+ description?: string;
158
+ tags?: string[];
159
+ timeoutMs?: number;
160
+ test: (t: EvalTestContext) => Promise<void>;
161
+ readonly __agentServe: "eval";
162
+ }
163
+
164
+ export type EvalDefinition = EvalConfig & { readonly __agentServe: "eval" };
165
+
166
+ /**
167
+ * Author an eval file. The path under `evals/` is the file id:
168
+ * `evals/weather.eval.ts` → `weather`. With a single `test`, that is also
169
+ * the case id. With `cases`, each datapoint is `<fileId>/<case.id>`.
170
+ */
171
+ export function defineEval(config: EvalConfig): EvalDefinition {
172
+ const hasTest = typeof config.test === "function";
173
+ const hasCases = config.cases !== undefined;
174
+ if (hasTest && hasCases) {
175
+ throw new Error("defineEval: set either test or cases, not both");
176
+ }
177
+ if (!hasTest && !hasCases) {
178
+ throw new Error("defineEval requires test(t) or a non-empty cases array");
179
+ }
180
+ if (hasCases) {
181
+ if (!Array.isArray(config.cases) || config.cases.length === 0) {
182
+ throw new Error("defineEval: cases must be a non-empty array");
183
+ }
184
+ const seen = new Set<string>();
185
+ for (const datapoint of config.cases) {
186
+ validateDatapointId(datapoint.id);
187
+ if (seen.has(datapoint.id)) {
188
+ throw new Error(
189
+ `defineEval: duplicate case id ${JSON.stringify(datapoint.id)}`
190
+ );
191
+ }
192
+ seen.add(datapoint.id);
193
+ if (typeof datapoint.test !== "function") {
194
+ throw new Error(
195
+ `defineEval: cases[${JSON.stringify(datapoint.id)}] requires test(t)`
196
+ );
197
+ }
198
+ }
199
+ }
200
+ return brandDefinition("eval", config);
201
+ }
202
+
203
+ function validateDatapointId(id: unknown): asserts id is string {
204
+ if (typeof id !== "string" || id.length === 0) {
205
+ throw new Error("defineEval: each case needs a non-empty string id");
206
+ }
207
+ if (id.includes("/") || id.includes("\\") || id.includes("..")) {
208
+ throw new Error(
209
+ `defineEval: case id must be a single path segment (got ${JSON.stringify(id)})`
210
+ );
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Expand a file-level definition into runnable datapoints.
216
+ * Exported for tests and tooling.
217
+ */
218
+ export function expandEvalDefinition(
219
+ fileId: string,
220
+ definition: EvalDefinition
221
+ ): Array<{ id: string; definition: EvalCaseDefinition }> {
222
+ if (definition.cases !== undefined) {
223
+ return definition.cases.map((datapoint) => {
224
+ const description = datapoint.description ?? definition.description;
225
+ const timeoutMs = datapoint.timeoutMs ?? definition.timeoutMs;
226
+ return {
227
+ id: `${fileId}/${datapoint.id}`,
228
+ definition: brandDefinition("eval", {
229
+ ...(description !== undefined ? { description } : {}),
230
+ tags: datapoint.tags ?? definition.tags,
231
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
232
+ test: datapoint.test,
233
+ }),
234
+ };
235
+ });
236
+ }
237
+ if (typeof definition.test !== "function") {
238
+ throw new Error(`defineEval(${fileId}): missing test(t)`);
239
+ }
240
+ return [
241
+ {
242
+ id: fileId,
243
+ definition: brandDefinition("eval", {
244
+ ...(definition.description !== undefined
245
+ ? { description: definition.description }
246
+ : {}),
247
+ ...(definition.tags !== undefined ? { tags: definition.tags } : {}),
248
+ ...(definition.timeoutMs !== undefined
249
+ ? { timeoutMs: definition.timeoutMs }
250
+ : {}),
251
+ test: definition.test,
252
+ }),
253
+ },
254
+ ];
255
+ }
256
+
257
+ /**
258
+ * Whether a discovered case id matches a CLI filter.
259
+ * - exact datapoint: `weather/nyc`
260
+ * - whole file / prefix: `weather` selects `weather`, `weather/nyc`, …
261
+ * - multiple filters: OR
262
+ */
263
+ export function matchesEvalIdFilter(caseId: string, filter: string): boolean {
264
+ return caseId === filter || caseId.startsWith(`${filter}/`);
265
+ }
266
+
267
+ /**
268
+ * Hard ceiling for concurrent eval cases.
269
+ *
270
+ * Each case issues model provider requests; unbounded parallelism would
271
+ * overwhelm provider rate limits and exhaust local API quota.
272
+ */
273
+ export const EVAL_MAX_CONCURRENCY_LIMIT = 200;
274
+
275
+ /** Default playground batches kept in the serve process when `maxPlaygroundRuns` is omitted. */
276
+ export const EVAL_DEFAULT_MAX_PLAYGROUND_RUNS = 20;
277
+
278
+ /** Hard ceiling for {@link EvalConfigFile.maxPlaygroundRuns}. */
279
+ export const EVAL_MAX_PLAYGROUND_RUNS = 500;
280
+
281
+ export type EvalCaseRunStatus = "pending" | "running" | "done";
282
+ export type EvalBatchStatus = "running" | "completed" | "failed";
283
+
284
+ /** One case inside a playground / HTTP eval batch snapshot. */
285
+ export interface EvalCaseSnapshot {
286
+ id: string;
287
+ fileId: string;
288
+ description?: string;
289
+ tags?: string[];
290
+ status: EvalCaseRunStatus;
291
+ ok?: boolean;
292
+ assertions?: EvalAssertionResult[];
293
+ sessionId?: string;
294
+ durationMs?: number;
295
+ error?: string;
296
+ logs?: string[];
297
+ inputs?: string[];
298
+ finalText?: string;
299
+ tools?: string[];
300
+ toolCalls?: Array<{
301
+ toolName: string;
302
+ args?: unknown;
303
+ output?: unknown;
304
+ isError: boolean;
305
+ }>;
306
+ }
307
+
308
+ /** Playground / HTTP snapshot of one eval batch (`POST /v1/dev/evals/runs`). */
309
+ export interface EvalRunSnapshot {
310
+ runId: string;
311
+ status: EvalBatchStatus;
312
+ startedAt: string;
313
+ finishedAt?: string;
314
+ error?: string;
315
+ summary: { passed: number; failed: number; total: number; done: number };
316
+ cases: EvalCaseSnapshot[];
317
+ config: {
318
+ maxConcurrency?: number;
319
+ timeoutMs?: number;
320
+ maxPlaygroundRuns?: number;
321
+ durableRuns?: boolean;
322
+ };
323
+ }
324
+
325
+ /** Context passed to {@link EvalRunPersistence} hooks. */
326
+ export interface EvalRunPersistContext {
327
+ /** Absolute agent project root (directory that contains `evals/`). */
328
+ projectRoot: string;
329
+ }
330
+
331
+ /**
332
+ * Durable store for playground eval batches. Without {@link EvalConfigFile.persistRuns},
333
+ * runs live only in the serve process memory — lost on restart, and capped by
334
+ * {@link EvalConfigFile.maxPlaygroundRuns} (default {@link EVAL_DEFAULT_MAX_PLAYGROUND_RUNS}).
335
+ *
336
+ * Implement your own (S3, DB, …) or use {@link persistEvalRunsToDir}.
337
+ * `delete` is required so {@link EvalConfigFile.maxPlaygroundRuns} can prune
338
+ * durable history (otherwise pruned rows reload on the next hydrate).
339
+ */
340
+ export interface EvalRunPersistence {
341
+ /** Load saved runs (any order). Called once when the serve process hydrates. */
342
+ load(
343
+ ctx: EvalRunPersistContext
344
+ ): EvalRunSnapshot[] | Promise<EvalRunSnapshot[]>;
345
+ /**
346
+ * Persist a full snapshot. Called when a batch starts, after each case
347
+ * finishes, and when the batch completes or fails.
348
+ */
349
+ save(run: EvalRunSnapshot, ctx: EvalRunPersistContext): void | Promise<void>;
350
+ /** Remove a run that falls outside {@link EvalConfigFile.maxPlaygroundRuns}. */
351
+ delete(runId: string, ctx: EvalRunPersistContext): void | Promise<void>;
352
+ }
353
+
354
+ export interface EvalConfigFile {
355
+ timeoutMs?: number;
356
+ /**
357
+ * Max number of eval cases to run in parallel. Required.
358
+ * Hard-capped at {@link EVAL_MAX_CONCURRENCY_LIMIT} due to model provider
359
+ * request limits.
360
+ */
361
+ maxConcurrency: number;
362
+ /**
363
+ * Optional. Max batches kept in the **playground / `/v1/dev/evals*`**
364
+ * history window (in-memory, and pruned from {@link persistRuns} via
365
+ * {@link EvalRunPersistence.delete}).
366
+ * Does not affect `agent-serve eval` CLI runs.
367
+ *
368
+ * Default {@link EVAL_DEFAULT_MAX_PLAYGROUND_RUNS}; hard-capped at
369
+ * {@link EVAL_MAX_PLAYGROUND_RUNS}. Newest batches win.
370
+ */
371
+ maxPlaygroundRuns?: number;
372
+ /**
373
+ * Optional durable store for playground eval batches. Omit this and runs
374
+ * are **not** surviving process restart (only the in-memory
375
+ * {@link maxPlaygroundRuns} window).
376
+ *
377
+ * ```ts
378
+ * import {
379
+ * defineEvalConfig,
380
+ * persistEvalRunsToDir,
381
+ * } from "@anysphere/agent-serve/evals";
382
+ *
383
+ * export default defineEvalConfig({
384
+ * maxConcurrency: 20,
385
+ * maxPlaygroundRuns: 50,
386
+ * // Survive serve restarts (relative to the agent project root):
387
+ * persistRuns: persistEvalRunsToDir(".agent-serve/eval-runs"),
388
+ * });
389
+ * ```
390
+ */
391
+ persistRuns?: EvalRunPersistence;
392
+ }
393
+
394
+ /**
395
+ * Defaults for every eval under `evals/` (`evals/evals.config.ts`).
396
+ * `maxConcurrency` is required (1–{@link EVAL_MAX_CONCURRENCY_LIMIT}).
397
+ *
398
+ * Playground batches default to **in-memory only** (see {@link maxPlaygroundRuns} /
399
+ * {@link persistRuns}).
400
+ */
401
+ export function defineEvalConfig(config: EvalConfigFile): EvalConfigFile {
402
+ const persistRuns = normalizePersistRuns(config.persistRuns);
403
+ return {
404
+ ...(config.timeoutMs === undefined ? {} : { timeoutMs: config.timeoutMs }),
405
+ maxConcurrency: normalizeEvalMaxConcurrency(config.maxConcurrency),
406
+ maxPlaygroundRuns: normalizeEvalMaxPlaygroundRuns(
407
+ config.maxPlaygroundRuns ?? EVAL_DEFAULT_MAX_PLAYGROUND_RUNS
408
+ ),
409
+ ...(persistRuns === undefined ? {} : { persistRuns }),
410
+ };
411
+ }
412
+
413
+ /**
414
+ * Validate and enforce the hard concurrency ceiling.
415
+ */
416
+ export function normalizeEvalMaxConcurrency(value: unknown): number {
417
+ return normalizePositiveInt(value, {
418
+ label: "evals.config.ts: maxConcurrency",
419
+ max: EVAL_MAX_CONCURRENCY_LIMIT,
420
+ maxMessage: `evals.config.ts: maxConcurrency ${String(value)} exceeds the hard limit of ${EVAL_MAX_CONCURRENCY_LIMIT} (model provider request limits)`,
421
+ });
422
+ }
423
+
424
+ /** Validate {@link EvalConfigFile.maxPlaygroundRuns}. */
425
+ export function normalizeEvalMaxPlaygroundRuns(value: unknown): number {
426
+ return normalizePositiveInt(value, {
427
+ label: "evals.config.ts: maxPlaygroundRuns",
428
+ max: EVAL_MAX_PLAYGROUND_RUNS,
429
+ });
430
+ }
431
+
432
+ /**
433
+ * Effective playground history window. Invalid values fall back to
434
+ * {@link EVAL_DEFAULT_MAX_PLAYGROUND_RUNS} (same as a missing field).
435
+ */
436
+ export function resolveEvalMaxPlaygroundRuns(value: unknown): number {
437
+ if (value === undefined) {
438
+ return EVAL_DEFAULT_MAX_PLAYGROUND_RUNS;
439
+ }
440
+ try {
441
+ return normalizeEvalMaxPlaygroundRuns(value);
442
+ } catch {
443
+ return EVAL_DEFAULT_MAX_PLAYGROUND_RUNS;
444
+ }
445
+ }
446
+
447
+ function normalizePersistRuns(
448
+ value: EvalRunPersistence | undefined
449
+ ): EvalRunPersistence | undefined {
450
+ if (value === undefined) {
451
+ return undefined;
452
+ }
453
+ if (
454
+ typeof value !== "object" ||
455
+ value === null ||
456
+ typeof value.load !== "function" ||
457
+ typeof value.save !== "function" ||
458
+ typeof value.delete !== "function"
459
+ ) {
460
+ throw new Error(
461
+ "evals.config.ts: persistRuns must define load(ctx), save(run, ctx), and delete(runId, ctx)"
462
+ );
463
+ }
464
+ return value;
465
+ }
466
+
467
+ /**
468
+ * Filesystem {@link EvalRunPersistence}: one JSON file per run under `dir`
469
+ * (relative paths resolve against the agent project root).
470
+ *
471
+ * ```ts
472
+ * export default defineEvalConfig({
473
+ * maxConcurrency: 20,
474
+ * persistRuns: persistEvalRunsToDir(".agent-serve/eval-runs"),
475
+ * });
476
+ * ```
477
+ */
478
+ export function persistEvalRunsToDir(dir: string): EvalRunPersistence {
479
+ const relativeDir = assertNonEmptyDir(dir, "persistEvalRunsToDir");
480
+ const resolveDir = (projectRoot: string): string =>
481
+ resolveProjectRelativeDir({ dir: relativeDir, projectRoot });
482
+
483
+ return {
484
+ async load(ctx) {
485
+ return readJsonDir<EvalRunSnapshot>(resolveDir(ctx.projectRoot));
486
+ },
487
+ async save(run, ctx) {
488
+ await writeJsonFile({
489
+ root: resolveDir(ctx.projectRoot),
490
+ fileName: `${run.runId}.json`,
491
+ value: run,
492
+ });
493
+ },
494
+ async delete(runId, ctx) {
495
+ await deleteFileInDir({
496
+ root: resolveDir(ctx.projectRoot),
497
+ fileName: `${runId}.json`,
498
+ });
499
+ },
500
+ };
501
+ }
package/src/hooks.ts ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `defineHook` — authored at `agent/hooks/<slug>.ts`.
3
+ *
4
+ * Hooks subscribe to the session event stream and run side effects after
5
+ * each event is durably recorded (audit logging, metrics, persisting
6
+ * transcripts to your own database). Handlers are observe-only.
7
+ *
8
+ * ```ts
9
+ * import { defineHook } from "@anysphere/agent-serve/hooks";
10
+ *
11
+ * export default defineHook({
12
+ * events: {
13
+ * async "turn.completed"(event, ctx) {
14
+ * console.log("turn done", ctx.session.id, event.data.usage);
15
+ * },
16
+ * },
17
+ * });
18
+ * ```
19
+ */
20
+
21
+ import { brandDefinition } from "./internal/brand.js";
22
+ import type { HookConfig, HookDefinition } from "./types.js";
23
+
24
+ export type {
25
+ HookConfig,
26
+ HookContext,
27
+ HookDefinition,
28
+ HookHandler,
29
+ } from "./types.js";
30
+
31
+ export function defineHook(config: HookConfig): HookDefinition {
32
+ return brandDefinition("hook", config);
33
+ }