pi-cursor-sdk 0.4.0 → 0.5.2

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 (799) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +169 -37
  3. package/dist/context-window-cache.js +0 -6
  4. package/dist/context.js +61 -34
  5. package/dist/cursor-api-key.js +34 -19
  6. package/dist/cursor-cloud-lifecycle.js +122 -98
  7. package/dist/cursor-cloud-options.js +1 -0
  8. package/dist/cursor-config.js +59 -0
  9. package/dist/cursor-custom-store-path.js +177 -0
  10. package/dist/cursor-custom-subagent-definitions.js +14 -0
  11. package/dist/cursor-durable-fs.js +97 -3
  12. package/dist/cursor-fallback-models.generated.js +288 -1
  13. package/dist/cursor-fallback-warning.js +10 -4
  14. package/dist/cursor-http1.js +8 -8
  15. package/dist/cursor-live-run-coordinator.js +31 -15
  16. package/dist/cursor-mcp-timeout-override.js +3 -1
  17. package/dist/cursor-native-replay-routing.js +1 -1
  18. package/dist/cursor-native-tool-display-registration.js +46 -22
  19. package/dist/cursor-native-tool-display-state.js +57 -22
  20. package/dist/cursor-native-tool-display-tools.js +5 -6
  21. package/dist/cursor-pi-tool-bridge-constants.js +23 -2
  22. package/dist/cursor-pi-tool-bridge-run.js +28 -3
  23. package/dist/cursor-pi-tool-bridge-server.js +1 -1
  24. package/dist/cursor-pi-tool-bridge-snapshot.js +1 -1
  25. package/dist/cursor-pi-tool-bridge.js +31 -9
  26. package/dist/cursor-provider-binding.js +118 -0
  27. package/dist/cursor-provider-errors.js +61 -33
  28. package/dist/cursor-provider-lazy.js +23 -11
  29. package/dist/cursor-provider-live-run-drain.js +25 -16
  30. package/dist/cursor-provider-run-finalizer.js +21 -9
  31. package/dist/cursor-provider-turn-coordinator.js +1 -0
  32. package/dist/cursor-provider-turn-display-router.js +4 -0
  33. package/dist/cursor-provider-turn-emit.js +1 -0
  34. package/dist/cursor-provider-turn-finalize.js +29 -20
  35. package/dist/cursor-provider-turn-prepare.js +49 -20
  36. package/dist/cursor-provider-turn-runner.js +37 -11
  37. package/dist/cursor-provider-turn-send.js +22 -9
  38. package/dist/cursor-provider-turn-summary.js +89 -0
  39. package/dist/cursor-provider-turn-tool-ledger.js +13 -7
  40. package/dist/cursor-provider.js +10 -3
  41. package/dist/cursor-question-tool.js +5 -5
  42. package/dist/cursor-request-provenance.js +53 -0
  43. package/dist/cursor-ripgrep-path.js +14 -3
  44. package/dist/cursor-runtime-state.js +50 -43
  45. package/dist/cursor-sdk-billed-usage.js +54 -75
  46. package/dist/cursor-sdk-event-debug-session.js +5 -6
  47. package/dist/cursor-sdk-event-debug.js +9 -6
  48. package/dist/cursor-sdk-output-filter.js +1 -1
  49. package/dist/cursor-sdk-process-error-guard.js +9 -10
  50. package/dist/cursor-sdk-runtime.js +13 -1
  51. package/dist/cursor-sdk-vendor-env.js +20 -0
  52. package/dist/cursor-session-agent-cleanup.js +31 -28
  53. package/dist/cursor-session-agent-lifecycle.js +18 -9
  54. package/dist/cursor-session-agent-lineage.js +28 -12
  55. package/dist/cursor-session-agent-resume.js +51 -35
  56. package/dist/cursor-session-agent.js +47 -25
  57. package/dist/cursor-session-compaction-prep.js +2 -7
  58. package/dist/cursor-session-scope.js +71 -39
  59. package/dist/cursor-session-send-policy.js +2 -2
  60. package/dist/cursor-session-settings.js +61 -0
  61. package/dist/cursor-session-store.js +235 -45
  62. package/dist/cursor-skill-tool.js +32 -49
  63. package/dist/cursor-state.js +78 -65
  64. package/dist/cursor-tool-manifest.js +1 -1
  65. package/dist/cursor-usage-accounting.js +13 -70
  66. package/dist/cursor-usage-command.js +89 -0
  67. package/dist/cursor-usage-ledger.js +512 -0
  68. package/dist/index.js +29 -35
  69. package/dist/model-discovery.js +62 -37
  70. package/dist/model-list-cache.js +12 -1
  71. package/docs/cursor-dogfood-checklist.md +3 -3
  72. package/docs/cursor-live-smoke-checklist.md +15 -15
  73. package/docs/cursor-model-ux-spec.md +124 -39
  74. package/docs/cursor-native-tool-replay.md +18 -8
  75. package/docs/cursor-native-tool-visual-audit.md +8 -8
  76. package/docs/cursor-testing-lessons.md +87 -25
  77. package/docs/cursor-tool-surfaces.md +4 -4
  78. package/docs/platform-smoke-implementation.md +10 -6
  79. package/docs/platform-smoke.md +35 -46
  80. package/node_modules/@hono/node-server/README.md +21 -10
  81. package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
  82. package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
  83. package/node_modules/@hono/node-server/dist/index.cjs +41 -19
  84. package/node_modules/@hono/node-server/dist/index.mjs +42 -20
  85. package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
  86. package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
  87. package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
  88. package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
  89. package/node_modules/@hono/node-server/package.json +3 -2
  90. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts → auth-Anm-lwWi.d.mts} +9 -8
  91. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts.map → auth-Anm-lwWi.d.mts.map} +1 -1
  92. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs → auth-BNDyLTqp.mjs} +5 -3
  93. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs.map → auth-BNDyLTqp.mjs.map} +1 -1
  94. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs → auth-D1CeV_Jr.cjs} +5 -3
  95. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs.map → auth-D1CeV_Jr.cjs.map} +1 -1
  96. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts → auth-V9XJSCfa.d.cts} +9 -8
  97. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts.map → auth-V9XJSCfa.d.cts.map} +1 -1
  98. package/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
  99. package/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
  100. package/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
  101. package/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
  102. package/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
  103. package/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
  104. package/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
  105. package/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
  106. package/node_modules/@modelcontextprotocol/core/package.json +2 -2
  107. package/node_modules/@modelcontextprotocol/hono/README.md +7 -5
  108. package/node_modules/@modelcontextprotocol/hono/dist/index.cjs.map +1 -1
  109. package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts +5 -0
  110. package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts.map +1 -1
  111. package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts +5 -0
  112. package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts.map +1 -1
  113. package/node_modules/@modelcontextprotocol/hono/dist/index.mjs.map +1 -1
  114. package/node_modules/@modelcontextprotocol/hono/package.json +4 -4
  115. package/node_modules/@modelcontextprotocol/server/README.md +1 -7
  116. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-Bt6U_Fqb.d.mts → createMcpHandler-D4NN8WsG.d.mts} +35 -13
  117. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts.map +1 -0
  118. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-BLVe3qmU.d.cts → createMcpHandler-DZmmlN8e.d.cts} +35 -13
  119. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DZmmlN8e.d.cts.map +1 -0
  120. package/node_modules/@modelcontextprotocol/server/dist/index.cjs +32 -5
  121. package/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
  122. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts +41 -5
  123. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
  124. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts +41 -5
  125. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
  126. package/node_modules/@modelcontextprotocol/server/dist/index.mjs +32 -5
  127. package/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
  128. package/node_modules/@modelcontextprotocol/server/dist/{mcp-DUcCQSTW.cjs → mcp-BumlNux0.cjs} +73 -23
  129. package/node_modules/@modelcontextprotocol/server/dist/mcp-BumlNux0.cjs.map +1 -0
  130. package/node_modules/@modelcontextprotocol/server/dist/{mcp-Dw2OlZ1f.mjs → mcp-DIH4cS6P.mjs} +73 -23
  131. package/node_modules/@modelcontextprotocol/server/dist/mcp-DIH4cS6P.mjs.map +1 -0
  132. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +1 -1
  133. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +1 -1
  134. package/node_modules/@modelcontextprotocol/server/dist/{src-CgFsfg3E.cjs → src-BhnGYybN.cjs} +29 -11
  135. package/node_modules/@modelcontextprotocol/server/dist/src-BhnGYybN.cjs.map +1 -0
  136. package/node_modules/@modelcontextprotocol/server/dist/{src-D-y6h4N7.mjs → src-Cqbh3MYc.mjs} +29 -11
  137. package/node_modules/@modelcontextprotocol/server/dist/src-Cqbh3MYc.mjs.map +1 -0
  138. package/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +2 -2
  139. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +1 -1
  140. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +1 -1
  141. package/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +2 -2
  142. package/node_modules/@modelcontextprotocol/server/package.json +4 -4
  143. package/node_modules/hono/dist/_virtual/_rolldown/runtime.js +13 -0
  144. package/node_modules/hono/dist/adapter/aws-lambda/conninfo.js +42 -23
  145. package/node_modules/hono/dist/adapter/aws-lambda/handler.js +318 -344
  146. package/node_modules/hono/dist/adapter/aws-lambda/index.js +2 -8
  147. package/node_modules/hono/dist/adapter/aws-lambda/types.js +1 -0
  148. package/node_modules/hono/dist/adapter/bun/conninfo.js +20 -25
  149. package/node_modules/hono/dist/adapter/bun/index.js +3 -13
  150. package/node_modules/hono/dist/adapter/bun/serve-static.js +27 -27
  151. package/node_modules/hono/dist/adapter/bun/server.js +11 -5
  152. package/node_modules/hono/dist/adapter/bun/ssg.js +25 -15
  153. package/node_modules/hono/dist/adapter/bun/websocket.js +61 -68
  154. package/node_modules/hono/dist/adapter/cloudflare-pages/conninfo.js +24 -9
  155. package/node_modules/hono/dist/adapter/cloudflare-pages/handler.js +59 -62
  156. package/node_modules/hono/dist/adapter/cloudflare-pages/index.js +2 -8
  157. package/node_modules/hono/dist/adapter/cloudflare-workers/conninfo.js +7 -9
  158. package/node_modules/hono/dist/adapter/cloudflare-workers/index.js +3 -8
  159. package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static-module.js +5 -6
  160. package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static.js +26 -20
  161. package/node_modules/hono/dist/adapter/cloudflare-workers/utils.js +21 -34
  162. package/node_modules/hono/dist/adapter/cloudflare-workers/websocket.js +31 -39
  163. package/node_modules/hono/dist/adapter/deno/conninfo.js +16 -13
  164. package/node_modules/hono/dist/adapter/deno/deno.d.js +1 -0
  165. package/node_modules/hono/dist/adapter/deno/index.js +3 -10
  166. package/node_modules/hono/dist/adapter/deno/serve-static.js +33 -38
  167. package/node_modules/hono/dist/adapter/deno/ssg.js +27 -16
  168. package/node_modules/hono/dist/adapter/deno/websocket.js +30 -30
  169. package/node_modules/hono/dist/adapter/lambda-edge/conninfo.js +7 -9
  170. package/node_modules/hono/dist/adapter/lambda-edge/handler.js +102 -101
  171. package/node_modules/hono/dist/adapter/lambda-edge/index.js +2 -6
  172. package/node_modules/hono/dist/adapter/netlify/conninfo.js +24 -9
  173. package/node_modules/hono/dist/adapter/netlify/handler.js +10 -8
  174. package/node_modules/hono/dist/adapter/netlify/index.js +3 -2
  175. package/node_modules/hono/dist/adapter/netlify/mod.js +2 -6
  176. package/node_modules/hono/dist/adapter/service-worker/handler.js +15 -19
  177. package/node_modules/hono/dist/adapter/service-worker/index.js +23 -7
  178. package/node_modules/hono/dist/adapter/service-worker/types.js +1 -0
  179. package/node_modules/hono/dist/adapter/vercel/conninfo.js +7 -10
  180. package/node_modules/hono/dist/adapter/vercel/handler.js +8 -6
  181. package/node_modules/hono/dist/adapter/vercel/index.js +2 -6
  182. package/node_modules/hono/dist/cjs/_virtual/_rolldown/runtime.js +33 -0
  183. package/node_modules/hono/dist/cjs/adapter/aws-lambda/conninfo.js +42 -44
  184. package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +326 -373
  185. package/node_modules/hono/dist/cjs/adapter/aws-lambda/index.js +7 -34
  186. package/node_modules/hono/dist/cjs/adapter/aws-lambda/types.js +0 -15
  187. package/node_modules/hono/dist/cjs/adapter/bun/conninfo.js +21 -47
  188. package/node_modules/hono/dist/cjs/adapter/bun/index.js +14 -45
  189. package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +29 -50
  190. package/node_modules/hono/dist/cjs/adapter/bun/server.js +11 -26
  191. package/node_modules/hono/dist/cjs/adapter/bun/ssg.js +24 -35
  192. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +63 -91
  193. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/conninfo.js +25 -31
  194. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/handler.js +61 -85
  195. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/index.js +7 -34
  196. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/conninfo.js +8 -31
  197. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/index.js +7 -33
  198. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static-module.js +7 -29
  199. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static.js +27 -42
  200. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/utils.js +21 -55
  201. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/websocket.js +33 -62
  202. package/node_modules/hono/dist/cjs/adapter/deno/conninfo.js +16 -34
  203. package/node_modules/hono/dist/cjs/adapter/deno/index.js +10 -38
  204. package/node_modules/hono/dist/cjs/adapter/deno/serve-static.js +33 -59
  205. package/node_modules/hono/dist/cjs/adapter/deno/ssg.js +27 -37
  206. package/node_modules/hono/dist/cjs/adapter/deno/websocket.js +32 -53
  207. package/node_modules/hono/dist/cjs/adapter/lambda-edge/conninfo.js +8 -31
  208. package/node_modules/hono/dist/cjs/adapter/lambda-edge/handler.js +102 -130
  209. package/node_modules/hono/dist/cjs/adapter/lambda-edge/index.js +5 -30
  210. package/node_modules/hono/dist/cjs/adapter/netlify/conninfo.js +25 -31
  211. package/node_modules/hono/dist/cjs/adapter/netlify/handler.js +10 -29
  212. package/node_modules/hono/dist/cjs/adapter/netlify/index.js +5 -21
  213. package/node_modules/hono/dist/cjs/adapter/netlify/mod.js +5 -30
  214. package/node_modules/hono/dist/cjs/adapter/service-worker/handler.js +16 -41
  215. package/node_modules/hono/dist/cjs/adapter/service-worker/index.js +25 -30
  216. package/node_modules/hono/dist/cjs/adapter/service-worker/types.js +0 -15
  217. package/node_modules/hono/dist/cjs/adapter/vercel/conninfo.js +8 -32
  218. package/node_modules/hono/dist/cjs/adapter/vercel/handler.js +8 -27
  219. package/node_modules/hono/dist/cjs/adapter/vercel/index.js +5 -30
  220. package/node_modules/hono/dist/cjs/client/client.js +139 -212
  221. package/node_modules/hono/dist/cjs/client/fetch-result-please.js +62 -80
  222. package/node_modules/hono/dist/cjs/client/index.js +7 -32
  223. package/node_modules/hono/dist/cjs/client/types.js +0 -15
  224. package/node_modules/hono/dist/cjs/client/utils.js +54 -92
  225. package/node_modules/hono/dist/cjs/compose.js +49 -66
  226. package/node_modules/hono/dist/cjs/context.js +379 -450
  227. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +47 -72
  228. package/node_modules/hono/dist/cjs/helper/accepts/index.js +3 -27
  229. package/node_modules/hono/dist/cjs/helper/adapter/index.js +33 -73
  230. package/node_modules/hono/dist/cjs/helper/conninfo/index.js +0 -15
  231. package/node_modules/hono/dist/cjs/helper/conninfo/types.js +0 -15
  232. package/node_modules/hono/dist/cjs/helper/cookie/index.js +75 -116
  233. package/node_modules/hono/dist/cjs/helper/css/common.js +165 -244
  234. package/node_modules/hono/dist/cjs/helper/css/index.js +136 -151
  235. package/node_modules/hono/dist/cjs/helper/dev/index.js +45 -71
  236. package/node_modules/hono/dist/cjs/helper/factory/index.js +30 -51
  237. package/node_modules/hono/dist/cjs/helper/html/index.js +32 -62
  238. package/node_modules/hono/dist/cjs/helper/proxy/index.js +113 -106
  239. package/node_modules/hono/dist/cjs/helper/route/index.js +123 -66
  240. package/node_modules/hono/dist/cjs/helper/ssg/index.js +19 -43
  241. package/node_modules/hono/dist/cjs/helper/ssg/middleware.js +56 -64
  242. package/node_modules/hono/dist/cjs/helper/ssg/plugins.js +55 -57
  243. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +196 -296
  244. package/node_modules/hono/dist/cjs/helper/ssg/utils.js +47 -90
  245. package/node_modules/hono/dist/cjs/helper/streaming/index.js +8 -35
  246. package/node_modules/hono/dist/cjs/helper/streaming/sse.js +53 -85
  247. package/node_modules/hono/dist/cjs/helper/streaming/stream.js +23 -53
  248. package/node_modules/hono/dist/cjs/helper/streaming/text.js +10 -32
  249. package/node_modules/hono/dist/cjs/helper/streaming/utils.js +13 -32
  250. package/node_modules/hono/dist/cjs/helper/testing/index.js +16 -31
  251. package/node_modules/hono/dist/cjs/helper/websocket/index.js +51 -76
  252. package/node_modules/hono/dist/cjs/hono-base.js +347 -403
  253. package/node_modules/hono/dist/cjs/hono.js +28 -42
  254. package/node_modules/hono/dist/cjs/http-exception.js +55 -56
  255. package/node_modules/hono/dist/cjs/index.js +22 -30
  256. package/node_modules/hono/dist/cjs/jsx/base.js +237 -366
  257. package/node_modules/hono/dist/cjs/jsx/children.js +16 -41
  258. package/node_modules/hono/dist/cjs/jsx/components.js +119 -192
  259. package/node_modules/hono/dist/cjs/jsx/constants.js +15 -42
  260. package/node_modules/hono/dist/cjs/jsx/context.js +144 -162
  261. package/node_modules/hono/dist/cjs/jsx/dom/client.js +49 -69
  262. package/node_modules/hono/dist/cjs/jsx/dom/components.js +23 -52
  263. package/node_modules/hono/dist/cjs/jsx/dom/context.js +39 -67
  264. package/node_modules/hono/dist/cjs/jsx/dom/css.js +143 -158
  265. package/node_modules/hono/dist/cjs/jsx/dom/hooks/index.js +55 -64
  266. package/node_modules/hono/dist/cjs/jsx/dom/index.js +114 -173
  267. package/node_modules/hono/dist/cjs/jsx/dom/intrinsic-element/components.js +282 -375
  268. package/node_modules/hono/dist/cjs/jsx/dom/jsx-dev-runtime.js +14 -49
  269. package/node_modules/hono/dist/cjs/jsx/dom/jsx-runtime.js +5 -32
  270. package/node_modules/hono/dist/cjs/jsx/dom/render.js +469 -623
  271. package/node_modules/hono/dist/cjs/jsx/dom/server.js +37 -64
  272. package/node_modules/hono/dist/cjs/jsx/dom/utils.js +7 -30
  273. package/node_modules/hono/dist/cjs/jsx/hooks/index.js +225 -318
  274. package/node_modules/hono/dist/cjs/jsx/index.js +86 -135
  275. package/node_modules/hono/dist/cjs/jsx/intrinsic-element/common.js +20 -43
  276. package/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +117 -168
  277. package/node_modules/hono/dist/cjs/jsx/intrinsic-elements.js +0 -15
  278. package/node_modules/hono/dist/cjs/jsx/jsx-dev-runtime.js +14 -39
  279. package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +34 -68
  280. package/node_modules/hono/dist/cjs/jsx/streaming.js +123 -166
  281. package/node_modules/hono/dist/cjs/jsx/types.js +0 -15
  282. package/node_modules/hono/dist/cjs/jsx/utils.js +91 -175
  283. package/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +98 -86
  284. package/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +92 -109
  285. package/node_modules/hono/dist/cjs/middleware/body-limit/index.js +66 -72
  286. package/node_modules/hono/dist/cjs/middleware/cache/index.js +153 -199
  287. package/node_modules/hono/dist/cjs/middleware/combine/index.js +135 -95
  288. package/node_modules/hono/dist/cjs/middleware/compress/index.js +73 -88
  289. package/node_modules/hono/dist/cjs/middleware/context-storage/index.js +49 -41
  290. package/node_modules/hono/dist/cjs/middleware/cors/index.js +107 -107
  291. package/node_modules/hono/dist/cjs/middleware/csrf/index.js +101 -72
  292. package/node_modules/hono/dist/cjs/middleware/etag/digest.js +58 -97
  293. package/node_modules/hono/dist/cjs/middleware/etag/index.js +71 -91
  294. package/node_modules/hono/dist/cjs/middleware/ip-restriction/index.js +161 -169
  295. package/node_modules/hono/dist/cjs/middleware/jsx-renderer/index.js +99 -77
  296. package/node_modules/hono/dist/cjs/middleware/jwk/index.js +3 -27
  297. package/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +118 -135
  298. package/node_modules/hono/dist/cjs/middleware/jwt/index.js +9 -38
  299. package/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +120 -141
  300. package/node_modules/hono/dist/cjs/middleware/language/index.js +7 -35
  301. package/node_modules/hono/dist/cjs/middleware/language/language.js +184 -182
  302. package/node_modules/hono/dist/cjs/middleware/logger/index.js +41 -62
  303. package/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +82 -88
  304. package/node_modules/hono/dist/cjs/middleware/method-override/index.js +101 -102
  305. package/node_modules/hono/dist/cjs/middleware/mount/index.js +71 -0
  306. package/node_modules/hono/dist/cjs/middleware/powered-by/index.js +23 -30
  307. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +38 -42
  308. package/node_modules/hono/dist/cjs/middleware/request-id/index.js +3 -27
  309. package/node_modules/hono/dist/cjs/middleware/request-id/request-id.js +34 -42
  310. package/node_modules/hono/dist/cjs/middleware/secure-headers/index.js +4 -29
  311. package/node_modules/hono/dist/cjs/middleware/secure-headers/permissions-policy.js +0 -15
  312. package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +142 -174
  313. package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +56 -93
  314. package/node_modules/hono/dist/cjs/middleware/serve-static/path.js +15 -38
  315. package/node_modules/hono/dist/cjs/middleware/timeout/index.js +40 -45
  316. package/node_modules/hono/dist/cjs/middleware/timing/index.js +7 -35
  317. package/node_modules/hono/dist/cjs/middleware/timing/timing.js +177 -118
  318. package/node_modules/hono/dist/cjs/middleware/trailing-slash/index.js +85 -58
  319. package/node_modules/hono/dist/cjs/preset/quick.js +18 -37
  320. package/node_modules/hono/dist/cjs/preset/tiny.js +15 -33
  321. package/node_modules/hono/dist/cjs/request/constants.js +5 -27
  322. package/node_modules/hono/dist/cjs/request.js +334 -346
  323. package/node_modules/hono/dist/cjs/router/linear-router/index.js +3 -27
  324. package/node_modules/hono/dist/cjs/router/linear-router/router.js +95 -143
  325. package/node_modules/hono/dist/cjs/router/pattern-router/index.js +3 -27
  326. package/node_modules/hono/dist/cjs/router/pattern-router/router.js +41 -63
  327. package/node_modules/hono/dist/cjs/router/reg-exp-router/index.js +7 -34
  328. package/node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js +18 -45
  329. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +91 -135
  330. package/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +92 -161
  331. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +98 -147
  332. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +73 -89
  333. package/node_modules/hono/dist/cjs/router/smart-router/index.js +3 -27
  334. package/node_modules/hono/dist/cjs/router/smart-router/router.js +49 -79
  335. package/node_modules/hono/dist/cjs/router/trie-router/index.js +3 -27
  336. package/node_modules/hono/dist/cjs/router/trie-router/node.js +134 -186
  337. package/node_modules/hono/dist/cjs/router/trie-router/router.js +15 -39
  338. package/node_modules/hono/dist/cjs/router/utils.js +5 -27
  339. package/node_modules/hono/dist/cjs/router.js +37 -37
  340. package/node_modules/hono/dist/cjs/types.js +5 -28
  341. package/node_modules/hono/dist/cjs/utils/accept.js +177 -225
  342. package/node_modules/hono/dist/cjs/utils/basic-auth.js +16 -40
  343. package/node_modules/hono/dist/cjs/utils/body.js +84 -110
  344. package/node_modules/hono/dist/cjs/utils/buffer.js +43 -91
  345. package/node_modules/hono/dist/cjs/utils/color.js +35 -44
  346. package/node_modules/hono/dist/cjs/utils/compress.js +11 -26
  347. package/node_modules/hono/dist/cjs/utils/concurrent.js +29 -59
  348. package/node_modules/hono/dist/cjs/utils/constants.js +7 -26
  349. package/node_modules/hono/dist/cjs/utils/cookie.js +107 -177
  350. package/node_modules/hono/dist/cjs/utils/crypto.js +30 -61
  351. package/node_modules/hono/dist/cjs/utils/encode.js +31 -48
  352. package/node_modules/hono/dist/cjs/utils/filepath.js +23 -54
  353. package/node_modules/hono/dist/cjs/utils/handler.js +11 -33
  354. package/node_modules/hono/dist/cjs/utils/headers.js +0 -15
  355. package/node_modules/hono/dist/cjs/utils/html.js +96 -137
  356. package/node_modules/hono/dist/cjs/utils/http-status.js +0 -15
  357. package/node_modules/hono/dist/cjs/utils/ipaddr.js +213 -286
  358. package/node_modules/hono/dist/cjs/utils/jwt/index.js +14 -27
  359. package/node_modules/hono/dist/cjs/utils/jwt/jwa.js +25 -42
  360. package/node_modules/hono/dist/cjs/utils/jwt/jws.js +119 -199
  361. package/node_modules/hono/dist/cjs/utils/jwt/jwt.js +122 -206
  362. package/node_modules/hono/dist/cjs/utils/jwt/types.js +122 -159
  363. package/node_modules/hono/dist/cjs/utils/jwt/utf8.js +9 -28
  364. package/node_modules/hono/dist/cjs/utils/mime.js +75 -101
  365. package/node_modules/hono/dist/cjs/utils/stream.js +88 -111
  366. package/node_modules/hono/dist/cjs/utils/types.js +0 -15
  367. package/node_modules/hono/dist/cjs/utils/url.js +185 -234
  368. package/node_modules/hono/dist/cjs/validator/index.js +3 -27
  369. package/node_modules/hono/dist/cjs/validator/utils.js +0 -15
  370. package/node_modules/hono/dist/cjs/validator/validator.js +60 -103
  371. package/node_modules/hono/dist/client/client.js +138 -197
  372. package/node_modules/hono/dist/client/fetch-result-please.js +59 -56
  373. package/node_modules/hono/dist/client/index.js +3 -7
  374. package/node_modules/hono/dist/client/types.js +1 -0
  375. package/node_modules/hono/dist/client/utils.js +51 -68
  376. package/node_modules/hono/dist/compose.js +49 -45
  377. package/node_modules/hono/dist/context.js +376 -426
  378. package/node_modules/hono/dist/helper/accepts/accepts.js +47 -51
  379. package/node_modules/hono/dist/helper/accepts/index.js +1 -4
  380. package/node_modules/hono/dist/helper/adapter/index.js +33 -52
  381. package/node_modules/hono/dist/helper/conninfo/index.js +1 -0
  382. package/node_modules/hono/dist/helper/conninfo/types.js +1 -0
  383. package/node_modules/hono/dist/helper/cookie/index.js +74 -94
  384. package/node_modules/hono/dist/helper/css/common.js +167 -225
  385. package/node_modules/hono/dist/helper/css/index.js +132 -137
  386. package/node_modules/hono/dist/helper/dev/index.js +44 -49
  387. package/node_modules/hono/dist/helper/factory/index.js +27 -27
  388. package/node_modules/hono/dist/helper/html/index.js +30 -39
  389. package/node_modules/hono/dist/helper/proxy/index.js +116 -88
  390. package/node_modules/hono/dist/helper/route/index.js +121 -43
  391. package/node_modules/hono/dist/helper/ssg/index.js +3 -18
  392. package/node_modules/hono/dist/helper/ssg/middleware.js +53 -40
  393. package/node_modules/hono/dist/helper/ssg/plugins.js +55 -36
  394. package/node_modules/hono/dist/helper/ssg/ssg.js +198 -283
  395. package/node_modules/hono/dist/helper/ssg/utils.js +53 -75
  396. package/node_modules/hono/dist/helper/streaming/index.js +2 -8
  397. package/node_modules/hono/dist/helper/streaming/sse.js +50 -61
  398. package/node_modules/hono/dist/helper/streaming/stream.js +22 -31
  399. package/node_modules/hono/dist/helper/streaming/text.js +9 -10
  400. package/node_modules/hono/dist/helper/streaming/utils.js +9 -12
  401. package/node_modules/hono/dist/helper/testing/index.js +16 -10
  402. package/node_modules/hono/dist/helper/websocket/index.js +49 -53
  403. package/node_modules/hono/dist/hono-base.js +344 -379
  404. package/node_modules/hono/dist/hono.js +27 -20
  405. package/node_modules/hono/dist/http-exception.js +53 -33
  406. package/node_modules/hono/dist/index.js +19 -6
  407. package/node_modules/hono/dist/jsx/base.js +231 -340
  408. package/node_modules/hono/dist/jsx/children.js +16 -20
  409. package/node_modules/hono/dist/jsx/components.js +118 -170
  410. package/node_modules/hono/dist/jsx/constants.js +9 -15
  411. package/node_modules/hono/dist/jsx/context.js +153 -150
  412. package/node_modules/hono/dist/jsx/dom/client.js +45 -48
  413. package/node_modules/hono/dist/jsx/dom/components.js +21 -29
  414. package/node_modules/hono/dist/jsx/dom/context.js +37 -44
  415. package/node_modules/hono/dist/jsx/dom/css.js +142 -147
  416. package/node_modules/hono/dist/jsx/dom/hooks/index.js +52 -40
  417. package/node_modules/hono/dist/jsx/dom/index.js +71 -134
  418. package/node_modules/hono/dist/jsx/dom/intrinsic-element/components.js +275 -359
  419. package/node_modules/hono/dist/jsx/dom/jsx-dev-runtime.js +14 -18
  420. package/node_modules/hono/dist/jsx/dom/jsx-runtime.js +2 -8
  421. package/node_modules/hono/dist/jsx/dom/render.js +492 -631
  422. package/node_modules/hono/dist/jsx/dom/server.js +32 -32
  423. package/node_modules/hono/dist/jsx/dom/utils.js +6 -8
  424. package/node_modules/hono/dist/jsx/hooks/index.js +236 -308
  425. package/node_modules/hono/dist/jsx/index.js +45 -98
  426. package/node_modules/hono/dist/jsx/intrinsic-element/common.js +20 -22
  427. package/node_modules/hono/dist/jsx/intrinsic-element/components.js +113 -154
  428. package/node_modules/hono/dist/jsx/intrinsic-elements.js +1 -0
  429. package/node_modules/hono/dist/jsx/jsx-dev-runtime.js +12 -16
  430. package/node_modules/hono/dist/jsx/jsx-runtime.js +29 -42
  431. package/node_modules/hono/dist/jsx/streaming.js +120 -142
  432. package/node_modules/hono/dist/jsx/types.js +1 -0
  433. package/node_modules/hono/dist/jsx/utils.js +105 -168
  434. package/node_modules/hono/dist/middleware/basic-auth/index.js +96 -63
  435. package/node_modules/hono/dist/middleware/bearer-auth/index.js +93 -89
  436. package/node_modules/hono/dist/middleware/body-limit/index.js +66 -51
  437. package/node_modules/hono/dist/middleware/cache/index.js +165 -190
  438. package/node_modules/hono/dist/middleware/combine/index.js +134 -73
  439. package/node_modules/hono/dist/middleware/compress/index.js +75 -69
  440. package/node_modules/hono/dist/middleware/context-storage/index.js +49 -19
  441. package/node_modules/hono/dist/middleware/cors/index.js +107 -86
  442. package/node_modules/hono/dist/middleware/csrf/index.js +103 -53
  443. package/node_modules/hono/dist/middleware/etag/digest.js +59 -77
  444. package/node_modules/hono/dist/middleware/etag/index.js +71 -70
  445. package/node_modules/hono/dist/middleware/ip-restriction/index.js +163 -158
  446. package/node_modules/hono/dist/middleware/jsx-renderer/index.js +97 -54
  447. package/node_modules/hono/dist/middleware/jwk/index.js +1 -4
  448. package/node_modules/hono/dist/middleware/jwk/jwk.js +116 -112
  449. package/node_modules/hono/dist/middleware/jwt/index.js +2 -10
  450. package/node_modules/hono/dist/middleware/jwt/jwt.js +114 -114
  451. package/node_modules/hono/dist/middleware/language/index.js +2 -15
  452. package/node_modules/hono/dist/middleware/language/language.js +180 -157
  453. package/node_modules/hono/dist/middleware/logger/index.js +43 -37
  454. package/node_modules/hono/dist/middleware/method-not-allowed/index.js +81 -66
  455. package/node_modules/hono/dist/middleware/method-override/index.js +101 -81
  456. package/node_modules/hono/dist/middleware/mount/index.js +70 -0
  457. package/node_modules/hono/dist/middleware/powered-by/index.js +23 -9
  458. package/node_modules/hono/dist/middleware/pretty-json/index.js +39 -22
  459. package/node_modules/hono/dist/middleware/request-id/index.js +1 -4
  460. package/node_modules/hono/dist/middleware/request-id/request-id.js +33 -20
  461. package/node_modules/hono/dist/middleware/secure-headers/index.js +1 -5
  462. package/node_modules/hono/dist/middleware/secure-headers/permissions-policy.js +1 -0
  463. package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +144 -155
  464. package/node_modules/hono/dist/middleware/serve-static/index.js +56 -72
  465. package/node_modules/hono/dist/middleware/serve-static/path.js +15 -17
  466. package/node_modules/hono/dist/middleware/timeout/index.js +40 -23
  467. package/node_modules/hono/dist/middleware/timing/index.js +2 -9
  468. package/node_modules/hono/dist/middleware/timing/timing.js +177 -97
  469. package/node_modules/hono/dist/middleware/trailing-slash/index.js +85 -37
  470. package/node_modules/hono/dist/preset/quick.js +17 -15
  471. package/node_modules/hono/dist/preset/tiny.js +14 -11
  472. package/node_modules/hono/dist/request/constants.js +4 -5
  473. package/node_modules/hono/dist/request.js +328 -319
  474. package/node_modules/hono/dist/router/linear-router/index.js +1 -4
  475. package/node_modules/hono/dist/router/linear-router/router.js +93 -120
  476. package/node_modules/hono/dist/router/pattern-router/index.js +1 -4
  477. package/node_modules/hono/dist/router/pattern-router/router.js +39 -40
  478. package/node_modules/hono/dist/router/reg-exp-router/index.js +1 -7
  479. package/node_modules/hono/dist/router/reg-exp-router/matcher.js +17 -23
  480. package/node_modules/hono/dist/router/reg-exp-router/node.js +87 -110
  481. package/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +89 -137
  482. package/node_modules/hono/dist/router/reg-exp-router/router.js +92 -129
  483. package/node_modules/hono/dist/router/reg-exp-router/trie.js +69 -64
  484. package/node_modules/hono/dist/router/smart-router/index.js +1 -4
  485. package/node_modules/hono/dist/router/smart-router/router.js +46 -55
  486. package/node_modules/hono/dist/router/trie-router/index.js +1 -4
  487. package/node_modules/hono/dist/router/trie-router/node.js +131 -162
  488. package/node_modules/hono/dist/router/trie-router/router.js +11 -14
  489. package/node_modules/hono/dist/router/utils.js +4 -5
  490. package/node_modules/hono/dist/router.js +35 -14
  491. package/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +4 -1
  492. package/node_modules/hono/dist/types/adapter/aws-lambda/handler.d.ts +150 -104
  493. package/node_modules/hono/dist/types/adapter/aws-lambda/index.d.ts +4 -8
  494. package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +152 -122
  495. package/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +4 -1
  496. package/node_modules/hono/dist/types/adapter/bun/index.d.ts +6 -10
  497. package/node_modules/hono/dist/types/adapter/bun/serve-static.d.ts +7 -2
  498. package/node_modules/hono/dist/types/adapter/bun/server.d.ts +4 -5
  499. package/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +5 -1
  500. package/node_modules/hono/dist/types/adapter/bun/websocket.d.ts +31 -16
  501. package/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +4 -1
  502. package/node_modules/hono/dist/types/adapter/cloudflare-pages/handler.d.ts +29 -17
  503. package/node_modules/hono/dist/types/adapter/cloudflare-pages/index.d.ts +3 -7
  504. package/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +6 -1
  505. package/node_modules/hono/dist/types/adapter/cloudflare-workers/index.d.ts +4 -7
  506. package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static-module.d.ts +5 -2
  507. package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static.d.ts +10 -5
  508. package/node_modules/hono/dist/types/adapter/cloudflare-workers/utils.d.ts +10 -2
  509. package/node_modules/hono/dist/types/adapter/cloudflare-workers/websocket.d.ts +6 -1
  510. package/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +4 -1
  511. package/node_modules/hono/dist/types/adapter/deno/deno.d.ts +1 -0
  512. package/node_modules/hono/dist/types/adapter/deno/index.d.ts +5 -8
  513. package/node_modules/hono/dist/types/adapter/deno/serve-static.d.ts +7 -2
  514. package/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +5 -1
  515. package/node_modules/hono/dist/types/adapter/deno/websocket.d.ts +6 -1
  516. package/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +6 -1
  517. package/node_modules/hono/dist/types/adapter/lambda-edge/handler.d.ts +83 -57
  518. package/node_modules/hono/dist/types/adapter/lambda-edge/index.d.ts +3 -7
  519. package/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +4 -1
  520. package/node_modules/hono/dist/types/adapter/netlify/handler.d.ts +6 -1
  521. package/node_modules/hono/dist/types/adapter/netlify/index.d.ts +3 -5
  522. package/node_modules/hono/dist/types/adapter/netlify/mod.d.ts +3 -2
  523. package/node_modules/hono/dist/types/adapter/service-worker/handler.d.ts +9 -7
  524. package/node_modules/hono/dist/types/adapter/service-worker/index.d.ts +7 -9
  525. package/node_modules/hono/dist/types/adapter/service-worker/types.d.ts +12 -7
  526. package/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +6 -1
  527. package/node_modules/hono/dist/types/adapter/vercel/handler.d.ts +6 -1
  528. package/node_modules/hono/dist/types/adapter/vercel/index.d.ts +3 -6
  529. package/node_modules/hono/dist/types/client/client.d.ts +5 -3
  530. package/node_modules/hono/dist/types/client/fetch-result-please.d.ts +21 -19
  531. package/node_modules/hono/dist/types/client/index.d.ts +5 -7
  532. package/node_modules/hono/dist/types/client/types.d.ts +134 -159
  533. package/node_modules/hono/dist/types/client/utils.d.ts +6 -4
  534. package/node_modules/hono/dist/types/compose.d.ts +4 -2
  535. package/node_modules/hono/dist/types/context.d.ts +335 -335
  536. package/node_modules/hono/dist/types/helper/accepts/accepts.d.ts +11 -9
  537. package/node_modules/hono/dist/types/helper/accepts/index.d.ts +2 -5
  538. package/node_modules/hono/dist/types/helper/adapter/index.d.ts +4 -6
  539. package/node_modules/hono/dist/types/helper/conninfo/index.d.ts +2 -5
  540. package/node_modules/hono/dist/types/helper/conninfo/types.d.ts +25 -23
  541. package/node_modules/hono/dist/types/helper/cookie/index.d.ts +10 -12
  542. package/node_modules/hono/dist/types/helper/css/common.d.ts +11 -9
  543. package/node_modules/hono/dist/types/helper/css/index.d.ts +26 -28
  544. package/node_modules/hono/dist/types/helper/dev/index.d.ts +10 -12
  545. package/node_modules/hono/dist/types/helper/factory/index.d.ts +26 -73
  546. package/node_modules/hono/dist/types/helper/html/index.d.ts +4 -7
  547. package/node_modules/hono/dist/types/helper/proxy/index.d.ts +19 -21
  548. package/node_modules/hono/dist/types/helper/route/index.d.ts +4 -2
  549. package/node_modules/hono/dist/types/helper/ssg/index.d.ts +4 -7
  550. package/node_modules/hono/dist/types/helper/ssg/middleware.d.ts +8 -6
  551. package/node_modules/hono/dist/types/helper/ssg/plugins.d.ts +3 -1
  552. package/node_modules/hono/dist/types/helper/ssg/ssg.d.ts +38 -36
  553. package/node_modules/hono/dist/types/helper/ssg/utils.d.ts +5 -3
  554. package/node_modules/hono/dist/types/helper/streaming/index.d.ts +4 -8
  555. package/node_modules/hono/dist/types/helper/streaming/sse.d.ts +10 -8
  556. package/node_modules/hono/dist/types/helper/streaming/stream.d.ts +4 -2
  557. package/node_modules/hono/dist/types/helper/streaming/text.d.ts +4 -2
  558. package/node_modules/hono/dist/types/helper/streaming/utils.d.ts +2 -0
  559. package/node_modules/hono/dist/types/helper/testing/index.d.ts +7 -9
  560. package/node_modules/hono/dist/types/helper/websocket/index.d.ts +30 -33
  561. package/node_modules/hono/dist/types/hono-base.d.ts +210 -210
  562. package/node_modules/hono/dist/types/hono.d.ts +11 -10
  563. package/node_modules/hono/dist/types/http-exception.d.ts +20 -22
  564. package/node_modules/hono/dist/types/index.d.ts +6 -37
  565. package/node_modules/hono/dist/types/jsx/base.d.ts +37 -35
  566. package/node_modules/hono/dist/types/jsx/children.d.ts +8 -6
  567. package/node_modules/hono/dist/types/jsx/components.d.ts +8 -5
  568. package/node_modules/hono/dist/types/jsx/constants.d.ts +2 -0
  569. package/node_modules/hono/dist/types/jsx/context.d.ts +9 -6
  570. package/node_modules/hono/dist/types/jsx/dom/client.d.ts +9 -10
  571. package/node_modules/hono/dist/types/jsx/dom/components.d.ts +9 -6
  572. package/node_modules/hono/dist/types/jsx/dom/context.d.ts +3 -1
  573. package/node_modules/hono/dist/types/jsx/dom/css.d.ts +27 -30
  574. package/node_modules/hono/dist/types/jsx/dom/hooks/index.d.ts +11 -12
  575. package/node_modules/hono/dist/types/jsx/dom/index.d.ts +79 -83
  576. package/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +9 -5
  577. package/node_modules/hono/dist/types/jsx/dom/jsx-dev-runtime.d.ts +4 -6
  578. package/node_modules/hono/dist/types/jsx/dom/jsx-runtime.d.ts +3 -7
  579. package/node_modules/hono/dist/types/jsx/dom/render.d.ts +32 -50
  580. package/node_modules/hono/dist/types/jsx/dom/server.d.ts +87 -85
  581. package/node_modules/hono/dist/types/jsx/dom/utils.d.ts +2 -0
  582. package/node_modules/hono/dist/types/jsx/hooks/index.d.ts +16 -16
  583. package/node_modules/hono/dist/types/jsx/index.d.ts +71 -73
  584. package/node_modules/hono/dist/types/jsx/intrinsic-element/common.d.ts +3 -1
  585. package/node_modules/hono/dist/types/jsx/intrinsic-element/components.d.ts +7 -4
  586. package/node_modules/hono/dist/types/jsx/intrinsic-elements.d.ts +708 -708
  587. package/node_modules/hono/dist/types/jsx/jsx-dev-runtime.d.ts +4 -7
  588. package/node_modules/hono/dist/types/jsx/jsx-runtime.d.ts +7 -10
  589. package/node_modules/hono/dist/types/jsx/streaming.d.ts +9 -10
  590. package/node_modules/hono/dist/types/jsx/types.d.ts +12 -13
  591. package/node_modules/hono/dist/types/jsx/utils.d.ts +2 -0
  592. package/node_modules/hono/dist/types/middleware/basic-auth/index.d.ts +17 -19
  593. package/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +46 -48
  594. package/node_modules/hono/dist/types/middleware/body-limit/index.d.ts +6 -8
  595. package/node_modules/hono/dist/types/middleware/cache/index.d.ts +13 -15
  596. package/node_modules/hono/dist/types/middleware/combine/index.d.ts +4 -6
  597. package/node_modules/hono/dist/types/middleware/compress/index.d.ts +9 -10
  598. package/node_modules/hono/dist/types/middleware/context-storage/index.d.ts +4 -6
  599. package/node_modules/hono/dist/types/middleware/cors/index.d.ts +10 -12
  600. package/node_modules/hono/dist/types/middleware/csrf/index.d.ts +6 -8
  601. package/node_modules/hono/dist/types/middleware/etag/digest.d.ts +2 -0
  602. package/node_modules/hono/dist/types/middleware/etag/index.d.ts +6 -8
  603. package/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +11 -12
  604. package/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +11 -11
  605. package/node_modules/hono/dist/types/middleware/jwk/index.d.ts +2 -1
  606. package/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +20 -23
  607. package/node_modules/hono/dist/types/middleware/jwt/index.d.ts +7 -6
  608. package/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +28 -30
  609. package/node_modules/hono/dist/types/middleware/language/index.d.ts +6 -5
  610. package/node_modules/hono/dist/types/middleware/language/language.d.ts +42 -44
  611. package/node_modules/hono/dist/types/middleware/logger/index.d.ts +3 -5
  612. package/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +7 -9
  613. package/node_modules/hono/dist/types/middleware/method-override/index.d.ts +14 -16
  614. package/node_modules/hono/dist/types/middleware/mount/index.d.ts +46 -0
  615. package/node_modules/hono/dist/types/middleware/powered-by/index.d.ts +8 -10
  616. package/node_modules/hono/dist/types/middleware/pretty-json/index.d.ts +18 -20
  617. package/node_modules/hono/dist/types/middleware/request-id/index.d.ts +6 -5
  618. package/node_modules/hono/dist/types/middleware/request-id/request-id.d.ts +9 -11
  619. package/node_modules/hono/dist/types/middleware/secure-headers/index.d.ts +6 -6
  620. package/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +2 -0
  621. package/node_modules/hono/dist/types/middleware/secure-headers/secure-headers.d.ts +55 -57
  622. package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +24 -24
  623. package/node_modules/hono/dist/types/middleware/serve-static/path.d.ts +2 -0
  624. package/node_modules/hono/dist/types/middleware/timeout/index.d.ts +5 -7
  625. package/node_modules/hono/dist/types/middleware/timing/index.d.ts +6 -5
  626. package/node_modules/hono/dist/types/middleware/timing/timing.d.ts +17 -20
  627. package/node_modules/hono/dist/types/middleware/trailing-slash/index.d.ts +35 -37
  628. package/node_modules/hono/dist/types/preset/quick.d.ts +6 -9
  629. package/node_modules/hono/dist/types/preset/tiny.d.ts +6 -9
  630. package/node_modules/hono/dist/types/request/constants.d.ts +2 -0
  631. package/node_modules/hono/dist/types/request.d.ts +288 -286
  632. package/node_modules/hono/dist/types/router/linear-router/index.d.ts +2 -5
  633. package/node_modules/hono/dist/types/router/linear-router/router.d.ts +7 -5
  634. package/node_modules/hono/dist/types/router/pattern-router/index.d.ts +2 -5
  635. package/node_modules/hono/dist/types/router/pattern-router/router.d.ts +7 -5
  636. package/node_modules/hono/dist/types/router/reg-exp-router/index.d.ts +3 -6
  637. package/node_modules/hono/dist/types/router/reg-exp-router/matcher.d.ts +3 -1
  638. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +6 -4
  639. package/node_modules/hono/dist/types/router/reg-exp-router/prepared-router.d.ts +11 -10
  640. package/node_modules/hono/dist/types/router/reg-exp-router/router.d.ts +10 -9
  641. package/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +7 -5
  642. package/node_modules/hono/dist/types/router/smart-router/index.d.ts +2 -5
  643. package/node_modules/hono/dist/types/router/smart-router/router.d.ts +11 -9
  644. package/node_modules/hono/dist/types/router/trie-router/index.d.ts +2 -5
  645. package/node_modules/hono/dist/types/router/trie-router/node.d.ts +6 -4
  646. package/node_modules/hono/dist/types/router/trie-router/router.d.ts +7 -5
  647. package/node_modules/hono/dist/types/router/utils.d.ts +2 -0
  648. package/node_modules/hono/dist/types/router.d.ts +23 -22
  649. package/node_modules/hono/dist/types/types.d.ts +146 -505
  650. package/node_modules/hono/dist/types/utils/accept.d.ts +5 -3
  651. package/node_modules/hono/dist/types/utils/basic-auth.d.ts +4 -2
  652. package/node_modules/hono/dist/types/utils/body.d.ts +46 -50
  653. package/node_modules/hono/dist/types/utils/buffer.d.ts +7 -5
  654. package/node_modules/hono/dist/types/utils/color.d.ts +2 -0
  655. package/node_modules/hono/dist/types/utils/compress.d.ts +2 -0
  656. package/node_modules/hono/dist/types/utils/concurrent.d.ts +6 -4
  657. package/node_modules/hono/dist/types/utils/constants.d.ts +2 -0
  658. package/node_modules/hono/dist/types/utils/cookie.d.ts +20 -18
  659. package/node_modules/hono/dist/types/utils/crypto.d.ts +5 -7
  660. package/node_modules/hono/dist/types/utils/encode.d.ts +2 -0
  661. package/node_modules/hono/dist/types/utils/filepath.d.ts +5 -3
  662. package/node_modules/hono/dist/types/utils/handler.d.ts +2 -0
  663. package/node_modules/hono/dist/types/utils/headers.d.ts +2 -0
  664. package/node_modules/hono/dist/types/utils/html.d.ts +11 -9
  665. package/node_modules/hono/dist/types/utils/http-status.d.ts +2 -0
  666. package/node_modules/hono/dist/types/utils/ipaddr.d.ts +4 -6
  667. package/node_modules/hono/dist/types/utils/jwt/index.d.ts +18 -12
  668. package/node_modules/hono/dist/types/utils/jwt/jwa.d.ts +15 -13
  669. package/node_modules/hono/dist/types/utils/jwt/jws.d.ts +4 -7
  670. package/node_modules/hono/dist/types/utils/jwt/jwt.d.ts +26 -29
  671. package/node_modules/hono/dist/types/utils/jwt/types.d.ts +48 -45
  672. package/node_modules/hono/dist/types/utils/jwt/utf8.d.ts +2 -0
  673. package/node_modules/hono/dist/types/utils/mime.d.ts +60 -57
  674. package/node_modules/hono/dist/types/utils/stream.d.ts +27 -25
  675. package/node_modules/hono/dist/types/utils/types.d.ts +14 -26
  676. package/node_modules/hono/dist/types/utils/url.d.ts +2 -0
  677. package/node_modules/hono/dist/types/validator/index.d.ts +3 -7
  678. package/node_modules/hono/dist/types/validator/utils.d.ts +6 -8
  679. package/node_modules/hono/dist/types/validator/validator.d.ts +11 -9
  680. package/node_modules/hono/dist/types.js +4 -6
  681. package/node_modules/hono/dist/utils/accept.js +185 -212
  682. package/node_modules/hono/dist/utils/basic-auth.js +18 -21
  683. package/node_modules/hono/dist/utils/body.js +87 -92
  684. package/node_modules/hono/dist/utils/buffer.js +44 -71
  685. package/node_modules/hono/dist/utils/color.js +33 -21
  686. package/node_modules/hono/dist/utils/compress.js +11 -5
  687. package/node_modules/hono/dist/utils/concurrent.js +29 -38
  688. package/node_modules/hono/dist/utils/constants.js +7 -5
  689. package/node_modules/hono/dist/utils/cookie.js +114 -163
  690. package/node_modules/hono/dist/utils/crypto.js +30 -40
  691. package/node_modules/hono/dist/utils/encode.js +30 -26
  692. package/node_modules/hono/dist/utils/filepath.js +23 -33
  693. package/node_modules/hono/dist/utils/handler.js +10 -11
  694. package/node_modules/hono/dist/utils/headers.js +1 -0
  695. package/node_modules/hono/dist/utils/html.js +97 -117
  696. package/node_modules/hono/dist/utils/http-status.js +1 -0
  697. package/node_modules/hono/dist/utils/ipaddr.js +227 -279
  698. package/node_modules/hono/dist/utils/jwt/index.js +12 -4
  699. package/node_modules/hono/dist/utils/jwt/jwa.js +24 -20
  700. package/node_modules/hono/dist/utils/jwt/jws.js +115 -174
  701. package/node_modules/hono/dist/utils/jwt/jwt.js +120 -198
  702. package/node_modules/hono/dist/utils/jwt/types.js +79 -95
  703. package/node_modules/hono/dist/utils/jwt/utf8.js +9 -7
  704. package/node_modules/hono/dist/utils/mime.js +74 -79
  705. package/node_modules/hono/dist/utils/stream.js +86 -88
  706. package/node_modules/hono/dist/utils/types.js +1 -0
  707. package/node_modules/hono/dist/utils/url.js +187 -215
  708. package/node_modules/hono/dist/validator/index.js +1 -4
  709. package/node_modules/hono/dist/validator/utils.js +1 -0
  710. package/node_modules/hono/dist/validator/validator.js +61 -83
  711. package/node_modules/hono/package.json +35 -27
  712. package/package.json +16 -14
  713. package/scripts/cloud-runtime-smoke.mjs +4 -2
  714. package/scripts/lib/cursor-sdk-output-filter.d.mts +1 -0
  715. package/scripts/lib/cursor-sdk-output-filter.mjs +1 -0
  716. package/scripts/local-resume-smoke.mjs +1 -1
  717. package/scripts/platform-smoke/artifacts.mjs +7 -1
  718. package/scripts/platform-smoke/card-detect.mjs +2 -8
  719. package/scripts/platform-smoke/targets.mjs +8 -15
  720. package/scripts/platform-smoke/visual-evidence.mjs +7 -2
  721. package/scripts/tmux-live-smoke.sh +57 -90
  722. package/shared/cursor-sdk-output-filter.d.mts +3 -0
  723. package/shared/cursor-sdk-output-filter.mjs +117 -44
  724. package/src/context-window-cache.ts +0 -6
  725. package/src/context.ts +65 -33
  726. package/src/cursor-api-key.ts +37 -17
  727. package/src/cursor-cloud-lifecycle.ts +124 -98
  728. package/src/cursor-cloud-options.ts +2 -0
  729. package/src/cursor-config.ts +76 -0
  730. package/src/cursor-custom-store-path.ts +151 -0
  731. package/src/cursor-custom-subagent-definitions.ts +21 -0
  732. package/src/cursor-durable-fs.ts +65 -3
  733. package/src/cursor-fallback-models.generated.ts +288 -1
  734. package/src/cursor-fallback-warning.ts +9 -5
  735. package/src/cursor-http1.ts +8 -8
  736. package/src/cursor-live-run-coordinator.ts +33 -15
  737. package/src/cursor-mcp-timeout-override.ts +3 -1
  738. package/src/cursor-native-replay-routing.ts +2 -1
  739. package/src/cursor-native-tool-display-registration.ts +48 -24
  740. package/src/cursor-native-tool-display-state.ts +65 -21
  741. package/src/cursor-native-tool-display-tools.ts +7 -4
  742. package/src/cursor-pi-tool-bridge-constants.ts +27 -2
  743. package/src/cursor-pi-tool-bridge-run.ts +32 -3
  744. package/src/cursor-pi-tool-bridge-server.ts +1 -2
  745. package/src/cursor-pi-tool-bridge-snapshot.ts +1 -1
  746. package/src/cursor-pi-tool-bridge-types.ts +3 -0
  747. package/src/cursor-pi-tool-bridge.ts +26 -9
  748. package/src/cursor-provider-binding.ts +121 -0
  749. package/src/cursor-provider-errors.ts +59 -35
  750. package/src/cursor-provider-lazy.ts +21 -15
  751. package/src/cursor-provider-live-run-drain.ts +29 -17
  752. package/src/cursor-provider-run-finalizer.ts +26 -16
  753. package/src/cursor-provider-turn-coordinator.ts +2 -0
  754. package/src/cursor-provider-turn-display-router.ts +5 -0
  755. package/src/cursor-provider-turn-emit.ts +3 -1
  756. package/src/cursor-provider-turn-finalize.ts +38 -23
  757. package/src/cursor-provider-turn-prepare.ts +51 -27
  758. package/src/cursor-provider-turn-runner.ts +40 -13
  759. package/src/cursor-provider-turn-send.ts +23 -15
  760. package/src/cursor-provider-turn-summary.ts +94 -0
  761. package/src/cursor-provider-turn-tool-ledger.ts +12 -7
  762. package/src/cursor-provider-turn-types.ts +37 -4
  763. package/src/cursor-provider.ts +28 -4
  764. package/src/cursor-question-tool.ts +5 -5
  765. package/src/cursor-request-provenance.ts +79 -0
  766. package/src/cursor-ripgrep-path.ts +15 -5
  767. package/src/cursor-runtime-state.ts +53 -48
  768. package/src/cursor-sdk-billed-usage.ts +54 -102
  769. package/src/cursor-sdk-event-debug-session.ts +5 -5
  770. package/src/cursor-sdk-event-debug.ts +10 -6
  771. package/src/cursor-sdk-output-filter.ts +2 -0
  772. package/src/cursor-sdk-process-error-guard.ts +8 -9
  773. package/src/cursor-sdk-runtime.ts +15 -2
  774. package/src/cursor-sdk-vendor-env.ts +22 -0
  775. package/src/cursor-session-agent-cleanup.ts +30 -29
  776. package/src/cursor-session-agent-lifecycle.ts +14 -9
  777. package/src/cursor-session-agent-lineage.ts +26 -12
  778. package/src/cursor-session-agent-resume.ts +49 -36
  779. package/src/cursor-session-agent.ts +57 -27
  780. package/src/cursor-session-compaction-prep.ts +2 -7
  781. package/src/cursor-session-scope.ts +87 -39
  782. package/src/cursor-session-send-policy.ts +2 -2
  783. package/src/cursor-session-settings.ts +72 -0
  784. package/src/cursor-session-store.ts +259 -53
  785. package/src/cursor-skill-tool.ts +37 -61
  786. package/src/cursor-state.ts +81 -69
  787. package/src/cursor-tool-manifest.ts +1 -1
  788. package/src/cursor-usage-accounting.ts +17 -82
  789. package/src/cursor-usage-command.ts +76 -0
  790. package/src/cursor-usage-ledger.ts +500 -0
  791. package/src/index.ts +30 -39
  792. package/src/model-discovery.ts +76 -45
  793. package/src/model-list-cache.ts +11 -1
  794. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +0 -1
  795. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +0 -1
  796. package/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +0 -1
  797. package/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +0 -1
  798. package/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +0 -1
  799. package/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "node:crypto";
2
- import { closeSync, constants, existsSync, fchmodSync, fstatSync, fsyncSync, lstatSync, openSync, readFileSync, readSync, writeFileSync } from "node:fs";
2
+ import { closeSync, constants, existsSync, fchmodSync, fstatSync, fsyncSync, openSync, readFileSync, readSync, writeFileSync } from "node:fs";
3
3
  import { dirname, join } from "node:path";
4
4
  import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext, SessionEntry } from "@earendil-works/pi-coding-agent";
5
5
  import { resolveCursorApiKey } from "./cursor-api-key.js";
@@ -12,7 +12,7 @@ import {
12
12
  CLOUD_LIFECYCLE_ENTRY_TYPE,
13
13
  CLOUD_LIFECYCLE_JOURNAL_PREFIX,
14
14
  } from "../shared/cursor-cloud-lifecycle-constants.mjs";
15
- import { fsyncExistingRegularFile, noFollowFlag, openExistingRegularFileNoFollow } from "./cursor-durable-fs.js";
15
+ import { createRegularFileExclusive, fsyncExistingRegularFile, openExistingRegularFileNoFollow } from "./cursor-durable-fs.js";
16
16
  import { truncateCursorDisplayLine } from "./cursor-display-text.js";
17
17
  import { asRecord, getString } from "./cursor-record-utils.js";
18
18
  import { scrubSensitiveText } from "./cursor-sensitive-text.js";
@@ -83,6 +83,7 @@ interface CloudLifecycleSessionState {
83
83
  getBranch?: () => SessionEntry[];
84
84
  }
85
85
 
86
+ const cloudBindings = new Map<object, { api: CloudLifecycleApi; session: CloudLifecycleSessionState }>();
86
87
  let cloudLifecycleApi: CloudLifecycleApi | undefined;
87
88
  let cloudLifecycleSession: CloudLifecycleSessionState = {};
88
89
  let durableWriterForTests: ((data: CursorCloudLifecycleEntryData) => boolean) | undefined;
@@ -178,11 +179,12 @@ function buildBaseEntry(agentId: string, action: CloudLifecycleAction): CursorCl
178
179
  };
179
180
  }
180
181
 
181
- function captureCloudLifecycleSession(ctx: CloudLifecycleSessionContext): void {
182
- cloudLifecycleSession = {
183
- sessionFile: ctx.sessionManager.getSessionFile?.() ?? undefined,
184
- sessionId: ctx.sessionManager.getSessionId?.() ?? undefined,
185
- getBranch: () => ctx.sessionManager.getBranch(),
182
+ function captureCloudLifecycleSession(ctx: CloudLifecycleSessionContext): CloudLifecycleSessionState {
183
+ const manager = ctx.sessionManager;
184
+ return {
185
+ sessionFile: manager.getSessionFile() ?? undefined,
186
+ sessionId: manager.getSessionId(),
187
+ getBranch: () => manager.getBranch(),
186
188
  };
187
189
  }
188
190
 
@@ -191,38 +193,16 @@ function durableLedgerPath(sessionFile: string, sessionId: string): string {
191
193
  return join(dirname(sessionFile), `${DURABLE_LEDGER_PREFIX}-${sessionHash}.journal`);
192
194
  }
193
195
 
194
- function sameFileIdentity(left: { dev: number; ino: number }, right: { dev: number; ino: number }): boolean {
195
- return left.dev === right.dev && left.ino === right.ino;
196
- }
197
-
198
- function createRegularFileExclusive(path: string, flags: number, mode: number): number {
199
- let fd: number | undefined;
200
- try {
201
- fd = openSync(path, flags | constants.O_CREAT | constants.O_EXCL | noFollowFlag(), mode);
202
- const opened = fstatSync(fd);
203
- const after = lstatSync(path);
204
- if (!opened.isFile() || !after.isFile() || !sameFileIdentity(opened, after)) {
205
- throw new Error("created journal path changed while opening");
206
- }
207
- return fd;
208
- } catch (error) {
209
- if (fd !== undefined) {
210
- try { closeSync(fd); } catch {}
211
- }
212
- throw error;
213
- }
214
- }
215
-
216
- function fsyncCloudLifecycleSessionFile(): boolean {
196
+ function fsyncCloudLifecycleSessionFile(session: CloudLifecycleSessionState): boolean {
217
197
  if (sessionFsyncForTests) return sessionFsyncForTests();
218
- const sessionFile = cloudLifecycleSession.sessionFile;
198
+ const sessionFile = session.sessionFile;
219
199
  if (!sessionFile || !existsSync(sessionFile)) return true;
220
200
  return fsyncExistingRegularFile(sessionFile);
221
201
  }
222
202
 
223
- function appendDurableCloudLifecycleEntry(data: CursorCloudLifecycleEntryData, anchorEntryId: string): boolean {
203
+ function appendDurableCloudLifecycleEntry(data: CursorCloudLifecycleEntryData, anchorEntryId: string, session: CloudLifecycleSessionState): boolean {
224
204
  if (durableWriterForTests) return durableWriterForTests(data);
225
- const { sessionFile, sessionId } = cloudLifecycleSession;
205
+ const { sessionFile, sessionId } = session;
226
206
  if (!sessionFile || !sessionId) return false;
227
207
  const entry: DurableCloudLifecycleEntry = {
228
208
  ...data,
@@ -269,13 +249,13 @@ function appendDurableCloudLifecycleEntry(data: CursorCloudLifecycleEntryData, a
269
249
  }
270
250
  }
271
251
 
272
- function appendCloudLifecycleEntry(pi: CloudLifecycleApi, data: CursorCloudLifecycleEntryData | undefined): boolean {
273
- if (!data || (!durableWriterForTests && (!cloudLifecycleSession.sessionFile || !cloudLifecycleSession.sessionId))) return false;
252
+ function appendCloudLifecycleEntry(pi: CloudLifecycleApi, data: CursorCloudLifecycleEntryData | undefined, session: CloudLifecycleSessionState): boolean {
253
+ if (!data || (!durableWriterForTests && (!session.sessionFile || !session.sessionId))) return false;
274
254
  let anchorEntryId: string | undefined;
275
255
  try {
276
- const previousEntryId = durableWriterForTests ? undefined : cloudLifecycleSession.getBranch?.().at(-1)?.id;
256
+ const previousEntryId = durableWriterForTests ? undefined : session.getBranch?.().at(-1)?.id;
277
257
  pi.appendEntry<CursorCloudLifecycleEntryData>(CLOUD_LIFECYCLE_ENTRY_TYPE, data);
278
- const anchor = cloudLifecycleSession.getBranch?.().at(-1);
258
+ const anchor = session.getBranch?.().at(-1);
279
259
  anchorEntryId = durableWriterForTests
280
260
  ? "test-cloud-lifecycle-entry"
281
261
  : anchor?.type === "custom" &&
@@ -287,19 +267,19 @@ function appendCloudLifecycleEntry(pi: CloudLifecycleApi, data: CursorCloudLifec
287
267
  return false;
288
268
  }
289
269
  return anchorEntryId !== undefined &&
290
- fsyncCloudLifecycleSessionFile() &&
291
- appendDurableCloudLifecycleEntry(data, anchorEntryId);
270
+ fsyncCloudLifecycleSessionFile(session) &&
271
+ appendDurableCloudLifecycleEntry(data, anchorEntryId, session);
292
272
  }
293
273
 
294
274
  function appendCloudLifecycleMutationEntry(
295
- pi: CloudLifecycleApi,
296
- ctx: CloudLifecycleCommandContext,
275
+ pi: CloudLifecycleApi | undefined,
297
276
  data: CursorCloudLifecycleEntryData | undefined,
277
+ session: CloudLifecycleSessionState,
278
+ anchorEntryId: string | undefined,
298
279
  ): boolean {
299
- const anchorEntryId = ctx.sessionManager.getBranch().at(-1)?.id;
300
- if (!data || !anchorEntryId || !fsyncCloudLifecycleSessionFile() || !appendDurableCloudLifecycleEntry(data, anchorEntryId)) return false;
280
+ if (!data || !anchorEntryId || !fsyncCloudLifecycleSessionFile(session) || !appendDurableCloudLifecycleEntry(data, anchorEntryId, session)) return false;
301
281
  try {
302
- pi.appendEntry<CursorCloudLifecycleEntryData>(CLOUD_LIFECYCLE_ENTRY_TYPE, data);
282
+ pi?.appendEntry<CursorCloudLifecycleEntryData>(CLOUD_LIFECYCLE_ENTRY_TYPE, data);
303
283
  } catch {
304
284
  // The fsynced mutation journal is authoritative.
305
285
  }
@@ -308,38 +288,54 @@ function appendCloudLifecycleMutationEntry(
308
288
 
309
289
  export function registerCursorCloudLifecycleLedger(pi: CloudLifecycleApi): void {
310
290
  cloudLifecycleApi = pi;
311
- pi.on("session_start", (_event, ctx) => captureCloudLifecycleSession(ctx));
312
- pi.on("before_agent_start", (_event, ctx) => captureCloudLifecycleSession(ctx));
313
- pi.on("session_tree", (_event, ctx) => captureCloudLifecycleSession(ctx));
291
+ const binding = { api: pi, session: {} as CloudLifecycleSessionState };
292
+ cloudBindings.set(pi, binding);
293
+ const capture = (ctx: CloudLifecycleSessionContext) => {
294
+ binding.session = captureCloudLifecycleSession(ctx);
295
+ cloudLifecycleSession = binding.session;
296
+ };
297
+ pi.on("session_start", (_event, ctx) => capture(ctx));
298
+ pi.on("before_agent_start", (_event, ctx) => capture(ctx));
299
+ pi.on("session_tree", (_event, ctx) => capture(ctx));
300
+ pi.on("session_shutdown", () => { cloudBindings.delete(pi); });
314
301
  }
315
302
 
316
303
  export function recordCursorCloudLifecycleRun(
317
304
  report: Omit<CursorCloudRunReport, "runId"> & { runId?: string },
318
- options: { apiKey?: string } = {},
305
+ options: { apiKey?: string; binding?: { api: CloudLifecycleApi; session: CloudLifecycleSessionState } } = {},
319
306
  ): boolean {
320
- if (!cloudLifecycleApi) return false;
307
+ const api = options.binding?.api ?? cloudLifecycleApi;
308
+ if (!api) return false;
321
309
  const baseEntry = buildBaseEntry(report.agentId, "record");
322
310
  if (!baseEntry) return false;
323
311
  const branches = buildBranchEntries(report, options.apiKey);
324
312
  const runId = typeof report.runId === "string"
325
313
  ? sanitizeLedgerString(report.runId, MAX_LEDGER_RUN_ID_LENGTH, options.apiKey)
326
314
  : "";
327
- return appendCloudLifecycleEntry(cloudLifecycleApi, {
315
+ return appendCloudLifecycleEntry(api, {
328
316
  ...baseEntry,
329
317
  ...(runId ? { runId } : {}),
330
318
  ...(branches ? { branches } : {}),
331
- });
319
+ }, options.binding?.session ?? cloudLifecycleSession);
332
320
  }
333
321
 
334
- export function recordCursorCloudLifecycleSafely(
335
- report: { agentId: string; runId?: string },
322
+ export type CursorCloudLifecycleRecorder = (
323
+ report: { agentId: string; runId?: string; branches?: CursorCloudRunReport["branches"] },
336
324
  apiKey: string | undefined,
337
- ): boolean {
338
- try {
339
- return recordCursorCloudLifecycleRun({ ...report, branches: [] }, { apiKey });
340
- } catch {
341
- return false;
342
- }
325
+ ) => boolean;
326
+
327
+ export function captureCursorCloudLifecycleRecorder(owner?: object): CursorCloudLifecycleRecorder {
328
+ const current = owner ? cloudBindings.get(owner) : undefined;
329
+ const api = current?.api ?? (owner ? undefined : cloudLifecycleApi);
330
+ const session = { ...(current?.session ?? (owner ? {} : cloudLifecycleSession)) };
331
+ return (report, apiKey) => {
332
+ if (!api) return false;
333
+ try {
334
+ return recordCursorCloudLifecycleRun({ ...report, branches: report.branches ?? [] }, { apiKey, binding: { api, session } });
335
+ } catch {
336
+ return false;
337
+ }
338
+ };
343
339
  }
344
340
 
345
341
  export function createCursorCloudLifecyclePersistenceError(
@@ -444,9 +440,8 @@ export function readCursorCloudLifecycleAgents(entries: readonly SessionEntry[])
444
440
  return reduceCloudLifecycleEntries(readCursorCloudLifecycleEntries(entries));
445
441
  }
446
442
 
447
- function readDurableCloudLifecycleJournal(ctx: CloudLifecycleCommandContext): ParsedDurableCloudLifecycleEntry[] {
448
- const sessionFile = ctx.sessionManager.getSessionFile?.();
449
- const sessionId = ctx.sessionManager.getSessionId?.();
443
+ function readDurableCloudLifecycleJournal(session: CloudLifecycleSessionState): ParsedDurableCloudLifecycleEntry[] {
444
+ const { sessionFile, sessionId } = session;
450
445
  if (!sessionFile || !sessionId) return [];
451
446
  let fd: number | undefined;
452
447
  let lines: string[];
@@ -478,12 +473,12 @@ function readDurableCloudLifecycleJournal(ctx: CloudLifecycleCommandContext): Pa
478
473
  return entries;
479
474
  }
480
475
 
481
- function readDurableCloudLifecycleEntries(ctx: CloudLifecycleCommandContext): CursorCloudLifecycleEntryData[] {
482
- const sessionFile = ctx.sessionManager.getSessionFile?.();
476
+ function readDurableCloudLifecycleEntries(session: CloudLifecycleSessionState): CursorCloudLifecycleEntryData[] {
477
+ const { sessionFile } = session;
483
478
  if (!sessionFile) return [];
484
479
  const fileless = !existsSync(sessionFile);
485
- const branchIds = new Set(ctx.sessionManager.getBranch().map((entry) => entry.id));
486
- return readDurableCloudLifecycleJournal(ctx).flatMap((entry) => {
480
+ const branchIds = new Set((session.getBranch?.() ?? []).map((entry) => entry.id));
481
+ return readDurableCloudLifecycleJournal(session).flatMap((entry) => {
487
482
  if (entry.data.action !== "record") return [entry.data];
488
483
  if (fileless) return entry.anchorEntryId === null ? [entry.data] : [];
489
484
  return entry.anchorEntryId !== null && branchIds.has(entry.anchorEntryId) ? [entry.data] : [];
@@ -494,17 +489,17 @@ function cloudLifecycleEntryKey(data: CursorCloudLifecycleEntryData): string {
494
489
  return JSON.stringify([data.action, data.agentId, data.runId, data.timestamp, data.branches]);
495
490
  }
496
491
 
497
- function reconcileDurableCloudLifecycleOrphans(pi: CloudLifecycleApi, ctx: CloudLifecycleCommandContext): boolean {
498
- const sessionFile = ctx.sessionManager.getSessionFile?.();
492
+ function reconcileDurableCloudLifecycleOrphans(pi: CloudLifecycleApi, session: CloudLifecycleSessionState): boolean {
493
+ const { sessionFile } = session;
499
494
  if (!sessionFile || !existsSync(sessionFile)) return true;
500
- const journal = readDurableCloudLifecycleJournal(ctx);
495
+ const journal = readDurableCloudLifecycleJournal(session);
501
496
  const claimedAgentIds = new Set(journal.flatMap((entry) =>
502
497
  entry.data.action === "record" && entry.anchorEntryId !== null ? [entry.data.agentId] : []));
503
498
  const latestOrphanByAgent = new Map<string, ParsedDurableCloudLifecycleEntry>();
504
499
  for (const entry of journal) {
505
500
  if (entry.data.action === "record" && entry.anchorEntryId === null) latestOrphanByAgent.set(entry.data.agentId, entry);
506
501
  }
507
- const branch = ctx.sessionManager.getBranch();
502
+ const branch = session.getBranch?.() ?? [];
508
503
  for (const [agentId, orphan] of latestOrphanByAgent) {
509
504
  if (claimedAgentIds.has(agentId)) continue;
510
505
  let matchingEntry: SessionEntry | undefined;
@@ -518,24 +513,24 @@ function reconcileDurableCloudLifecycleOrphans(pi: CloudLifecycleApi, ctx: Cloud
518
513
  }
519
514
  }
520
515
  if (matchingEntry) {
521
- if (!fsyncCloudLifecycleSessionFile() || !appendDurableCloudLifecycleEntry(orphan.data, matchingEntry.id)) return false;
516
+ if (!fsyncCloudLifecycleSessionFile(session) || !appendDurableCloudLifecycleEntry(orphan.data, matchingEntry.id, session)) return false;
522
517
  continue;
523
518
  }
524
- if (orphan.sessionFile !== sessionFile && !appendCloudLifecycleEntry(pi, orphan.data)) return false;
519
+ if (orphan.sessionFile !== sessionFile && !appendCloudLifecycleEntry(pi, orphan.data, session)) return false;
525
520
  }
526
521
  return true;
527
522
  }
528
523
 
529
- function reconcileDurableCloudLifecycleOrphansForCommand(pi: CloudLifecycleApi, ctx: CloudLifecycleCommandContext): boolean {
530
- if (reconcileDurableCloudLifecycleOrphans(pi, ctx)) return true;
524
+ function reconcileDurableCloudLifecycleOrphansForCommand(pi: CloudLifecycleApi, ctx: CloudLifecycleCommandContext, session: CloudLifecycleSessionState): boolean {
525
+ if (reconcileDurableCloudLifecycleOrphans(pi, session)) return true;
531
526
  ctx.ui.notify("Unable to reconcile the durable Cursor cloud lifecycle journal with this session branch.", "error");
532
527
  return false;
533
528
  }
534
529
 
535
- function readRecordedCloudAgents(ctx: CloudLifecycleCommandContext): CursorCloudLifecycleAgentRecord[] {
536
- const durableEntries = readDurableCloudLifecycleEntries(ctx);
530
+ function readRecordedCloudAgents(session: CloudLifecycleSessionState): CursorCloudLifecycleAgentRecord[] {
531
+ const durableEntries = readDurableCloudLifecycleEntries(session);
537
532
  const durableKeys = new Set(durableEntries.map(cloudLifecycleEntryKey));
538
- const branchOnlyEntries = readCursorCloudLifecycleEntries(ctx.sessionManager.getBranch())
533
+ const branchOnlyEntries = readCursorCloudLifecycleEntries(session.getBranch?.() ?? [])
539
534
  .filter((entry) => !durableKeys.has(cloudLifecycleEntryKey(entry)));
540
535
  return reduceCloudLifecycleEntries([...durableEntries, ...branchOnlyEntries]);
541
536
  }
@@ -618,51 +613,85 @@ async function mutateRecordedCloudAgent(params: {
618
613
  ctx: CloudLifecycleCommandContext;
619
614
  agentId: string;
620
615
  action: "archive" | "delete";
621
- apiKey: string;
616
+ session: CloudLifecycleSessionState;
622
617
  }): Promise<void> {
623
- const records = readRecordedCloudAgents(params.ctx);
624
- const validationError = validateRecordedCloudAgentId(params.agentId, records, params.action);
618
+ const manager = params.ctx.sessionManager;
619
+ const ui = params.ctx.ui;
620
+ const modelRegistry = params.ctx.modelRegistry;
621
+ const binding = cloudBindings.get(params.pi);
622
+ let anchorEntryId = manager.getBranch().at(-1)?.id;
623
+ // Include recoverable fileless records before auth, without writing anything
624
+ // until credentials are available. General provider recording stays live.
625
+ const readAuthority = () => JSON.stringify([readRecordedCloudAgents(params.session), readDurableCloudLifecycleJournal(params.session)]);
626
+ let authority = readAuthority();
627
+ const isOriginCurrent = (): boolean => {
628
+ try {
629
+ return cloudBindings.get(params.pi) === binding &&
630
+ params.ctx.sessionManager === manager &&
631
+ manager.getSessionFile() === params.session.sessionFile &&
632
+ manager.getSessionId() === params.session.sessionId &&
633
+ manager.getBranch().at(-1)?.id === anchorEntryId;
634
+ } catch {
635
+ return false; // Pi invalidates the command context on owning reload.
636
+ }
637
+ };
638
+ const checkAuthority = (): boolean => {
639
+ if (isOriginCurrent() && readAuthority() === authority) return true;
640
+ ui.notify(`Cursor cloud ${params.action} was not started because its originating session branch or authority changed. Retry from the intended branch.`, "error");
641
+ return false;
642
+ };
643
+ const apiKey = await resolveCloudLifecycleMutationApiKey({ modelRegistry, ui, sessionManager: manager });
644
+ if (!apiKey || !checkAuthority()) return;
645
+ if (!reconcileDurableCloudLifecycleOrphansForCommand(params.pi, { modelRegistry, ui, sessionManager: manager }, params.session)) return;
646
+ // Reconciliation may append only the unchanged, captured orphan authority.
647
+ anchorEntryId = manager.getBranch().at(-1)?.id;
648
+ authority = readAuthority();
649
+ const validationError = validateRecordedCloudAgentId(params.agentId, readRecordedCloudAgents(params.session), params.action);
625
650
  if (validationError) {
626
- params.ctx.ui.notify(validationError, "error");
651
+ ui.notify(validationError, "error");
627
652
  return;
628
653
  }
629
- const apiKey = params.apiKey;
630
654
  let operations: CloudLifecycleSdkOperations;
631
655
  try {
632
656
  operations = await getSdkOperations();
633
657
  } catch (error) {
634
- params.ctx.ui.notify(`Failed to prepare Cursor cloud ${params.action}: ${formatCloudLifecycleError(error, apiKey)}`, "error");
658
+ ui.notify(`Failed to prepare Cursor cloud ${params.action}: ${formatCloudLifecycleError(error, apiKey)}`, "error");
635
659
  return;
636
660
  }
661
+ if (!checkAuthority()) return;
637
662
  if (!appendCloudLifecycleMutationEntry(
638
663
  params.pi,
639
- params.ctx,
640
664
  buildBaseEntry(params.agentId, params.action === "archive" ? "archive_intent" : "delete_intent"),
665
+ params.session,
666
+ anchorEntryId,
641
667
  )) {
642
- params.ctx.ui.notify(`Cursor cloud ${params.action} was not started because its durable intent could not be recorded.`, "error");
668
+ ui.notify(`Cursor cloud ${params.action} was not started because its durable intent could not be recorded.`, "error");
643
669
  return;
644
670
  }
671
+ // After SDK start the actual result belongs to this journal and post-intent
672
+ // anchor, even if Pi replaces the context or selects another branch.
673
+ anchorEntryId = manager.getBranch().at(-1)?.id;
645
674
  try {
646
675
  await operations[params.action](params.agentId, { apiKey });
647
676
  } catch (error) {
648
- params.ctx.ui.notify(
677
+ ui.notify(
649
678
  `Cursor cloud ${params.action} for agent ${params.agentId} is unresolved: ${formatCloudLifecycleError(error, apiKey)} Inspect it in the Cursor Cloud dashboard before retrying.`,
650
679
  "error",
651
680
  );
652
681
  return;
653
682
  }
654
- if (!appendCloudLifecycleMutationEntry(params.pi, params.ctx, buildBaseEntry(params.agentId, params.action))) {
655
- params.ctx.ui.notify(
683
+ if (!appendCloudLifecycleMutationEntry(isOriginCurrent() ? params.pi : undefined, buildBaseEntry(params.agentId, params.action), params.session, anchorEntryId)) {
684
+ ui.notify(
656
685
  `Cursor cloud agent ${params.agentId} ${params.action === "archive" ? "archived" : "deleted"}, but its durable result could not be recorded. Inspect it in the Cursor Cloud dashboard before retrying.`,
657
686
  "error",
658
687
  );
659
688
  return;
660
689
  }
661
- params.ctx.ui.notify(`Cursor cloud agent ${params.agentId} ${params.action === "archive" ? "archived" : "deleted"}.`, "info");
690
+ ui.notify(`Cursor cloud agent ${params.agentId} ${params.action === "archive" ? "archived" : "deleted"}.`, "info");
662
691
  }
663
692
 
664
693
  export async function runCursorCloudLifecycleCommand(pi: CloudLifecycleApi, args: string, ctx: CloudLifecycleCommandContext): Promise<void> {
665
- captureCloudLifecycleSession(ctx);
694
+ const session = captureCloudLifecycleSession(ctx);
666
695
  const usage = "Usage: /cursor-cloud list | archive <bc-agentId> | delete <bc-agentId> --yes";
667
696
  const tokens = tokenizeArgs(args);
668
697
  const [subcommand, agentId, ...rest] = tokens;
@@ -671,8 +700,8 @@ export async function runCursorCloudLifecycleCommand(pi: CloudLifecycleApi, args
671
700
  ctx.ui.notify(`Invalid Cursor cloud arguments. ${usage}`, "error");
672
701
  return;
673
702
  }
674
- if (!reconcileDurableCloudLifecycleOrphansForCommand(pi, ctx)) return;
675
- ctx.ui.notify(formatCloudLifecycleRecords(readRecordedCloudAgents(ctx)), "info");
703
+ if (!reconcileDurableCloudLifecycleOrphansForCommand(pi, ctx, session)) return;
704
+ ctx.ui.notify(formatCloudLifecycleRecords(readRecordedCloudAgents(session)), "info");
676
705
  return;
677
706
  }
678
707
  if (subcommand === "archive") {
@@ -685,9 +714,7 @@ export async function runCursorCloudLifecycleCommand(pi: CloudLifecycleApi, args
685
714
  ctx.ui.notify(validationError, "error");
686
715
  return;
687
716
  }
688
- const apiKey = await resolveCloudLifecycleMutationApiKey(ctx);
689
- if (!apiKey || !reconcileDurableCloudLifecycleOrphansForCommand(pi, ctx)) return;
690
- await mutateRecordedCloudAgent({ pi, ctx, agentId, action: "archive", apiKey });
717
+ await mutateRecordedCloudAgent({ pi, ctx, agentId, action: "archive", session });
691
718
  return;
692
719
  }
693
720
  if (subcommand === "delete") {
@@ -700,9 +727,7 @@ export async function runCursorCloudLifecycleCommand(pi: CloudLifecycleApi, args
700
727
  ctx.ui.notify(validationError, "error");
701
728
  return;
702
729
  }
703
- const apiKey = await resolveCloudLifecycleMutationApiKey(ctx);
704
- if (!apiKey || !reconcileDurableCloudLifecycleOrphansForCommand(pi, ctx)) return;
705
- await mutateRecordedCloudAgent({ pi, ctx, agentId, action: "delete", apiKey });
730
+ await mutateRecordedCloudAgent({ pi, ctx, agentId, action: "delete", session });
706
731
  return;
707
732
  }
708
733
  ctx.ui.notify(`Invalid Cursor cloud command. ${usage}`, "error");
@@ -710,6 +735,7 @@ export async function runCursorCloudLifecycleCommand(pi: CloudLifecycleApi, args
710
735
 
711
736
  export const __testUtils = {
712
737
  reset: () => {
738
+ cloudBindings.clear();
713
739
  cloudLifecycleApi = undefined;
714
740
  cloudLifecycleSession = {};
715
741
  durableWriterForTests = undefined;
@@ -49,6 +49,7 @@ export function buildCursorCloudAgentOptions(options: {
49
49
  agentMode: AgentModeOption;
50
50
  resolvedConfig: CursorResolvedSdkConfig;
51
51
  name?: string;
52
+ agents?: AgentOptions["agents"];
52
53
  }): AgentOptions {
53
54
  const { resolvedConfig } = options;
54
55
  const environment = resolvedConfig.cloud.environment.value;
@@ -91,6 +92,7 @@ export function buildCursorCloudAgentOptions(options: {
91
92
  model: options.modelSelection,
92
93
  mode: options.agentMode,
93
94
  ...(options.name ? { name: options.name } : {}),
95
+ ...(options.agents && Object.keys(options.agents).length ? { agents: options.agents } : {}),
94
96
  cloud,
95
97
  };
96
98
  }
@@ -13,6 +13,7 @@ import {
13
13
  } from "node:fs";
14
14
  import { dirname, join } from "node:path";
15
15
  import { CONFIG_DIR_NAME, getAgentDir } from "@earendil-works/pi-coding-agent";
16
+ import type { ModelThinkingLevel } from "@earendil-works/pi-ai";
16
17
  import { parseOptionalEnvBoolean } from "./cursor-env-boolean.js";
17
18
  import { asRecord } from "./cursor-record-utils.js";
18
19
 
@@ -36,6 +37,7 @@ export const CURSOR_SANDBOX_ENV = "PI_CURSOR_SANDBOX";
36
37
  export const CURSOR_LOCAL_FORCE_ENV = "PI_CURSOR_LOCAL_FORCE";
37
38
  export const CURSOR_LOCAL_RESUME_ENV = "PI_CURSOR_LOCAL_RESUME";
38
39
  export const CURSOR_HTTP1_ENV = "PI_CURSOR_HTTP_1_1";
40
+ export const CURSOR_STATE_ROOT_ENV = "PI_CURSOR_SDK_STATE_ROOT";
39
41
 
40
42
  export type CursorConfigSource = "cli" | "environment" | "project" | "user" | "session" | "model-alias" | "builtin";
41
43
  export type CursorConfigTrustLevel = "one-shot" | "environment" | "trusted-project" | "user" | "session" | "model-catalog" | "builtin";
@@ -48,9 +50,20 @@ export interface CursorCloudEnvironmentConfig {
48
50
  name?: string;
49
51
  }
50
52
 
53
+ export interface CursorCustomSubagentConfig {
54
+ description: string;
55
+ prompt: string;
56
+ model?: string;
57
+ thinking?: ModelThinkingLevel;
58
+ fast?: boolean;
59
+ }
60
+
61
+ export type CursorCustomSubagentsConfig = Record<string, CursorCustomSubagentConfig>;
62
+
51
63
  export interface CursorSdkConfig {
52
64
  fastDefaults?: Record<string, boolean>;
53
65
  runtime?: CursorRuntime;
66
+ subagents?: CursorCustomSubagentsConfig;
54
67
  cloud?: {
55
68
  repo?: string;
56
69
  branch?: string;
@@ -73,6 +86,7 @@ export interface CursorSdkConfig {
73
86
  force?: boolean;
74
87
  resume?: boolean;
75
88
  useHttp1ForAgent?: boolean;
89
+ storeRoot?: string;
76
90
  };
77
91
  }
78
92
 
@@ -94,6 +108,7 @@ export interface CursorResolvedSetting<T> {
94
108
 
95
109
  export interface CursorResolvedSdkConfig {
96
110
  runtime: CursorResolvedSetting<CursorRuntime>;
111
+ subagents: CursorResolvedSetting<CursorCustomSubagentsConfig | undefined>;
97
112
  cloud: {
98
113
  repo: CursorResolvedSetting<string | undefined>;
99
114
  branch: CursorResolvedSetting<string | undefined>;
@@ -113,6 +128,7 @@ export interface CursorResolvedSdkConfig {
113
128
  force: CursorResolvedSetting<boolean>;
114
129
  resume: CursorResolvedSetting<boolean>;
115
130
  useHttp1ForAgent: CursorResolvedSetting<boolean>;
131
+ storeRoot: CursorResolvedSetting<string | undefined>;
116
132
  };
117
133
  }
118
134
 
@@ -237,6 +253,44 @@ function parseCloudEnvironment(value: unknown): CursorCloudEnvironmentConfig | u
237
253
  return Object.keys(parsed).length > 0 ? parsed : undefined;
238
254
  }
239
255
 
256
+ const THINKING_LEVELS = {
257
+ off: true,
258
+ minimal: true,
259
+ low: true,
260
+ medium: true,
261
+ high: true,
262
+ xhigh: true,
263
+ max: true,
264
+ } satisfies Record<ModelThinkingLevel, true>;
265
+
266
+ function isCursorSubagentThinkingLevel(value: unknown): value is ModelThinkingLevel {
267
+ return typeof value === "string" && Object.hasOwn(THINKING_LEVELS, value);
268
+ }
269
+
270
+ function parseCustomSubagents(value: unknown): CursorCustomSubagentsConfig | undefined {
271
+ const record = asRecord(value);
272
+ if (!record) return undefined;
273
+ const entries: Array<[string, CursorCustomSubagentConfig]> = [];
274
+ for (const [name, raw] of Object.entries(record)) {
275
+ // Extension config policy, not an upstream SDK naming restriction.
276
+ if (!/^[A-Za-z][A-Za-z0-9._-]{0,63}$/.test(name)) continue;
277
+ const entry = asRecord(raw);
278
+ const description = parseNonEmptyString(entry?.description);
279
+ const prompt = parseNonEmptyString(entry?.prompt);
280
+ if (!entry || !description || !prompt) continue;
281
+ const model = parseNonEmptyString(entry.model);
282
+ const thinking = entry.thinking;
283
+ entries.push([name, {
284
+ description,
285
+ prompt,
286
+ ...(model ? { model } : {}),
287
+ ...(isCursorSubagentThinkingLevel(thinking) ? { thinking } : {}),
288
+ ...(typeof entry.fast === "boolean" ? { fast: entry.fast } : {}),
289
+ }]);
290
+ }
291
+ return entries.length ? Object.fromEntries(entries) : undefined;
292
+ }
293
+
240
294
  export function parseCursorSdkConfig(value: unknown): CursorSdkConfig | undefined {
241
295
  const record = asRecord(value);
242
296
  if (!record) return undefined;
@@ -244,6 +298,9 @@ export function parseCursorSdkConfig(value: unknown): CursorSdkConfig | undefine
244
298
 
245
299
  if (isCursorRuntime(record.runtime)) config.runtime = record.runtime;
246
300
 
301
+ const subagents = parseCustomSubagents(record.subagents);
302
+ if (subagents) config.subagents = subagents;
303
+
247
304
  const fastDefaults = asRecord(record.fastDefaults);
248
305
  if (fastDefaults) {
249
306
  config.fastDefaults = Object.fromEntries(
@@ -275,6 +332,7 @@ export function parseCursorSdkConfig(value: unknown): CursorSdkConfig | undefine
275
332
  const local = asRecord(record.local);
276
333
  if (local) {
277
334
  const parsedLocal: NonNullable<CursorSdkConfig["local"]> = {};
335
+ if (typeof local.storeRoot === "string" && local.storeRoot.trim()) parsedLocal.storeRoot = local.storeRoot;
278
336
  if (typeof local.autoReview === "boolean") parsedLocal.autoReview = local.autoReview;
279
337
  if (typeof local.sandbox === "boolean") parsedLocal.sandbox = local.sandbox;
280
338
  if (typeof local.force === "boolean") parsedLocal.force = local.force;
@@ -533,6 +591,8 @@ const CLOUD_ORDER: CursorFieldSource[] = ["cli", "environment", "session", "user
533
591
  const LOCAL_ORDER: CursorFieldSource[] = ["cli", "environment", "project", "user", "builtin"];
534
592
  const LOCAL_FORCE_ORDER: CursorFieldSource[] = ["cli", "environment", "builtin"];
535
593
  const HTTP1_ORDER: CursorFieldSource[] = ["session", "environment", "user", "builtin"];
594
+ const SUBAGENTS_ORDER: CursorFieldSource[] = ["project", "user", "builtin"];
595
+ const STORE_ROOT_ORDER: CursorFieldSource[] = ["environment", "user", "builtin"];
536
596
 
537
597
  function buildFieldLayers<T>(order: CursorFieldSource[], values: CursorFieldValues<T>): Array<CursorResolvedSetting<T> | undefined> {
538
598
  return order.map((source) => (source === "builtin" ? resolved("builtin", values.builtin as T) : valueFrom(source, values[source])));
@@ -550,6 +610,16 @@ function resolveEnvNamesSafetyField(order: CursorFieldSource[], values: CursorFi
550
610
  return resolveWithCap(buildFieldLayers(order, values), valueFrom("user", values.user), envNamesCap);
551
611
  }
552
612
 
613
+ export function resolveCursorLocalStoreRoot(
614
+ { env = process.env, user }: Pick<ResolveCursorSdkConfigOptions, "env" | "user"> = {},
615
+ ): CursorResolvedSetting<string | undefined> {
616
+ return resolveOrdinaryField(STORE_ROOT_ORDER, {
617
+ environment: env[CURSOR_STATE_ROOT_ENV]?.trim() ? env[CURSOR_STATE_ROOT_ENV] : undefined,
618
+ user: user?.local?.storeRoot?.trim() ? user.local.storeRoot : undefined,
619
+ builtin: undefined,
620
+ });
621
+ }
622
+
553
623
  export function cursorSdkConfigFromEnv(env: Record<string, string | undefined> = process.env): CursorSdkConfig {
554
624
  const config: CursorSdkConfig = {};
555
625
  const runtime = validateExplicitValue(env[CURSOR_RUNTIME_ENV], CURSOR_RUNTIME_ENV, isCursorRuntime, '"local" or "cloud"');
@@ -648,6 +718,11 @@ export function resolveCursorSdkConfig(options: ResolveCursorSdkConfigOptions =
648
718
  },
649
719
  (value) => (value === "cloud" ? 1 : 0),
650
720
  ),
721
+ subagents: resolveOrdinaryField(SUBAGENTS_ORDER, {
722
+ project: parseCustomSubagents(project?.subagents),
723
+ user: parseCustomSubagents(user?.subagents),
724
+ builtin: undefined,
725
+ }),
651
726
  cloud: {
652
727
  repo: resolveOrdinaryField(CLOUD_ORDER, {
653
728
  cli: cli?.cloud?.repo,
@@ -752,6 +827,7 @@ export function resolveCursorSdkConfig(options: ResolveCursorSdkConfigOptions =
752
827
  }),
753
828
  },
754
829
  local: {
830
+ storeRoot: resolveCursorLocalStoreRoot({ env: options.env, user }),
755
831
  autoReview: resolveOrdinaryField(LOCAL_ORDER, {
756
832
  cli: cli?.local?.autoReview,
757
833
  environment: env.local?.autoReview,