@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,211 @@
1
+ /**
2
+ * Host-side MCP clients for authored `agent/mcp-connections/*`.
3
+ *
4
+ * Every connection is always available in three places:
5
+ * - the Cursor agent, via SDK `mcpServers` (local harness or cloud)
6
+ * - the agent-serve host, for in-process server tools through
7
+ * {@link HostMcpRegistry} on {@link ToolContext.host}.mcp
8
+ * - channel / webhook route handlers through
9
+ * {@link HostMcpRegistry} on {@link ChannelHandlerArgs.host}.mcp
10
+ */
11
+
12
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
13
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
14
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
15
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
16
+ import type {
17
+ DiscoveredConnection,
18
+ HostMcpCallResult,
19
+ HostMcpRegistry,
20
+ HostMcpToolInfo,
21
+ JsonObject,
22
+ } from "../types.js";
23
+
24
+ interface OpenedConnection {
25
+ client: Client;
26
+ close: () => Promise<void>;
27
+ }
28
+
29
+ export class McpHost implements HostMcpRegistry {
30
+ private readonly byName = new Map<string, DiscoveredConnection>();
31
+ private readonly clients = new Map<string, Promise<OpenedConnection>>();
32
+
33
+ constructor(connections: DiscoveredConnection[]) {
34
+ for (const connection of connections) {
35
+ this.byName.set(connection.name, connection);
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Register a connection after construction (serve-time resolved peers).
41
+ * Clients open lazily on first use, so adding before first call is safe.
42
+ */
43
+ addConnection(connection: DiscoveredConnection): void {
44
+ this.byName.set(connection.name, connection);
45
+ }
46
+
47
+ names(): string[] {
48
+ return [...this.byName.keys()].sort();
49
+ }
50
+
51
+ async listTools(connectionName: string): Promise<HostMcpToolInfo[]> {
52
+ const { client } = await this.getClient(connectionName);
53
+ const listed = await client.listTools();
54
+ return listed.tools.map((tool) => ({
55
+ name: tool.name,
56
+ ...(tool.description === undefined
57
+ ? {}
58
+ : { description: tool.description }),
59
+ ...(tool.inputSchema === undefined
60
+ ? {}
61
+ : { inputSchema: tool.inputSchema as JsonObject }),
62
+ }));
63
+ }
64
+
65
+ async callTool(
66
+ connectionName: string,
67
+ toolName: string,
68
+ args: Record<string, unknown> = {}
69
+ ): Promise<HostMcpCallResult> {
70
+ const { client } = await this.getClient(connectionName);
71
+ const result = await client.callTool({
72
+ name: toolName,
73
+ arguments: args,
74
+ });
75
+ return normalizeCallResult(result);
76
+ }
77
+
78
+ async close(): Promise<void> {
79
+ const opened = await Promise.allSettled([...this.clients.values()]);
80
+ this.clients.clear();
81
+ await Promise.allSettled(
82
+ opened.map(async (settled) => {
83
+ if (settled.status === "fulfilled") {
84
+ await settled.value.close();
85
+ }
86
+ })
87
+ );
88
+ }
89
+
90
+ private getClient(name: string): Promise<OpenedConnection> {
91
+ let pending = this.clients.get(name);
92
+ if (pending === undefined) {
93
+ pending = this.connect(name).catch((error) => {
94
+ this.clients.delete(name);
95
+ throw error;
96
+ });
97
+ this.clients.set(name, pending);
98
+ }
99
+ return pending;
100
+ }
101
+
102
+ private async connect(name: string): Promise<OpenedConnection> {
103
+ const connection = this.byName.get(name);
104
+ if (connection === undefined) {
105
+ const known = this.names().join(", ") || "(none)";
106
+ throw new Error(
107
+ `Unknown MCP connection "${name}". Authored MCP connections: ${known}.`
108
+ );
109
+ }
110
+ return openConnection(connection);
111
+ }
112
+ }
113
+
114
+ async function openConnection(
115
+ connection: DiscoveredConnection
116
+ ): Promise<OpenedConnection> {
117
+ const client = new Client({
118
+ name: "agent-serve",
119
+ version: "0.1.0",
120
+ });
121
+ const transport = createTransport(connection);
122
+ await client.connect(transport);
123
+
124
+ return {
125
+ client,
126
+ close: async () => {
127
+ try {
128
+ await client.close();
129
+ } catch {
130
+ // Best-effort teardown.
131
+ }
132
+ try {
133
+ await transport.close?.();
134
+ } catch {
135
+ // Best-effort teardown.
136
+ }
137
+ },
138
+ };
139
+ }
140
+
141
+ function createTransport(connection: DiscoveredConnection) {
142
+ const transport = connection.transport;
143
+ if ("agent" in transport) {
144
+ // Peers are resolved to concrete URLs by the serve host before any call
145
+ // (SessionEngine.setResolvedConnections); reaching here means the
146
+ // connection is being used outside a running server.
147
+ throw new Error(
148
+ `MCP connection "${connection.name}" targets peer agent "${transport.agent}" and has not been resolved; peer MCP connections are only callable on a running serve host.`
149
+ );
150
+ }
151
+ if ("cursorAccount" in transport) {
152
+ // Same contract as peers: the serve host resolves the account bridge URL
153
+ // before any call (SessionEngine.setResolvedConnections).
154
+ throw new Error(
155
+ `MCP connection "${connection.name}" exposes the Cursor account's connectors and has not been resolved; Cursor account MCP connections are only callable on a running serve host.`
156
+ );
157
+ }
158
+ if ("command" in transport) {
159
+ return new StdioClientTransport({
160
+ command: transport.command,
161
+ ...(transport.args === undefined ? {} : { args: transport.args }),
162
+ env: {
163
+ ...Object.fromEntries(
164
+ Object.entries(process.env).filter(
165
+ (entry): entry is [string, string] => entry[1] !== undefined
166
+ )
167
+ ),
168
+ ...(transport.env ?? {}),
169
+ },
170
+ ...(transport.cwd === undefined ? {} : { cwd: transport.cwd }),
171
+ });
172
+ }
173
+
174
+ const url = new URL(transport.url);
175
+ const requestInit =
176
+ transport.headers === undefined
177
+ ? undefined
178
+ : { headers: transport.headers };
179
+
180
+ if (transport.type === "sse") {
181
+ return new SSEClientTransport(url, {
182
+ ...(requestInit === undefined ? {} : { requestInit }),
183
+ });
184
+ }
185
+
186
+ return new StreamableHTTPClientTransport(url, {
187
+ ...(requestInit === undefined ? {} : { requestInit }),
188
+ });
189
+ }
190
+
191
+ function normalizeCallResult(result: unknown): HostMcpCallResult {
192
+ if (typeof result !== "object" || result === null) {
193
+ return {
194
+ content: [{ type: "text", text: String(result) }],
195
+ };
196
+ }
197
+ const record = result as {
198
+ content?: HostMcpCallResult["content"];
199
+ isError?: boolean;
200
+ structuredContent?: JsonObject;
201
+ };
202
+ return {
203
+ content: Array.isArray(record.content)
204
+ ? record.content
205
+ : [{ type: "text", text: JSON.stringify(result) }],
206
+ ...(record.isError === undefined ? {} : { isError: record.isError }),
207
+ ...(record.structuredContent === undefined
208
+ ? {}
209
+ : { structuredContent: record.structuredContent }),
210
+ };
211
+ }
@@ -0,0 +1,31 @@
1
+ /** True for IPv4/IPv6 loopback addresses (including IPv4-mapped IPv6). */
2
+ export function isLoopbackAddress(address: string): boolean {
3
+ const normalized = address.startsWith("::ffff:")
4
+ ? address.slice("::ffff:".length)
5
+ : address;
6
+ if (normalized === "::1" || normalized === "localhost") {
7
+ return true;
8
+ }
9
+ return normalized.startsWith("127.");
10
+ }
11
+
12
+ /** True when a parsed URL hostname refers to loopback (localhost / 127.x / ::1). */
13
+ export function isLoopbackHostname(hostname: string): boolean {
14
+ const normalized = hostname.toLowerCase();
15
+ if (normalized === "localhost" || normalized === "::1") {
16
+ return true;
17
+ }
18
+ if (normalized.startsWith("[") && normalized.endsWith("]")) {
19
+ const inner = normalized.slice(1, -1);
20
+ return inner === "::1";
21
+ }
22
+ const ipv4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(normalized);
23
+ if (ipv4 === null) {
24
+ return false;
25
+ }
26
+ const octets = ipv4.slice(1, 5).map((part) => Number(part));
27
+ if (octets.some((octet) => octet > 255)) {
28
+ return false;
29
+ }
30
+ return octets[0] === 127;
31
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Peer MCP connections: `defineConnection({ agent: "<slug>" })` addresses
3
+ * another agent mounted on the same serve host. Discovery keeps the
4
+ * transport symbolic (the target slug); the server resolves it to that
5
+ * agent's MCP endpoint (`/<slug>/v1/mcp`) once mounts and the listen
6
+ * address are known.
7
+ *
8
+ * Local-runtime turns (and host-side `ctx.host.mcp` calls) use the loopback
9
+ * server URL. Cloud-runtime turns run on a VM that cannot reach loopback,
10
+ * so they use the serve `publicUrl` when configured — and omit the peer
11
+ * (with a startup warning) when it is not.
12
+ */
13
+
14
+ import { type AgentProject, isPeerConnectionTransport } from "../types.js";
15
+ import { MCP_ENDPOINT_PATH } from "./mcp-endpoint.js";
16
+ import type { EngineResolvedConnection } from "./session-engine.js";
17
+
18
+ /** A validated peer reference: MCP connection name → target mount slug. */
19
+ export interface PeerConnectionRef {
20
+ /** Connection (MCP server) name — the filename under `agent/mcp-connections/`. */
21
+ name: string;
22
+ /** Slug of the peer agent mount this connection targets. */
23
+ targetSlug: string;
24
+ }
25
+
26
+ /**
27
+ * Validate every peer MCP connection across `mounts` and return them grouped by
28
+ * the referencing mount's slug. Throws on references to unknown slugs and on
29
+ * self-references (an agent asking itself recurses forever).
30
+ */
31
+ export function collectPeerConnections(
32
+ mounts: Array<{ slug: string; project: AgentProject }>
33
+ ): Map<string, PeerConnectionRef[]> {
34
+ const knownSlugs = new Set(
35
+ mounts.map(({ slug }) => slug).filter((slug) => slug !== "")
36
+ );
37
+ const bySlug = new Map<string, PeerConnectionRef[]>();
38
+ for (const { slug, project } of mounts) {
39
+ const refs: PeerConnectionRef[] = [];
40
+ for (const connection of project.agent.connections) {
41
+ if (!isPeerConnectionTransport(connection.transport)) {
42
+ continue;
43
+ }
44
+ const targetSlug = connection.transport.agent;
45
+ const label = slug === "" ? project.name : slug;
46
+ if (targetSlug === slug) {
47
+ throw new Error(
48
+ `Agent "${label}" connection "${connection.name}" references itself (agent: "${targetSlug}"); an agent cannot be its own peer.`
49
+ );
50
+ }
51
+ if (!knownSlugs.has(targetSlug)) {
52
+ const available = [...knownSlugs].sort().join(", ") || "(none)";
53
+ throw new Error(
54
+ `Agent "${label}" connection "${connection.name}" references unknown peer agent "${targetSlug}". Mounted agents: ${available}. Peers require multi-agent serve (each agent mounted under its directory-name slug).`
55
+ );
56
+ }
57
+ refs.push({ name: connection.name, targetSlug });
58
+ }
59
+ if (refs.length > 0) {
60
+ bySlug.set(slug, refs);
61
+ }
62
+ }
63
+ return bySlug;
64
+ }
65
+
66
+ /**
67
+ * Resolve validated peer refs to concrete MCP URLs once the server is
68
+ * listening. `serverUrl` is the loopback base (`http://127.0.0.1:<port>`);
69
+ * `publicUrl` (when configured) is the externally reachable base used for
70
+ * cloud-runtime turns. When the host requires a bearer token, it is attached
71
+ * so peer calls pass the target agent's auth chain.
72
+ */
73
+ export function resolvePeerConnections(args: {
74
+ refs: PeerConnectionRef[];
75
+ serverUrl: string;
76
+ publicUrl?: string;
77
+ authToken?: string;
78
+ }): EngineResolvedConnection[] {
79
+ const serverBase = trimTrailingSlash(args.serverUrl);
80
+ const publicBase =
81
+ args.publicUrl === undefined
82
+ ? undefined
83
+ : trimTrailingSlash(args.publicUrl);
84
+ const headers =
85
+ args.authToken === undefined
86
+ ? undefined
87
+ : { authorization: `Bearer ${args.authToken}` };
88
+ return args.refs.map((ref) => ({
89
+ name: ref.name,
90
+ localUrl: `${serverBase}/${ref.targetSlug}${MCP_ENDPOINT_PATH}`,
91
+ ...(publicBase === undefined
92
+ ? {}
93
+ : { cloudUrl: `${publicBase}/${ref.targetSlug}${MCP_ENDPOINT_PATH}` }),
94
+ ...(headers === undefined ? {} : { headers }),
95
+ }));
96
+ }
97
+
98
+ function trimTrailingSlash(url: string): string {
99
+ return url.endsWith("/") ? url.slice(0, -1) : url;
100
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Serves the built Vite playground SPA and the multi-agent index page.
3
+ *
4
+ * The playground is a Vite + React app (see `playground/`). `serve` auto-builds
5
+ * `dist/playground/` when the local vite toolchain is present (see
6
+ * `toolchain.ts`); `pnpm run build` also emits it for publish. In `--dev`,
7
+ * Vite HMR is spawned separately; this module only serves the static bundle.
8
+ *
9
+ * The server mounts the SPA at `/playground` (single agent) or
10
+ * `/<slug>/playground` (multi), so the built `index.html` — whose asset URLs
11
+ * are relative — gets a `<base href>` injected to resolve them under the mount.
12
+ */
13
+
14
+ import { existsSync, readFileSync } from "node:fs";
15
+ import { extname, join, normalize } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+
18
+ // src/internal/playground/static.ts -> packages/agent-serve/dist/playground/.
19
+ // Resolves the same from compiled dist/internal/playground/static.js.
20
+ const DIST_DIR = fileURLToPath(
21
+ new URL("../../../dist/playground/", import.meta.url)
22
+ );
23
+ const INDEX_HTML = join(DIST_DIR, "index.html");
24
+ const ASSETS_DIR = join(DIST_DIR, "assets");
25
+
26
+ /** Content types for the static bundles this server ships (playground, docs). */
27
+ export const STATIC_CONTENT_TYPES: Record<string, string> = {
28
+ ".html": "text/html; charset=utf-8",
29
+ ".js": "text/javascript; charset=utf-8",
30
+ ".mjs": "text/javascript; charset=utf-8",
31
+ ".css": "text/css; charset=utf-8",
32
+ ".map": "application/json; charset=utf-8",
33
+ ".json": "application/json; charset=utf-8",
34
+ ".svg": "image/svg+xml",
35
+ ".png": "image/png",
36
+ ".jpg": "image/jpeg",
37
+ ".jpeg": "image/jpeg",
38
+ ".gif": "image/gif",
39
+ ".webp": "image/webp",
40
+ ".ico": "image/x-icon",
41
+ ".woff": "font/woff",
42
+ ".woff2": "font/woff2",
43
+ ".ttf": "font/ttf",
44
+ };
45
+
46
+ /** Whether `pnpm run build:playground` has produced the SPA bundle. */
47
+ export function playgroundBundleExists(): boolean {
48
+ return existsSync(INDEX_HTML);
49
+ }
50
+
51
+ /**
52
+ * The SPA `index.html` with a `<base href>` injected so its relative asset
53
+ * URLs resolve under the mount point (`/playground/` or `/<slug>/playground/`).
54
+ * Falls back to a helpful placeholder page when the bundle is missing.
55
+ */
56
+ export function renderPlaygroundIndexHtml(baseHref: string): string {
57
+ if (!playgroundBundleExists()) {
58
+ return fallbackHtml(baseHref);
59
+ }
60
+ const html = readFileSync(INDEX_HTML, "utf8");
61
+ const baseTag = `<base href="${escapeHtml(baseHref)}" />`;
62
+ if (html.includes("<head>")) {
63
+ return html.replace("<head>", `<head>\n ${baseTag}`);
64
+ }
65
+ return `${baseTag}\n${html}`;
66
+ }
67
+
68
+ /** Serve one built asset from `dist/playground/assets/` by filename. */
69
+ export function renderPlaygroundAsset(file: string): Response {
70
+ // The route captures a single path segment, but normalize + reject anything
71
+ // that escapes the assets dir defensively.
72
+ const safe = normalize(file).replace(/^(\.\.[/\\])+/, "");
73
+ if (safe.includes("/") || safe.includes("\\") || safe === "") {
74
+ return new Response("Not found", { status: 404 });
75
+ }
76
+ const filePath = join(ASSETS_DIR, safe);
77
+ if (!filePath.startsWith(ASSETS_DIR) || !existsSync(filePath)) {
78
+ return new Response("Not found", { status: 404 });
79
+ }
80
+ const body = readFileSync(filePath);
81
+ const type =
82
+ STATIC_CONTENT_TYPES[extname(safe).toLowerCase()] ??
83
+ "application/octet-stream";
84
+ return new Response(new Uint8Array(body), {
85
+ headers: {
86
+ "content-type": type,
87
+ // Vite emits content-hashed filenames, so they are safe to cache hard.
88
+ "cache-control": "public, max-age=31536000, immutable",
89
+ },
90
+ });
91
+ }
92
+
93
+ /** One row on the multi-agent index page. */
94
+ export interface AgentIndexEntry {
95
+ slug: string;
96
+ name: string;
97
+ model: string;
98
+ tools: number;
99
+ channels: number;
100
+ }
101
+
102
+ /** Standalone index page listing every mounted agent (multi-agent serving). */
103
+ export function renderAgentsIndexHtml(agents: AgentIndexEntry[]): string {
104
+ const cards = agents
105
+ .map((agent) => {
106
+ const meta = `${agent.model || "—"} · ${agent.tools} tool${
107
+ agent.tools === 1 ? "" : "s"
108
+ } · ${agent.channels} channel${agent.channels === 1 ? "" : "s"}`;
109
+ return ` <a class="card" href="/${escapeHtml(agent.slug)}/playground">
110
+ <div class="card-name">${escapeHtml(agent.name)}</div>
111
+ <div class="card-slug">/${escapeHtml(agent.slug)}</div>
112
+ <div class="card-meta">${escapeHtml(meta)}</div>
113
+ </a>`;
114
+ })
115
+ .join("\n");
116
+ return AGENTS_INDEX_TEMPLATE.replace(
117
+ "<!--CARDS-->",
118
+ cards || ' <div class="card-meta">No agents mounted.</div>'
119
+ ).replace("<!--COUNT-->", String(agents.length));
120
+ }
121
+
122
+ function escapeHtml(value: string): string {
123
+ return value
124
+ .replace(/&/g, "&amp;")
125
+ .replace(/</g, "&lt;")
126
+ .replace(/>/g, "&gt;")
127
+ .replace(/"/g, "&quot;");
128
+ }
129
+
130
+ function fallbackHtml(baseHref: string): string {
131
+ return `<!doctype html>
132
+ <html lang="en">
133
+ <head>
134
+ <base href="${escapeHtml(baseHref)}" />
135
+ <meta charset="utf-8" />
136
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
137
+ <title>agent-serve playground</title>
138
+ <style>
139
+ body { margin: 0; background: #0e1116; color: #e6edf3; font: 14px/1.6 ui-sans-serif, system-ui, sans-serif; }
140
+ .box { max-width: 640px; margin: 64px auto; padding: 0 24px; }
141
+ code { background: #1b212b; padding: 2px 6px; border-radius: 6px; font-family: ui-monospace, monospace; }
142
+ h1 { font-size: 18px; }
143
+ a { color: #6cb6ff; }
144
+ </style>
145
+ </head>
146
+ <body>
147
+ <div class="box">
148
+ <h1>Playground bundle not built</h1>
149
+ <p>
150
+ The Vite playground has not been built yet. <code>agent-serve serve</code>
151
+ auto-builds it when the local vite toolchain is available; otherwise run
152
+ <code>pnpm run build:playground</code> from <code>packages/agent-serve</code>,
153
+ or <code>pnpm run dev:playground</code> for Vite HMR.
154
+ </p>
155
+ </div>
156
+ </body>
157
+ </html>`;
158
+ }
159
+
160
+ const AGENTS_INDEX_TEMPLATE = `<!doctype html>
161
+ <html lang="en">
162
+ <head>
163
+ <meta charset="utf-8" />
164
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
165
+ <title>agent-serve — agents</title>
166
+ <style>
167
+ :root { color-scheme: dark; }
168
+ body { margin: 0; background: #0e1116; color: #e6edf3; font: 14px/1.6 ui-sans-serif, system-ui, -apple-system, sans-serif; }
169
+ .agents-wrap { max-width: 880px; margin: 0 auto; padding: 48px 24px; }
170
+ .agents-wrap h1 { font-size: 20px; font-weight: 650; margin: 0 0 2px; }
171
+ .agents-wrap .sub { color: #8b949e; font-size: 13px; margin-bottom: 28px; }
172
+ .agents-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 14px; }
173
+ .card { display: block; text-decoration: none; color: inherit; background: #161b22; border: 1px solid #30363d; border-radius: 12px; padding: 16px 18px; transition: border-color 0.12s; }
174
+ .card:hover { border-color: #6cb6ff; }
175
+ .card-name { font-size: 15px; font-weight: 600; }
176
+ .card-slug { font-family: ui-monospace, monospace; font-size: 12px; color: #6cb6ff; margin-top: 2px; }
177
+ .card-meta { color: #6e7681; font-size: 12px; margin-top: 10px; }
178
+ </style>
179
+ </head>
180
+ <body>
181
+ <div class="agents-wrap">
182
+ <h1>agent-serve</h1>
183
+ <div class="sub"><!--COUNT--> agents mounted</div>
184
+ <div class="agents-grid">
185
+ <!--CARDS-->
186
+ </div>
187
+ </div>
188
+ </body>
189
+ </html>`;