@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
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Read-only A/B metrics snapshot: fold durable session event streams into
3
+ * per-session assignments and aggregate arm totals. Used by `GET /v1/abs`.
4
+ */
5
+
6
+ import {
7
+ type ABDefinition,
8
+ type ABMetrics,
9
+ type ABVariantMeta,
10
+ cloneABMetrics,
11
+ emptyABMetrics,
12
+ } from "../ab.js";
13
+ import type {
14
+ DiscoveredAB,
15
+ SessionEvent,
16
+ SessionInfo,
17
+ SessionRecord,
18
+ SessionSummary,
19
+ } from "../types.js";
20
+ import { applyABDerive, cloneFoldedMetrics, foldABStream } from "./ab-fold.js";
21
+ import { mapPool } from "./map-pool.js";
22
+
23
+ export interface ABSnapshotAssignment {
24
+ experiment: string;
25
+ variant: string | null;
26
+ variantLabel?: string;
27
+ /** Present when enrolled (`variant` non-null). */
28
+ metrics?: ABMetrics;
29
+ }
30
+
31
+ export interface ABSnapshotSession {
32
+ sessionId: string;
33
+ channelId: string;
34
+ mode: string;
35
+ title?: string;
36
+ turnCount: number;
37
+ updatedAt?: string;
38
+ assignments: ABSnapshotAssignment[];
39
+ }
40
+
41
+ export interface ABSnapshotArm {
42
+ variant: string;
43
+ variantLabel?: string;
44
+ description?: string;
45
+ /** Sessions enrolled in this arm. */
46
+ sessions: number;
47
+ metrics: ABMetrics;
48
+ }
49
+
50
+ export interface ABSnapshotExperiment {
51
+ name: string;
52
+ variants: Record<string, ABVariantMeta>;
53
+ /** Sessions with sticky skip (`variant: null`). */
54
+ skipped: number;
55
+ arms: ABSnapshotArm[];
56
+ }
57
+
58
+ export interface ABSnapshotConfig {
59
+ /** Newest-first session fold window for this snapshot (`GET /v1/abs`). */
60
+ maxPlaygroundSessions?: number;
61
+ /** True when `persistSamples` is configured. */
62
+ durableSamples?: boolean;
63
+ /** True when `persistSnapshots` is configured. */
64
+ durableSnapshots?: boolean;
65
+ /** Set when writing via filesystem snapshot persistence helpers. */
66
+ snapshotId?: string;
67
+ }
68
+
69
+ export interface ABSnapshot {
70
+ experiments: ABSnapshotExperiment[];
71
+ sessions: ABSnapshotSession[];
72
+ config?: ABSnapshotConfig;
73
+ }
74
+
75
+ export interface BuildABSnapshotInput {
76
+ experiments: readonly DiscoveredAB[];
77
+ agentName: string;
78
+ /** Newest-first session list (same order as `GET /v1/sessions`). */
79
+ sessions: readonly SessionSummary[];
80
+ loadRecord: (sessionId: string) => Promise<SessionRecord | undefined>;
81
+ loadEvents: (sessionId: string) => Promise<SessionEvent[]>;
82
+ sessionInfo: (record: SessionRecord) => SessionInfo;
83
+ logger: (line: string) => void;
84
+ /** Max concurrent event-log reads (default 8). */
85
+ concurrency?: number;
86
+ /** Attached to the returned snapshot (playground / persistence meta). */
87
+ config?: ABSnapshotConfig;
88
+ }
89
+
90
+ export async function buildABSnapshot(
91
+ input: BuildABSnapshotInput
92
+ ): Promise<ABSnapshot> {
93
+ const experiments = input.experiments;
94
+ const experimentByName = new Map(
95
+ experiments.map((experiment) => [experiment.name, experiment])
96
+ );
97
+
98
+ const armTotals = new Map<
99
+ string,
100
+ Map<string, { sessions: number; metrics: ABMetrics }>
101
+ >();
102
+ const skipped = new Map<string, number>();
103
+ for (const experiment of experiments) {
104
+ armTotals.set(experiment.name, new Map());
105
+ skipped.set(experiment.name, 0);
106
+ for (const variant of Object.keys(
107
+ (experiment.definition as ABDefinition).variants
108
+ )) {
109
+ armTotals.get(experiment.name)!.set(variant, {
110
+ sessions: 0,
111
+ metrics: emptyABMetrics(),
112
+ });
113
+ }
114
+ }
115
+
116
+ const concurrency = Math.max(1, input.concurrency ?? 8);
117
+ const sessionRows: ABSnapshotSession[] = [];
118
+
119
+ async function processOne(summary: SessionSummary): Promise<void> {
120
+ const record = await input.loadRecord(summary.sessionId);
121
+ if (record === undefined) {
122
+ return;
123
+ }
124
+ // Eval harness sessions never enroll; keep them out of aggregates too.
125
+ if (record.purpose === "eval") {
126
+ return;
127
+ }
128
+ const events = await input.loadEvents(summary.sessionId);
129
+ const folded = foldABStream(events);
130
+ if (experiments.length > 0) {
131
+ await applyABDerive(
132
+ folded,
133
+ events,
134
+ experiments,
135
+ input.sessionInfo(record),
136
+ input.agentName,
137
+ input.logger
138
+ );
139
+ }
140
+
141
+ const assignments: ABSnapshotAssignment[] = [];
142
+ // Prefer declared experiment order; include unknown arms from the log after.
143
+ const seen = new Set<string>();
144
+ for (const experiment of experiments) {
145
+ seen.add(experiment.name);
146
+ const variant = folded.arms.get(experiment.name);
147
+ if (variant === undefined) {
148
+ continue;
149
+ }
150
+ const def = experiment.definition as ABDefinition;
151
+ const label = variant === null ? undefined : def.variants[variant]?.label;
152
+ const metrics =
153
+ variant === null
154
+ ? undefined
155
+ : cloneFoldedMetrics(folded.metrics.get(experiment.name));
156
+ assignments.push({
157
+ experiment: experiment.name,
158
+ variant,
159
+ ...(label !== undefined ? { variantLabel: label } : {}),
160
+ ...(metrics !== undefined ? { metrics } : {}),
161
+ });
162
+ if (variant === null) {
163
+ skipped.set(experiment.name, (skipped.get(experiment.name) ?? 0) + 1);
164
+ } else {
165
+ const bucket = armTotals.get(experiment.name)?.get(variant);
166
+ if (bucket !== undefined && metrics !== undefined) {
167
+ bucket.sessions += 1;
168
+ addMetrics(bucket.metrics, metrics);
169
+ } else if (bucket === undefined) {
170
+ // Assigned to an arm no longer in the definition — still surface it.
171
+ const arms = armTotals.get(experiment.name) ?? new Map();
172
+ const created = {
173
+ sessions: 1,
174
+ metrics:
175
+ metrics !== undefined
176
+ ? cloneABMetrics(metrics)
177
+ : emptyABMetrics(),
178
+ };
179
+ arms.set(variant, created);
180
+ armTotals.set(experiment.name, arms);
181
+ }
182
+ }
183
+ }
184
+ for (const [experiment, variant] of folded.arms) {
185
+ if (seen.has(experiment)) {
186
+ continue;
187
+ }
188
+ const metrics =
189
+ variant === null
190
+ ? undefined
191
+ : cloneFoldedMetrics(folded.metrics.get(experiment));
192
+ assignments.push({
193
+ experiment,
194
+ variant,
195
+ ...(metrics !== undefined ? { metrics } : {}),
196
+ });
197
+ }
198
+
199
+ if (assignments.length === 0) {
200
+ return;
201
+ }
202
+
203
+ sessionRows.push({
204
+ sessionId: summary.sessionId,
205
+ channelId: summary.channelId,
206
+ mode: summary.mode,
207
+ ...(summary.title === undefined ? {} : { title: summary.title }),
208
+ turnCount: summary.turnCount,
209
+ ...(summary.updatedAt === undefined
210
+ ? {}
211
+ : { updatedAt: summary.updatedAt }),
212
+ assignments,
213
+ });
214
+ }
215
+
216
+ await mapPool(input.sessions, concurrency, async (summary) => {
217
+ await processOne(summary);
218
+ });
219
+
220
+ // Preserve newest-first order from the sessions list.
221
+ const order = new Map(
222
+ input.sessions.map((summary, index) => [summary.sessionId, index])
223
+ );
224
+ sessionRows.sort(
225
+ (a, b) => (order.get(a.sessionId) ?? 0) - (order.get(b.sessionId) ?? 0)
226
+ );
227
+
228
+ const experimentRows: ABSnapshotExperiment[] = experiments.map(
229
+ (experiment) => {
230
+ const def = experiment.definition as ABDefinition;
231
+ const arms: ABSnapshotArm[] = [];
232
+ for (const [variant, meta] of Object.entries(def.variants)) {
233
+ const bucket = armTotals.get(experiment.name)?.get(variant) ?? {
234
+ sessions: 0,
235
+ metrics: emptyABMetrics(),
236
+ };
237
+ arms.push({
238
+ variant,
239
+ ...(meta.label !== undefined ? { variantLabel: meta.label } : {}),
240
+ ...(meta.description !== undefined
241
+ ? { description: meta.description }
242
+ : {}),
243
+ sessions: bucket.sessions,
244
+ metrics: cloneABMetrics(bucket.metrics),
245
+ });
246
+ }
247
+ // Orphan arms from the log (no longer in definition).
248
+ for (const [variant, bucket] of armTotals.get(experiment.name) ?? []) {
249
+ if (variant in def.variants) {
250
+ continue;
251
+ }
252
+ arms.push({
253
+ variant,
254
+ sessions: bucket.sessions,
255
+ metrics: cloneABMetrics(bucket.metrics),
256
+ });
257
+ }
258
+ return {
259
+ name: experiment.name,
260
+ variants: def.variants,
261
+ skipped: skipped.get(experiment.name) ?? 0,
262
+ arms,
263
+ };
264
+ }
265
+ );
266
+
267
+ // Experiments that appear only in logs (definition removed).
268
+ const known = new Set(experiments.map((experiment) => experiment.name));
269
+ const orphanNames = new Set<string>();
270
+ for (const row of sessionRows) {
271
+ for (const assignment of row.assignments) {
272
+ if (!known.has(assignment.experiment)) {
273
+ orphanNames.add(assignment.experiment);
274
+ }
275
+ }
276
+ }
277
+ for (const name of orphanNames) {
278
+ const armsMap = new Map<string, { sessions: number; metrics: ABMetrics }>();
279
+ let skipCount = 0;
280
+ for (const row of sessionRows) {
281
+ for (const assignment of row.assignments) {
282
+ if (assignment.experiment !== name) {
283
+ continue;
284
+ }
285
+ if (assignment.variant === null) {
286
+ skipCount += 1;
287
+ continue;
288
+ }
289
+ const bucket = armsMap.get(assignment.variant) ?? {
290
+ sessions: 0,
291
+ metrics: emptyABMetrics(),
292
+ };
293
+ bucket.sessions += 1;
294
+ if (assignment.metrics !== undefined) {
295
+ addMetrics(bucket.metrics, assignment.metrics);
296
+ }
297
+ armsMap.set(assignment.variant, bucket);
298
+ }
299
+ }
300
+ experimentRows.push({
301
+ name,
302
+ variants: {},
303
+ skipped: skipCount,
304
+ arms: [...armsMap.entries()].map(([variant, bucket]) => ({
305
+ variant,
306
+ sessions: bucket.sessions,
307
+ metrics: cloneABMetrics(bucket.metrics),
308
+ })),
309
+ });
310
+ }
311
+
312
+ return {
313
+ experiments: experimentRows,
314
+ sessions: sessionRows,
315
+ ...(input.config === undefined ? {} : { config: input.config }),
316
+ };
317
+ }
318
+
319
+ function addMetrics(target: ABMetrics, delta: ABMetrics): void {
320
+ target.turns += delta.turns;
321
+ target.turnFailures += delta.turnFailures;
322
+ target.toolCalls += delta.toolCalls;
323
+ target.toolErrors += delta.toolErrors;
324
+ target.inputTokens += delta.inputTokens;
325
+ target.outputTokens += delta.outputTokens;
326
+ target.cacheReadTokens += delta.cacheReadTokens;
327
+ target.cacheWriteTokens += delta.cacheWriteTokens;
328
+ target.wallTimeMs += delta.wallTimeMs;
329
+ for (const [key, value] of Object.entries(delta.custom)) {
330
+ target.custom[key] = (target.custom[key] ?? 0) + value;
331
+ }
332
+ }
333
+
334
+ /** Narrow helper so callers don't need the unused DiscoveredAB import above. */
335
+ export type { DiscoveredAB };
@@ -0,0 +1,115 @@
1
+ /**
2
+ * In-memory gate for human-in-the-loop tool approvals. The session
3
+ * engine parks inside a server-tool `execute` by awaiting
4
+ * {@link ApprovalGate.wait}; HTTP (or the playground) unblocks via
5
+ * {@link ApprovalGate.resolve}.
6
+ *
7
+ * Pending approvals are also mirrored onto {@link SessionRecord} for
8
+ * durability of the *list* across reloads. After a process restart the
9
+ * in-flight SDK tool callback is gone, so resolve returns false and
10
+ * the host treats the approval as interrupted.
11
+ */
12
+
13
+ import type { ApprovalDecision, PendingApproval } from "../types.js";
14
+
15
+ function approvalKey(sessionId: string, callId: string): string {
16
+ return `${sessionId}\0${callId}`;
17
+ }
18
+
19
+ export interface ApprovalResolution {
20
+ decision: ApprovalDecision;
21
+ by?: string;
22
+ }
23
+
24
+ interface Waiter {
25
+ meta: PendingApproval;
26
+ resolve: (resolution: ApprovalResolution) => void;
27
+ }
28
+
29
+ export class ApprovalGate {
30
+ private readonly waiters = new Map<string, Waiter>();
31
+
32
+ wait(
33
+ meta: PendingApproval & { sessionId: string }
34
+ ): Promise<ApprovalResolution> {
35
+ const key = approvalKey(meta.sessionId, meta.callId);
36
+ const existing = this.waiters.get(key);
37
+ if (existing !== undefined) {
38
+ throw new Error(
39
+ `Approval already pending for session ${meta.sessionId} call ${meta.callId}`
40
+ );
41
+ }
42
+ return new Promise<ApprovalResolution>((resolveDecision) => {
43
+ this.waiters.set(key, {
44
+ meta: {
45
+ callId: meta.callId,
46
+ turnId: meta.turnId,
47
+ toolName: meta.toolName,
48
+ args: meta.args,
49
+ requestedAt: meta.requestedAt,
50
+ },
51
+ resolve: resolveDecision,
52
+ });
53
+ });
54
+ }
55
+
56
+ /**
57
+ * Unblock a waiter. Returns false when there is no live waiter (e.g. the
58
+ * host restarted while the tool call was parked).
59
+ */
60
+ resolve(
61
+ sessionId: string,
62
+ callId: string,
63
+ decision: ApprovalDecision,
64
+ resolvedBy?: string
65
+ ): boolean {
66
+ const key = approvalKey(sessionId, callId);
67
+ const waiter = this.waiters.get(key);
68
+ if (waiter === undefined) {
69
+ return false;
70
+ }
71
+ this.waiters.delete(key);
72
+ waiter.resolve({
73
+ decision,
74
+ ...(resolvedBy === undefined || resolvedBy === ""
75
+ ? {}
76
+ : { by: resolvedBy }),
77
+ });
78
+ return true;
79
+ }
80
+
81
+ has(sessionId: string, callId: string): boolean {
82
+ return this.waiters.has(approvalKey(sessionId, callId));
83
+ }
84
+
85
+ list(sessionId: string): PendingApproval[] {
86
+ const prefix = `${sessionId}\0`;
87
+ const out: PendingApproval[] = [];
88
+ for (const [key, waiter] of this.waiters) {
89
+ if (key.startsWith(prefix)) {
90
+ out.push(waiter.meta);
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+
96
+ /** Drop waiters for a session (e.g. turn already failed). */
97
+ cancelSession(sessionId: string, decision: ApprovalDecision = "deny"): void {
98
+ const prefix = `${sessionId}\0`;
99
+ for (const [key, waiter] of [...this.waiters.entries()]) {
100
+ if (!key.startsWith(prefix)) {
101
+ continue;
102
+ }
103
+ this.waiters.delete(key);
104
+ waiter.resolve({ decision });
105
+ }
106
+ }
107
+
108
+ /** Unblock every live waiter (e.g. engine shutdown). */
109
+ cancelAll(decision: ApprovalDecision = "deny"): void {
110
+ for (const waiter of this.waiters.values()) {
111
+ waiter.resolve({ decision });
112
+ }
113
+ this.waiters.clear();
114
+ }
115
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Auth helpers shared by the HTTP channel, session engine, and session store.
3
+ */
4
+
5
+ import type { AuthContext } from "../types.js";
6
+
7
+ /**
8
+ * Session ids must be a single path segment: no `..`, separators, or empty
9
+ * names. Generated ids use `ses_<24 hex>`; this also admits caller-provided
10
+ * safe keys without opening path traversal.
11
+ */
12
+ const SAFE_SESSION_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
13
+
14
+ export function isSafeSessionId(sessionId: string): boolean {
15
+ return (
16
+ SAFE_SESSION_ID.test(sessionId) &&
17
+ !sessionId.includes("..") &&
18
+ !sessionId.includes("/") &&
19
+ !sessionId.includes("\\")
20
+ );
21
+ }
22
+
23
+ /** True when both sides identify the same principal (or both are null). */
24
+ export function samePrincipal(
25
+ a: AuthContext | null,
26
+ b: AuthContext | null
27
+ ): boolean {
28
+ if (a === null && b === null) {
29
+ return true;
30
+ }
31
+ if (a === null || b === null) {
32
+ return false;
33
+ }
34
+ return (
35
+ a.authenticator === b.authenticator &&
36
+ a.principalId === b.principalId &&
37
+ a.principalType === b.principalType
38
+ );
39
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Node module-customization hooks for authored agent files (registered via
3
+ * node:module `register()` from authored-loaders.ts; runs on Node's loader
4
+ * thread — keep this module dependency-free).
5
+ *
6
+ * Authored files import the framework by bare specifier. From a published
7
+ * install those need help in two cases:
8
+ *
9
+ * - `@anysphere/agent-serve[/subpath]` (the historical monorepo name) is not
10
+ * on npm, so it can never resolve from a user project. `directAliases` map
11
+ * it straight onto the running package's dist entries.
12
+ * - `@cursor/july[/subpath]` (the published name) and `@cursor/agentkit
13
+ * [/subpath]` (the future public name) normally resolve through the
14
+ * project's own node_modules; `fallbackAliases` only apply when that
15
+ * fails (npx/global installs, projects without a local dependency), so a
16
+ * real install in the user's project keeps precedence.
17
+ */
18
+
19
+ // Null-prototype copies so specifiers like "constructor" or "__proto__"
20
+ // can never resolve to inherited Object.prototype members.
21
+ let directAliases = toNullProtoMap({});
22
+ let fallbackAliases = toNullProtoMap({});
23
+
24
+ export interface AuthoredAliasHookData {
25
+ directAliases: Record<string, string>;
26
+ fallbackAliases: Record<string, string>;
27
+ }
28
+
29
+ function toNullProtoMap(
30
+ source: Record<string, string>
31
+ ): Record<string, string> {
32
+ return Object.assign(Object.create(null) as Record<string, string>, source);
33
+ }
34
+
35
+ export function initialize(data: AuthoredAliasHookData): void {
36
+ directAliases = toNullProtoMap(data.directAliases);
37
+ fallbackAliases = toNullProtoMap(data.fallbackAliases);
38
+ }
39
+
40
+ interface ResolveResult {
41
+ url: string;
42
+ shortCircuit?: boolean;
43
+ format?: string | null;
44
+ }
45
+
46
+ type NextResolve = (
47
+ specifier: string,
48
+ context: unknown
49
+ ) => ResolveResult | Promise<ResolveResult>;
50
+
51
+ export function resolve(
52
+ specifier: string,
53
+ context: unknown,
54
+ nextResolve: NextResolve
55
+ ): ResolveResult | Promise<ResolveResult> {
56
+ const direct = directAliases[specifier];
57
+ if (direct !== undefined) {
58
+ return { url: direct, shortCircuit: true };
59
+ }
60
+ const fallback = fallbackAliases[specifier];
61
+ if (fallback === undefined) {
62
+ // Not ours: pass through with no promise/try-catch overhead. This hook
63
+ // runs on every module resolution in the process.
64
+ return nextResolve(specifier, context);
65
+ }
66
+ return Promise.resolve()
67
+ .then(() => nextResolve(specifier, context))
68
+ .catch(() => ({ url: fallback, shortCircuit: true }));
69
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Process-wide module loaders for authored agent files.
3
+ *
4
+ * The CLI dynamically imports user TypeScript (`agent/agent.ts`,
5
+ * `agent/tools/*.ts`, `evals/**\/*.eval.ts`) at runtime, and plain Node
6
+ * cannot load `.ts` modules. Instead of requiring hosts to wrap the bin in
7
+ * `node --import tsx`, the bin (and programmatic `serve()`) registers tsx's
8
+ * ESM loader itself on startup.
9
+ *
10
+ * On compiled runs it additionally registers alias hooks so authored bare
11
+ * imports of the framework resolve against the running package: the
12
+ * historical `@anysphere/agent-serve[/x]` name always, and
13
+ * `@cursor/july[/x]` / `@cursor/agentkit[/x]` as fallbacks when the user's
14
+ * project has no local install (npx / global). Source runs (tsx from the
15
+ * monorepo) skip both — the host loader and tsconfig paths already cover
16
+ * them.
17
+ */
18
+
19
+ import { register as registerModuleHooks } from "node:module";
20
+ import { join } from "node:path";
21
+ import { pathToFileURL } from "node:url";
22
+ import type { AuthoredAliasHookData } from "./authored-alias-hooks.js";
23
+ import {
24
+ AGENTKIT_PACKAGE_NAME,
25
+ AUTHORING_ENTRY_FILES,
26
+ CLI_COMMAND_NAME,
27
+ isCompiledDistribution,
28
+ LEGACY_PACKAGE_NAME,
29
+ PACKAGE_NAME,
30
+ packageRootDir,
31
+ } from "./distribution.js";
32
+
33
+ /**
34
+ * Cross-copy markers: a user project with its own `@cursor/july` install
35
+ * can load a second copy of this module in the same process; tsx and the
36
+ * alias hooks must only be registered once.
37
+ */
38
+ const TSX_REGISTERED_KEY = Symbol.for("cursor.agentkit.tsxRegistered");
39
+ const ALIASES_REGISTERED_KEY = Symbol.for("cursor.agentkit.aliasesRegistered");
40
+
41
+ let registration: Promise<void> | undefined;
42
+
43
+ /**
44
+ * Install the runtime loaders for authored agent files. Idempotent; called
45
+ * from the CLI entry before any command runs, and from `serve()` and the
46
+ * discovery APIs for programmatic embedders. Concurrent callers share one
47
+ * registration and all wait for it to finish.
48
+ */
49
+ export function registerAuthoredModuleLoaders(): Promise<void> {
50
+ if (!isCompiledDistribution()) {
51
+ return Promise.resolve();
52
+ }
53
+ registration ??= (async () => {
54
+ await registerTsxLoader();
55
+ registerFrameworkAliases();
56
+ })();
57
+ return registration;
58
+ }
59
+
60
+ async function registerTsxLoader(): Promise<void> {
61
+ // Escape hatch for hosts that precompile authored files to .js (or bring
62
+ // their own loader) and don't want tsx hooked into module resolution.
63
+ if (process.env.AGENT_SERVE_DISABLE_TSX === "1") {
64
+ return;
65
+ }
66
+ if (tsxAlreadyActive()) {
67
+ return;
68
+ }
69
+ try {
70
+ const tsx = (await import("tsx/esm/api")) as {
71
+ register: () => unknown;
72
+ };
73
+ if (typeof tsx.register !== "function") {
74
+ throw new Error("tsx/esm/api has no register export");
75
+ }
76
+ tsx.register();
77
+ (globalThis as Record<symbol, unknown>)[TSX_REGISTERED_KEY] = true;
78
+ } catch (error) {
79
+ process.stderr.write(
80
+ `[${CLI_COMMAND_NAME}] tsx loader unavailable (${
81
+ error instanceof Error ? error.message : String(error)
82
+ }); authored TypeScript files will not load — install tsx or precompile the agent to .js\n`
83
+ );
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Whether a tsx loader is already installed process-wide: by a previous call
89
+ * from another copy of this module, or by the host command line (the Docker
90
+ * flow still runs `node --import tsx dist/bin/agent-serve.js`).
91
+ */
92
+ function tsxAlreadyActive(): boolean {
93
+ if ((globalThis as Record<symbol, unknown>)[TSX_REGISTERED_KEY] === true) {
94
+ return true;
95
+ }
96
+ const hostArgs = [
97
+ ...process.execArgv,
98
+ ...(process.env.NODE_OPTIONS?.split(/\s+/) ?? []),
99
+ ];
100
+ for (let i = 0; i < hostArgs.length; i++) {
101
+ const arg = hostArgs[i];
102
+ if (arg === "--import" || arg === "--loader" || arg === "--require") {
103
+ const value = hostArgs[i + 1];
104
+ if (value === "tsx" || value?.startsWith("tsx/")) {
105
+ return true;
106
+ }
107
+ } else if (
108
+ arg !== undefined &&
109
+ /^--(import|loader|require)=tsx(\/|$)/.test(arg)
110
+ ) {
111
+ return true;
112
+ }
113
+ }
114
+ return false;
115
+ }
116
+
117
+ function registerFrameworkAliases(): void {
118
+ const markers = globalThis as Record<symbol, unknown>;
119
+ if (markers[ALIASES_REGISTERED_KEY] === true) {
120
+ return;
121
+ }
122
+ const distDir = join(packageRootDir(), "dist");
123
+ const directAliases: Record<string, string> = {};
124
+ const fallbackAliases: Record<string, string> = {};
125
+ for (const [subpath, file] of AUTHORING_ENTRY_FILES) {
126
+ const target = pathToFileURL(join(distDir, file)).href;
127
+ const suffix = subpath === "" ? "" : `/${subpath}`;
128
+ directAliases[`${LEGACY_PACKAGE_NAME}${suffix}`] = target;
129
+ fallbackAliases[`${PACKAGE_NAME}${suffix}`] = target;
130
+ fallbackAliases[`${AGENTKIT_PACKAGE_NAME}${suffix}`] = target;
131
+ }
132
+ const hooksUrl = new URL("./authored-alias-hooks.js", import.meta.url);
133
+ const data: AuthoredAliasHookData = { directAliases, fallbackAliases };
134
+ // `node:module`'s register() is synchronous: it blocks until the hooks
135
+ // thread has initialized, so the aliases are active when it returns.
136
+ registerModuleHooks(hooksUrl, { data });
137
+ markers[ALIASES_REGISTERED_KEY] = true;
138
+ }