@cursor/july 0.1.30 → 0.1.32

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 (403) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +10 -5
  3. package/dist/bin/agent-serve.js +4 -4
  4. package/dist/channels/github/index.d.ts +1 -1
  5. package/dist/channels/github/index.js +1 -1
  6. package/dist/channels/slack/bot-mentions.d.ts +1 -1
  7. package/dist/channels/slack/bot-mentions.d.ts.map +1 -1
  8. package/dist/channels/slack/bot-mentions.js +1 -1
  9. package/dist/channels/slack/eval-directive.js +1 -1
  10. package/dist/channels/slack/external-policy.d.ts +1 -1
  11. package/dist/channels/slack/external-policy.js +1 -1
  12. package/dist/channels/slack/log.d.ts +1 -1
  13. package/dist/channels/slack/log.js +1 -1
  14. package/dist/channels/slack/post-update-delivery.d.ts +85 -0
  15. package/dist/channels/slack/post-update-delivery.d.ts.map +1 -0
  16. package/dist/channels/slack/setup.js +1 -1
  17. package/dist/channels/slack/socket-mode.js +1 -1
  18. package/dist/docs/404.html +3 -3
  19. package/dist/docs/ab.html +11 -11
  20. package/dist/docs/assets/{ab.md.BMCZ6Hd7.js → ab.md.DAQoJ-up.js} +6 -6
  21. package/dist/docs/assets/{ab.md.BMCZ6Hd7.lean.js → ab.md.DAQoJ-up.lean.js} +1 -1
  22. package/dist/docs/assets/{app.Cm4lsMc4.js → app.C2aVczmo.js} +1 -1
  23. package/dist/docs/assets/building-with-agents.md.CnHqvYDd.js +13 -0
  24. package/dist/docs/assets/{building-with-agents.md.CJCtZCyi.lean.js → building-with-agents.md.CnHqvYDd.lean.js} +1 -1
  25. package/dist/docs/assets/chunks/@localSearchIndexroot.xgMnlUSO.js +1 -0
  26. package/dist/docs/assets/chunks/{VPLocalSearchBox.CYUFXspH.js → VPLocalSearchBox.DLEzetbD.js} +1 -1
  27. package/dist/docs/assets/chunks/{theme.CTjkX9vc.js → theme.BkOH1oMp.js} +2 -2
  28. package/dist/docs/assets/concepts.md.DFaQEFkA.js +4 -0
  29. package/dist/docs/assets/concepts.md.DFaQEFkA.lean.js +1 -0
  30. package/dist/docs/assets/deployment.md.9MYBuKM1.js +55 -0
  31. package/dist/docs/assets/deployment.md.9MYBuKM1.lean.js +1 -0
  32. package/dist/docs/assets/{evals.md.DYOjkRCX.js → evals.md.BIUoVZ6X.js} +13 -13
  33. package/dist/docs/assets/evals.md.BIUoVZ6X.lean.js +1 -0
  34. package/dist/docs/assets/{example-agents_approval-buddy.md.DFGBYLcc.js → example-agents_approval-buddy.md.BhEfleVx.js} +4 -4
  35. package/dist/docs/assets/{example-agents_approval-buddy.md.DFGBYLcc.lean.js → example-agents_approval-buddy.md.BhEfleVx.lean.js} +1 -1
  36. package/dist/docs/assets/example-agents_benny.md.2Et1qa8f.js +7 -0
  37. package/dist/docs/assets/{example-agents_bugbot.md.DelIdhxB.js → example-agents_bugbot.md.ByUexi5i.js} +5 -5
  38. package/dist/docs/assets/{example-agents_codebase-wiki.md.DC6sgwn0.js → example-agents_codebase-wiki.md.B4y-7ZVW.js} +6 -6
  39. package/dist/docs/assets/{example-agents_codebase-wiki.md.DC6sgwn0.lean.js → example-agents_codebase-wiki.md.B4y-7ZVW.lean.js} +1 -1
  40. package/dist/docs/assets/{example-agents_codeowners-review.md.Ku_tG2RY.js → example-agents_codeowners-review.md.D6ay4nvf.js} +6 -6
  41. package/dist/docs/assets/{example-agents_codeowners-review.md.Ku_tG2RY.lean.js → example-agents_codeowners-review.md.D6ay4nvf.lean.js} +1 -1
  42. package/dist/docs/assets/{example-agents_concierge.md.4rQTSMXt.js → example-agents_concierge.md.lL8rhYlj.js} +7 -7
  43. package/dist/docs/assets/{example-agents_fsd.md.CzgUrDfi.js → example-agents_fsd.md.DfNKQTHz.js} +5 -5
  44. package/dist/docs/assets/example-agents_index.md.DgGBwckv.js +2 -0
  45. package/dist/docs/assets/example-agents_index.md.DgGBwckv.lean.js +1 -0
  46. package/dist/docs/assets/{example-agents_knowledge-base.md.BPJiVueF.js → example-agents_knowledge-base.md.CzyZ2DCr.js} +5 -5
  47. package/dist/docs/assets/{example-agents_knowledge-base.md.BPJiVueF.lean.js → example-agents_knowledge-base.md.CzyZ2DCr.lean.js} +1 -1
  48. package/dist/docs/assets/example-agents_oncall.md.wFFXXEyW.js +10 -0
  49. package/dist/docs/assets/{example-agents_security-reviewer.md.Dhj_m7_B.js → example-agents_security-reviewer.md.Dkf1gyo6.js} +8 -8
  50. package/dist/docs/assets/example-agents_slack-agent.md.DvgvT4nn.js +5 -0
  51. package/dist/docs/assets/example-agents_weather-agent.md.Dmrcphhl.js +24 -0
  52. package/dist/docs/assets/example-agents_weather-agent.md.Dmrcphhl.lean.js +1 -0
  53. package/dist/docs/assets/{guides_agent-to-agent.md.Bpzgq2Pq.js → guides_agent-to-agent.md.Bmbxy-FA.js} +4 -4
  54. package/dist/docs/assets/guides_cloud-runtime.md.BZ2GA7Es.js +9 -0
  55. package/dist/docs/assets/{guides_github.md.DOOCpqsW.js → guides_github.md.R2QlpR75.js} +5 -5
  56. package/dist/docs/assets/{guides_human-in-the-loop.md.DlUqsp1S.js → guides_human-in-the-loop.md.BWvT7UqY.js} +1 -1
  57. package/dist/docs/assets/{guides_mcp-oauth.md.Dd8EgSem.js → guides_mcp-oauth.md.C7G7IykG.js} +5 -5
  58. package/dist/docs/assets/guides_mcp-oauth.md.C7G7IykG.lean.js +1 -0
  59. package/dist/docs/assets/guides_slack.md.zriQpU_9.js +47 -0
  60. package/dist/docs/assets/guides_slack.md.zriQpU_9.lean.js +1 -0
  61. package/dist/docs/assets/{guides_webhooks.md.wSOYas3X.js → guides_webhooks.md.DiAwSR42.js} +1 -1
  62. package/dist/docs/assets/{hillclimbing.md.DHNast08.js → hillclimbing.md.D9Y1_bYh.js} +1 -1
  63. package/dist/docs/assets/index.md.CZqbBJPB.js +20 -0
  64. package/dist/docs/assets/index.md.CZqbBJPB.lean.js +1 -0
  65. package/dist/docs/assets/{quickstart.md.BU6Iwi_9.js → quickstart.md.TnEXYgYW.js} +12 -12
  66. package/dist/docs/assets/{reference_agent-config.md.DrW2JUM8.js → reference_agent-config.md.kuN6-OxK.js} +1 -1
  67. package/dist/docs/assets/reference_cli.md.sD-IUWjg.js +73 -0
  68. package/dist/docs/assets/{reference_cli.md.ccoKOoXt.lean.js → reference_cli.md.sD-IUWjg.lean.js} +1 -1
  69. package/dist/docs/assets/{reference_connections.md.B9Q3TOve.js → reference_connections.md.DGqAsFXb.js} +3 -3
  70. package/dist/docs/assets/reference_http-api.md.CfVM_ICa.js +11 -0
  71. package/dist/docs/assets/{reference_project-layout.md.Bd_CKtNS.js → reference_project-layout.md.D8E6ZmHJ.js} +4 -4
  72. package/dist/docs/assets/{reference_project-layout.md.Bd_CKtNS.lean.js → reference_project-layout.md.D8E6ZmHJ.lean.js} +1 -1
  73. package/dist/docs/assets/{reference_schedules.md.w_F2mXB6.js → reference_schedules.md.gmfYzf_I.js} +1 -1
  74. package/dist/docs/assets/{reference_sessions.md.DLd6mvbv.js → reference_sessions.md.C_ouF_uf.js} +3 -3
  75. package/dist/docs/assets/{reference_tools.md.BRSDnTbN.js → reference_tools.md.BswAQM41.js} +3 -3
  76. package/dist/docs/assets/{scaffolding-agents.md.C3pTrmoE.js → scaffolding-agents.md.Bsr9Pwzu.js} +1 -1
  77. package/dist/docs/assets/{scaffolding-agents.md.C3pTrmoE.lean.js → scaffolding-agents.md.Bsr9Pwzu.lean.js} +1 -1
  78. package/dist/docs/assets/{storage.md.DRTdnFvd.js → storage.md.xZoiGM58.js} +3 -3
  79. package/dist/docs/assets/storage.md.xZoiGM58.lean.js +1 -0
  80. package/dist/docs/assets/troubleshooting.md.B5RVX_tL.js +1 -0
  81. package/dist/docs/assets/{troubleshooting.md.CmQkmnzC.lean.js → troubleshooting.md.B5RVX_tL.lean.js} +1 -1
  82. package/dist/docs/building-with-agents.html +12 -12
  83. package/dist/docs/concepts.html +6 -6
  84. package/dist/docs/deployment.html +32 -32
  85. package/dist/docs/evals.html +19 -19
  86. package/dist/docs/example-agents/approval-buddy.html +9 -9
  87. package/dist/docs/example-agents/benny.html +11 -11
  88. package/dist/docs/example-agents/bugbot.html +10 -10
  89. package/dist/docs/example-agents/codebase-wiki.html +11 -11
  90. package/dist/docs/example-agents/codeowners-review.html +11 -11
  91. package/dist/docs/example-agents/concierge.html +12 -12
  92. package/dist/docs/example-agents/fsd.html +10 -10
  93. package/dist/docs/example-agents/index.html +7 -7
  94. package/dist/docs/example-agents/knowledge-base.html +10 -10
  95. package/dist/docs/example-agents/oncall.html +10 -10
  96. package/dist/docs/example-agents/security-reviewer.html +13 -13
  97. package/dist/docs/example-agents/slack-agent.html +10 -10
  98. package/dist/docs/example-agents/weather-agent.html +16 -16
  99. package/dist/docs/guides/agent-to-agent.html +9 -9
  100. package/dist/docs/guides/cloud-runtime.html +7 -7
  101. package/dist/docs/guides/github.html +10 -10
  102. package/dist/docs/guides/human-in-the-loop.html +7 -7
  103. package/dist/docs/guides/mcp-oauth.html +11 -11
  104. package/dist/docs/guides/slack.html +22 -17
  105. package/dist/docs/guides/webhooks.html +7 -7
  106. package/dist/docs/hashmap.json +1 -1
  107. package/dist/docs/hillclimbing.html +7 -7
  108. package/dist/docs/index.html +9 -9
  109. package/dist/docs/quickstart.html +17 -17
  110. package/dist/docs/reference/agent-config.html +7 -7
  111. package/dist/docs/reference/channels.html +5 -5
  112. package/dist/docs/reference/cli.html +56 -48
  113. package/dist/docs/reference/connections.html +9 -9
  114. package/dist/docs/reference/hooks.html +5 -5
  115. package/dist/docs/reference/http-api.html +7 -7
  116. package/dist/docs/reference/instructions.html +5 -5
  117. package/dist/docs/reference/playground.html +5 -5
  118. package/dist/docs/reference/project-layout.html +9 -9
  119. package/dist/docs/reference/prompt.html +5 -5
  120. package/dist/docs/reference/schedules.html +7 -7
  121. package/dist/docs/reference/sessions.html +8 -8
  122. package/dist/docs/reference/skills.html +5 -5
  123. package/dist/docs/reference/subagents.html +5 -5
  124. package/dist/docs/reference/tools.html +9 -9
  125. package/dist/docs/scaffolding-agents.html +6 -6
  126. package/dist/docs/storage.html +9 -9
  127. package/dist/docs/troubleshooting.html +6 -6
  128. package/dist/evals/reporters.d.ts +1 -1
  129. package/dist/evals/reporters.js +1 -1
  130. package/dist/evals.d.ts +2 -2
  131. package/dist/files-backends/agent-store-presigned-url.d.ts +3 -0
  132. package/dist/files-backends/agent-store-presigned-url.d.ts.map +1 -0
  133. package/dist/files-backends/agent-store-presigned-url.js +1023 -0
  134. package/dist/files-backends/cursor-hosted.d.ts +87 -0
  135. package/dist/files-backends/cursor-hosted.d.ts.map +1 -0
  136. package/dist/files-backends/cursor-hosted.js +563 -0
  137. package/dist/files-backends/local-fs.d.ts +33 -0
  138. package/dist/files-backends/local-fs.d.ts.map +1 -0
  139. package/dist/files-backends/local-fs.js +199 -0
  140. package/dist/files.d.ts +139 -0
  141. package/dist/files.d.ts.map +1 -0
  142. package/dist/files.js +89 -0
  143. package/dist/internal/ab-collector.js +2 -2
  144. package/dist/internal/ab-fold.js +1 -1
  145. package/dist/internal/cli-ax.d.ts +2 -2
  146. package/dist/internal/cli-ax.js +2 -2
  147. package/dist/internal/cli-deploy.d.ts +1 -1
  148. package/dist/internal/cli-deploy.d.ts.map +1 -1
  149. package/dist/internal/cli-deploy.js +7 -2
  150. package/dist/internal/cli-docs.d.ts +1 -1
  151. package/dist/internal/cli-docs.js +1 -1
  152. package/dist/internal/cli-github.js +13 -13
  153. package/dist/internal/cli-mcp-oauth.d.ts +1 -1
  154. package/dist/internal/cli-mcp-oauth.js +2 -2
  155. package/dist/internal/cli-mcp.d.ts +3 -3
  156. package/dist/internal/cli-mcp.js +4 -4
  157. package/dist/internal/cli-skills.js +1 -1
  158. package/dist/internal/cloud-turn-cost.d.ts +9 -1
  159. package/dist/internal/cloud-turn-cost.d.ts.map +1 -1
  160. package/dist/internal/cloud-turn-cost.js +14 -4
  161. package/dist/internal/cursor/account-mcp.js +5 -5
  162. package/dist/internal/cursor/backend-client.js +1 -1
  163. package/dist/internal/cursor/github-credentials.js +3 -3
  164. package/dist/internal/cursor-account-mcp-auth.d.ts +1 -1
  165. package/dist/internal/cursor-account-mcp-auth.js +1 -1
  166. package/dist/internal/cursor-event-relay.js +1 -1
  167. package/dist/internal/cursor-relay-core.d.ts +1 -1
  168. package/dist/internal/cursor-relay-core.d.ts.map +1 -1
  169. package/dist/internal/cursor-slack-relay.js +1 -1
  170. package/dist/internal/deploy-client.d.ts +6 -1
  171. package/dist/internal/deploy-client.d.ts.map +1 -1
  172. package/dist/internal/deploy-client.js +3 -2
  173. package/dist/internal/deploy-source.d.ts +2 -2
  174. package/dist/internal/deploy-source.js +2 -2
  175. package/dist/internal/discovery.js +2 -2
  176. package/dist/internal/distribution.d.ts +5 -5
  177. package/dist/internal/distribution.d.ts.map +1 -1
  178. package/dist/internal/distribution.js +6 -6
  179. package/dist/internal/docs-site.js +5 -5
  180. package/dist/internal/eval-run-store.js +8 -8
  181. package/dist/internal/evals-client.d.ts +1 -1
  182. package/dist/internal/evals-client.js +1 -1
  183. package/dist/internal/github-fanout.js +2 -2
  184. package/dist/internal/host-files.d.ts +29 -0
  185. package/dist/internal/host-files.d.ts.map +1 -0
  186. package/dist/internal/host-files.js +283 -0
  187. package/dist/internal/host-platforms.js +5 -5
  188. package/dist/internal/hosting.d.ts +1 -1
  189. package/dist/internal/hosting.js +1 -1
  190. package/dist/internal/http-channel.d.ts.map +1 -1
  191. package/dist/internal/http-channel.js +26 -0
  192. package/dist/internal/install-cursor-skills.d.ts +1 -1
  193. package/dist/internal/install-cursor-skills.d.ts.map +1 -1
  194. package/dist/internal/install-cursor-skills.js +33 -4
  195. package/dist/internal/json-dir-store.d.ts +32 -0
  196. package/dist/internal/json-dir-store.d.ts.map +1 -0
  197. package/dist/internal/local-control-plane.js +2 -2
  198. package/dist/internal/logs-client.d.ts +2 -2
  199. package/dist/internal/logs-client.js +2 -2
  200. package/dist/internal/mcp-endpoint.js +1 -1
  201. package/dist/internal/mcp-oauth.js +2 -2
  202. package/dist/internal/persistence-coordinator.d.ts +127 -0
  203. package/dist/internal/persistence-coordinator.d.ts.map +1 -0
  204. package/dist/internal/platform-schedule-sync.js +2 -2
  205. package/dist/internal/playground/toolchain.js +6 -6
  206. package/dist/internal/reminder-runner.js +13 -13
  207. package/dist/internal/resolved-connections.js +6 -6
  208. package/dist/internal/schedule-runner.js +1 -1
  209. package/dist/internal/sdk-runner.js +5 -5
  210. package/dist/internal/server.js +16 -16
  211. package/dist/internal/session-cost.d.ts +3 -2
  212. package/dist/internal/session-cost.d.ts.map +1 -1
  213. package/dist/internal/session-cost.js +7 -6
  214. package/dist/internal/session-engine.d.ts +31 -1
  215. package/dist/internal/session-engine.d.ts.map +1 -1
  216. package/dist/internal/session-engine.js +119 -31
  217. package/dist/internal/slack-provision-client.js +1 -1
  218. package/dist/internal/storage-coordinator.js +7 -7
  219. package/dist/internal/trajectory.js +2 -2
  220. package/dist/internal/turn-cost.d.ts +27 -0
  221. package/dist/internal/turn-cost.d.ts.map +1 -0
  222. package/dist/internal/turn-cost.js +83 -0
  223. package/dist/internal/update-check.d.ts +3 -3
  224. package/dist/internal/update-check.d.ts.map +1 -1
  225. package/dist/internal/update-check.js +5 -5
  226. package/dist/memory.d.ts +1 -1
  227. package/dist/memory.js +1 -1
  228. package/dist/multi-tenant.d.ts +80 -0
  229. package/dist/multi-tenant.d.ts.map +1 -0
  230. package/dist/multi-tenant.js +69 -0
  231. package/dist/persistence.d.ts +184 -0
  232. package/dist/persistence.d.ts.map +1 -0
  233. package/dist/playground/assets/index-50PKeJlG.css +1 -0
  234. package/dist/playground/assets/index-C0f2Wl1q.js +85 -0
  235. package/dist/playground/index.html +2 -2
  236. package/dist/storage.d.ts +1 -1
  237. package/dist/storage.js +1 -1
  238. package/dist/types.d.ts +120 -16
  239. package/dist/types.d.ts.map +1 -1
  240. package/docs/README.md +23 -23
  241. package/docs/ab.md +12 -12
  242. package/docs/building-with-agents.md +9 -9
  243. package/docs/concepts.md +11 -11
  244. package/docs/deployment.md +55 -43
  245. package/docs/evals.md +20 -20
  246. package/docs/example-agents/approval-buddy.md +9 -9
  247. package/docs/example-agents/benny.md +13 -13
  248. package/docs/example-agents/bugbot.md +6 -6
  249. package/docs/example-agents/codebase-wiki.md +8 -8
  250. package/docs/example-agents/codeowners-review.md +8 -8
  251. package/docs/example-agents/concierge.md +10 -10
  252. package/docs/example-agents/fsd.md +7 -7
  253. package/docs/example-agents/index.md +8 -8
  254. package/docs/example-agents/knowledge-base.md +9 -9
  255. package/docs/example-agents/oncall.md +7 -7
  256. package/docs/example-agents/security-reviewer.md +12 -12
  257. package/docs/example-agents/slack-agent.md +10 -10
  258. package/docs/example-agents/weather-agent.md +30 -26
  259. package/docs/guides/agent-to-agent.md +4 -4
  260. package/docs/guides/cloud-runtime.md +3 -3
  261. package/docs/guides/github.md +6 -6
  262. package/docs/guides/human-in-the-loop.md +1 -1
  263. package/docs/guides/mcp-oauth.md +9 -9
  264. package/docs/guides/slack.md +94 -21
  265. package/docs/guides/webhooks.md +1 -1
  266. package/docs/hillclimbing.md +3 -3
  267. package/docs/quickstart.md +18 -18
  268. package/docs/reference/agent-config.md +1 -1
  269. package/docs/reference/cli.md +110 -79
  270. package/docs/reference/connections.md +3 -3
  271. package/docs/reference/http-api.md +2 -2
  272. package/docs/reference/project-layout.md +7 -7
  273. package/docs/reference/schedules.md +1 -1
  274. package/docs/reference/sessions.md +7 -7
  275. package/docs/reference/tools.md +3 -3
  276. package/docs/scaffolding-agents.md +2 -2
  277. package/docs/storage.md +5 -5
  278. package/docs/troubleshooting.md +11 -10
  279. package/package.json +5 -2
  280. package/skills/ab/SKILL.md +5 -5
  281. package/skills/create-agent/SKILL.md +17 -17
  282. package/skills/debug/SKILL.md +10 -10
  283. package/skills/evals/SKILL.md +13 -13
  284. package/skills/framework-map/SKILL.md +3 -3
  285. package/skills/github/SKILL.md +11 -11
  286. package/skills/hillclimb/SKILL.md +9 -9
  287. package/skills/mcp-auth/SKILL.md +11 -11
  288. package/skills/setup-slack/SKILL.md +28 -28
  289. package/src/bin/agent-serve.ts +4 -4
  290. package/src/channels/github/index.ts +1 -1
  291. package/src/channels/slack/bot-mentions.ts +1 -1
  292. package/src/channels/slack/eval-directive.ts +1 -1
  293. package/src/channels/slack/external-policy.ts +1 -1
  294. package/src/channels/slack/log.ts +1 -1
  295. package/src/channels/slack/setup.ts +1 -1
  296. package/src/channels/slack/socket-mode.ts +1 -1
  297. package/src/evals/reporters.ts +1 -1
  298. package/src/evals.ts +2 -2
  299. package/src/files-backends/agent-store-presigned-url.ts +8 -0
  300. package/src/files-backends/cursor-hosted.ts +724 -0
  301. package/src/files-backends/local-fs.ts +178 -0
  302. package/src/files.ts +195 -0
  303. package/src/internal/ab-collector.ts +2 -2
  304. package/src/internal/ab-fold.ts +1 -1
  305. package/src/internal/cli-ax.ts +2 -2
  306. package/src/internal/cli-deploy.ts +7 -2
  307. package/src/internal/cli-docs.ts +1 -1
  308. package/src/internal/cli-github.ts +13 -13
  309. package/src/internal/cli-mcp-oauth.ts +2 -2
  310. package/src/internal/cli-mcp.ts +4 -4
  311. package/src/internal/cli-skills.ts +1 -1
  312. package/src/internal/cloud-turn-cost.ts +20 -4
  313. package/src/internal/cursor/account-mcp.ts +5 -5
  314. package/src/internal/cursor/backend-client.ts +1 -1
  315. package/src/internal/cursor/github-credentials.ts +3 -3
  316. package/src/internal/cursor-account-mcp-auth.ts +1 -1
  317. package/src/internal/cursor-event-relay.ts +1 -1
  318. package/src/internal/cursor-relay-core.ts +1 -1
  319. package/src/internal/cursor-slack-relay.ts +1 -1
  320. package/src/internal/deploy-client.ts +8 -2
  321. package/src/internal/deploy-source.ts +2 -2
  322. package/src/internal/discovery.ts +2 -2
  323. package/src/internal/distribution.ts +6 -6
  324. package/src/internal/docs-site.ts +5 -5
  325. package/src/internal/eval-run-store.ts +8 -8
  326. package/src/internal/evals-client.ts +1 -1
  327. package/src/internal/github-fanout.ts +2 -2
  328. package/src/internal/host-files.ts +372 -0
  329. package/src/internal/host-platforms.ts +5 -5
  330. package/src/internal/hosting.ts +1 -1
  331. package/src/internal/http-channel.ts +30 -0
  332. package/src/internal/install-cursor-skills.ts +31 -3
  333. package/src/internal/local-control-plane.ts +2 -2
  334. package/src/internal/logs-client.ts +2 -2
  335. package/src/internal/mcp-endpoint.ts +1 -1
  336. package/src/internal/mcp-oauth.ts +2 -2
  337. package/src/internal/platform-schedule-sync.ts +2 -2
  338. package/src/internal/playground/toolchain.ts +6 -6
  339. package/src/internal/reminder-runner.ts +13 -13
  340. package/src/internal/resolved-connections.ts +6 -6
  341. package/src/internal/schedule-runner.ts +1 -1
  342. package/src/internal/sdk-runner.ts +5 -5
  343. package/src/internal/server.ts +16 -16
  344. package/src/internal/session-cost.ts +7 -6
  345. package/src/internal/session-engine.ts +141 -28
  346. package/src/internal/slack-provision-client.ts +1 -1
  347. package/src/internal/storage-coordinator.ts +7 -7
  348. package/src/internal/trajectory.ts +2 -2
  349. package/src/internal/turn-cost.ts +110 -0
  350. package/src/internal/update-check.ts +6 -6
  351. package/src/memory.ts +1 -1
  352. package/src/storage.ts +1 -1
  353. package/src/types.ts +148 -16
  354. package/dist/docs/assets/building-with-agents.md.CJCtZCyi.js +0 -13
  355. package/dist/docs/assets/chunks/@localSearchIndexroot.CbQshWFK.js +0 -1
  356. package/dist/docs/assets/concepts.md.Cfb9b-k1.js +0 -4
  357. package/dist/docs/assets/concepts.md.Cfb9b-k1.lean.js +0 -1
  358. package/dist/docs/assets/deployment.md.TecHo0_2.js +0 -55
  359. package/dist/docs/assets/deployment.md.TecHo0_2.lean.js +0 -1
  360. package/dist/docs/assets/evals.md.DYOjkRCX.lean.js +0 -1
  361. package/dist/docs/assets/example-agents_benny.md.B0gjhI-p.js +0 -7
  362. package/dist/docs/assets/example-agents_index.md.D2PEVSXl.js +0 -2
  363. package/dist/docs/assets/example-agents_index.md.D2PEVSXl.lean.js +0 -1
  364. package/dist/docs/assets/example-agents_oncall.md.BG_sUMly.js +0 -10
  365. package/dist/docs/assets/example-agents_slack-agent.md.buLbgvBf.js +0 -5
  366. package/dist/docs/assets/example-agents_weather-agent.md.C9Qv-W0o.js +0 -24
  367. package/dist/docs/assets/example-agents_weather-agent.md.C9Qv-W0o.lean.js +0 -1
  368. package/dist/docs/assets/guides_cloud-runtime.md.gVzabdQL.js +0 -9
  369. package/dist/docs/assets/guides_mcp-oauth.md.Dd8EgSem.lean.js +0 -1
  370. package/dist/docs/assets/guides_slack.md.CjmJSvZS.js +0 -42
  371. package/dist/docs/assets/guides_slack.md.CjmJSvZS.lean.js +0 -1
  372. package/dist/docs/assets/index.md.CH_s5uZe.js +0 -20
  373. package/dist/docs/assets/index.md.CH_s5uZe.lean.js +0 -1
  374. package/dist/docs/assets/reference_cli.md.ccoKOoXt.js +0 -65
  375. package/dist/docs/assets/reference_http-api.md.BncLd3PZ.js +0 -11
  376. package/dist/docs/assets/storage.md.DRTdnFvd.lean.js +0 -1
  377. package/dist/docs/assets/troubleshooting.md.CmQkmnzC.js +0 -1
  378. package/dist/internal/model-pricing.d.ts +0 -49
  379. package/dist/internal/model-pricing.d.ts.map +0 -1
  380. package/dist/internal/model-pricing.js +0 -377
  381. package/dist/playground/assets/index-CquRB-l0.js +0 -85
  382. package/dist/playground/assets/index-Dj0bWpkn.css +0 -1
  383. package/src/internal/model-pricing.ts +0 -426
  384. /package/dist/docs/assets/{example-agents_benny.md.B0gjhI-p.lean.js → example-agents_benny.md.2Et1qa8f.lean.js} +0 -0
  385. /package/dist/docs/assets/{example-agents_bugbot.md.DelIdhxB.lean.js → example-agents_bugbot.md.ByUexi5i.lean.js} +0 -0
  386. /package/dist/docs/assets/{example-agents_concierge.md.4rQTSMXt.lean.js → example-agents_concierge.md.lL8rhYlj.lean.js} +0 -0
  387. /package/dist/docs/assets/{example-agents_fsd.md.CzgUrDfi.lean.js → example-agents_fsd.md.DfNKQTHz.lean.js} +0 -0
  388. /package/dist/docs/assets/{example-agents_oncall.md.BG_sUMly.lean.js → example-agents_oncall.md.wFFXXEyW.lean.js} +0 -0
  389. /package/dist/docs/assets/{example-agents_security-reviewer.md.Dhj_m7_B.lean.js → example-agents_security-reviewer.md.Dkf1gyo6.lean.js} +0 -0
  390. /package/dist/docs/assets/{example-agents_slack-agent.md.buLbgvBf.lean.js → example-agents_slack-agent.md.DvgvT4nn.lean.js} +0 -0
  391. /package/dist/docs/assets/{guides_agent-to-agent.md.Bpzgq2Pq.lean.js → guides_agent-to-agent.md.Bmbxy-FA.lean.js} +0 -0
  392. /package/dist/docs/assets/{guides_cloud-runtime.md.gVzabdQL.lean.js → guides_cloud-runtime.md.BZ2GA7Es.lean.js} +0 -0
  393. /package/dist/docs/assets/{guides_github.md.DOOCpqsW.lean.js → guides_github.md.R2QlpR75.lean.js} +0 -0
  394. /package/dist/docs/assets/{guides_human-in-the-loop.md.DlUqsp1S.lean.js → guides_human-in-the-loop.md.BWvT7UqY.lean.js} +0 -0
  395. /package/dist/docs/assets/{guides_webhooks.md.wSOYas3X.lean.js → guides_webhooks.md.DiAwSR42.lean.js} +0 -0
  396. /package/dist/docs/assets/{hillclimbing.md.DHNast08.lean.js → hillclimbing.md.D9Y1_bYh.lean.js} +0 -0
  397. /package/dist/docs/assets/{quickstart.md.BU6Iwi_9.lean.js → quickstart.md.TnEXYgYW.lean.js} +0 -0
  398. /package/dist/docs/assets/{reference_agent-config.md.DrW2JUM8.lean.js → reference_agent-config.md.kuN6-OxK.lean.js} +0 -0
  399. /package/dist/docs/assets/{reference_connections.md.B9Q3TOve.lean.js → reference_connections.md.DGqAsFXb.lean.js} +0 -0
  400. /package/dist/docs/assets/{reference_http-api.md.BncLd3PZ.lean.js → reference_http-api.md.CfVM_ICa.lean.js} +0 -0
  401. /package/dist/docs/assets/{reference_schedules.md.w_F2mXB6.lean.js → reference_schedules.md.gmfYzf_I.lean.js} +0 -0
  402. /package/dist/docs/assets/{reference_sessions.md.DLd6mvbv.lean.js → reference_sessions.md.C_ouF_uf.lean.js} +0 -0
  403. /package/dist/docs/assets/{reference_tools.md.BRSDnTbN.lean.js → reference_tools.md.BswAQM41.lean.js} +0 -0
@@ -118,7 +118,7 @@ export class EvalRunStore {
118
118
  this.abortByRunId.set(runId, abort);
119
119
  this.pruneOldRuns(config);
120
120
  this.persist(snapshot);
121
- this.logger(`[agentkit] eval run ${runId}: starting ${cases.length} case(s)`);
121
+ this.logger(`[agent-sdk] eval run ${runId}: starting ${cases.length} case(s)`);
122
122
  void this.execute(runId, Object.assign(Object.assign(Object.assign({ baseUrl: loopbackUrl, evals: selected, config, signal: abort.signal }, (input.bearerToken === undefined
123
123
  ? {}
124
124
  : { bearerToken: input.bearerToken })), (input.verbose === undefined ? {} : { verbose: input.verbose })), (input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs })));
@@ -149,7 +149,7 @@ export class EvalRunStore {
149
149
  if (this.activeRunId === runId) {
150
150
  this.activeRunId = undefined;
151
151
  }
152
- this.logger(`[agentkit] eval run ${runId}: cancelled`);
152
+ this.logger(`[agent-sdk] eval run ${runId}: cancelled`);
153
153
  return run;
154
154
  });
155
155
  }
@@ -203,14 +203,14 @@ export class EvalRunStore {
203
203
  config = (yield discoverEvals(this.projectRoot)).config;
204
204
  }
205
205
  catch (error) {
206
- this.logger(`[agentkit] eval discovery failed during hydrate (pruning with defaults): ${error instanceof Error ? error.message : String(error)}`);
206
+ this.logger(`[agent-sdk] eval discovery failed during hydrate (pruning with defaults): ${error instanceof Error ? error.message : String(error)}`);
207
207
  }
208
208
  this.pruneOldRuns(config);
209
- this.logger(`[agentkit] hydrated ${this.runs.size} playground eval run(s) from storage`);
209
+ this.logger(`[agent-sdk] hydrated ${this.runs.size} playground eval run(s) from storage`);
210
210
  }
211
211
  catch (error) {
212
212
  const message = error instanceof Error ? error.message : String(error);
213
- this.logger(`[agentkit] failed to hydrate playground eval runs: ${message}`);
213
+ this.logger(`[agent-sdk] failed to hydrate playground eval runs: ${message}`);
214
214
  }
215
215
  finally {
216
216
  this.hydrated = true;
@@ -324,7 +324,7 @@ export class EvalRunStore {
324
324
  run.status = "completed";
325
325
  run.finishedAt = new Date().toISOString();
326
326
  this.persist(run);
327
- this.logger(`[agentkit] eval run ${runId}: done — ${run.summary.passed} passed, ${run.summary.failed} failed`);
327
+ this.logger(`[agent-sdk] eval run ${runId}: done — ${run.summary.passed} passed, ${run.summary.failed} failed`);
328
328
  }
329
329
  catch (error) {
330
330
  const run = this.runs.get(runId);
@@ -335,14 +335,14 @@ export class EvalRunStore {
335
335
  if (opts.signal.aborted || message === "cancelled") {
336
336
  markCancelledRun(run);
337
337
  this.persist(run);
338
- this.logger(`[agentkit] eval run ${runId}: cancelled`);
338
+ this.logger(`[agent-sdk] eval run ${runId}: cancelled`);
339
339
  return;
340
340
  }
341
341
  run.status = "failed";
342
342
  run.finishedAt = new Date().toISOString();
343
343
  run.error = message;
344
344
  this.persist(run);
345
- this.logger(`[agentkit] eval run ${runId}: failed — ${run.error}`);
345
+ this.logger(`[agent-sdk] eval run ${runId}: failed — ${run.error}`);
346
346
  }
347
347
  finally {
348
348
  this.abortByRunId.delete(runId);
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * HTTP client for playground eval batches (`/v1/dev/evals/runs`).
3
3
  *
4
- * Used by `agentkit eval --prod` (or `--url`) so the batch runs on the serve
4
+ * Used by `agent-sdk eval --prod` (or `--url`) so the batch runs on the serve
5
5
  * process and is mirrored to `defineStorage` when an `evals` table is
6
6
  * configured. Without those flags, eval keeps the in-process ephemeral path
7
7
  * in `cli-ax.ts`.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * HTTP client for playground eval batches (`/v1/dev/evals/runs`).
3
3
  *
4
- * Used by `agentkit eval --prod` (or `--url`) so the batch runs on the serve
4
+ * Used by `agent-sdk eval --prod` (or `--url`) so the batch runs on the serve
5
5
  * process and is mirrored to `defineStorage` when an `evals` table is
6
6
  * configured. Without those flags, eval keeps the in-process ephemeral path
7
7
  * in `cli-ax.ts`.
@@ -105,13 +105,13 @@ export function fanoutDelivery(body_1, headers_1, targets_1) {
105
105
  body: payload,
106
106
  });
107
107
  if (!response.ok) {
108
- log(`[agentkit] delivery to ${label} failed: HTTP ${response.status}\n`);
108
+ log(`[agent-sdk] delivery to ${label} failed: HTTP ${response.status}\n`);
109
109
  return;
110
110
  }
111
111
  delivered.push(label);
112
112
  }
113
113
  catch (error) {
114
- log(`[agentkit] delivery to ${label} failed: ${error instanceof Error ? error.message : String(error)}\n`);
114
+ log(`[agent-sdk] delivery to ${label} failed: ${error instanceof Error ? error.message : String(error)}\n`);
115
115
  }
116
116
  })));
117
117
  if (recipients.length > 0 && delivered.length === 0) {
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Author-facing durable file storage for {@link HostContext.files}.
3
+ *
4
+ * On Cursor-managed hosting the bytes live in the deployment's durable
5
+ * store; otherwise they land under `--state-root/files` on local disk, which
6
+ * is what makes `host.files` work self-hosted with no storage service at all.
7
+ *
8
+ * Everything that decides *which* bytes an author may reach lives here rather
9
+ * than in the sink: scope selection, path validation, and key minting through
10
+ * {@link fileKeys}. A sink only ever sees a fully-qualified opaque key, so an
11
+ * authored sink — including one a customer wrote against their own Dropbox —
12
+ * cannot be steered into another deployment's or another session's files.
13
+ */
14
+ import { type FileSink } from "../files.js";
15
+ import type { HostFilesApi } from "../types.js";
16
+ export interface CreateHostFilesApiOptions {
17
+ agentName: string;
18
+ /** Local disk root for the default sink. Required unless `sink` is supplied. */
19
+ stateRoot?: string;
20
+ /** Explicit sink override (tests). Omitted → hosted store or local disk. */
21
+ sink?: FileSink;
22
+ /** Session bound for `scope: "session"` calls; prefer {@link HostFilesApi.forSession}. */
23
+ sessionId?: string;
24
+ /** Environment consulted when choosing the default sink (tests). */
25
+ env?: NodeJS.ProcessEnv;
26
+ }
27
+ /** Build the host file API for one agent process. */
28
+ export declare function createHostFilesApi(options: CreateHostFilesApiOptions): HostFilesApi;
29
+ //# sourceMappingURL=host-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-files.d.ts","sourceRoot":"","sources":["../../src/internal/host-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAGL,KAAK,QAAQ,EAId,MAAM,aAAa,CAAC;AAMrB,OAAO,KAAK,EAGV,YAAY,EAGb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,YAAY,CASd"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Author-facing durable file storage for {@link HostContext.files}.
3
+ *
4
+ * On Cursor-managed hosting the bytes live in the deployment's durable
5
+ * store; otherwise they land under `--state-root/files` on local disk, which
6
+ * is what makes `host.files` work self-hosted with no storage service at all.
7
+ *
8
+ * Everything that decides *which* bytes an author may reach lives here rather
9
+ * than in the sink: scope selection, path validation, and key minting through
10
+ * {@link fileKeys}. A sink only ever sees a fully-qualified opaque key, so an
11
+ * authored sink — including one a customer wrote against their own Dropbox —
12
+ * cannot be steered into another deployment's or another session's files.
13
+ */
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ import { join, normalize, sep } from "node:path";
24
+ import { FilePathRejectedError, FileSessionRequiredError, FileTooLargeError, fileKeys, } from "../files.js";
25
+ import { cursorHostedFiles, isCursorHostedFilesAvailable, } from "../files-backends/cursor-hosted.js";
26
+ import { localFiles } from "../files-backends/local-fs.js";
27
+ /** Build the host file API for one agent process. */
28
+ export function createHostFilesApi(options) {
29
+ var _a;
30
+ const sink = (_a = options.sink) !== null && _a !== void 0 ? _a : createDefaultSink(options);
31
+ return createBoundHostFilesApi(Object.assign({ agentName: options.agentName, sink }, (options.sessionId === undefined
32
+ ? {}
33
+ : { sessionId: options.sessionId })));
34
+ }
35
+ /**
36
+ * Pick the default sink.
37
+ *
38
+ * On Cursor-managed hosting the durable store is the only correct answer —
39
+ * falling back to pod-local disk there would accept writes that vanish with
40
+ * the pod, which is the failure this surface exists to remove. Off hosting,
41
+ * local disk keeps `serve --dev`, replay, fixtures, and evals working with no
42
+ * storage service. This is the gate all six hosted agents write by hand in
43
+ * their `agent/storage.ts`; resolving it here means authors do not repeat it.
44
+ */
45
+ function createDefaultSink(options) {
46
+ var _a;
47
+ if (isCursorHostedFilesAvailable((_a = options.env) !== null && _a !== void 0 ? _a : process.env)) {
48
+ return cursorHostedFiles();
49
+ }
50
+ if (options.stateRoot === undefined) {
51
+ throw new Error("createHostFilesApi needs a stateRoot for the default local-disk sink, or an explicit sink");
52
+ }
53
+ return localFiles({
54
+ filesRoot: join(options.stateRoot, "files"),
55
+ stripKeyPrefix: localKeyPrefix(options.agentName),
56
+ });
57
+ }
58
+ /** On-disk layout drops the framework key prefix so paths stay navigable. */
59
+ function localKeyPrefix(agentName) {
60
+ return fileKeys.deploymentPrefix(agentName).replace(/deployment\/$/, "");
61
+ }
62
+ function createBoundHostFilesApi(state) {
63
+ var _a;
64
+ const sinkCaps = (_a = state.sink.capabilities) !== null && _a !== void 0 ? _a : {};
65
+ const capabilities = Object.assign({ conflictDetection: sinkCaps.etags === true, materialized: sinkCaps.materialized === true &&
66
+ typeof state.sink.materializedPath === "function" }, (sinkCaps.maxBytes === undefined ? {} : { maxBytes: sinkCaps.maxBytes }));
67
+ const keyFor = (path, scope) => mintKey(state, path, scope);
68
+ const api = {
69
+ capabilities,
70
+ forSession(sessionId) {
71
+ const trimmed = sessionId.trim();
72
+ if (trimmed === "") {
73
+ throw new FileSessionRequiredError("host.files.forSession requires a non-empty session id");
74
+ }
75
+ return createBoundHostFilesApi(Object.assign(Object.assign({}, state), { sessionId: trimmed }));
76
+ },
77
+ read(path, options) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ var _a;
80
+ const bytes = yield api.readBytes(path, options);
81
+ return bytes === undefined
82
+ ? undefined
83
+ : Buffer.from(bytes).toString((_a = options === null || options === void 0 ? void 0 : options.encoding) !== null && _a !== void 0 ? _a : "utf8");
84
+ });
85
+ },
86
+ readBytes(path, options) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ const found = yield state.sink.get(keyFor(path, options === null || options === void 0 ? void 0 : options.scope));
89
+ if (found === undefined) {
90
+ return undefined;
91
+ }
92
+ return found instanceof Uint8Array ? found : found.body;
93
+ });
94
+ },
95
+ write(path, data, options) {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ const key = keyFor(path, options === null || options === void 0 ? void 0 : options.scope);
98
+ const body = typeof data === "string"
99
+ ? Buffer.from(data, "utf8")
100
+ : Buffer.from(data);
101
+ const maxBytes = capabilities.maxBytes;
102
+ if (maxBytes !== undefined && body.byteLength > maxBytes) {
103
+ throw new FileTooLargeError(key, body.byteLength, maxBytes);
104
+ }
105
+ yield state.sink.put(key, body, (options === null || options === void 0 ? void 0 : options.ifMatch) === undefined
106
+ ? undefined
107
+ : { ifMatch: options.ifMatch });
108
+ });
109
+ },
110
+ remove(path, options) {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ yield state.sink.delete(keyFor(path, options === null || options === void 0 ? void 0 : options.scope));
113
+ });
114
+ },
115
+ exists(path, options) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ return (yield api.stat(path, options)) !== undefined;
118
+ });
119
+ },
120
+ stat(path, options) {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ const key = keyFor(path, options === null || options === void 0 ? void 0 : options.scope);
123
+ const entry = yield statKey(state.sink, key);
124
+ if (entry === undefined) {
125
+ return undefined;
126
+ }
127
+ return Object.assign(Object.assign({ size: entry.size }, (entry.mtimeMs === undefined ? {} : { mtimeMs: entry.mtimeMs })), (entry.etag === undefined ? {} : { etag: entry.etag }));
128
+ });
129
+ },
130
+ list(prefix, options) {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ const scopePrefix = mintPrefix(state, options === null || options === void 0 ? void 0 : options.scope);
133
+ const rel = prefix === undefined ? "" : normalizeRelPath(prefix, true);
134
+ const entries = yield state.sink.list(`${scopePrefix}${rel}`);
135
+ const out = [];
136
+ for (const entry of entries) {
137
+ if (!entry.key.startsWith(scopePrefix)) {
138
+ // A sink that widens the prefix must not leak keys from another
139
+ // scope through a listing.
140
+ continue;
141
+ }
142
+ out.push(Object.assign({ path: entry.key.slice(scopePrefix.length), size: entry.size }, (entry.mtimeMs === undefined ? {} : { mtimeMs: entry.mtimeMs })));
143
+ }
144
+ return out.sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
145
+ });
146
+ },
147
+ materializedPath(path, options) {
148
+ var _a, _b;
149
+ if (!capabilities.materialized) {
150
+ return undefined;
151
+ }
152
+ return (_b = (_a = state.sink).materializedPath) === null || _b === void 0 ? void 0 : _b.call(_a, keyFor(path, options === null || options === void 0 ? void 0 : options.scope));
153
+ },
154
+ };
155
+ return api;
156
+ }
157
+ function statKey(sink, key) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ if (typeof sink.stat === "function") {
160
+ return yield sink.stat(key);
161
+ }
162
+ const entries = yield sink.list(key);
163
+ return entries.find((entry) => entry.key === key);
164
+ });
165
+ }
166
+ // ============================================================================
167
+ // Key minting
168
+ // ============================================================================
169
+ function mintKey(state, path, scope) {
170
+ const rel = normalizeRelPath(path, false);
171
+ const resolved = resolveScope(state, scope);
172
+ if (resolved.kind === "session") {
173
+ return fileKeys.session(state.agentName, resolved.sessionId, rel);
174
+ }
175
+ return resolved.partition === undefined
176
+ ? fileKeys.deployment(state.agentName, rel)
177
+ : fileKeys.deploymentPartition(state.agentName, resolved.partition, rel);
178
+ }
179
+ function mintPrefix(state, scope) {
180
+ const resolved = resolveScope(state, scope);
181
+ if (resolved.kind === "session") {
182
+ return fileKeys.sessionPrefix(state.agentName, resolved.sessionId);
183
+ }
184
+ const base = fileKeys.deploymentPrefix(state.agentName);
185
+ return resolved.partition === undefined
186
+ ? base
187
+ : `${base}${resolved.partition}/`;
188
+ }
189
+ function resolveScope(state, scope) {
190
+ var _a;
191
+ if (scope === "deployment") {
192
+ return { kind: "deployment" };
193
+ }
194
+ if (scope !== undefined && typeof scope === "object") {
195
+ if (scope.kind === "deployment") {
196
+ return scope.partition === undefined
197
+ ? { kind: "deployment" }
198
+ : { kind: "deployment", partition: segment(scope.partition) };
199
+ }
200
+ const explicit = (_a = scope.sessionId) !== null && _a !== void 0 ? _a : state.sessionId;
201
+ return { kind: "session", sessionId: requireSession(explicit) };
202
+ }
203
+ // Default and explicit `"session"` both bind to the caller's own session, so
204
+ // a relative path can never be re-read as another session's.
205
+ return { kind: "session", sessionId: requireSession(state.sessionId) };
206
+ }
207
+ function requireSession(sessionId) {
208
+ if (sessionId === undefined || sessionId.trim() === "") {
209
+ throw new FileSessionRequiredError("host.files needs a session in scope: call forSession(sessionId), pass { scope: { kind: 'session', sessionId } }, or use { scope: 'deployment' }");
210
+ }
211
+ return segment(sessionId);
212
+ }
213
+ /**
214
+ * Normalize an author path into key-relative form. Rejects traversal, NUL,
215
+ * backslashes, trailing slashes, and the `.cursor*` prefix the Agent Store
216
+ * reserves for Cursor-managed content — refusing here turns an opaque failure
217
+ * deep in a sink (or a 400 from the hosted API, which accepts each path in
218
+ * exactly one spelling) into one the author can act on, and keeps the rule
219
+ * identical across sinks.
220
+ */
221
+ function normalizeRelPath(path, allowEmpty) {
222
+ if (typeof path !== "string") {
223
+ throw new FilePathRejectedError("host.files path must be a string");
224
+ }
225
+ const trimmed = path.trim().replace(/^\/+/, "");
226
+ if (trimmed === "") {
227
+ if (allowEmpty) {
228
+ return "";
229
+ }
230
+ throw new FilePathRejectedError("host.files path must be non-empty");
231
+ }
232
+ if (trimmed.includes("\0")) {
233
+ throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
234
+ }
235
+ // A backslash is a separator on Windows and a literal on POSIX, so a key
236
+ // minted from one would name different objects on different hosts — and the
237
+ // hosted API refuses it. Same rule as `segment()` below.
238
+ if (trimmed.includes("\\")) {
239
+ throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
240
+ }
241
+ // On an object path, a trailing slash would mint a key ending in "/" — an
242
+ // empty "directory marker" object, never what an author writing a file
243
+ // meant, and refused by the hosted API. A listing prefix (`allowEmpty`) is
244
+ // a different thing: there a trailing slash legitimately scopes to a
245
+ // directory's contents.
246
+ if (!allowEmpty && trimmed.endsWith("/")) {
247
+ throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
248
+ }
249
+ const normalized = normalize(trimmed).split(sep).join("/");
250
+ if (normalized === ".." ||
251
+ normalized === "." ||
252
+ normalized.startsWith("../") ||
253
+ normalized.includes("/../") ||
254
+ normalized.endsWith("/..")) {
255
+ throw new FilePathRejectedError(`host.files path is not allowed: ${path}`);
256
+ }
257
+ for (const part of normalized.split("/")) {
258
+ if (isReservedSegment(part)) {
259
+ throw new FilePathRejectedError(`host.files path segment "${part}" is reserved for Cursor-managed content: ${path}`);
260
+ }
261
+ }
262
+ return normalized;
263
+ }
264
+ /** One key segment (session id, partition): no separators, no traversal. */
265
+ function segment(value) {
266
+ const trimmed = value.trim();
267
+ if (trimmed === "" ||
268
+ trimmed === "." ||
269
+ trimmed === ".." ||
270
+ trimmed.includes("/") ||
271
+ trimmed.includes("\\") ||
272
+ trimmed.includes("\0")) {
273
+ throw new FilePathRejectedError(`host.files key segment is not allowed: ${value}`);
274
+ }
275
+ if (isReservedSegment(trimmed)) {
276
+ throw new FilePathRejectedError(`host.files key segment "${trimmed}" is reserved for Cursor-managed content`);
277
+ }
278
+ return trimmed;
279
+ }
280
+ /** Mirrors the server's reserved-prefix rule (`AGENT_STORE_RESERVED_CURSOR_PATH_PREFIX`). */
281
+ function isReservedSegment(value) {
282
+ return value.toLowerCase().startsWith(".cursor");
283
+ }
@@ -90,7 +90,7 @@ export function warmupHostGitHubAuth(options) {
90
90
  var _a;
91
91
  const source = (_a = options.authSource) !== null && _a !== void 0 ? _a : (yield resolveHostGitHubAuthSource());
92
92
  if (source === "unavailable") {
93
- options.logger("[agentkit] GitHub auth: unavailable (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + GITHUB_APP_INSTALLATION_ID, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)");
93
+ options.logger("[agent-sdk] GitHub auth: unavailable (set GITHUB_APP_ID + GITHUB_APP_PRIVATE_KEY + GITHUB_APP_INSTALLATION_ID, or GITHUB_TOKEN / GH_TOKEN, or run `gh auth login`)");
94
94
  return source;
95
95
  }
96
96
  let exportedGhToken = false;
@@ -99,7 +99,7 @@ export function warmupHostGitHubAuth(options) {
99
99
  exportedGhToken = yield ensureGhCliTokenEnv();
100
100
  }
101
101
  catch (error) {
102
- options.logger(`[agentkit] GitHub auth: failed to export GH_TOKEN for gh CLI: ${error instanceof Error ? error.message : String(error)}`);
102
+ options.logger(`[agent-sdk] GitHub auth: failed to export GH_TOKEN for gh CLI: ${error instanceof Error ? error.message : String(error)}`);
103
103
  }
104
104
  }
105
105
  const label = source === "cursor-account"
@@ -112,15 +112,15 @@ export function warmupHostGitHubAuth(options) {
112
112
  ? "GITHUB_TOKEN/GH_TOKEN"
113
113
  : "gh auth token";
114
114
  if (options.github === undefined) {
115
- options.logger(`[agentkit] GitHub auth: ${label}`);
115
+ options.logger(`[agent-sdk] GitHub auth: ${label}`);
116
116
  return source;
117
117
  }
118
118
  try {
119
119
  yield options.github.getOctokit();
120
- options.logger(`[agentkit] GitHub auth: ${label}`);
120
+ options.logger(`[agent-sdk] GitHub auth: ${label}`);
121
121
  }
122
122
  catch (error) {
123
- options.logger(`[agentkit] GitHub auth: ${label} resolved but Octokit warmup failed: ${error instanceof Error ? error.message : String(error)}`);
123
+ options.logger(`[agent-sdk] GitHub auth: ${label} resolved but Octokit warmup failed: ${error instanceof Error ? error.message : String(error)}`);
124
124
  }
125
125
  return source;
126
126
  });
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Client-side mirrors of the Agent Serve hosting validation rules
3
3
  * (backend/server/src/agentServe/agentServeShared.ts). Shared by discovery
4
- * (`hosting` block diagnostics on `agentkit validate`) and the deploy /
4
+ * (`hosting` block diagnostics on `agent-sdk validate`) and the deploy /
5
5
  * secrets CLI verbs (actionable errors before any network call). The
6
6
  * backend stays authoritative — these exist so mistakes fail fast and
7
7
  * locally with the same grammar the server enforces.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Client-side mirrors of the Agent Serve hosting validation rules
3
3
  * (backend/server/src/agentServe/agentServeShared.ts). Shared by discovery
4
- * (`hosting` block diagnostics on `agentkit validate`) and the deploy /
4
+ * (`hosting` block diagnostics on `agent-sdk validate`) and the deploy /
5
5
  * secrets CLI verbs (actionable errors before any network call). The
6
6
  * backend stays authoritative — these exist so mistakes fail fast and
7
7
  * locally with the same grammar the server enforces.
@@ -1 +1 @@
1
- {"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CA0YhB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AAoGD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
1
+ {"version":3,"file":"http-channel.d.ts","sourceRoot":"","sources":["../../src/internal/http-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,aAAa,CAAC;AAQrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;OAGG;IACH,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,GAAG,WAAW,EAAE,CAwahB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GACA,QAAQ,GAAG,SAAS,CAiBtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,OAAO,EACb,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAO,GAC/D,QAAQ,CAQV;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,QAAQ,CAEV;AAoGD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAc9C"}
@@ -216,6 +216,31 @@ export function buildHttpChannelRoutes(args) {
216
216
  });
217
217
  }),
218
218
  };
219
+ const cost = {
220
+ method: "GET",
221
+ pattern: `${base}/v1/session/:sessionId/cost`,
222
+ auth,
223
+ handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
224
+ var _a;
225
+ const sessionId = (_a = ctx.params.sessionId) !== null && _a !== void 0 ? _a : "";
226
+ const record = yield engine.getOrRestoreSession(sessionId);
227
+ if (record === undefined) {
228
+ return errorResponse(404, "session_not_found", `Unknown session ${sessionId}.`);
229
+ }
230
+ const ownership = requireSessionOwner(record, ctx.auth, {
231
+ relax: relaxSessionReadAuth,
232
+ beyondLoopback: relaxSessionReadAuthBeyondLoopback,
233
+ requestIp: ctx.requestIp,
234
+ });
235
+ if (ownership !== undefined) {
236
+ return ownership;
237
+ }
238
+ const payload = yield engine.sessionCost(sessionId);
239
+ return jsonResponse(payload, {
240
+ headers: { [SESSION_ID_HEADER]: sessionId },
241
+ });
242
+ }),
243
+ };
219
244
  const listApprovals = {
220
245
  method: "GET",
221
246
  pattern: `${base}/v1/session/:sessionId/approvals`,
@@ -325,6 +350,7 @@ export function buildHttpChannelRoutes(args) {
325
350
  stop,
326
351
  stream,
327
352
  events,
353
+ cost,
328
354
  listApprovals,
329
355
  resolveApproval,
330
356
  ];
@@ -69,7 +69,7 @@ export declare function planSkillInstall(options?: {
69
69
  packageRoot?: string;
70
70
  skillsHome?: string;
71
71
  }): Promise<SkillInstallPlan>;
72
- /** `Installed 9 agentkit skills`, what it dropped, and where it went. */
72
+ /** `Installed 9 Agent SDK skills`, what it dropped, and where it went. */
73
73
  export declare function formatSkillInstall(plan: SkillInstallPlan, result: SkillInstallResult): string;
74
74
  export interface OfferInstallCursorSkillsOptions {
75
75
  /** Skip when false (non-TTY / `--json`). */
@@ -1 +1 @@
1
- {"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-cursor-skills.d.ts","sourceRoot":"","sources":["../../src/internal/install-cursor-skills.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
15
15
  step((generator = generator.apply(thisArg, _arguments || [])).next());
16
16
  });
17
17
  };
18
- import { access, cp, mkdir, readdir, readFile, rm, writeFile, } from "node:fs/promises";
18
+ import { access, chmod, cp, mkdir, readdir, readFile, rm, stat, writeFile, } from "node:fs/promises";
19
19
  import { homedir } from "node:os";
20
20
  import { join } from "node:path";
21
21
  import { CLI_COMMAND_NAME, packageRootDir } from "./distribution.js";
@@ -115,6 +115,11 @@ export function installCursorSkills(skills_1) {
115
115
  for (const skill of skills) {
116
116
  const target = skillInstallPath(skill, skillsHome);
117
117
  yield cp(skill.sourceDir, target, { recursive: true, force: true });
118
+ // cp() preserves source modes, and installs can come from read-only
119
+ // stores (Bazel runfiles, pnpm's content-addressed store, nix). Make the
120
+ // copies writable so the SKILL.md rewrite below and the overwrite on the
121
+ // next upgrade both work.
122
+ yield makeTreeWritable(target);
118
123
  const skillMdPath = join(target, "SKILL.md");
119
124
  const raw = yield readFile(skillMdPath, "utf8");
120
125
  const adjusted = prepareSkillMarkdownForCursorInstall(raw);
@@ -126,6 +131,30 @@ export function installCursorSkills(skills_1) {
126
131
  return { installed, removed };
127
132
  });
128
133
  }
134
+ function makeTreeWritable(root) {
135
+ return __awaiter(this, void 0, void 0, function* () {
136
+ yield addOwnerWrite(root);
137
+ const entries = yield readdir(root, { withFileTypes: true });
138
+ for (const entry of entries) {
139
+ const child = join(root, entry.name);
140
+ if (entry.isDirectory()) {
141
+ yield makeTreeWritable(child);
142
+ }
143
+ else {
144
+ yield addOwnerWrite(child);
145
+ }
146
+ }
147
+ });
148
+ }
149
+ /** Add owner-write, preserving every other mode bit (e.g. exec on scripts). */
150
+ function addOwnerWrite(path) {
151
+ return __awaiter(this, void 0, void 0, function* () {
152
+ const mode = (yield stat(path)).mode & 0o7777;
153
+ if ((mode & 0o200) === 0) {
154
+ yield chmod(path, mode | 0o200);
155
+ }
156
+ });
157
+ }
129
158
  /** Installed leaf dirs the package no longer ships. Installing deletes these. */
130
159
  function orphanLeaves(namespaceDir, skills) {
131
160
  return __awaiter(this, void 0, void 0, function* () {
@@ -193,11 +222,11 @@ export function planSkillInstall(options) {
193
222
  };
194
223
  });
195
224
  }
196
- /** `Installed 9 agentkit skills`, what it dropped, and where it went. */
225
+ /** `Installed 9 Agent SDK skills`, what it dropped, and where it went. */
197
226
  export function formatSkillInstall(plan, result) {
198
227
  const noun = result.installed.length === 1 ? "skill" : "skills";
199
228
  const verb = plan.firstInstall ? "Installed" : "Updated";
200
- const lines = [`${verb} ${result.installed.length} agentkit ${noun}`];
229
+ const lines = [`${verb} ${result.installed.length} Agent SDK ${noun}`];
201
230
  if (result.removed.length > 0) {
202
231
  lines.push(` removed: ${result.removed.join(", ")}`);
203
232
  }
@@ -228,7 +257,7 @@ export function offerInstallCursorSkills() {
228
257
  const noun = plan.shipped.length === 1 ? "skill" : "skills";
229
258
  const verb = plan.firstInstall ? "Install" : "Update";
230
259
  const c = stdoutPalette();
231
- out(`${verb} ${plan.shipped.length} agentkit ${noun} in ${plan.directory}?\n`);
260
+ out(`${verb} ${plan.shipped.length} Agent SDK ${noun} in ${plan.directory}?\n`);
232
261
  out(c.dim(` ${plan.leaves.join(", ")}\n`));
233
262
  if (!plan.firstInstall) {
234
263
  out(c.dim(" (overwrites existing copies with the package version)\n"));
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Small filesystem helpers for one-JSON-file-per-id persistence under a
3
+ * project-relative directory (eval run snapshots, A/B aggregate snapshots).
4
+ */
5
+ export declare function assertNonEmptyDir(dir: string, fnName: string): string;
6
+ /** Resolve `dir` against `projectRoot` when relative. */
7
+ export declare function resolveProjectRelativeDir(args: {
8
+ dir: string;
9
+ projectRoot: string;
10
+ }): string;
11
+ /** List `*.json` basenames in `root` (any order). Missing dir → []. */
12
+ export declare function listJsonBasenames(root: string): Promise<string[]>;
13
+ /**
14
+ * Read and JSON.parse every `*.json` file under `root`. Missing dir → [].
15
+ * Unreadable or corrupt files are skipped so one bad snapshot cannot wipe
16
+ * the rest of the history.
17
+ */
18
+ export declare function readJsonDir<T>(root: string, options?: {
19
+ sortBasenames?: "asc" | "desc";
20
+ }): Promise<T[]>;
21
+ /** Atomically write JSON under `root`/`fileName` (temp file + rename). */
22
+ export declare function writeJsonFile(args: {
23
+ root: string;
24
+ fileName: string;
25
+ value: unknown;
26
+ }): Promise<void>;
27
+ /** Best-effort delete; ignores missing files. */
28
+ export declare function deleteFileInDir(args: {
29
+ root: string;
30
+ fileName: string;
31
+ }): Promise<void>;
32
+ //# sourceMappingURL=json-dir-store.d.ts.map