@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,355 @@
1
+ /**
2
+ * Per-agent MCP surface: every mounted agent is also a Model Context
3
+ * Protocol server over streamable HTTP at `<base>/v1/mcp`, so other agents
4
+ * (peer MCP connections) and ordinary MCP clients can delegate work to it.
5
+ *
6
+ * The endpoint is stateless (a fresh `McpServer` + transport per POST, JSON
7
+ * response mode): session identity travels in tool arguments, not in MCP
8
+ * transport session headers, so any number of hosts can sit in front of it.
9
+ *
10
+ * Tools:
11
+ * - `ask` — start (or continue, via `sessionId`) a conversation with this
12
+ * agent; runs a model turn in the agent's own context and returns the
13
+ * reply. Bounded wait: long turns return `status: "running"`.
14
+ * - `check` — wait for / poll a running session started by `ask`.
15
+ * - `call_tool` — call one of the agent's deterministic server tools
16
+ * directly (no model turn). Registered only when server tools exist.
17
+ */
18
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
+ return new (P || (P = Promise))(function (resolve, reject) {
21
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
25
+ });
26
+ };
27
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
28
+ import { WebStandardStreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";
29
+ import { z } from "zod";
30
+ import { samePrincipal } from "./auth.js";
31
+ import { SessionBusyError, ToolInputError, ToolNotDirectlyCallableError, UnknownSessionError, UnknownToolError, } from "./session-engine.js";
32
+ /** Channel id recorded on sessions created through the MCP surface. */
33
+ export const MCP_CHANNEL_ID = "mcp";
34
+ /** Mount path of the MCP surface, relative to the agent base. */
35
+ export const MCP_ENDPOINT_PATH = "/v1/mcp";
36
+ /**
37
+ * Bounded waits stay below the MCP client default request timeout (60s) so
38
+ * a long model turn degrades to `status: "running"` instead of a client
39
+ * timeout that loses the session id.
40
+ */
41
+ const MAX_WAIT_SECONDS = 55;
42
+ const DEFAULT_WAIT_SECONDS = 50;
43
+ /**
44
+ * Serve one stateless streamable-HTTP MCP request: a fresh server +
45
+ * transport per POST, JSON response mode, spec-compliant 405 on other
46
+ * methods. Shared by the per-agent MCP endpoint and the Cursor account
47
+ * bridge so the subtle transport/error plumbing exists once.
48
+ */
49
+ export function handleStatelessMcpRequest(args) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ var _a;
52
+ const logger = (_a = args.logger) !== null && _a !== void 0 ? _a : (() => { });
53
+ if (args.request.method !== "POST") {
54
+ // Stateless server: no server-initiated SSE stream (GET) and no
55
+ // transport sessions to delete (DELETE). 405 per the MCP spec;
56
+ // clients treat it as "streaming unsupported" and carry on.
57
+ return new Response(JSON.stringify({
58
+ jsonrpc: "2.0",
59
+ error: { code: -32000, message: "Method not allowed." },
60
+ id: null,
61
+ }), {
62
+ status: 405,
63
+ headers: { "content-type": "application/json", allow: "POST" },
64
+ });
65
+ }
66
+ const server = args.buildServer();
67
+ const transport = new WebStandardStreamableHTTPServerTransport({
68
+ sessionIdGenerator: undefined,
69
+ enableJsonResponse: true,
70
+ });
71
+ try {
72
+ yield server.connect(transport);
73
+ // JSON-response mode materializes the full body before resolving,
74
+ // so closing in `finally` never truncates a streamed response.
75
+ return yield transport.handleRequest(args.request);
76
+ }
77
+ catch (error) {
78
+ logger(`[agent-serve] ${args.label} request failed: ${describeError(error)}`);
79
+ return new Response(JSON.stringify({
80
+ jsonrpc: "2.0",
81
+ error: { code: -32603, message: "Internal server error." },
82
+ id: null,
83
+ }), { status: 500, headers: { "content-type": "application/json" } });
84
+ }
85
+ finally {
86
+ void server.close().catch(() => { });
87
+ }
88
+ });
89
+ }
90
+ /** Tool names the MCP surface exposes for `project` (info projection). */
91
+ export function mcpEndpointToolNames(project) {
92
+ const names = ["ask", "check"];
93
+ if (project.agent.tools.some((tool) => tool.execution === "server")) {
94
+ names.push("call_tool");
95
+ }
96
+ return names;
97
+ }
98
+ export function createAgentMcpEndpoint(args) {
99
+ const { engine, logger } = args;
100
+ return {
101
+ handle(request, auth) {
102
+ return handleStatelessMcpRequest(Object.assign({ request, buildServer: () => buildAgentMcpServer(engine, auth), label: "mcp endpoint" }, (logger === undefined ? {} : { logger })));
103
+ },
104
+ };
105
+ }
106
+ // ============================================================================
107
+ // Server construction (per request; tools close over the caller principal)
108
+ // ============================================================================
109
+ function buildAgentMcpServer(engine, auth) {
110
+ const project = engine.project;
111
+ const agent = project.agent;
112
+ const server = new McpServer({ name: project.name, version: "0.1.0" }, { instructions: buildInstructions(project) });
113
+ server.registerTool("ask", {
114
+ description: buildAskDescription(project),
115
+ inputSchema: {
116
+ message: z.string().describe("The message or task for this agent."),
117
+ sessionId: z
118
+ .string()
119
+ .optional()
120
+ .describe("Existing session to follow up on (from a previous ask). Omit to start a fresh session with fresh context."),
121
+ waitSeconds: z
122
+ .number()
123
+ .min(0)
124
+ .max(MAX_WAIT_SECONDS)
125
+ .optional()
126
+ .describe(`How long to wait for the turn to finish before returning status "running" (default ${DEFAULT_WAIT_SECONDS}).`),
127
+ },
128
+ }, (_a) => __awaiter(this, [_a], void 0, function* ({ message, sessionId, waitSeconds }) {
129
+ try {
130
+ const targetSessionId = yield (sessionId === undefined
131
+ ? startSession(engine, auth, message)
132
+ : followUpSession(engine, auth, sessionId, message));
133
+ const payload = yield waitForReply(engine, targetSessionId, waitSeconds !== null && waitSeconds !== void 0 ? waitSeconds : DEFAULT_WAIT_SECONDS);
134
+ return toToolResult(payload);
135
+ }
136
+ catch (error) {
137
+ return errorResult(describeError(error));
138
+ }
139
+ }));
140
+ server.registerTool("check", {
141
+ description: 'Wait for (or poll) a session started with ask. Returns the final reply once the turn completes, or status "running" to keep waiting. Use waitSeconds: 0 for a non-blocking poll.',
142
+ inputSchema: {
143
+ sessionId: z.string().describe("Session id returned by ask."),
144
+ waitSeconds: z
145
+ .number()
146
+ .min(0)
147
+ .max(MAX_WAIT_SECONDS)
148
+ .optional()
149
+ .describe(`How long to wait for the running turn before returning status "running" (default ${DEFAULT_WAIT_SECONDS}).`),
150
+ },
151
+ }, (_a) => __awaiter(this, [_a], void 0, function* ({ sessionId, waitSeconds }) {
152
+ try {
153
+ yield requireOwnedSession(engine, auth, sessionId);
154
+ const payload = yield waitForReply(engine, sessionId, waitSeconds !== null && waitSeconds !== void 0 ? waitSeconds : DEFAULT_WAIT_SECONDS);
155
+ return toToolResult(payload);
156
+ }
157
+ catch (error) {
158
+ return errorResult(describeError(error));
159
+ }
160
+ }));
161
+ const serverTools = agent.tools.filter((tool) => tool.execution === "server");
162
+ if (serverTools.length > 0) {
163
+ server.registerTool("call_tool", {
164
+ description: `Call one of this agent's deterministic server tools directly (no model turn decides anything). Available tools: ${serverTools
165
+ .map((tool) => tool.name)
166
+ .join(", ")}.`,
167
+ inputSchema: {
168
+ toolName: z.string().describe("Name of the server tool to call."),
169
+ input: z
170
+ .record(z.unknown())
171
+ .optional()
172
+ .describe("Tool input, validated against the tool's schema."),
173
+ sessionId: z
174
+ .string()
175
+ .optional()
176
+ .describe("Run the tool inside an existing session (recorded on its event stream). Omit for an ephemeral scratch workspace."),
177
+ },
178
+ }, (_a) => __awaiter(this, [_a], void 0, function* ({ toolName, input, sessionId }) {
179
+ try {
180
+ if (sessionId !== undefined) {
181
+ yield requireOwnedSession(engine, auth, sessionId);
182
+ }
183
+ const outcome = yield engine.callTool(toolName, input !== null && input !== void 0 ? input : {}, Object.assign({ auth }, (sessionId === undefined ? {} : { sessionId })));
184
+ return Object.assign({ content: [
185
+ {
186
+ type: "text",
187
+ text: JSON.stringify(Object.assign({ toolName: outcome.toolName, isError: outcome.isError, result: outcome.result, durationMs: outcome.durationMs }, (outcome.errorMessage === undefined
188
+ ? {}
189
+ : { errorMessage: outcome.errorMessage }))),
190
+ },
191
+ ] }, (outcome.isError ? { isError: true } : {}));
192
+ }
193
+ catch (error) {
194
+ if (error instanceof UnknownToolError) {
195
+ return errorResult(`${error.message}. Available tools: ${error.availableToolNames.join(", ") || "(none)"}.`);
196
+ }
197
+ if (error instanceof ToolNotDirectlyCallableError ||
198
+ error instanceof ToolInputError ||
199
+ error instanceof SessionBusyError ||
200
+ error instanceof UnknownSessionError) {
201
+ return errorResult(error.message);
202
+ }
203
+ return errorResult(describeError(error));
204
+ }
205
+ }));
206
+ }
207
+ return server;
208
+ }
209
+ function buildInstructions(project) {
210
+ const agent = project.agent;
211
+ const parts = [
212
+ `This MCP server fronts the Cursor agent "${project.name}".`,
213
+ ...(agent.description === undefined ? [] : [agent.description]),
214
+ 'Delegate a task with the ask tool: each call without a sessionId starts a fresh session (fresh context); pass the returned sessionId to continue the same conversation. When ask returns status "running", call check with that sessionId to keep waiting for the reply.',
215
+ ];
216
+ return parts.join(" ");
217
+ }
218
+ function buildAskDescription(project) {
219
+ const description = project.agent.description;
220
+ const purpose = description === undefined || description.trim() === ""
221
+ ? `the "${project.name}" agent`
222
+ : `the "${project.name}" agent — ${description.trim()}`;
223
+ return `Send a message to ${purpose}. Runs a full model turn in that agent's own context and returns its reply. Omit sessionId to start a fresh session; pass it to follow up. Long turns return status "running" — call check with the sessionId to keep waiting.`;
224
+ }
225
+ // ============================================================================
226
+ // Session helpers
227
+ // ============================================================================
228
+ function startSession(engine, auth, message) {
229
+ return __awaiter(this, void 0, void 0, function* () {
230
+ const session = yield engine.send(MCP_CHANNEL_ID, message, { auth });
231
+ return session.id;
232
+ });
233
+ }
234
+ function followUpSession(engine, auth, sessionId, message) {
235
+ return __awaiter(this, void 0, void 0, function* () {
236
+ const record = yield requireOwnedSession(engine, auth, sessionId);
237
+ if (record.mode === "task") {
238
+ throw new Error(`Session ${sessionId} is a fire-and-forget task session; it does not accept follow-ups.`);
239
+ }
240
+ if (record.continuationKey === null) {
241
+ throw new Error(`Session ${sessionId} is not addressable for follow-ups (no active continuation).`);
242
+ }
243
+ // Send as the session owner after the ownership gate above, mirroring the
244
+ // HTTP follow-up route (machine callers address sessions by id; the HTTP
245
+ // continuation token is not rotated).
246
+ yield engine.send(record.channelId, message, {
247
+ auth: record.auth,
248
+ continuationToken: record.continuationKey,
249
+ });
250
+ return sessionId;
251
+ });
252
+ }
253
+ function requireOwnedSession(engine, auth, sessionId) {
254
+ return __awaiter(this, void 0, void 0, function* () {
255
+ const record = yield engine.sessions.get(sessionId);
256
+ if (record === undefined) {
257
+ throw new UnknownSessionError(sessionId);
258
+ }
259
+ if (!samePrincipal(record.auth, auth)) {
260
+ throw new Error(`Session ${sessionId} belongs to a different principal; use the credentials that created it.`);
261
+ }
262
+ return record;
263
+ });
264
+ }
265
+ function waitForReply(engine, sessionId, waitSeconds) {
266
+ return __awaiter(this, void 0, void 0, function* () {
267
+ const waitMs = Math.max(0, Math.min(waitSeconds, MAX_WAIT_SECONDS)) * 1000;
268
+ const outcome = yield raceTimeout(engine.waitForCompletion(sessionId), waitMs);
269
+ if (outcome === undefined) {
270
+ return {
271
+ status: "running",
272
+ sessionId,
273
+ note: `The turn is still running. Call check with { "sessionId": "${sessionId}" } to keep waiting.`,
274
+ };
275
+ }
276
+ return toReplyPayload(engine, sessionId, outcome);
277
+ });
278
+ }
279
+ function toReplyPayload(engine, sessionId, outcome) {
280
+ return __awaiter(this, void 0, void 0, function* () {
281
+ var _a, _b;
282
+ if (outcome.status === "finished") {
283
+ let reply = outcome.result;
284
+ if (reply === undefined || reply === "") {
285
+ // The engine's in-memory outcome is gone after a host restart; fall
286
+ // back to the durable event log for the last completed turn.
287
+ reply = yield latestReplyFromEvents(engine, sessionId);
288
+ }
289
+ return Object.assign({ status: "completed", sessionId }, (reply === undefined ? {} : { reply }));
290
+ }
291
+ if (outcome.status === "cancelled") {
292
+ return {
293
+ status: "cancelled",
294
+ sessionId,
295
+ errorMessage: (_a = outcome.errorMessage) !== null && _a !== void 0 ? _a : "The turn was cancelled.",
296
+ };
297
+ }
298
+ return {
299
+ status: "error",
300
+ sessionId,
301
+ errorMessage: (_b = outcome.errorMessage) !== null && _b !== void 0 ? _b : "The turn failed.",
302
+ };
303
+ });
304
+ }
305
+ function latestReplyFromEvents(engine, sessionId) {
306
+ return __awaiter(this, void 0, void 0, function* () {
307
+ let events;
308
+ try {
309
+ events = yield engine.listEvents(sessionId);
310
+ }
311
+ catch (_a) {
312
+ return undefined;
313
+ }
314
+ for (let i = events.length - 1; i >= 0; i--) {
315
+ const event = events[i];
316
+ if (event === undefined) {
317
+ continue;
318
+ }
319
+ if (event.type === "turn.completed" && event.data.result !== undefined) {
320
+ return event.data.result;
321
+ }
322
+ if (event.type === "message.completed" && event.data.text !== "") {
323
+ return event.data.text;
324
+ }
325
+ }
326
+ return undefined;
327
+ });
328
+ }
329
+ function toToolResult(payload) {
330
+ return Object.assign({ content: [{ type: "text", text: JSON.stringify(payload) }] }, (payload.status === "error" ? { isError: true } : {}));
331
+ }
332
+ function errorResult(message) {
333
+ return {
334
+ content: [{ type: "text", text: message }],
335
+ isError: true,
336
+ };
337
+ }
338
+ /** Resolve to the promise value, or undefined once `ms` elapses first. */
339
+ function raceTimeout(promise, ms) {
340
+ return new Promise((resolve, reject) => {
341
+ const timer = setTimeout(() => {
342
+ resolve(undefined);
343
+ }, ms);
344
+ promise.then((value) => {
345
+ clearTimeout(timer);
346
+ resolve(value);
347
+ }, (error) => {
348
+ clearTimeout(timer);
349
+ reject(error instanceof Error ? error : new Error(String(error)));
350
+ });
351
+ });
352
+ }
353
+ function describeError(error) {
354
+ return error instanceof Error ? error.message : String(error);
355
+ }
@@ -0,0 +1,28 @@
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
+ import type { DiscoveredConnection, HostMcpCallResult, HostMcpRegistry, HostMcpToolInfo } from "../types.js";
12
+ export declare class McpHost implements HostMcpRegistry {
13
+ private readonly byName;
14
+ private readonly clients;
15
+ constructor(connections: DiscoveredConnection[]);
16
+ /**
17
+ * Register a connection after construction (serve-time resolved peers).
18
+ * Clients open lazily on first use, so adding before first call is safe.
19
+ */
20
+ addConnection(connection: DiscoveredConnection): void;
21
+ names(): string[];
22
+ listTools(connectionName: string): Promise<HostMcpToolInfo[]>;
23
+ callTool(connectionName: string, toolName: string, args?: Record<string, unknown>): Promise<HostMcpCallResult>;
24
+ close(): Promise<void>;
25
+ private getClient;
26
+ private connect;
27
+ }
28
+ //# sourceMappingURL=mcp-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-host.d.ts","sourceRoot":"","sources":["../../src/internal/mcp-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEhB,MAAM,aAAa,CAAC;AAOrB,qBAAa,OAAQ,YAAW,eAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IAExE,YAAY,WAAW,EAAE,oBAAoB,EAAE,EAI9C;IAED;;;OAGG;IACH,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI,CAEpD;IAED,KAAK,IAAI,MAAM,EAAE,CAEhB;IAEK,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAYlE;IAEK,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,iBAAiB,CAAC,CAO5B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;IAED,OAAO,CAAC,SAAS;YAYH,OAAO;CAUtB"}
@@ -0,0 +1,162 @@
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
12
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
13
+ return new (P || (P = Promise))(function (resolve, reject) {
14
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
16
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
17
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
18
+ });
19
+ };
20
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
21
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
22
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
23
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
24
+ export class McpHost {
25
+ constructor(connections) {
26
+ this.byName = new Map();
27
+ this.clients = new Map();
28
+ for (const connection of connections) {
29
+ this.byName.set(connection.name, connection);
30
+ }
31
+ }
32
+ /**
33
+ * Register a connection after construction (serve-time resolved peers).
34
+ * Clients open lazily on first use, so adding before first call is safe.
35
+ */
36
+ addConnection(connection) {
37
+ this.byName.set(connection.name, connection);
38
+ }
39
+ names() {
40
+ return [...this.byName.keys()].sort();
41
+ }
42
+ listTools(connectionName) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ const { client } = yield this.getClient(connectionName);
45
+ const listed = yield client.listTools();
46
+ return listed.tools.map((tool) => (Object.assign(Object.assign({ name: tool.name }, (tool.description === undefined
47
+ ? {}
48
+ : { description: tool.description })), (tool.inputSchema === undefined
49
+ ? {}
50
+ : { inputSchema: tool.inputSchema }))));
51
+ });
52
+ }
53
+ callTool(connectionName_1, toolName_1) {
54
+ return __awaiter(this, arguments, void 0, function* (connectionName, toolName, args = {}) {
55
+ const { client } = yield this.getClient(connectionName);
56
+ const result = yield client.callTool({
57
+ name: toolName,
58
+ arguments: args,
59
+ });
60
+ return normalizeCallResult(result);
61
+ });
62
+ }
63
+ close() {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const opened = yield Promise.allSettled([...this.clients.values()]);
66
+ this.clients.clear();
67
+ yield Promise.allSettled(opened.map((settled) => __awaiter(this, void 0, void 0, function* () {
68
+ if (settled.status === "fulfilled") {
69
+ yield settled.value.close();
70
+ }
71
+ })));
72
+ });
73
+ }
74
+ getClient(name) {
75
+ let pending = this.clients.get(name);
76
+ if (pending === undefined) {
77
+ pending = this.connect(name).catch((error) => {
78
+ this.clients.delete(name);
79
+ throw error;
80
+ });
81
+ this.clients.set(name, pending);
82
+ }
83
+ return pending;
84
+ }
85
+ connect(name) {
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ const connection = this.byName.get(name);
88
+ if (connection === undefined) {
89
+ const known = this.names().join(", ") || "(none)";
90
+ throw new Error(`Unknown MCP connection "${name}". Authored MCP connections: ${known}.`);
91
+ }
92
+ return openConnection(connection);
93
+ });
94
+ }
95
+ }
96
+ function openConnection(connection) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ const client = new Client({
99
+ name: "agent-serve",
100
+ version: "0.1.0",
101
+ });
102
+ const transport = createTransport(connection);
103
+ yield client.connect(transport);
104
+ return {
105
+ client,
106
+ close: () => __awaiter(this, void 0, void 0, function* () {
107
+ var _a;
108
+ try {
109
+ yield client.close();
110
+ }
111
+ catch (_b) {
112
+ // Best-effort teardown.
113
+ }
114
+ try {
115
+ yield (_a = transport.close) === null || _a === void 0 ? void 0 : _a.call(transport);
116
+ }
117
+ catch (_c) {
118
+ // Best-effort teardown.
119
+ }
120
+ }),
121
+ };
122
+ });
123
+ }
124
+ function createTransport(connection) {
125
+ var _a;
126
+ const transport = connection.transport;
127
+ if ("agent" in transport) {
128
+ // Peers are resolved to concrete URLs by the serve host before any call
129
+ // (SessionEngine.setResolvedConnections); reaching here means the
130
+ // connection is being used outside a running server.
131
+ throw new Error(`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.`);
132
+ }
133
+ if ("cursorAccount" in transport) {
134
+ // Same contract as peers: the serve host resolves the account bridge URL
135
+ // before any call (SessionEngine.setResolvedConnections).
136
+ throw new Error(`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.`);
137
+ }
138
+ if ("command" in transport) {
139
+ return new StdioClientTransport(Object.assign(Object.assign(Object.assign({ command: transport.command }, (transport.args === undefined ? {} : { args: transport.args })), { env: Object.assign(Object.assign({}, Object.fromEntries(Object.entries(process.env).filter((entry) => entry[1] !== undefined))), ((_a = transport.env) !== null && _a !== void 0 ? _a : {})) }), (transport.cwd === undefined ? {} : { cwd: transport.cwd })));
140
+ }
141
+ const url = new URL(transport.url);
142
+ const requestInit = transport.headers === undefined
143
+ ? undefined
144
+ : { headers: transport.headers };
145
+ if (transport.type === "sse") {
146
+ return new SSEClientTransport(url, Object.assign({}, (requestInit === undefined ? {} : { requestInit })));
147
+ }
148
+ return new StreamableHTTPClientTransport(url, Object.assign({}, (requestInit === undefined ? {} : { requestInit })));
149
+ }
150
+ function normalizeCallResult(result) {
151
+ if (typeof result !== "object" || result === null) {
152
+ return {
153
+ content: [{ type: "text", text: String(result) }],
154
+ };
155
+ }
156
+ const record = result;
157
+ return Object.assign(Object.assign({ content: Array.isArray(record.content)
158
+ ? record.content
159
+ : [{ type: "text", text: JSON.stringify(result) }] }, (record.isError === undefined ? {} : { isError: record.isError })), (record.structuredContent === undefined
160
+ ? {}
161
+ : { structuredContent: record.structuredContent }));
162
+ }
@@ -0,0 +1,5 @@
1
+ /** True for IPv4/IPv6 loopback addresses (including IPv4-mapped IPv6). */
2
+ export declare function isLoopbackAddress(address: string): boolean;
3
+ /** True when a parsed URL hostname refers to loopback (localhost / 127.x / ::1). */
4
+ export declare function isLoopbackHostname(hostname: string): boolean;
5
+ //# sourceMappingURL=net.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../src/internal/net.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ1D;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAkB5D"}
@@ -0,0 +1,30 @@
1
+ /** True for IPv4/IPv6 loopback addresses (including IPv4-mapped IPv6). */
2
+ export function isLoopbackAddress(address) {
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
+ /** True when a parsed URL hostname refers to loopback (localhost / 127.x / ::1). */
12
+ export function isLoopbackHostname(hostname) {
13
+ const normalized = hostname.toLowerCase();
14
+ if (normalized === "localhost" || normalized === "::1") {
15
+ return true;
16
+ }
17
+ if (normalized.startsWith("[") && normalized.endsWith("]")) {
18
+ const inner = normalized.slice(1, -1);
19
+ return inner === "::1";
20
+ }
21
+ const ipv4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(normalized);
22
+ if (ipv4 === null) {
23
+ return false;
24
+ }
25
+ const octets = ipv4.slice(1, 5).map((part) => Number(part));
26
+ if (octets.some((octet) => octet > 255)) {
27
+ return false;
28
+ }
29
+ return octets[0] === 127;
30
+ }
@@ -0,0 +1,44 @@
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
+ import { type AgentProject } from "../types.js";
14
+ import type { EngineResolvedConnection } from "./session-engine.js";
15
+ /** A validated peer reference: MCP connection name → target mount slug. */
16
+ export interface PeerConnectionRef {
17
+ /** Connection (MCP server) name — the filename under `agent/mcp-connections/`. */
18
+ name: string;
19
+ /** Slug of the peer agent mount this connection targets. */
20
+ targetSlug: string;
21
+ }
22
+ /**
23
+ * Validate every peer MCP connection across `mounts` and return them grouped by
24
+ * the referencing mount's slug. Throws on references to unknown slugs and on
25
+ * self-references (an agent asking itself recurses forever).
26
+ */
27
+ export declare function collectPeerConnections(mounts: Array<{
28
+ slug: string;
29
+ project: AgentProject;
30
+ }>): Map<string, PeerConnectionRef[]>;
31
+ /**
32
+ * Resolve validated peer refs to concrete MCP URLs once the server is
33
+ * listening. `serverUrl` is the loopback base (`http://127.0.0.1:<port>`);
34
+ * `publicUrl` (when configured) is the externally reachable base used for
35
+ * cloud-runtime turns. When the host requires a bearer token, it is attached
36
+ * so peer calls pass the target agent's auth chain.
37
+ */
38
+ export declare function resolvePeerConnections(args: {
39
+ refs: PeerConnectionRef[];
40
+ serverUrl: string;
41
+ publicUrl?: string;
42
+ authToken?: string;
43
+ }): EngineResolvedConnection[];
44
+ //# sourceMappingURL=peer-connections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-connections.d.ts","sourceRoot":"","sources":["../../src/internal/peer-connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,YAAY,EAA6B,MAAM,aAAa,CAAC;AAE3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,GACrD,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CA+BlC;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,wBAAwB,EAAE,CAkB7B"}