@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,477 @@
1
+ /**
2
+ * Minimal Connect-JSON client for the handful of `aiserver.v1.DashboardService`
3
+ * RPCs agent-serve needs — `GetMe`, `ListSandMcpTools`, `ExecuteSandMcpTool`,
4
+ * and the login-time key lifecycle (`CreateUserApiKey`, `ListUserApiKeys`,
5
+ * `RevokeUserApiKey`).
6
+ *
7
+ * Plain `fetch` POSTs with proto-JSON bodies and zod-validated responses:
8
+ * agent-serve is a published package and should not pull the generated
9
+ * proto tree in for a few unary calls.
10
+ *
11
+ * Auth: the client holds the account API key and exchanges it on demand for
12
+ * a short-lived access token (`POST /auth/exchange_user_api_key`, ~1h),
13
+ * cached until shortly before expiry and re-exchanged once on a 401.
14
+ */
15
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17
+ return new (P || (P = Promise))(function (resolve, reject) {
18
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
22
+ });
23
+ };
24
+ import { randomUUID } from "node:crypto";
25
+ import { z } from "zod";
26
+ const CLIENT_VERSION = "agent-serve-0.1.0";
27
+ const EXCHANGE_PATH = "/auth/exchange_user_api_key";
28
+ const SERVICE_PREFIX = "/aiserver.v1.DashboardService";
29
+ /** Re-exchange when the cached token is within this window of expiry. */
30
+ const TOKEN_EXPIRY_LEEWAY_MS = 5 * 60 * 1000;
31
+ /** Fallback token lifetime when the JWT `exp` claim cannot be parsed. */
32
+ const FALLBACK_TOKEN_LIFETIME_MS = 30 * 60 * 1000;
33
+ const LIST_TIMEOUT_MS = 60000;
34
+ /** Backend-executed tools call out to third-party servers; be generous. */
35
+ const EXECUTE_TIMEOUT_MS = 120000;
36
+ export class CursorBackendError extends Error {
37
+ constructor(message, status) {
38
+ super(message);
39
+ this.status = status;
40
+ this.name = "CursorBackendError";
41
+ }
42
+ }
43
+ // ============================================================================
44
+ // Response schemas (proto-JSON, camelCase; default-valued fields are omitted)
45
+ // ============================================================================
46
+ const getMeResponseSchema = z.object({
47
+ authId: z.string().optional(),
48
+ email: z.string().optional(),
49
+ firstName: z.string().optional(),
50
+ lastName: z.string().optional(),
51
+ teamId: z.number().optional(),
52
+ teamName: z.string().optional(),
53
+ });
54
+ const createUserApiKeyResponseSchema = z.object({
55
+ apiKey: z.string().min(1),
56
+ });
57
+ const mcpToolSchema = z.object({
58
+ name: z.string(),
59
+ providerIdentifier: z.string().optional(),
60
+ toolName: z.string().optional(),
61
+ description: z.string().optional(),
62
+ /** `google.protobuf.Value` — an arbitrary JSON Schema object. */
63
+ inputSchema: z.unknown().optional(),
64
+ });
65
+ const listSandMcpToolsResponseSchema = z.object({
66
+ servers: z
67
+ .array(z.object({
68
+ serverIdentifier: z.string(),
69
+ /** "connected" | "needsAuth" | "error" | "loading" */
70
+ status: z.string(),
71
+ tools: z.array(mcpToolSchema).optional(),
72
+ }))
73
+ .optional(),
74
+ });
75
+ /**
76
+ * Proto-JSON of `agent.v1.McpResult` (oneof → exactly one field set).
77
+ * Inner strings default to `""` because proto-JSON omits default-valued
78
+ * fields — `McpTextContent{text: ""}` arrives as `{"text": {}}`.
79
+ */
80
+ const mcpResultSchema = z.object({
81
+ success: z
82
+ .object({
83
+ content: z
84
+ .array(z.object({
85
+ text: z.object({ text: z.string().default("") }).optional(),
86
+ image: z
87
+ .object({
88
+ data: z.string().default(""),
89
+ mimeType: z.string().optional(),
90
+ })
91
+ .optional(),
92
+ }))
93
+ .optional(),
94
+ isError: z.boolean().optional(),
95
+ structuredContent: z.record(z.unknown()).optional(),
96
+ })
97
+ .optional(),
98
+ error: z.object({ error: z.string().optional() }).optional(),
99
+ rejected: z.object({ reason: z.string().optional() }).optional(),
100
+ permissionDenied: z.object({ error: z.string().optional() }).optional(),
101
+ toolNotFound: z
102
+ .object({
103
+ name: z.string().optional(),
104
+ availableTools: z.array(z.string()).optional(),
105
+ })
106
+ .optional(),
107
+ serverNotFound: z
108
+ .object({
109
+ name: z.string().optional(),
110
+ availableServers: z.array(z.string()).optional(),
111
+ })
112
+ .optional(),
113
+ });
114
+ const executeResponseSchema = z.object({
115
+ result: mcpResultSchema.optional(),
116
+ });
117
+ // ============================================================================
118
+ // Shared request machinery (used by the client and the login-time mint)
119
+ // ============================================================================
120
+ /** One DashboardService Connect-JSON POST; auth is the caller's bearer. */
121
+ function dashboardRpc(args) {
122
+ return __awaiter(this, void 0, void 0, function* () {
123
+ var _a;
124
+ try {
125
+ return yield args.fetchImpl(`${args.backendUrl}${SERVICE_PREFIX}/${args.method}`, {
126
+ method: "POST",
127
+ headers: {
128
+ "content-type": "application/json",
129
+ authorization: `Bearer ${args.bearer}`,
130
+ "x-ghost-mode": "true",
131
+ "x-cursor-client-version": CLIENT_VERSION,
132
+ "x-cursor-client-type": "agent-serve",
133
+ "x-request-id": randomUUID(),
134
+ },
135
+ body: JSON.stringify((_a = args.body) !== null && _a !== void 0 ? _a : {}),
136
+ signal: AbortSignal.timeout(args.timeoutMs),
137
+ });
138
+ }
139
+ catch (error) {
140
+ throw new CursorBackendError(`Cursor backend request ${args.method} failed: ${describeError(error)}`);
141
+ }
142
+ });
143
+ }
144
+ /** Drain and parse an RPC response; maps non-2xx to a CursorBackendError. */
145
+ function parseRpcResponse(method, response) {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ const text = yield response.text();
148
+ if (!response.ok) {
149
+ throw new CursorBackendError(`Cursor backend ${method} failed (${response.status}): ${connectErrorMessage(text)}`, response.status);
150
+ }
151
+ try {
152
+ return JSON.parse(text);
153
+ }
154
+ catch (_a) {
155
+ throw new CursorBackendError(`Cursor backend ${method} returned a non-JSON response.`);
156
+ }
157
+ });
158
+ }
159
+ export class CursorBackendClient {
160
+ constructor(options) {
161
+ var _a, _b;
162
+ this.backendUrl = options.backendUrl.endsWith("/")
163
+ ? options.backendUrl.slice(0, -1)
164
+ : options.backendUrl;
165
+ this.apiKey = options.apiKey;
166
+ this.logger = (_a = options.logger) !== null && _a !== void 0 ? _a : (() => { });
167
+ this.fetchImpl = (_b = options.fetchImpl) !== null && _b !== void 0 ? _b : fetch;
168
+ }
169
+ /** Who this API key acts as. */
170
+ getMe() {
171
+ return __awaiter(this, void 0, void 0, function* () {
172
+ return getMeResponseSchema.parse(yield this.rpc("GetMe", {}));
173
+ });
174
+ }
175
+ /**
176
+ * The account's MCP connectors with live status and backend-prefixed tool
177
+ * definitions. `serverIdentifiers` restricts discovery (empty = all
178
+ * HTTP/SSE servers on the account).
179
+ */
180
+ listAccountMcpTools(serverIdentifiers) {
181
+ return __awaiter(this, void 0, void 0, function* () {
182
+ var _a;
183
+ const raw = yield this.rpc("ListSandMcpTools", { serverIdentifiers: [...serverIdentifiers] }, LIST_TIMEOUT_MS);
184
+ const parsed = listSandMcpToolsResponseSchema.parse(raw);
185
+ return ((_a = parsed.servers) !== null && _a !== void 0 ? _a : []).map((server) => { var _a; return ({
186
+ serverIdentifier: server.serverIdentifier,
187
+ status: server.status,
188
+ tools: ((_a = server.tools) !== null && _a !== void 0 ? _a : []).map((tool) => { var _a; return ({
189
+ name: tool.name,
190
+ description: (_a = tool.description) !== null && _a !== void 0 ? _a : "",
191
+ inputSchema: normalizeInputSchema(tool.inputSchema),
192
+ }); }),
193
+ }); });
194
+ });
195
+ }
196
+ /**
197
+ * Execute one connector tool **on the Cursor backend** with the account's
198
+ * stored OAuth credentials. `toolName` is the fully-qualified name from
199
+ * {@link listAccountMcpTools}.
200
+ */
201
+ executeAccountMcpTool(args) {
202
+ return __awaiter(this, void 0, void 0, function* () {
203
+ var _a;
204
+ const raw = yield this.rpc("ExecuteSandMcpTool", {
205
+ serverIdentifier: args.serverIdentifier,
206
+ toolName: args.toolName,
207
+ args: args.args,
208
+ toolCallId: randomUUID(),
209
+ }, EXECUTE_TIMEOUT_MS);
210
+ const parsed = executeResponseSchema.parse(raw);
211
+ return toCallResult((_a = parsed.result) !== null && _a !== void 0 ? _a : {});
212
+ });
213
+ }
214
+ rpc(method_1, body_1) {
215
+ return __awaiter(this, arguments, void 0, function* (method, body, timeoutMs = LIST_TIMEOUT_MS) {
216
+ var _a, _b;
217
+ const bearer = yield this.getAccessToken();
218
+ const first = yield dashboardRpc({
219
+ fetchImpl: this.fetchImpl,
220
+ backendUrl: this.backendUrl,
221
+ method,
222
+ bearer,
223
+ body,
224
+ timeoutMs,
225
+ });
226
+ if (first.status !== 401) {
227
+ return parseRpcResponse(method, first);
228
+ }
229
+ // The token aged out server-side. Drain the rejected body (keeps the
230
+ // connection reusable), drop the token — unless a concurrent retry
231
+ // already minted a newer one — and retry once.
232
+ yield drainResponseBody(first);
233
+ if (((_a = this.token) === null || _a === void 0 ? void 0 : _a.value) === bearer) {
234
+ this.token = undefined;
235
+ }
236
+ const retryBearer = yield this.getAccessToken();
237
+ const second = yield dashboardRpc({
238
+ fetchImpl: this.fetchImpl,
239
+ backendUrl: this.backendUrl,
240
+ method,
241
+ bearer: retryBearer,
242
+ body,
243
+ timeoutMs,
244
+ });
245
+ if (second.status === 401 && ((_b = this.token) === null || _b === void 0 ? void 0 : _b.value) === retryBearer) {
246
+ // The freshly minted token was rejected too; do not keep serving it.
247
+ this.token = undefined;
248
+ }
249
+ return parseRpcResponse(method, second);
250
+ });
251
+ }
252
+ getAccessToken() {
253
+ if (this.token !== undefined &&
254
+ Date.now() < this.token.expiresAtMs - TOKEN_EXPIRY_LEEWAY_MS) {
255
+ return Promise.resolve(this.token.value);
256
+ }
257
+ // Single-flight: concurrent tool calls share one exchange.
258
+ if (this.tokenExchange === undefined) {
259
+ this.tokenExchange = this.exchangeApiKey().finally(() => {
260
+ this.tokenExchange = undefined;
261
+ });
262
+ }
263
+ return this.tokenExchange;
264
+ }
265
+ exchangeApiKey() {
266
+ return __awaiter(this, void 0, void 0, function* () {
267
+ let response;
268
+ try {
269
+ response = yield this.fetchImpl(`${this.backendUrl}${EXCHANGE_PATH}`, {
270
+ method: "POST",
271
+ headers: {
272
+ "content-type": "application/json",
273
+ authorization: `Bearer ${this.apiKey}`,
274
+ },
275
+ body: "{}",
276
+ signal: AbortSignal.timeout(30000),
277
+ });
278
+ }
279
+ catch (error) {
280
+ throw new CursorBackendError(`Could not reach the Cursor backend at ${this.backendUrl}: ${describeError(error)}`);
281
+ }
282
+ const text = yield response.text();
283
+ if (!response.ok) {
284
+ throw new CursorBackendError(response.status === 401
285
+ ? "The Cursor API key was rejected. Run `agent-serve login` again or update CURSOR_API_KEY."
286
+ : `Cursor API key exchange failed (${response.status}).`, response.status);
287
+ }
288
+ const body = accessTokenResponseSchema.safeParse(safeJsonParse(text));
289
+ if (!body.success || body.data.accessToken === "") {
290
+ throw new CursorBackendError("Cursor API key exchange returned no access token.");
291
+ }
292
+ this.token = {
293
+ value: body.data.accessToken,
294
+ expiresAtMs: jwtExpiryMs(body.data.accessToken),
295
+ };
296
+ this.logger("[agent-serve] cursor account: minted a fresh access token");
297
+ return body.data.accessToken;
298
+ });
299
+ }
300
+ }
301
+ /**
302
+ * Mint a named user API key from a short-lived login session token. Used
303
+ * exactly once per `agent-serve login`; the session token is then discarded.
304
+ */
305
+ export function createUserApiKeyWithSessionToken(args) {
306
+ return __awaiter(this, void 0, void 0, function* () {
307
+ var _a;
308
+ const response = yield dashboardRpc({
309
+ fetchImpl: (_a = args.fetchImpl) !== null && _a !== void 0 ? _a : fetch,
310
+ backendUrl: args.backendUrl.endsWith("/")
311
+ ? args.backendUrl.slice(0, -1)
312
+ : args.backendUrl,
313
+ method: "CreateUserApiKey",
314
+ bearer: args.sessionToken,
315
+ body: { name: args.keyName },
316
+ timeoutMs: 30000,
317
+ });
318
+ const raw = yield parseRpcResponse("CreateUserApiKey", response);
319
+ return createUserApiKeyResponseSchema.parse(raw).apiKey;
320
+ });
321
+ }
322
+ const API_KEY_PREFIX = "crsr_";
323
+ /** Matches dashboard `maskApiKey` (`crsr_...abcd`). */
324
+ function maskApiKey(apiKey) {
325
+ return `${API_KEY_PREFIX}...${apiKey.slice(-4)}`;
326
+ }
327
+ const listUserApiKeysResponseSchema = z.object({
328
+ apiKeys: z
329
+ .array(z.object({
330
+ id: z.number(),
331
+ name: z.string(),
332
+ maskedKey: z.string().optional(),
333
+ }))
334
+ .optional(),
335
+ });
336
+ /**
337
+ * Best-effort cleanup when `login` mints a key but fails before storing it,
338
+ * authenticated with the browser session token that minted it. The key is
339
+ * identified by its masked suffix in `ListUserApiKeys` — never by name alone,
340
+ * so replica lag after `CreateUserApiKey` can only skip the cleanup, not
341
+ * revoke an older same-named key.
342
+ */
343
+ export function revokeMintedUserApiKey(args) {
344
+ return __awaiter(this, void 0, void 0, function* () {
345
+ var _a, _b;
346
+ const fetchImpl = (_a = args.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
347
+ const backendUrl = args.backendUrl.endsWith("/")
348
+ ? args.backendUrl.slice(0, -1)
349
+ : args.backendUrl;
350
+ const listResponse = yield dashboardRpc({
351
+ fetchImpl,
352
+ backendUrl,
353
+ method: "ListUserApiKeys",
354
+ bearer: args.sessionToken,
355
+ body: {},
356
+ timeoutMs: 30000,
357
+ });
358
+ const listed = listUserApiKeysResponseSchema.parse(yield parseRpcResponse("ListUserApiKeys", listResponse));
359
+ const masked = maskApiKey(args.apiKey);
360
+ const match = ((_b = listed.apiKeys) !== null && _b !== void 0 ? _b : []).find((key) => key.name === args.keyName && key.maskedKey === masked);
361
+ if (match === undefined) {
362
+ // CreateUserApiKey writes the primary while ListUserApiKeys may read a
363
+ // lagging replica — skip rather than touch any other key.
364
+ return;
365
+ }
366
+ const revokeResponse = yield dashboardRpc({
367
+ fetchImpl,
368
+ backendUrl,
369
+ method: "RevokeUserApiKey",
370
+ bearer: args.sessionToken,
371
+ body: { id: match.id },
372
+ timeoutMs: 30000,
373
+ });
374
+ yield drainResponseBody(revokeResponse);
375
+ });
376
+ }
377
+ // ============================================================================
378
+ // Helpers
379
+ // ============================================================================
380
+ const accessTokenResponseSchema = z.object({ accessToken: z.string() });
381
+ function safeJsonParse(text) {
382
+ try {
383
+ return JSON.parse(text);
384
+ }
385
+ catch (_a) {
386
+ return undefined;
387
+ }
388
+ }
389
+ function normalizeInputSchema(schema) {
390
+ if (typeof schema === "object" && schema !== null && !Array.isArray(schema)) {
391
+ return schema;
392
+ }
393
+ return { type: "object", properties: {} };
394
+ }
395
+ function toCallResult(result) {
396
+ var _a;
397
+ if (result.success !== undefined) {
398
+ const content = [];
399
+ for (const item of (_a = result.success.content) !== null && _a !== void 0 ? _a : []) {
400
+ if (item.text !== undefined) {
401
+ content.push({ type: "text", text: item.text.text });
402
+ }
403
+ else if (item.image !== undefined) {
404
+ content.push(Object.assign({ type: "image", data: item.image.data }, (item.image.mimeType === undefined
405
+ ? {}
406
+ : { mimeType: item.image.mimeType })));
407
+ }
408
+ }
409
+ return Object.assign({ content, isError: result.success.isError === true }, (result.success.structuredContent === undefined
410
+ ? {}
411
+ : { structuredContent: result.success.structuredContent }));
412
+ }
413
+ return {
414
+ content: [{ type: "text", text: describeFailure(result) }],
415
+ isError: true,
416
+ };
417
+ }
418
+ function describeFailure(result) {
419
+ var _a, _b, _c, _d, _e, _f;
420
+ if (result.error !== undefined) {
421
+ return (_a = result.error.error) !== null && _a !== void 0 ? _a : "The tool call failed.";
422
+ }
423
+ if (result.permissionDenied !== undefined) {
424
+ return (_b = result.permissionDenied.error) !== null && _b !== void 0 ? _b : "Permission denied.";
425
+ }
426
+ if (result.rejected !== undefined) {
427
+ return `The tool call was rejected${result.rejected.reason === undefined ? "" : `: ${result.rejected.reason}`}.`;
428
+ }
429
+ if (result.toolNotFound !== undefined) {
430
+ return `Unknown tool "${(_c = result.toolNotFound.name) !== null && _c !== void 0 ? _c : ""}". Available: ${((_d = result.toolNotFound.availableTools) !== null && _d !== void 0 ? _d : []).join(", ") || "(none)"}.`;
431
+ }
432
+ if (result.serverNotFound !== undefined) {
433
+ return `Unknown MCP server "${(_e = result.serverNotFound.name) !== null && _e !== void 0 ? _e : ""}". Available: ${((_f = result.serverNotFound.availableServers) !== null && _f !== void 0 ? _f : []).join(", ") || "(none)"}.`;
434
+ }
435
+ return "The tool call returned no result.";
436
+ }
437
+ /** Best-effort human-readable message from a Connect error JSON body. */
438
+ function connectErrorMessage(bodyText) {
439
+ const parsed = safeJsonParse(bodyText);
440
+ if (typeof parsed === "object" &&
441
+ parsed !== null &&
442
+ typeof parsed.message === "string" &&
443
+ parsed.message !== "") {
444
+ return parsed.message;
445
+ }
446
+ return bodyText.slice(0, 300) || "(empty response body)";
447
+ }
448
+ function jwtExpiryMs(token) {
449
+ try {
450
+ const payload = token.split(".")[1];
451
+ if (payload === undefined) {
452
+ throw new Error("not a JWT");
453
+ }
454
+ const claims = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
455
+ if (typeof claims.exp === "number") {
456
+ return claims.exp * 1000;
457
+ }
458
+ }
459
+ catch (_a) {
460
+ // Opaque token — assume a conservative lifetime.
461
+ }
462
+ return Date.now() + FALLBACK_TOKEN_LIFETIME_MS;
463
+ }
464
+ function describeError(error) {
465
+ return error instanceof Error ? error.message : String(error);
466
+ }
467
+ /** Release undici/fetch connection slots on responses we will not parse. */
468
+ function drainResponseBody(response) {
469
+ return __awaiter(this, void 0, void 0, function* () {
470
+ try {
471
+ yield response.arrayBuffer();
472
+ }
473
+ catch (_a) {
474
+ // Best-effort; the socket may already be closed.
475
+ }
476
+ });
477
+ }
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Cursor account credentials for the agent-serve host.
3
+ *
4
+ * Exactly one kind of secret exists at runtime: a **personal Cursor user API
5
+ * key**. Two ways to obtain it, one code path after that:
6
+ *
7
+ * - `agent-serve login` runs the same PKCE browser flow as `cursor-agent`
8
+ * and Sand, then uses the short-lived session once to mint a named,
9
+ * dashboard-revocable user API key — only the key is stored.
10
+ * - `CURSOR_API_KEY` (or `serve({ apiKey })`) wins over the stored key, so
11
+ * CI and hosted deployments stay env-driven.
12
+ *
13
+ * There is deliberately no session-token storage, refresh-token rotation, or
14
+ * cross-tool credential sharing here: short-lived access tokens are minted
15
+ * on demand from the API key (see `backend-client.ts`).
16
+ */
17
+ import { z } from "zod";
18
+ export declare const DEFAULT_CURSOR_BACKEND_URL = "https://api2.cursor.sh";
19
+ /** Backend API base URL (`CURSOR_API_BASE_URL` override for local dev). */
20
+ export declare function cursorBackendUrl(): string;
21
+ /** Website base URL for the login deep link (`CURSOR_WEBSITE_URL` override). */
22
+ export declare function cursorWebsiteUrl(): string;
23
+ declare const storedCredentialsSchema: z.ZodObject<{
24
+ backendUrl: z.ZodString;
25
+ apiKey: z.ZodString;
26
+ }, "strip">;
27
+ export type StoredCredentials = z.infer<typeof storedCredentialsSchema>;
28
+ /**
29
+ * `~/.config/agent-serve/credentials.json` (0600), honoring
30
+ * `XDG_CONFIG_HOME`. `AGENT_SERVE_CONFIG_DIR` pins the directory outright
31
+ * (tests, containers).
32
+ */
33
+ export declare function credentialsFilePath(): string;
34
+ export declare function readStoredCredentials(): Promise<StoredCredentials | undefined>;
35
+ export declare function writeStoredCredentials(credentials: StoredCredentials): Promise<void>;
36
+ export declare function clearStoredCredentials(): Promise<boolean>;
37
+ export type ApiKeySource = "option" | "env" | "login";
38
+ export interface ResolvedApiKey {
39
+ apiKey: string;
40
+ source: ApiKeySource;
41
+ backendUrl: string;
42
+ }
43
+ /**
44
+ * Resolve the account API key for `backendUrl` (defaults to the active
45
+ * backend): explicit option → `CURSOR_API_KEY` → stored login. A stored key
46
+ * minted against a different backend is ignored rather than sent to the
47
+ * wrong host.
48
+ */
49
+ export declare function resolveApiKey(options?: {
50
+ apiKey?: string;
51
+ backendUrl?: string;
52
+ }): Promise<ResolvedApiKey | undefined>;
53
+ /** One-line hint for "no credentials" errors, shared across surfaces. */
54
+ export declare const SIGN_IN_HINT: string;
55
+ export interface LoginStart {
56
+ /** URL the user opens in a browser to approve the login. */
57
+ loginUrl: string;
58
+ uuid: string;
59
+ verifier: string;
60
+ }
61
+ /**
62
+ * Build the `/loginDeepControl` deep link and its PKCE material. The portal
63
+ * completes the login and the backend holds the resulting session until
64
+ * {@link pollForLoginTokens} picks it up with the verifier.
65
+ */
66
+ export declare function startBrowserLogin(): LoginStart;
67
+ /**
68
+ * Why the poll stopped. Distinct cases because collapsing them into
69
+ * "timed out or was cancelled" turned an unsupported-verb 404 into an
70
+ * unfalsifiable "login is slow" report.
71
+ */
72
+ export type LoginPollResult = {
73
+ status: "signed_in";
74
+ accessToken: string;
75
+ } | {
76
+ status: "cancelled";
77
+ } | {
78
+ status: "timed_out";
79
+ } | {
80
+ status: "failed";
81
+ message: string;
82
+ };
83
+ /**
84
+ * Poll `/auth/poll` until the browser login completes.
85
+ *
86
+ * **POST, with the verifier in the JSON body.** The verifier is redeemable:
87
+ * anyone holding it (plus the uuid) can complete the login and mint a durable
88
+ * user API key, so it must not reach a URL — not the backend's access log, not
89
+ * a proxy's request log, not a terminal. `POST /auth/poll` exists for exactly
90
+ * this reason.
91
+ *
92
+ * A backend that predates that route answers POST with a route-not-found 404.
93
+ * Those get one sticky fallback to `GET /auth/poll?uuid=…&verifier=…` — the
94
+ * shape the vscode client and Sand already use — so the login still works
95
+ * while the backend catches up. The fallback puts the verifier in the query
96
+ * string, which is the exposure POST was added to remove, so it warns; it
97
+ * disappears on its own once the backend serves POST.
98
+ */
99
+ export declare function pollForLoginTokens(args: {
100
+ uuid: string;
101
+ verifier: string;
102
+ backendUrl?: string;
103
+ signal?: AbortSignal;
104
+ /** Notified once if the backend forces the GET fallback. */
105
+ logger?: (line: string) => void;
106
+ /** Test seam; defaults to global fetch. */
107
+ fetchImpl?: typeof fetch;
108
+ /** Test seam; defaults to 150 (~24 minutes with the backoff below). */
109
+ maxAttempts?: number;
110
+ }): Promise<LoginPollResult>;
111
+ export {};
112
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/internal/cursor/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAGnE,2EAA2E;AAC3E,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAUD,QAAA,MAAM,uBAAuB,EAAE,CAAC,CAAC,SAAS,CACxC;IAAE,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAA;CAAE,EAChD,OAAO,CAKP,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CACpD,iBAAiB,GAAG,SAAS,CAC9B,CAsBA;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO/D;AAMD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CActC;AAED,yEAAyE;AACzE,eAAO,MAAM,YAAY,EAAE,MAA8F,CAAC;AAQ1H,MAAM,WAAW,UAAU;IACzB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,CAU9C;AAKD;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmG3B"}