pi-cursor-sdk 0.5.0 → 0.5.3

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 (737) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/README.md +135 -34
  3. package/dist/context.js +55 -36
  4. package/dist/cursor-api-key.js +34 -19
  5. package/dist/cursor-cloud-options.js +1 -0
  6. package/dist/cursor-config.js +59 -0
  7. package/dist/cursor-custom-store-path.js +177 -0
  8. package/dist/cursor-custom-subagent-definitions.js +14 -0
  9. package/dist/cursor-fallback-models.generated.js +402 -1
  10. package/dist/cursor-fallback-warning.js +8 -2
  11. package/dist/cursor-live-run-coordinator.js +22 -2
  12. package/dist/cursor-local-agent-ownership.js +17 -0
  13. package/dist/cursor-mcp-timeout-override.js +3 -1
  14. package/dist/cursor-pi-tool-bridge-diagnostics.js +4 -0
  15. package/dist/cursor-pi-tool-bridge-run.js +31 -3
  16. package/dist/cursor-pi-tool-bridge-server.js +1 -1
  17. package/dist/cursor-provider-binding.js +70 -10
  18. package/dist/cursor-provider-errors.js +33 -26
  19. package/dist/cursor-provider-live-run-drain.js +10 -4
  20. package/dist/cursor-provider-run-finalizer.js +2 -1
  21. package/dist/cursor-provider-turn-prepare.js +25 -9
  22. package/dist/cursor-provider-turn-summary.js +1 -1
  23. package/dist/cursor-provider-turn-tool-ledger.js +13 -7
  24. package/dist/cursor-provider.js +2 -1
  25. package/dist/cursor-question-tool.js +5 -5
  26. package/dist/cursor-request-provenance.js +13 -2
  27. package/dist/cursor-sdk-output-filter.js +1 -1
  28. package/dist/cursor-sdk-process-error-guard.js +1 -3
  29. package/dist/cursor-sdk-runtime.js +13 -14
  30. package/dist/cursor-sdk-vendor-env.js +20 -0
  31. package/dist/cursor-session-agent-cleanup.js +38 -26
  32. package/dist/cursor-session-agent-lifecycle.js +2 -2
  33. package/dist/cursor-session-agent-lineage.js +11 -7
  34. package/dist/cursor-session-agent-resume.js +15 -9
  35. package/dist/cursor-session-agent.js +60 -23
  36. package/dist/cursor-session-scope.js +27 -14
  37. package/dist/cursor-session-send-policy.js +2 -2
  38. package/dist/cursor-session-settings.js +3 -3
  39. package/dist/cursor-session-store.js +235 -45
  40. package/dist/cursor-state.js +23 -9
  41. package/dist/cursor-tool-manifest.js +1 -1
  42. package/dist/index.js +21 -19
  43. package/dist/model-discovery.js +58 -26
  44. package/dist/model-list-cache.js +12 -1
  45. package/docs/cursor-live-smoke-checklist.md +2 -2
  46. package/docs/cursor-model-ux-spec.md +83 -30
  47. package/docs/cursor-native-tool-replay.md +16 -5
  48. package/docs/cursor-native-tool-visual-audit.md +1 -1
  49. package/docs/cursor-testing-lessons.md +63 -7
  50. package/docs/cursor-tool-surfaces.md +19 -4
  51. package/node_modules/@hono/node-server/README.md +21 -10
  52. package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
  53. package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
  54. package/node_modules/@hono/node-server/dist/index.cjs +41 -19
  55. package/node_modules/@hono/node-server/dist/index.mjs +42 -20
  56. package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
  57. package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
  58. package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
  59. package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
  60. package/node_modules/@hono/node-server/package.json +3 -2
  61. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts → auth-Anm-lwWi.d.mts} +9 -8
  62. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts.map → auth-Anm-lwWi.d.mts.map} +1 -1
  63. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs → auth-BNDyLTqp.mjs} +5 -3
  64. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs.map → auth-BNDyLTqp.mjs.map} +1 -1
  65. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs → auth-D1CeV_Jr.cjs} +5 -3
  66. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs.map → auth-D1CeV_Jr.cjs.map} +1 -1
  67. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts → auth-V9XJSCfa.d.cts} +9 -8
  68. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts.map → auth-V9XJSCfa.d.cts.map} +1 -1
  69. package/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
  70. package/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
  71. package/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
  72. package/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
  73. package/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
  74. package/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
  75. package/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
  76. package/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
  77. package/node_modules/@modelcontextprotocol/core/package.json +2 -2
  78. package/node_modules/@modelcontextprotocol/hono/README.md +7 -5
  79. package/node_modules/@modelcontextprotocol/hono/dist/index.cjs.map +1 -1
  80. package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts +5 -0
  81. package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts.map +1 -1
  82. package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts +5 -0
  83. package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts.map +1 -1
  84. package/node_modules/@modelcontextprotocol/hono/dist/index.mjs.map +1 -1
  85. package/node_modules/@modelcontextprotocol/hono/package.json +4 -4
  86. package/node_modules/@modelcontextprotocol/server/README.md +1 -7
  87. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-Bt6U_Fqb.d.mts → createMcpHandler-D4NN8WsG.d.mts} +35 -13
  88. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts.map +1 -0
  89. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-BLVe3qmU.d.cts → createMcpHandler-DZmmlN8e.d.cts} +35 -13
  90. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DZmmlN8e.d.cts.map +1 -0
  91. package/node_modules/@modelcontextprotocol/server/dist/index.cjs +32 -5
  92. package/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
  93. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts +41 -5
  94. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
  95. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts +41 -5
  96. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
  97. package/node_modules/@modelcontextprotocol/server/dist/index.mjs +32 -5
  98. package/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
  99. package/node_modules/@modelcontextprotocol/server/dist/{mcp-DUcCQSTW.cjs → mcp-BumlNux0.cjs} +73 -23
  100. package/node_modules/@modelcontextprotocol/server/dist/mcp-BumlNux0.cjs.map +1 -0
  101. package/node_modules/@modelcontextprotocol/server/dist/{mcp-Dw2OlZ1f.mjs → mcp-DIH4cS6P.mjs} +73 -23
  102. package/node_modules/@modelcontextprotocol/server/dist/mcp-DIH4cS6P.mjs.map +1 -0
  103. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +1 -1
  104. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +1 -1
  105. package/node_modules/@modelcontextprotocol/server/dist/{src-CgFsfg3E.cjs → src-BhnGYybN.cjs} +29 -11
  106. package/node_modules/@modelcontextprotocol/server/dist/src-BhnGYybN.cjs.map +1 -0
  107. package/node_modules/@modelcontextprotocol/server/dist/{src-D-y6h4N7.mjs → src-Cqbh3MYc.mjs} +29 -11
  108. package/node_modules/@modelcontextprotocol/server/dist/src-Cqbh3MYc.mjs.map +1 -0
  109. package/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +2 -2
  110. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +1 -1
  111. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +1 -1
  112. package/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +2 -2
  113. package/node_modules/@modelcontextprotocol/server/package.json +4 -4
  114. package/node_modules/hono/dist/_virtual/_rolldown/runtime.js +13 -0
  115. package/node_modules/hono/dist/adapter/aws-lambda/conninfo.js +42 -23
  116. package/node_modules/hono/dist/adapter/aws-lambda/handler.js +318 -344
  117. package/node_modules/hono/dist/adapter/aws-lambda/index.js +2 -8
  118. package/node_modules/hono/dist/adapter/aws-lambda/types.js +1 -0
  119. package/node_modules/hono/dist/adapter/bun/conninfo.js +20 -25
  120. package/node_modules/hono/dist/adapter/bun/index.js +3 -13
  121. package/node_modules/hono/dist/adapter/bun/serve-static.js +27 -27
  122. package/node_modules/hono/dist/adapter/bun/server.js +11 -5
  123. package/node_modules/hono/dist/adapter/bun/ssg.js +25 -15
  124. package/node_modules/hono/dist/adapter/bun/websocket.js +61 -68
  125. package/node_modules/hono/dist/adapter/cloudflare-pages/conninfo.js +24 -9
  126. package/node_modules/hono/dist/adapter/cloudflare-pages/handler.js +59 -62
  127. package/node_modules/hono/dist/adapter/cloudflare-pages/index.js +2 -8
  128. package/node_modules/hono/dist/adapter/cloudflare-workers/conninfo.js +7 -9
  129. package/node_modules/hono/dist/adapter/cloudflare-workers/index.js +3 -8
  130. package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static-module.js +5 -6
  131. package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static.js +26 -20
  132. package/node_modules/hono/dist/adapter/cloudflare-workers/utils.js +21 -34
  133. package/node_modules/hono/dist/adapter/cloudflare-workers/websocket.js +31 -39
  134. package/node_modules/hono/dist/adapter/deno/conninfo.js +16 -13
  135. package/node_modules/hono/dist/adapter/deno/deno.d.js +1 -0
  136. package/node_modules/hono/dist/adapter/deno/index.js +3 -10
  137. package/node_modules/hono/dist/adapter/deno/serve-static.js +33 -38
  138. package/node_modules/hono/dist/adapter/deno/ssg.js +27 -16
  139. package/node_modules/hono/dist/adapter/deno/websocket.js +30 -30
  140. package/node_modules/hono/dist/adapter/lambda-edge/conninfo.js +7 -9
  141. package/node_modules/hono/dist/adapter/lambda-edge/handler.js +102 -101
  142. package/node_modules/hono/dist/adapter/lambda-edge/index.js +2 -6
  143. package/node_modules/hono/dist/adapter/netlify/conninfo.js +24 -9
  144. package/node_modules/hono/dist/adapter/netlify/handler.js +10 -8
  145. package/node_modules/hono/dist/adapter/netlify/index.js +3 -2
  146. package/node_modules/hono/dist/adapter/netlify/mod.js +2 -6
  147. package/node_modules/hono/dist/adapter/service-worker/handler.js +15 -19
  148. package/node_modules/hono/dist/adapter/service-worker/index.js +23 -7
  149. package/node_modules/hono/dist/adapter/service-worker/types.js +1 -0
  150. package/node_modules/hono/dist/adapter/vercel/conninfo.js +7 -10
  151. package/node_modules/hono/dist/adapter/vercel/handler.js +8 -6
  152. package/node_modules/hono/dist/adapter/vercel/index.js +2 -6
  153. package/node_modules/hono/dist/cjs/_virtual/_rolldown/runtime.js +33 -0
  154. package/node_modules/hono/dist/cjs/adapter/aws-lambda/conninfo.js +42 -44
  155. package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +326 -373
  156. package/node_modules/hono/dist/cjs/adapter/aws-lambda/index.js +7 -34
  157. package/node_modules/hono/dist/cjs/adapter/aws-lambda/types.js +0 -15
  158. package/node_modules/hono/dist/cjs/adapter/bun/conninfo.js +21 -47
  159. package/node_modules/hono/dist/cjs/adapter/bun/index.js +14 -45
  160. package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +29 -50
  161. package/node_modules/hono/dist/cjs/adapter/bun/server.js +11 -26
  162. package/node_modules/hono/dist/cjs/adapter/bun/ssg.js +24 -35
  163. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +63 -91
  164. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/conninfo.js +25 -31
  165. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/handler.js +61 -85
  166. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/index.js +7 -34
  167. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/conninfo.js +8 -31
  168. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/index.js +7 -33
  169. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static-module.js +7 -29
  170. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static.js +27 -42
  171. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/utils.js +21 -55
  172. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/websocket.js +33 -62
  173. package/node_modules/hono/dist/cjs/adapter/deno/conninfo.js +16 -34
  174. package/node_modules/hono/dist/cjs/adapter/deno/index.js +10 -38
  175. package/node_modules/hono/dist/cjs/adapter/deno/serve-static.js +33 -59
  176. package/node_modules/hono/dist/cjs/adapter/deno/ssg.js +27 -37
  177. package/node_modules/hono/dist/cjs/adapter/deno/websocket.js +32 -53
  178. package/node_modules/hono/dist/cjs/adapter/lambda-edge/conninfo.js +8 -31
  179. package/node_modules/hono/dist/cjs/adapter/lambda-edge/handler.js +102 -130
  180. package/node_modules/hono/dist/cjs/adapter/lambda-edge/index.js +5 -30
  181. package/node_modules/hono/dist/cjs/adapter/netlify/conninfo.js +25 -31
  182. package/node_modules/hono/dist/cjs/adapter/netlify/handler.js +10 -29
  183. package/node_modules/hono/dist/cjs/adapter/netlify/index.js +5 -21
  184. package/node_modules/hono/dist/cjs/adapter/netlify/mod.js +5 -30
  185. package/node_modules/hono/dist/cjs/adapter/service-worker/handler.js +16 -41
  186. package/node_modules/hono/dist/cjs/adapter/service-worker/index.js +25 -30
  187. package/node_modules/hono/dist/cjs/adapter/service-worker/types.js +0 -15
  188. package/node_modules/hono/dist/cjs/adapter/vercel/conninfo.js +8 -32
  189. package/node_modules/hono/dist/cjs/adapter/vercel/handler.js +8 -27
  190. package/node_modules/hono/dist/cjs/adapter/vercel/index.js +5 -30
  191. package/node_modules/hono/dist/cjs/client/client.js +139 -212
  192. package/node_modules/hono/dist/cjs/client/fetch-result-please.js +62 -80
  193. package/node_modules/hono/dist/cjs/client/index.js +7 -32
  194. package/node_modules/hono/dist/cjs/client/types.js +0 -15
  195. package/node_modules/hono/dist/cjs/client/utils.js +54 -92
  196. package/node_modules/hono/dist/cjs/compose.js +49 -66
  197. package/node_modules/hono/dist/cjs/context.js +379 -450
  198. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +47 -72
  199. package/node_modules/hono/dist/cjs/helper/accepts/index.js +3 -27
  200. package/node_modules/hono/dist/cjs/helper/adapter/index.js +33 -73
  201. package/node_modules/hono/dist/cjs/helper/conninfo/index.js +0 -15
  202. package/node_modules/hono/dist/cjs/helper/conninfo/types.js +0 -15
  203. package/node_modules/hono/dist/cjs/helper/cookie/index.js +75 -116
  204. package/node_modules/hono/dist/cjs/helper/css/common.js +165 -244
  205. package/node_modules/hono/dist/cjs/helper/css/index.js +136 -151
  206. package/node_modules/hono/dist/cjs/helper/dev/index.js +45 -71
  207. package/node_modules/hono/dist/cjs/helper/factory/index.js +30 -51
  208. package/node_modules/hono/dist/cjs/helper/html/index.js +32 -62
  209. package/node_modules/hono/dist/cjs/helper/proxy/index.js +113 -106
  210. package/node_modules/hono/dist/cjs/helper/route/index.js +123 -66
  211. package/node_modules/hono/dist/cjs/helper/ssg/index.js +19 -43
  212. package/node_modules/hono/dist/cjs/helper/ssg/middleware.js +56 -64
  213. package/node_modules/hono/dist/cjs/helper/ssg/plugins.js +55 -57
  214. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +196 -296
  215. package/node_modules/hono/dist/cjs/helper/ssg/utils.js +47 -90
  216. package/node_modules/hono/dist/cjs/helper/streaming/index.js +8 -35
  217. package/node_modules/hono/dist/cjs/helper/streaming/sse.js +53 -85
  218. package/node_modules/hono/dist/cjs/helper/streaming/stream.js +23 -53
  219. package/node_modules/hono/dist/cjs/helper/streaming/text.js +10 -32
  220. package/node_modules/hono/dist/cjs/helper/streaming/utils.js +13 -32
  221. package/node_modules/hono/dist/cjs/helper/testing/index.js +16 -31
  222. package/node_modules/hono/dist/cjs/helper/websocket/index.js +51 -76
  223. package/node_modules/hono/dist/cjs/hono-base.js +347 -403
  224. package/node_modules/hono/dist/cjs/hono.js +28 -42
  225. package/node_modules/hono/dist/cjs/http-exception.js +55 -56
  226. package/node_modules/hono/dist/cjs/index.js +22 -30
  227. package/node_modules/hono/dist/cjs/jsx/base.js +237 -366
  228. package/node_modules/hono/dist/cjs/jsx/children.js +16 -41
  229. package/node_modules/hono/dist/cjs/jsx/components.js +119 -192
  230. package/node_modules/hono/dist/cjs/jsx/constants.js +15 -42
  231. package/node_modules/hono/dist/cjs/jsx/context.js +144 -162
  232. package/node_modules/hono/dist/cjs/jsx/dom/client.js +49 -69
  233. package/node_modules/hono/dist/cjs/jsx/dom/components.js +23 -52
  234. package/node_modules/hono/dist/cjs/jsx/dom/context.js +39 -67
  235. package/node_modules/hono/dist/cjs/jsx/dom/css.js +143 -158
  236. package/node_modules/hono/dist/cjs/jsx/dom/hooks/index.js +55 -64
  237. package/node_modules/hono/dist/cjs/jsx/dom/index.js +114 -173
  238. package/node_modules/hono/dist/cjs/jsx/dom/intrinsic-element/components.js +282 -375
  239. package/node_modules/hono/dist/cjs/jsx/dom/jsx-dev-runtime.js +14 -49
  240. package/node_modules/hono/dist/cjs/jsx/dom/jsx-runtime.js +5 -32
  241. package/node_modules/hono/dist/cjs/jsx/dom/render.js +469 -623
  242. package/node_modules/hono/dist/cjs/jsx/dom/server.js +37 -64
  243. package/node_modules/hono/dist/cjs/jsx/dom/utils.js +7 -30
  244. package/node_modules/hono/dist/cjs/jsx/hooks/index.js +225 -318
  245. package/node_modules/hono/dist/cjs/jsx/index.js +86 -135
  246. package/node_modules/hono/dist/cjs/jsx/intrinsic-element/common.js +20 -43
  247. package/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +117 -168
  248. package/node_modules/hono/dist/cjs/jsx/intrinsic-elements.js +0 -15
  249. package/node_modules/hono/dist/cjs/jsx/jsx-dev-runtime.js +14 -39
  250. package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +34 -68
  251. package/node_modules/hono/dist/cjs/jsx/streaming.js +123 -166
  252. package/node_modules/hono/dist/cjs/jsx/types.js +0 -15
  253. package/node_modules/hono/dist/cjs/jsx/utils.js +91 -175
  254. package/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +98 -86
  255. package/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +92 -109
  256. package/node_modules/hono/dist/cjs/middleware/body-limit/index.js +66 -72
  257. package/node_modules/hono/dist/cjs/middleware/cache/index.js +153 -199
  258. package/node_modules/hono/dist/cjs/middleware/combine/index.js +135 -95
  259. package/node_modules/hono/dist/cjs/middleware/compress/index.js +73 -88
  260. package/node_modules/hono/dist/cjs/middleware/context-storage/index.js +49 -41
  261. package/node_modules/hono/dist/cjs/middleware/cors/index.js +107 -107
  262. package/node_modules/hono/dist/cjs/middleware/csrf/index.js +101 -72
  263. package/node_modules/hono/dist/cjs/middleware/etag/digest.js +58 -97
  264. package/node_modules/hono/dist/cjs/middleware/etag/index.js +71 -91
  265. package/node_modules/hono/dist/cjs/middleware/ip-restriction/index.js +161 -169
  266. package/node_modules/hono/dist/cjs/middleware/jsx-renderer/index.js +99 -77
  267. package/node_modules/hono/dist/cjs/middleware/jwk/index.js +3 -27
  268. package/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +118 -135
  269. package/node_modules/hono/dist/cjs/middleware/jwt/index.js +9 -38
  270. package/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +120 -141
  271. package/node_modules/hono/dist/cjs/middleware/language/index.js +7 -35
  272. package/node_modules/hono/dist/cjs/middleware/language/language.js +184 -182
  273. package/node_modules/hono/dist/cjs/middleware/logger/index.js +41 -62
  274. package/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +82 -88
  275. package/node_modules/hono/dist/cjs/middleware/method-override/index.js +101 -102
  276. package/node_modules/hono/dist/cjs/middleware/mount/index.js +71 -0
  277. package/node_modules/hono/dist/cjs/middleware/powered-by/index.js +23 -30
  278. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +38 -42
  279. package/node_modules/hono/dist/cjs/middleware/request-id/index.js +3 -27
  280. package/node_modules/hono/dist/cjs/middleware/request-id/request-id.js +34 -42
  281. package/node_modules/hono/dist/cjs/middleware/secure-headers/index.js +4 -29
  282. package/node_modules/hono/dist/cjs/middleware/secure-headers/permissions-policy.js +0 -15
  283. package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +142 -174
  284. package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +56 -93
  285. package/node_modules/hono/dist/cjs/middleware/serve-static/path.js +15 -38
  286. package/node_modules/hono/dist/cjs/middleware/timeout/index.js +40 -45
  287. package/node_modules/hono/dist/cjs/middleware/timing/index.js +7 -35
  288. package/node_modules/hono/dist/cjs/middleware/timing/timing.js +177 -118
  289. package/node_modules/hono/dist/cjs/middleware/trailing-slash/index.js +85 -58
  290. package/node_modules/hono/dist/cjs/preset/quick.js +18 -37
  291. package/node_modules/hono/dist/cjs/preset/tiny.js +15 -33
  292. package/node_modules/hono/dist/cjs/request/constants.js +5 -27
  293. package/node_modules/hono/dist/cjs/request.js +334 -346
  294. package/node_modules/hono/dist/cjs/router/linear-router/index.js +3 -27
  295. package/node_modules/hono/dist/cjs/router/linear-router/router.js +95 -143
  296. package/node_modules/hono/dist/cjs/router/pattern-router/index.js +3 -27
  297. package/node_modules/hono/dist/cjs/router/pattern-router/router.js +41 -63
  298. package/node_modules/hono/dist/cjs/router/reg-exp-router/index.js +7 -34
  299. package/node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js +18 -45
  300. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +91 -135
  301. package/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +92 -161
  302. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +98 -147
  303. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +73 -89
  304. package/node_modules/hono/dist/cjs/router/smart-router/index.js +3 -27
  305. package/node_modules/hono/dist/cjs/router/smart-router/router.js +49 -79
  306. package/node_modules/hono/dist/cjs/router/trie-router/index.js +3 -27
  307. package/node_modules/hono/dist/cjs/router/trie-router/node.js +134 -186
  308. package/node_modules/hono/dist/cjs/router/trie-router/router.js +15 -39
  309. package/node_modules/hono/dist/cjs/router/utils.js +5 -27
  310. package/node_modules/hono/dist/cjs/router.js +37 -37
  311. package/node_modules/hono/dist/cjs/types.js +5 -28
  312. package/node_modules/hono/dist/cjs/utils/accept.js +177 -225
  313. package/node_modules/hono/dist/cjs/utils/basic-auth.js +16 -40
  314. package/node_modules/hono/dist/cjs/utils/body.js +84 -110
  315. package/node_modules/hono/dist/cjs/utils/buffer.js +43 -91
  316. package/node_modules/hono/dist/cjs/utils/color.js +35 -44
  317. package/node_modules/hono/dist/cjs/utils/compress.js +11 -26
  318. package/node_modules/hono/dist/cjs/utils/concurrent.js +29 -59
  319. package/node_modules/hono/dist/cjs/utils/constants.js +7 -26
  320. package/node_modules/hono/dist/cjs/utils/cookie.js +107 -177
  321. package/node_modules/hono/dist/cjs/utils/crypto.js +30 -61
  322. package/node_modules/hono/dist/cjs/utils/encode.js +31 -48
  323. package/node_modules/hono/dist/cjs/utils/filepath.js +23 -54
  324. package/node_modules/hono/dist/cjs/utils/handler.js +11 -33
  325. package/node_modules/hono/dist/cjs/utils/headers.js +0 -15
  326. package/node_modules/hono/dist/cjs/utils/html.js +96 -137
  327. package/node_modules/hono/dist/cjs/utils/http-status.js +0 -15
  328. package/node_modules/hono/dist/cjs/utils/ipaddr.js +213 -286
  329. package/node_modules/hono/dist/cjs/utils/jwt/index.js +14 -27
  330. package/node_modules/hono/dist/cjs/utils/jwt/jwa.js +25 -42
  331. package/node_modules/hono/dist/cjs/utils/jwt/jws.js +119 -199
  332. package/node_modules/hono/dist/cjs/utils/jwt/jwt.js +122 -206
  333. package/node_modules/hono/dist/cjs/utils/jwt/types.js +122 -159
  334. package/node_modules/hono/dist/cjs/utils/jwt/utf8.js +9 -28
  335. package/node_modules/hono/dist/cjs/utils/mime.js +75 -101
  336. package/node_modules/hono/dist/cjs/utils/stream.js +88 -111
  337. package/node_modules/hono/dist/cjs/utils/types.js +0 -15
  338. package/node_modules/hono/dist/cjs/utils/url.js +185 -234
  339. package/node_modules/hono/dist/cjs/validator/index.js +3 -27
  340. package/node_modules/hono/dist/cjs/validator/utils.js +0 -15
  341. package/node_modules/hono/dist/cjs/validator/validator.js +60 -103
  342. package/node_modules/hono/dist/client/client.js +138 -197
  343. package/node_modules/hono/dist/client/fetch-result-please.js +59 -56
  344. package/node_modules/hono/dist/client/index.js +3 -7
  345. package/node_modules/hono/dist/client/types.js +1 -0
  346. package/node_modules/hono/dist/client/utils.js +51 -68
  347. package/node_modules/hono/dist/compose.js +49 -45
  348. package/node_modules/hono/dist/context.js +376 -426
  349. package/node_modules/hono/dist/helper/accepts/accepts.js +47 -51
  350. package/node_modules/hono/dist/helper/accepts/index.js +1 -4
  351. package/node_modules/hono/dist/helper/adapter/index.js +33 -52
  352. package/node_modules/hono/dist/helper/conninfo/index.js +1 -0
  353. package/node_modules/hono/dist/helper/conninfo/types.js +1 -0
  354. package/node_modules/hono/dist/helper/cookie/index.js +74 -94
  355. package/node_modules/hono/dist/helper/css/common.js +167 -225
  356. package/node_modules/hono/dist/helper/css/index.js +132 -137
  357. package/node_modules/hono/dist/helper/dev/index.js +44 -49
  358. package/node_modules/hono/dist/helper/factory/index.js +27 -27
  359. package/node_modules/hono/dist/helper/html/index.js +30 -39
  360. package/node_modules/hono/dist/helper/proxy/index.js +116 -88
  361. package/node_modules/hono/dist/helper/route/index.js +121 -43
  362. package/node_modules/hono/dist/helper/ssg/index.js +3 -18
  363. package/node_modules/hono/dist/helper/ssg/middleware.js +53 -40
  364. package/node_modules/hono/dist/helper/ssg/plugins.js +55 -36
  365. package/node_modules/hono/dist/helper/ssg/ssg.js +198 -283
  366. package/node_modules/hono/dist/helper/ssg/utils.js +53 -75
  367. package/node_modules/hono/dist/helper/streaming/index.js +2 -8
  368. package/node_modules/hono/dist/helper/streaming/sse.js +50 -61
  369. package/node_modules/hono/dist/helper/streaming/stream.js +22 -31
  370. package/node_modules/hono/dist/helper/streaming/text.js +9 -10
  371. package/node_modules/hono/dist/helper/streaming/utils.js +9 -12
  372. package/node_modules/hono/dist/helper/testing/index.js +16 -10
  373. package/node_modules/hono/dist/helper/websocket/index.js +49 -53
  374. package/node_modules/hono/dist/hono-base.js +344 -379
  375. package/node_modules/hono/dist/hono.js +27 -20
  376. package/node_modules/hono/dist/http-exception.js +53 -33
  377. package/node_modules/hono/dist/index.js +19 -6
  378. package/node_modules/hono/dist/jsx/base.js +231 -340
  379. package/node_modules/hono/dist/jsx/children.js +16 -20
  380. package/node_modules/hono/dist/jsx/components.js +118 -170
  381. package/node_modules/hono/dist/jsx/constants.js +9 -15
  382. package/node_modules/hono/dist/jsx/context.js +153 -150
  383. package/node_modules/hono/dist/jsx/dom/client.js +45 -48
  384. package/node_modules/hono/dist/jsx/dom/components.js +21 -29
  385. package/node_modules/hono/dist/jsx/dom/context.js +37 -44
  386. package/node_modules/hono/dist/jsx/dom/css.js +142 -147
  387. package/node_modules/hono/dist/jsx/dom/hooks/index.js +52 -40
  388. package/node_modules/hono/dist/jsx/dom/index.js +71 -134
  389. package/node_modules/hono/dist/jsx/dom/intrinsic-element/components.js +275 -359
  390. package/node_modules/hono/dist/jsx/dom/jsx-dev-runtime.js +14 -18
  391. package/node_modules/hono/dist/jsx/dom/jsx-runtime.js +2 -8
  392. package/node_modules/hono/dist/jsx/dom/render.js +492 -631
  393. package/node_modules/hono/dist/jsx/dom/server.js +32 -32
  394. package/node_modules/hono/dist/jsx/dom/utils.js +6 -8
  395. package/node_modules/hono/dist/jsx/hooks/index.js +236 -308
  396. package/node_modules/hono/dist/jsx/index.js +45 -98
  397. package/node_modules/hono/dist/jsx/intrinsic-element/common.js +20 -22
  398. package/node_modules/hono/dist/jsx/intrinsic-element/components.js +113 -154
  399. package/node_modules/hono/dist/jsx/intrinsic-elements.js +1 -0
  400. package/node_modules/hono/dist/jsx/jsx-dev-runtime.js +12 -16
  401. package/node_modules/hono/dist/jsx/jsx-runtime.js +29 -42
  402. package/node_modules/hono/dist/jsx/streaming.js +120 -142
  403. package/node_modules/hono/dist/jsx/types.js +1 -0
  404. package/node_modules/hono/dist/jsx/utils.js +105 -168
  405. package/node_modules/hono/dist/middleware/basic-auth/index.js +96 -63
  406. package/node_modules/hono/dist/middleware/bearer-auth/index.js +93 -89
  407. package/node_modules/hono/dist/middleware/body-limit/index.js +66 -51
  408. package/node_modules/hono/dist/middleware/cache/index.js +165 -190
  409. package/node_modules/hono/dist/middleware/combine/index.js +134 -73
  410. package/node_modules/hono/dist/middleware/compress/index.js +75 -69
  411. package/node_modules/hono/dist/middleware/context-storage/index.js +49 -19
  412. package/node_modules/hono/dist/middleware/cors/index.js +107 -86
  413. package/node_modules/hono/dist/middleware/csrf/index.js +103 -53
  414. package/node_modules/hono/dist/middleware/etag/digest.js +59 -77
  415. package/node_modules/hono/dist/middleware/etag/index.js +71 -70
  416. package/node_modules/hono/dist/middleware/ip-restriction/index.js +163 -158
  417. package/node_modules/hono/dist/middleware/jsx-renderer/index.js +97 -54
  418. package/node_modules/hono/dist/middleware/jwk/index.js +1 -4
  419. package/node_modules/hono/dist/middleware/jwk/jwk.js +116 -112
  420. package/node_modules/hono/dist/middleware/jwt/index.js +2 -10
  421. package/node_modules/hono/dist/middleware/jwt/jwt.js +114 -114
  422. package/node_modules/hono/dist/middleware/language/index.js +2 -15
  423. package/node_modules/hono/dist/middleware/language/language.js +180 -157
  424. package/node_modules/hono/dist/middleware/logger/index.js +43 -37
  425. package/node_modules/hono/dist/middleware/method-not-allowed/index.js +81 -66
  426. package/node_modules/hono/dist/middleware/method-override/index.js +101 -81
  427. package/node_modules/hono/dist/middleware/mount/index.js +70 -0
  428. package/node_modules/hono/dist/middleware/powered-by/index.js +23 -9
  429. package/node_modules/hono/dist/middleware/pretty-json/index.js +39 -22
  430. package/node_modules/hono/dist/middleware/request-id/index.js +1 -4
  431. package/node_modules/hono/dist/middleware/request-id/request-id.js +33 -20
  432. package/node_modules/hono/dist/middleware/secure-headers/index.js +1 -5
  433. package/node_modules/hono/dist/middleware/secure-headers/permissions-policy.js +1 -0
  434. package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +144 -155
  435. package/node_modules/hono/dist/middleware/serve-static/index.js +56 -72
  436. package/node_modules/hono/dist/middleware/serve-static/path.js +15 -17
  437. package/node_modules/hono/dist/middleware/timeout/index.js +40 -23
  438. package/node_modules/hono/dist/middleware/timing/index.js +2 -9
  439. package/node_modules/hono/dist/middleware/timing/timing.js +177 -97
  440. package/node_modules/hono/dist/middleware/trailing-slash/index.js +85 -37
  441. package/node_modules/hono/dist/preset/quick.js +17 -15
  442. package/node_modules/hono/dist/preset/tiny.js +14 -11
  443. package/node_modules/hono/dist/request/constants.js +4 -5
  444. package/node_modules/hono/dist/request.js +328 -319
  445. package/node_modules/hono/dist/router/linear-router/index.js +1 -4
  446. package/node_modules/hono/dist/router/linear-router/router.js +93 -120
  447. package/node_modules/hono/dist/router/pattern-router/index.js +1 -4
  448. package/node_modules/hono/dist/router/pattern-router/router.js +39 -40
  449. package/node_modules/hono/dist/router/reg-exp-router/index.js +1 -7
  450. package/node_modules/hono/dist/router/reg-exp-router/matcher.js +17 -23
  451. package/node_modules/hono/dist/router/reg-exp-router/node.js +87 -110
  452. package/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +89 -137
  453. package/node_modules/hono/dist/router/reg-exp-router/router.js +92 -129
  454. package/node_modules/hono/dist/router/reg-exp-router/trie.js +69 -64
  455. package/node_modules/hono/dist/router/smart-router/index.js +1 -4
  456. package/node_modules/hono/dist/router/smart-router/router.js +46 -55
  457. package/node_modules/hono/dist/router/trie-router/index.js +1 -4
  458. package/node_modules/hono/dist/router/trie-router/node.js +131 -162
  459. package/node_modules/hono/dist/router/trie-router/router.js +11 -14
  460. package/node_modules/hono/dist/router/utils.js +4 -5
  461. package/node_modules/hono/dist/router.js +35 -14
  462. package/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +4 -1
  463. package/node_modules/hono/dist/types/adapter/aws-lambda/handler.d.ts +150 -104
  464. package/node_modules/hono/dist/types/adapter/aws-lambda/index.d.ts +4 -8
  465. package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +152 -122
  466. package/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +4 -1
  467. package/node_modules/hono/dist/types/adapter/bun/index.d.ts +6 -10
  468. package/node_modules/hono/dist/types/adapter/bun/serve-static.d.ts +7 -2
  469. package/node_modules/hono/dist/types/adapter/bun/server.d.ts +4 -5
  470. package/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +5 -1
  471. package/node_modules/hono/dist/types/adapter/bun/websocket.d.ts +31 -16
  472. package/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +4 -1
  473. package/node_modules/hono/dist/types/adapter/cloudflare-pages/handler.d.ts +29 -17
  474. package/node_modules/hono/dist/types/adapter/cloudflare-pages/index.d.ts +3 -7
  475. package/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +6 -1
  476. package/node_modules/hono/dist/types/adapter/cloudflare-workers/index.d.ts +4 -7
  477. package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static-module.d.ts +5 -2
  478. package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static.d.ts +10 -5
  479. package/node_modules/hono/dist/types/adapter/cloudflare-workers/utils.d.ts +10 -2
  480. package/node_modules/hono/dist/types/adapter/cloudflare-workers/websocket.d.ts +6 -1
  481. package/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +4 -1
  482. package/node_modules/hono/dist/types/adapter/deno/deno.d.ts +1 -0
  483. package/node_modules/hono/dist/types/adapter/deno/index.d.ts +5 -8
  484. package/node_modules/hono/dist/types/adapter/deno/serve-static.d.ts +7 -2
  485. package/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +5 -1
  486. package/node_modules/hono/dist/types/adapter/deno/websocket.d.ts +6 -1
  487. package/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +6 -1
  488. package/node_modules/hono/dist/types/adapter/lambda-edge/handler.d.ts +83 -57
  489. package/node_modules/hono/dist/types/adapter/lambda-edge/index.d.ts +3 -7
  490. package/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +4 -1
  491. package/node_modules/hono/dist/types/adapter/netlify/handler.d.ts +6 -1
  492. package/node_modules/hono/dist/types/adapter/netlify/index.d.ts +3 -5
  493. package/node_modules/hono/dist/types/adapter/netlify/mod.d.ts +3 -2
  494. package/node_modules/hono/dist/types/adapter/service-worker/handler.d.ts +9 -7
  495. package/node_modules/hono/dist/types/adapter/service-worker/index.d.ts +7 -9
  496. package/node_modules/hono/dist/types/adapter/service-worker/types.d.ts +12 -7
  497. package/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +6 -1
  498. package/node_modules/hono/dist/types/adapter/vercel/handler.d.ts +6 -1
  499. package/node_modules/hono/dist/types/adapter/vercel/index.d.ts +3 -6
  500. package/node_modules/hono/dist/types/client/client.d.ts +5 -3
  501. package/node_modules/hono/dist/types/client/fetch-result-please.d.ts +21 -19
  502. package/node_modules/hono/dist/types/client/index.d.ts +5 -7
  503. package/node_modules/hono/dist/types/client/types.d.ts +134 -159
  504. package/node_modules/hono/dist/types/client/utils.d.ts +6 -4
  505. package/node_modules/hono/dist/types/compose.d.ts +4 -2
  506. package/node_modules/hono/dist/types/context.d.ts +335 -335
  507. package/node_modules/hono/dist/types/helper/accepts/accepts.d.ts +11 -9
  508. package/node_modules/hono/dist/types/helper/accepts/index.d.ts +2 -5
  509. package/node_modules/hono/dist/types/helper/adapter/index.d.ts +4 -6
  510. package/node_modules/hono/dist/types/helper/conninfo/index.d.ts +2 -5
  511. package/node_modules/hono/dist/types/helper/conninfo/types.d.ts +25 -23
  512. package/node_modules/hono/dist/types/helper/cookie/index.d.ts +10 -12
  513. package/node_modules/hono/dist/types/helper/css/common.d.ts +11 -9
  514. package/node_modules/hono/dist/types/helper/css/index.d.ts +26 -28
  515. package/node_modules/hono/dist/types/helper/dev/index.d.ts +10 -12
  516. package/node_modules/hono/dist/types/helper/factory/index.d.ts +26 -73
  517. package/node_modules/hono/dist/types/helper/html/index.d.ts +4 -7
  518. package/node_modules/hono/dist/types/helper/proxy/index.d.ts +19 -21
  519. package/node_modules/hono/dist/types/helper/route/index.d.ts +4 -2
  520. package/node_modules/hono/dist/types/helper/ssg/index.d.ts +4 -7
  521. package/node_modules/hono/dist/types/helper/ssg/middleware.d.ts +8 -6
  522. package/node_modules/hono/dist/types/helper/ssg/plugins.d.ts +3 -1
  523. package/node_modules/hono/dist/types/helper/ssg/ssg.d.ts +38 -36
  524. package/node_modules/hono/dist/types/helper/ssg/utils.d.ts +5 -3
  525. package/node_modules/hono/dist/types/helper/streaming/index.d.ts +4 -8
  526. package/node_modules/hono/dist/types/helper/streaming/sse.d.ts +10 -8
  527. package/node_modules/hono/dist/types/helper/streaming/stream.d.ts +4 -2
  528. package/node_modules/hono/dist/types/helper/streaming/text.d.ts +4 -2
  529. package/node_modules/hono/dist/types/helper/streaming/utils.d.ts +2 -0
  530. package/node_modules/hono/dist/types/helper/testing/index.d.ts +7 -9
  531. package/node_modules/hono/dist/types/helper/websocket/index.d.ts +30 -33
  532. package/node_modules/hono/dist/types/hono-base.d.ts +210 -210
  533. package/node_modules/hono/dist/types/hono.d.ts +11 -10
  534. package/node_modules/hono/dist/types/http-exception.d.ts +20 -22
  535. package/node_modules/hono/dist/types/index.d.ts +6 -37
  536. package/node_modules/hono/dist/types/jsx/base.d.ts +37 -35
  537. package/node_modules/hono/dist/types/jsx/children.d.ts +8 -6
  538. package/node_modules/hono/dist/types/jsx/components.d.ts +8 -5
  539. package/node_modules/hono/dist/types/jsx/constants.d.ts +2 -0
  540. package/node_modules/hono/dist/types/jsx/context.d.ts +9 -6
  541. package/node_modules/hono/dist/types/jsx/dom/client.d.ts +9 -10
  542. package/node_modules/hono/dist/types/jsx/dom/components.d.ts +9 -6
  543. package/node_modules/hono/dist/types/jsx/dom/context.d.ts +3 -1
  544. package/node_modules/hono/dist/types/jsx/dom/css.d.ts +27 -30
  545. package/node_modules/hono/dist/types/jsx/dom/hooks/index.d.ts +11 -12
  546. package/node_modules/hono/dist/types/jsx/dom/index.d.ts +79 -83
  547. package/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +9 -5
  548. package/node_modules/hono/dist/types/jsx/dom/jsx-dev-runtime.d.ts +4 -6
  549. package/node_modules/hono/dist/types/jsx/dom/jsx-runtime.d.ts +3 -7
  550. package/node_modules/hono/dist/types/jsx/dom/render.d.ts +32 -50
  551. package/node_modules/hono/dist/types/jsx/dom/server.d.ts +87 -85
  552. package/node_modules/hono/dist/types/jsx/dom/utils.d.ts +2 -0
  553. package/node_modules/hono/dist/types/jsx/hooks/index.d.ts +16 -16
  554. package/node_modules/hono/dist/types/jsx/index.d.ts +71 -73
  555. package/node_modules/hono/dist/types/jsx/intrinsic-element/common.d.ts +3 -1
  556. package/node_modules/hono/dist/types/jsx/intrinsic-element/components.d.ts +7 -4
  557. package/node_modules/hono/dist/types/jsx/intrinsic-elements.d.ts +708 -708
  558. package/node_modules/hono/dist/types/jsx/jsx-dev-runtime.d.ts +4 -7
  559. package/node_modules/hono/dist/types/jsx/jsx-runtime.d.ts +7 -10
  560. package/node_modules/hono/dist/types/jsx/streaming.d.ts +9 -10
  561. package/node_modules/hono/dist/types/jsx/types.d.ts +12 -13
  562. package/node_modules/hono/dist/types/jsx/utils.d.ts +2 -0
  563. package/node_modules/hono/dist/types/middleware/basic-auth/index.d.ts +17 -19
  564. package/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +46 -48
  565. package/node_modules/hono/dist/types/middleware/body-limit/index.d.ts +6 -8
  566. package/node_modules/hono/dist/types/middleware/cache/index.d.ts +13 -15
  567. package/node_modules/hono/dist/types/middleware/combine/index.d.ts +4 -6
  568. package/node_modules/hono/dist/types/middleware/compress/index.d.ts +9 -10
  569. package/node_modules/hono/dist/types/middleware/context-storage/index.d.ts +4 -6
  570. package/node_modules/hono/dist/types/middleware/cors/index.d.ts +10 -12
  571. package/node_modules/hono/dist/types/middleware/csrf/index.d.ts +6 -8
  572. package/node_modules/hono/dist/types/middleware/etag/digest.d.ts +2 -0
  573. package/node_modules/hono/dist/types/middleware/etag/index.d.ts +6 -8
  574. package/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +11 -12
  575. package/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +11 -11
  576. package/node_modules/hono/dist/types/middleware/jwk/index.d.ts +2 -1
  577. package/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +20 -23
  578. package/node_modules/hono/dist/types/middleware/jwt/index.d.ts +7 -6
  579. package/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +28 -30
  580. package/node_modules/hono/dist/types/middleware/language/index.d.ts +6 -5
  581. package/node_modules/hono/dist/types/middleware/language/language.d.ts +42 -44
  582. package/node_modules/hono/dist/types/middleware/logger/index.d.ts +3 -5
  583. package/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +7 -9
  584. package/node_modules/hono/dist/types/middleware/method-override/index.d.ts +14 -16
  585. package/node_modules/hono/dist/types/middleware/mount/index.d.ts +46 -0
  586. package/node_modules/hono/dist/types/middleware/powered-by/index.d.ts +8 -10
  587. package/node_modules/hono/dist/types/middleware/pretty-json/index.d.ts +18 -20
  588. package/node_modules/hono/dist/types/middleware/request-id/index.d.ts +6 -5
  589. package/node_modules/hono/dist/types/middleware/request-id/request-id.d.ts +9 -11
  590. package/node_modules/hono/dist/types/middleware/secure-headers/index.d.ts +6 -6
  591. package/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +2 -0
  592. package/node_modules/hono/dist/types/middleware/secure-headers/secure-headers.d.ts +55 -57
  593. package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +24 -24
  594. package/node_modules/hono/dist/types/middleware/serve-static/path.d.ts +2 -0
  595. package/node_modules/hono/dist/types/middleware/timeout/index.d.ts +5 -7
  596. package/node_modules/hono/dist/types/middleware/timing/index.d.ts +6 -5
  597. package/node_modules/hono/dist/types/middleware/timing/timing.d.ts +17 -20
  598. package/node_modules/hono/dist/types/middleware/trailing-slash/index.d.ts +35 -37
  599. package/node_modules/hono/dist/types/preset/quick.d.ts +6 -9
  600. package/node_modules/hono/dist/types/preset/tiny.d.ts +6 -9
  601. package/node_modules/hono/dist/types/request/constants.d.ts +2 -0
  602. package/node_modules/hono/dist/types/request.d.ts +288 -286
  603. package/node_modules/hono/dist/types/router/linear-router/index.d.ts +2 -5
  604. package/node_modules/hono/dist/types/router/linear-router/router.d.ts +7 -5
  605. package/node_modules/hono/dist/types/router/pattern-router/index.d.ts +2 -5
  606. package/node_modules/hono/dist/types/router/pattern-router/router.d.ts +7 -5
  607. package/node_modules/hono/dist/types/router/reg-exp-router/index.d.ts +3 -6
  608. package/node_modules/hono/dist/types/router/reg-exp-router/matcher.d.ts +3 -1
  609. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +6 -4
  610. package/node_modules/hono/dist/types/router/reg-exp-router/prepared-router.d.ts +11 -10
  611. package/node_modules/hono/dist/types/router/reg-exp-router/router.d.ts +10 -9
  612. package/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +7 -5
  613. package/node_modules/hono/dist/types/router/smart-router/index.d.ts +2 -5
  614. package/node_modules/hono/dist/types/router/smart-router/router.d.ts +11 -9
  615. package/node_modules/hono/dist/types/router/trie-router/index.d.ts +2 -5
  616. package/node_modules/hono/dist/types/router/trie-router/node.d.ts +6 -4
  617. package/node_modules/hono/dist/types/router/trie-router/router.d.ts +7 -5
  618. package/node_modules/hono/dist/types/router/utils.d.ts +2 -0
  619. package/node_modules/hono/dist/types/router.d.ts +23 -22
  620. package/node_modules/hono/dist/types/types.d.ts +146 -505
  621. package/node_modules/hono/dist/types/utils/accept.d.ts +5 -3
  622. package/node_modules/hono/dist/types/utils/basic-auth.d.ts +4 -2
  623. package/node_modules/hono/dist/types/utils/body.d.ts +46 -50
  624. package/node_modules/hono/dist/types/utils/buffer.d.ts +7 -5
  625. package/node_modules/hono/dist/types/utils/color.d.ts +2 -0
  626. package/node_modules/hono/dist/types/utils/compress.d.ts +2 -0
  627. package/node_modules/hono/dist/types/utils/concurrent.d.ts +6 -4
  628. package/node_modules/hono/dist/types/utils/constants.d.ts +2 -0
  629. package/node_modules/hono/dist/types/utils/cookie.d.ts +20 -18
  630. package/node_modules/hono/dist/types/utils/crypto.d.ts +5 -7
  631. package/node_modules/hono/dist/types/utils/encode.d.ts +2 -0
  632. package/node_modules/hono/dist/types/utils/filepath.d.ts +5 -3
  633. package/node_modules/hono/dist/types/utils/handler.d.ts +2 -0
  634. package/node_modules/hono/dist/types/utils/headers.d.ts +2 -0
  635. package/node_modules/hono/dist/types/utils/html.d.ts +11 -9
  636. package/node_modules/hono/dist/types/utils/http-status.d.ts +2 -0
  637. package/node_modules/hono/dist/types/utils/ipaddr.d.ts +4 -6
  638. package/node_modules/hono/dist/types/utils/jwt/index.d.ts +18 -12
  639. package/node_modules/hono/dist/types/utils/jwt/jwa.d.ts +15 -13
  640. package/node_modules/hono/dist/types/utils/jwt/jws.d.ts +4 -7
  641. package/node_modules/hono/dist/types/utils/jwt/jwt.d.ts +26 -29
  642. package/node_modules/hono/dist/types/utils/jwt/types.d.ts +48 -45
  643. package/node_modules/hono/dist/types/utils/jwt/utf8.d.ts +2 -0
  644. package/node_modules/hono/dist/types/utils/mime.d.ts +60 -57
  645. package/node_modules/hono/dist/types/utils/stream.d.ts +27 -25
  646. package/node_modules/hono/dist/types/utils/types.d.ts +14 -26
  647. package/node_modules/hono/dist/types/utils/url.d.ts +2 -0
  648. package/node_modules/hono/dist/types/validator/index.d.ts +3 -7
  649. package/node_modules/hono/dist/types/validator/utils.d.ts +6 -8
  650. package/node_modules/hono/dist/types/validator/validator.d.ts +11 -9
  651. package/node_modules/hono/dist/types.js +4 -6
  652. package/node_modules/hono/dist/utils/accept.js +185 -212
  653. package/node_modules/hono/dist/utils/basic-auth.js +18 -21
  654. package/node_modules/hono/dist/utils/body.js +87 -92
  655. package/node_modules/hono/dist/utils/buffer.js +44 -71
  656. package/node_modules/hono/dist/utils/color.js +33 -21
  657. package/node_modules/hono/dist/utils/compress.js +11 -5
  658. package/node_modules/hono/dist/utils/concurrent.js +29 -38
  659. package/node_modules/hono/dist/utils/constants.js +7 -5
  660. package/node_modules/hono/dist/utils/cookie.js +114 -163
  661. package/node_modules/hono/dist/utils/crypto.js +30 -40
  662. package/node_modules/hono/dist/utils/encode.js +30 -26
  663. package/node_modules/hono/dist/utils/filepath.js +23 -33
  664. package/node_modules/hono/dist/utils/handler.js +10 -11
  665. package/node_modules/hono/dist/utils/headers.js +1 -0
  666. package/node_modules/hono/dist/utils/html.js +97 -117
  667. package/node_modules/hono/dist/utils/http-status.js +1 -0
  668. package/node_modules/hono/dist/utils/ipaddr.js +227 -279
  669. package/node_modules/hono/dist/utils/jwt/index.js +12 -4
  670. package/node_modules/hono/dist/utils/jwt/jwa.js +24 -20
  671. package/node_modules/hono/dist/utils/jwt/jws.js +115 -174
  672. package/node_modules/hono/dist/utils/jwt/jwt.js +120 -198
  673. package/node_modules/hono/dist/utils/jwt/types.js +79 -95
  674. package/node_modules/hono/dist/utils/jwt/utf8.js +9 -7
  675. package/node_modules/hono/dist/utils/mime.js +74 -79
  676. package/node_modules/hono/dist/utils/stream.js +86 -88
  677. package/node_modules/hono/dist/utils/types.js +1 -0
  678. package/node_modules/hono/dist/utils/url.js +187 -215
  679. package/node_modules/hono/dist/validator/index.js +1 -4
  680. package/node_modules/hono/dist/validator/utils.js +1 -0
  681. package/node_modules/hono/dist/validator/validator.js +61 -83
  682. package/node_modules/hono/package.json +35 -27
  683. package/package.json +20 -18
  684. package/scripts/lib/cursor-sdk-output-filter.d.mts +1 -0
  685. package/scripts/lib/cursor-sdk-output-filter.mjs +1 -0
  686. package/scripts/platform-smoke/artifacts.mjs +7 -1
  687. package/shared/cursor-sdk-output-filter.d.mts +3 -0
  688. package/shared/cursor-sdk-output-filter.mjs +117 -44
  689. package/src/context.ts +59 -35
  690. package/src/cursor-api-key.ts +37 -17
  691. package/src/cursor-cloud-options.ts +2 -0
  692. package/src/cursor-config.ts +76 -0
  693. package/src/cursor-custom-store-path.ts +151 -0
  694. package/src/cursor-custom-subagent-definitions.ts +21 -0
  695. package/src/cursor-fallback-models.generated.ts +402 -1
  696. package/src/cursor-fallback-warning.ts +7 -3
  697. package/src/cursor-live-run-coordinator.ts +21 -2
  698. package/src/cursor-local-agent-ownership.ts +18 -0
  699. package/src/cursor-mcp-timeout-override.ts +3 -1
  700. package/src/cursor-pi-tool-bridge-diagnostics.ts +17 -0
  701. package/src/cursor-pi-tool-bridge-run.ts +31 -3
  702. package/src/cursor-pi-tool-bridge-server.ts +1 -2
  703. package/src/cursor-pi-tool-bridge-types.ts +3 -0
  704. package/src/cursor-provider-binding.ts +70 -11
  705. package/src/cursor-provider-errors.ts +32 -28
  706. package/src/cursor-provider-live-run-drain.ts +9 -4
  707. package/src/cursor-provider-run-finalizer.ts +2 -1
  708. package/src/cursor-provider-turn-prepare.ts +28 -13
  709. package/src/cursor-provider-turn-summary.ts +1 -1
  710. package/src/cursor-provider-turn-tool-ledger.ts +12 -7
  711. package/src/cursor-provider.ts +3 -1
  712. package/src/cursor-question-tool.ts +5 -5
  713. package/src/cursor-request-provenance.ts +18 -3
  714. package/src/cursor-sdk-output-filter.ts +2 -0
  715. package/src/cursor-sdk-process-error-guard.ts +1 -2
  716. package/src/cursor-sdk-runtime.ts +14 -15
  717. package/src/cursor-sdk-vendor-env.ts +22 -0
  718. package/src/cursor-session-agent-cleanup.ts +33 -27
  719. package/src/cursor-session-agent-lifecycle.ts +2 -2
  720. package/src/cursor-session-agent-lineage.ts +10 -5
  721. package/src/cursor-session-agent-resume.ts +14 -7
  722. package/src/cursor-session-agent.ts +67 -24
  723. package/src/cursor-session-scope.ts +33 -11
  724. package/src/cursor-session-send-policy.ts +2 -2
  725. package/src/cursor-session-settings.ts +3 -3
  726. package/src/cursor-session-store.ts +259 -53
  727. package/src/cursor-state.ts +32 -7
  728. package/src/cursor-tool-manifest.ts +1 -1
  729. package/src/index.ts +19 -19
  730. package/src/model-discovery.ts +68 -30
  731. package/src/model-list-cache.ts +11 -1
  732. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +0 -1
  733. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +0 -1
  734. package/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +0 -1
  735. package/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +0 -1
  736. package/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +0 -1
  737. package/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,81 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.3 - 2026-10-07
4
+
5
+ ### Changed
6
+
7
+ - Upgrade the exact unbundled Cursor SDK and five optional platform pins to 1.0.37. Keep the SDK 1.0.36 catalog capture from 2026-10-06 and private hook canary attributed to their historical version.
8
+ - Refresh the fallback catalog from the authenticated SDK 1.0.37 catalog-only observation on 2026-10-07: 46 models, adding Claude Haiku 5.5 (`claude-haiku-5-5`) with 20 thinking/context/effort variants while preserving all 45 prior model records. The 33 bundled checkpoint-derived entries remain unchanged; no Agent/model turn or Cloud run was performed.
9
+
10
+ ### Fixed
11
+
12
+ - Map boolean `thinking` combined with either `effort` or `reasoning_effort` through native thinking controls. Haiku 5.5 now exposes all five catalog-supported enabled effort levels at both `@300k` and `@1m`; `off` sends `thinking=false` without the effort parameter. Verified offline against the captured SDK 1.0.37 catalog; no Agent/model turn or Cloud run was performed.
13
+ - Select the declared TypeScript 7 entrypoint explicitly for all typechecks, matching the build and avoiding npm `tsc` shim collisions.
14
+ - Separate SessionManager-owned runtime scopes from unchanged durable identities. A same-file sibling's reload/tree/shutdown no longer closes another manager's pool or pending bridge run; process-local claims exclude live handles from resume and cleanup (#282 reproduced trigger, not the original reporter's full qualification).
15
+ - Label structured tool history as historical request/result/error without declaring unmatched requests completed. Preserve prose, IDs, arguments, errors and raw history; do not synthesize tool calls, strip narration or automatically resend effects (#257 mitigation).
16
+ - Make `/cursor-tools` report current-registry exposure eligibility, not live-run connectivity. Add opt-in validated initialization and catalog-handler output receipts with explicit client/model/health ceilings (#206 diagnostics, not Windows reporter qualification).
17
+
18
+ ### Security
19
+
20
+ - Update development-only transitive `source-map-js` to 1.2.2 for its event-loop denial-of-service fix.
21
+
22
+ ### Verification and limits
23
+
24
+ - Document SDK 1.0.37's new public `computerUse` output through the existing bounded generic Cursor activity/summary fallback, without dedicated action/screenshot presentation or a new public local execution option.
25
+ - Record SDK 1.0.37's vendored HTTP/2 ping/response-iteration and local retry-classification source changes. Public controls, bearer/lease/reload mechanisms, LOCAL ID/inherit-only custom agents and inspected storage layouts remain unchanged; internal definition-only MCP setters are not supported options. These source comparisons do not resolve the original #247 authentication cause, #339 signal sender, #173 rtk behavior, #233 Windows loader or #206 readiness reports.
26
+ - Exercise real public installed-SDK first-send linking through a blocked key-exchange boundary, with a request-time missing-module negative control. Native SDK-substituted session tests remain separate; neither proves authenticated inference or every embedded loader.
27
+ - Clarify inspected SDK hook/parser/authentication mechanisms and remaining reporter-only unknowns (#173, #339, #247, #233). Public commit/PR attribution controls remain absent (#302); no SDK-internal patch or paid test campaign is added.
28
+
29
+ ## 0.5.2
30
+
31
+ ### Fixed
32
+
33
+ - Pair all shared CI/release workflow invocations, automation inputs, and checkouts at one reviewed revision. The shared fork producer now uses the fork's canonical artifact-set API; the existing host consumer reads the receipt's relative tarball paths and verifies their hashes. Preserve once-resolved latest official/fork targets, offline platform jobs, and manual npm approval.
34
+ - Carry forward the Grok 4.7 selection fix from #344 (mirroring #343 by @LucasAIBuilder): omit only an outgoing `context` equal to the base catalog's default-variant context, including unambiguous aliases and fast/slow variants. Keep model metadata, non-default contexts, effort, and speed explicit; omit nothing when no catalog default context exists. The reporter describes an SDK 1.0.36 LOCAL reject/pass pair; that report is not qualification of this release candidate or Cloud behavior.
35
+
36
+ ### Changed
37
+
38
+ - Align locked development Pi snapshots and their resolved transitives to 1.0.4. These reproducible build inputs are not qualification targets; Node 24+, official Pi 0.87.1+, and optional wildcard Pi/TypeBox peers remain unchanged.
39
+ - Include the unpublished 0.5.1 backlog changes below: exact unbundled SDK/platform 1.0.36, static source/compiled-loader graph, native prompt/image and usage ownership, pending bridge-call protection, shell correlation, bounded diagnostics, trusted SDK-native subagents, and persistent LOCAL store roots with migration/cleanup guards. Preserve Pi's native footer, full question UI opt-in (`PI_CURSOR_ASK_QUESTION=1`, off by default), ordinary explicit Cloud capability, and the documented limits. This is not another SDK upgrade or evidence that all open reporter/service issues are fixed.
40
+
41
+ ## 0.5.1 (unpublished source history)
42
+
43
+ These changes are carried into 0.5.2; this section does not record a successful npm publication. Historical candidate evidence remains bound to its original source, version, and run.
44
+
45
+ ### Added
46
+
47
+ - Support trusted config-defined SDK-native subagents with independent catalog selections and content-digest session invalidation (adapted from #208 by Sam Armstrong). SDK 1.0.36 LOCAL conversion retains only model ID/inherit, not thinking/fast/context parameters; Cloud retains selections without delegated service-honoring proof. LOCAL compaction/tree summaries remain definition-free.
48
+ - Add persistent LOCAL SQLite roots through `PI_CURSOR_SDK_STATE_ROOT` or user `local.storeRoot`, with environment precedence and captured private absolute-path selection (adapted from #236 by @gwatkins-arista). Project/session/CLI roots are excluded; fileless and LOCAL summary stores remain temporary. Root changes retain old history, without automatic copy, merge or deletion.
49
+
50
+ ### Fixed
51
+
52
+ - Preserve genuine persisted native user input, following notices as background context, and current images across incremental, budgeted bootstrap and offline Cloud fresh prompts (#229). Custom-only continuation does not resend old requests/images; payload/order-changing transforms remain conservative.
53
+ - Protect each live run's pending pi bridge calls, including human questions, from idle disposal. After the last owned call settles and the drain lease ends, restart the full configured window, including previously armed cleanup. Explicit cancellation, compaction, shutdown and bridge/MCP deadlines remain independent (#281).
54
+ - Filter verified bounded SDK bootstrap frames through one byte-preserving process sink retained through deferred SDK completion and bridge/replay turns. Known plugin-confinement/parser warnings escape the creation-only mute as bounded owner-scoped recovery notices and non-model session entries, without raw paths (#284/#232). Plugin confinement remains enforced; unknown warnings are not universally filtered.
55
+ - Keep Cursor SDK and bridge imports in Pi's static extension graph and initialize the native parser vendor path before SDK evaluation (#228). Retained credential-free packed compiled-Bun proof reached the authentication boundary on official Pi 1.0.3/macOS arm64; Windows embedded-loader behavior remains unqualified.
56
+ - Preserve scrubbed network classification through real SDK UNAVAILABLE wrappers and bounded cause provenance (#265). Keep SDK-vendored/backend process-error guards scoped; unrelated connect-node-only errors remain fatal. Retry eligibility is not backend recovery proof.
57
+ - Match shell completions by exact ID or unique identical arguments, accepting legacy aliases without hiding unmatched/error activity (adapted from #258 by @yansigit). Installed SDK 1.0.36 contracts cover its typed shell payload and ID-less step-before-completed-delta producer, not an observed alias-changing service pair or universal stale-shell recovery.
58
+ - Preserve default-store resume/cleanup ownership across the SDK's MD5-to-SHA256 workspace migration, without merging stores. Validate exact recorded identities before bounded path walks and retain same-cwd ownership through admission/open/disposal. Reject unsafe owned layouts before migration; higher user-managed links remain supported only for default storage. This is not a cross-process migration lock.
59
+ - Keep custom-root admission exact to the current session. Wrong-domain, identity-less or malformed cleanup candidates become durably non-retryable; temporary damage at admitted paths remains retryable. Retain default cleanup candidates across root changes. Clean up before relocation if desired: restoring a root does not revive excluded candidates. Windows ACL/all-reparse and hostile same-user pathname confinement are not guaranteed.
60
+ - Bound artifact gzip output at the existing public size cap. Separate compatibility build, verification and native contracts into bounded phases, stopping timed-out POSIX command descendants before workspace removal without increasing individual test deadlines.
61
+
62
+ ### Changed
63
+
64
+ - Upgrade the exact unbundled Cursor SDK and all five optional platform pins to 1.0.36; requalify installed stall/error construction, MCP, transport, bootstrap, custom-agent, SQLite and public usage contracts offline. Refresh fallback-catalog provenance from the authenticated SDK 1.0.36 observation on 2026-10-06; all 45 model records match the reviewed metadata and checkpoint limits remain unchanged. The SDK upgrade alone establishes no open service/reporter fix.
65
+ - Replace serialized catalog resync with public native API-key auth and accepted-generation publication (adapted from #300/#301 by @yansigit). Startup and login/logout/key/runtime mutations resync matching cache/fallback without catalog requests. Opt-in `PI_CURSOR_HIDE_MODELS_WHEN_LOGGED_OUT` hides AVAILABLE picker/list results, preserving KNOWN CLI identities and login. Cancellation/supersession reject late publication, not underlying SDK transport work.
66
+ - Add default-visible `PI_CURSOR_FOOTER`; `0` hides only Cursor extension status, not Pi's native model/usage footer or provider behavior (#213).
67
+ - Make `cursor_ask_question` OFF by default; `PI_CURSOR_ASK_QUESTION=1` retains the full bridged UI capability without disabling other pi tools (#238).
68
+ - Apply the GitHub issue/PR comment rule to bootstrap and incremental prompt tails: comment only when the user asks (#239). Reads and requested writes remain supported; prompt guidance is not a hard execution-permission boundary.
69
+ - Add private strict decimal `PI_CURSOR_LIVE_RUN_IDLE_DISPOSE_MS`, accepting `1`–`2147483647` milliseconds with a five-minute default (adapted from #283 by @aaalexliu). This tunes eligible abandonment cleanup, not authentication/transport recovery.
70
+ - Upgrade the bundled MCP bridge to adapter 2.0.2/server 2.3.1/Hono 4.13.13, retaining node-server 2.1.3, bounded JSON parsing and Host/Origin rejection. Upgrade development-only ConnectRPC to 2.2.0 and MCP client to 2.3.1 without replacing the SDK's nested Connect 1.7.0/Protobuf 1.10.0 transport graph.
71
+ - Align direct development Pi snapshots/transitives to 1.0.3, root TypeBox to 1.3.36 and Vitest to 5.0.3. Node 24+, official Pi 0.87.1+ and optional wildcard Pi/TypeBox host peers remain unchanged; qualification targets latest stable official Pi and current maintained fork main.
72
+ - Extend native context-edit/filtering contracts to preserve raw history, current system instructions/tools and explicit tool removal (#271 native slice only). Strengthen public aggregate-only usage and original-origin terminal/late telemetry contracts without placing cumulative billing in native occupancy or claiming invoice/branch attribution.
73
+
74
+ ### Known limits
75
+
76
+ - Official Pi 1.0.4 has a demonstrated startup refresh-admission race that can temporarily retain fallback models and an incorrect missing-key warning despite a matching authenticated cache (#337). The shared-owner repair is merged in `fitchmultz/pi` via #190; this release does not claim the official host is fixed.
77
+ - Attribution controls remain upstream-blocked in canonical #302 for BOTH commit and PR attribution; #143 is a duplicate, not a fix. LOCAL summary-state isolation is distinct from summary-content quality (#223). The new non-Cursor/opencode parser-warning/SIGTERM report (#339) has no established causal owner. Other open reporter/service cases are not closed by the SDK version or offline contracts.
78
+
3
79
  ## 0.5.0 - 2026-10-04
4
80
 
5
81
  ### Breaking Changes
package/README.md CHANGED
@@ -51,11 +51,11 @@ If pi started without a key, run `/cursor-refresh-models` after `/login` to refr
51
51
  ## Requirements
52
52
 
53
53
  - Node.js 24+
54
- - pi-cursor-sdk 0.5.0 requires official Pi 0.87.1 or later. Official Pi 0.87.1/latest and current `fitchmultz/pi` main are compatibility targets; the exact development `@earendil-works/pi-ai`, `@earendil-works/pi-coding-agent`, and `@earendil-works/pi-tui` packages are 0.99.1
54
+ - pi-cursor-sdk 0.5.3 requires official Pi 0.87.1 or later. The latest stable official Pi and current `fitchmultz/pi` main are required compatibility targets, resolved once per workflow run; locked development Pi packages are reproducible snapshots, not validation targets
55
55
  - optional Pi and TypeBox peer metadata uses `"*"` ranges per Pi package guidance
56
56
  - a Cursor SDK API key saved through `/login`, available as `CURSOR_API_KEY`, or passed with pi's `--api-key`
57
57
 
58
- No global `@cursor/sdk` install is required. This package depends on exact `@cursor/sdk@1.0.32`, so normal package installation brings in the tested SDK. The extension intentionally does not bundle `@cursor/sdk` or its platform packages, because packing from one maintainer OS can ship the wrong optional SDK binary for another OS. The SDK has used its current single-file/new-chunk package layout since 1.0.28. Pi hosts that pass transcript-only provider contexts are supported through Pi 0.87.1's required public replay helpers.
58
+ No global `@cursor/sdk` install is required. This package depends on exact `@cursor/sdk@1.0.37`, so normal package installation brings in that SDK. The extension intentionally does not bundle `@cursor/sdk` or its platform packages, because packing from one maintainer OS can ship the wrong optional SDK binary for another OS. The SDK has used its current single-file/new-chunk package layout since 1.0.28. Pi hosts that pass transcript-only provider contexts are supported through Pi 0.87.1's required public replay helpers.
59
59
 
60
60
  ## Install
61
61
 
@@ -124,9 +124,11 @@ Then, inside pi:
124
124
  4. Paste your Cursor SDK API key.
125
125
  5. The key is saved in pi's native `~/.pi/agent/auth.json`.
126
126
 
127
- If pi started without a key, fallback Cursor models still register so `/login` is reachable. After `/login`, fallback model runs can use the stored key, and `/cursor-refresh-models` refreshes the full live Cursor model catalog discovered from the Cursor SDK without restarting pi.
127
+ If pi started without a key, known fallback Cursor models still register so `/login` and CLI model selection remain reachable. Native login, logout, key rotation, and runtime-key changes immediately resync the matching cached catalog or fallback in the same session, without making a catalog request. Run `/cursor-refresh-models` for the full live catalog without restarting pi.
128
128
 
129
- Note: if `/login` shows `Cursor ✓ key in models.json` but you have not saved a Cursor key and `CURSOR_API_KEY` is unset, that status is a pi auth-status limitation. A real Cursor SDK API key is still required for Cursor runs.
129
+ Set `PI_CURSOR_HIDE_MODELS_WHEN_LOGGED_OUT=1` to hide unauthenticated Cursor models from the picker and `--list-models`. This is off by default. Known model identities remain CLI-selectable, including `pi --model cursor/grok-4.6 --api-key "your-key"`; `/login` stays reachable. Stored logout does not hide models or delete the matching cache when environment or `models.json` auth remains. Pi's native logout also removes its runtime key override.
130
+
131
+ The default fallback availability policy is not proof of a usable key. A real Cursor SDK API key is still required for Cursor runs.
130
132
 
131
133
  Environment setup:
132
134
 
@@ -141,17 +143,21 @@ One-shot setup:
141
143
  pi --api-key "your-key" --model cursor/grok-4.6 --cursor-no-fast -p "Say ok only."
142
144
  ```
143
145
 
144
- Startup discovery intentionally does not parse Pi CLI arguments. It uses the stored `cursor` key in `~/.pi/agent/auth.json`, then `CURSOR_API_KEY`; without either, the bundled fallback catalog registers. Provider turns still receive Pi's resolved `--api-key`. `/cursor-refresh-models` and `/cursor-cloud` mutations ask Pi's ModelRegistry for provider `cursor`, so command-time auth follows Pi's provider-scoped resolution and is normalized through `CURSOR_API_KEY` placeholders before reaching the Cursor SDK.
146
+ Pi owns CLI parsing and credential storage. Cursor's public native API-key auth honors runtime keys, stored keys or provider-scoped `env.CURSOR_API_KEY`, composed `models.json` keys, then ambient `CURSOR_API_KEY`. Unresolved placeholder values are not real keys, and unsupported stored credential types do not fall through to ambient auth. Discovery receives the effective native key explicitly; it never reads an unrelated default auth file. Provider turns keep Pi's resolved request key. Environment or `models.json` changes take effect on the next native registry refresh (for example opening `/model`); there is no auth-file watcher.
145
147
 
146
148
  ### Model catalog cache
147
149
 
148
- To avoid a live `Cursor.models.list` network round-trip on every pi startup, the discovered catalog is cached on disk at `~/.pi/agent/cursor-sdk-model-list.json` (written `0600`, keyed by an API-key fingerprint — the key itself is never stored). Warm startups within the cache TTL skip the network call and avoid loading `@cursor/sdk` until a Cursor turn needs it; `/cursor-refresh-models` always bypasses the cache and refreshes the live catalog. If a refresh fails, a previously cached catalog is preferred over the generic bundled fallback.
150
+ The discovered catalog is cached at `~/.pi/agent/cursor-sdk-model-list.json` (written `0600`, keyed by an API-key fingerprint — the key itself is never stored). Startup and native auth mutations are always cache-only: a matching cache, even if expired, or the bundled fallback supplies known models with zero catalog/network calls. The SDK remains in the static extension graph for compiled-Bun loading; cache-only does not mean zero SDK module evaluation. Pi may separately request a network-allowed refresh; fresh matching caches then skip the request. `/cursor-refresh-models` requests a forced native live refresh and reports cancellation or failure truthfully. Authenticated errors prefer the matching cached catalog over the generic fallback.
151
+
152
+ Only an accepted native generation can update the catalog, selection metadata, cache, and fallback warning. An effective no-auth refresh removes only the extension's valid regular-file orphaned catalog. Cancelled, superseded, or shut-down refreshes cannot install late results. SDK 1.0.37 catalog requests have no public caller-abort option, so cancellation rejects their late publication rather than promising to stop the underlying request.
153
+
154
+ Known host limitation: official Pi 1.0.4 has a demonstrated startup refresh-admission race that can temporarily leave fallback models and an incorrect missing-key warning despite a matching authenticated cache. The shared-owner repair is merged in `fitchmultz/pi` via [#190](https://github.com/fitchmultz/pi/pull/190); this is not an official-host fix. See [#337](https://github.com/fitchmultz/pi-cursor-sdk/pull/337). It is separate from Cursor service authentication failures and the compiled-loader repair.
149
155
 
150
156
  ```bash
151
157
  # Cache lifetime in milliseconds (default 86400000 = 24h).
152
158
  PI_CURSOR_SDK_MODEL_CACHE_TTL_MS=3600000 pi --model cursor/grok-4.6
153
159
 
154
- # Disable the cache and always discover live.
160
+ # Disable cache reads/writes; cache-only phases still use the fallback.
155
161
  PI_CURSOR_SDK_DISABLE_MODEL_CACHE=1 pi --model cursor/grok-4.6
156
162
  ```
157
163
 
@@ -216,12 +222,12 @@ For models where Cursor exposes `reasoning`, `effort`, `reasoning_effort`, or bo
216
222
 
217
223
  - `reasoning=none|low|medium|high|extra-high`
218
224
  - `effort=low|medium|high|xhigh|max`
219
- - `reasoning_effort=low|medium|high`
225
+ - `reasoning_effort=low|medium|high|xhigh|max` where exposed by the catalog
220
226
  - `thinking=false|true` for boolean thinking models
221
227
 
222
228
  Pi `xhigh` maps to Cursor `xhigh` or `extra-high`; Pi `max` maps only to a distinct Cursor `max` value. Gemini 3.8 Flash exposes only `low`, `medium`, and `high` through `reasoning_effort`; its SDK default remains `high`.
223
229
 
224
- For Claude models with both `thinking` and `effort`, pi thinking `off` sends `thinking=false` and omits `effort`.
230
+ For Claude models with boolean `thinking` and either `effort` or `reasoning_effort`, enabled pi levels send `thinking=true` and the mapped effort value; `off` sends `thinking=false` and omits the effort parameter. Haiku 5.5 exposes all five enabled effort levels (`low`, `medium`, `high`, `xhigh`, `max`) at both `@300k` and `@1m`.
225
231
 
226
232
  ### Why some Cursor models show `thinking=no`
227
233
 
@@ -256,7 +262,7 @@ The `:fast` and `:slow` aliases are available only for Cursor models whose catal
256
262
 
257
263
  Composer 2 and Composer 2.5 can default to fast. Use `--cursor-no-fast` or a `:slow` virtual alias for a one-shot no-fast Composer run. In print mode (`-p`), `--cursor-no-fast` is silent and does not write `~/.pi/agent/cursor-sdk.json`.
258
264
 
259
- In interactive mode, the footer shows Cursor status only while a Cursor model is active. Fast-capable models show fast state explicitly, and fast and plan mode share one Cursor status value so they do not overwrite each other:
265
+ In interactive mode, the footer shows Cursor status only while a Cursor model is active. Set `PI_CURSOR_FOOTER=0` to hide this status; it is visible by default. This controls display only: runtime, mode, and transport selection and validation are unchanged. Fast-capable models show fast state explicitly, and fast and plan mode share one Cursor status value so they do not overwrite each other:
260
266
 
261
267
  ```text
262
268
  cursor:local · fast:n/a
@@ -292,7 +298,7 @@ Change the session mode interactively:
292
298
 
293
299
  `/cursor-mode` with no argument reports the current mode and usage. The CLI flag does not persist to the session; slash-command changes are persisted with `pi.appendEntry()`.
294
300
 
295
- Maintainers can run `/cursor-tools` in a Cursor model session to print the current bridge enablement, bootstrap manifest enablement, effective `PI_CURSOR_SETTING_SOURCES`, and callable-surface snapshot (host tools summary plus current `pi__*` names). See [Cursor dogfood checklist](docs/cursor-dogfood-checklist.md).
301
+ Maintainers can run `/cursor-tools` in a Cursor model session to print bridge/manifest enablement, effective `PI_CURSOR_SETTING_SOURCES`, and the current registry's bridge exposure eligibility. This is not a live-run connection or invocation check; use the [bridge diagnostics](#cursor-provider-tool-contract) below for per-run observations. See [Cursor dogfood checklist](docs/cursor-dogfood-checklist.md).
296
302
 
297
303
  For conversation agents, the extension seeds the mode through `Agent.create({ mode })` and sends it on each `agent.send(..., { mode })` so `/cursor-mode` and `--cursor-mode` remain the source of truth when a pooled agent is reused. LOCAL compaction/tree summary agents always use text-only `agent` mode.
298
304
 
@@ -300,7 +306,9 @@ Cursor SDK `plan` mode can produce plan-oriented output and Cursor todo/plan act
300
306
 
301
307
  ## Cursor local agent config and safety controls
302
308
 
303
- `/cursor-refresh-config` calls the current pooled SDK agent's `agent.reload()` so Cursor reloads filesystem config such as local hooks, project MCP, and subagents without restarting pi. If no Cursor agent exists yet, the next Cursor run loads config normally.
309
+ `/cursor-refresh-config` calls the current pooled SDK agent's `agent.reload()` so Cursor reloads its filesystem config such as local hooks, project MCP, and Cursor-managed subagents without restarting pi. Extension `cursor-sdk.json` definitions below are captured on the next ordinary turn; changed definitions recreate the pooled agent instead of relying on SDK reload.
310
+
311
+ **Hook enforcement is not qualified by settings loading or replay cards.** SDK 1.0.37 source retains Shell `preToolUse` command-rewrite plumbing. The retained SDK 1.0.36 offline probe executed a rewritten command using private lexical bindings and permissive approval; it is not an executed SDK 1.0.37 canary. That is not an end-to-end Pi/rtk or security-policy guarantee. Replay may show the original model arguments before the SDK applies a rewrite. Verify the hook decision and actual executed command together when relying on hooks; the reported native-Agent/Pi discrepancy remains open in [#173](https://github.com/fitchmultz/pi-cursor-sdk/issues/173).
304
312
 
305
313
  Cursor SDK local safety controls stay off by default. Enable them explicitly for one run:
306
314
 
@@ -325,7 +333,27 @@ pi --model cursor/grok-4.6 --cursor-no-local-resume
325
333
  PI_CURSOR_LOCAL_RESUME=0 pi --model cursor/grok-4.6
326
334
  ```
327
335
 
328
- Resume is strict: the current pi session file/id, branch path prefix, cwd/repo root, model/API/tool-surface pool key, SDK store identity, and compaction generation must match. Each persisted pi session gets a SQLite store under `<getDefaultSdkStateRoot(cwd)>/pi-sessions/<session-hash>/`, and that same store is used for create/resume, transcript reads, checkpoint lookup, and exact-ID cleanup so parallel pi sessions do not contend on one workspace `index.db`. Fileless sessions use a unique OS-temporary store per acquisition, remove it on graceful disposal, and start a fresh agent after invalidation instead of reopening a disposed temporary store. Legacy resume entries still try the SDK's default workspace store; if that resume fails or the agent is later replaced, the new agent moves to the per-session store. A trailing user message already present at process startup is crash-ambiguous and invalidates the old handle; only a user message appended in the current process may span a recorded handle, preventing restart from resending an already-submitted prompt. A successful process reattachment bootstraps the current pi transcript once while retaining the resumed Cursor agent's native state; later in-process turns remain incremental. If `Agent.resume()` fails, pi bootstraps a new local Cursor agent from the current transcript and streams one display-only continuity note. Superseded local agents can be cleaned up explicitly with `/cursor-local-resume-cleanup --dry-run` and `/cursor-local-resume-cleanup --yes`; cleanup only deletes exact recorded `agent-*` IDs from their recorded store. Cloud resume remains disabled; `/cursor-cloud list|archive|delete` only manages recorded cloud agents.
336
+ Resume is strict: the current pi session file/id, branch path prefix, cwd/repo root, model/API/tool-surface pool key, SDK store identity, and compaction generation must match. By default, each persisted pi session gets a SQLite store under `<getDefaultSdkStateRoot(cwd)>/pi-sessions/<session-hash>/`, and that same store is used for create/resume, transcript reads, checkpoint lookup, and exact-ID cleanup so parallel pi sessions do not contend on one workspace `index.db`. Fileless sessions use a unique OS-temporary store per acquisition, remove it on graceful disposal, and start a fresh agent after invalidation instead of reopening a disposed temporary store. With default storage selected, legacy resume entries still try the SDK's default workspace store; if that resume fails or the agent is later replaced, the new agent moves to the per-session store. A trailing user message already present at process startup is crash-ambiguous and invalidates the old handle; only a user message appended in the current process may span a recorded handle, preventing restart from resending an already-submitted prompt. A successful process reattachment bootstraps the current pi transcript once while retaining the resumed Cursor agent's native state; later in-process turns remain incremental. If `Agent.resume()` fails, pi bootstraps a new local Cursor agent from the current transcript and streams one display-only continuity note. Superseded local agents can be cleaned up explicitly with `/cursor-local-resume-cleanup --dry-run` and `/cursor-local-resume-cleanup --yes`; cleanup only deletes exact recorded `agent-*` IDs from their recorded store. Cloud resume remains disabled; `/cursor-cloud list|archive|delete` only manages recorded cloud agents.
337
+
338
+ If a default local-store error names a rejected link or non-directory, make that SDK-owned prefix/component a real directory without discarding its data, or relocate via a link at a higher ancestor such as `~/.cursor/projects` instead. Custom roots reject user-controlled ancestor links too.
339
+
340
+ ### Custom local SQLite root
341
+
342
+ For persistent LOCAL conversations, set `PI_CURSOR_SDK_STATE_ROOT` or user `~/.pi/agent/cursor-sdk.json`:
343
+
344
+ ```json
345
+ { "local": { "storeRoot": "/absolute/private/cursor-state" } }
346
+ ```
347
+
348
+ Environment wins over user; blank values are absent. Project, session, CLI and built-in settings cannot select a root. With neither set, SDK-default storage/migration is unchanged. Selection is captured once per turn and at explicit cleanup entry, not reread after asynchronous work.
349
+
350
+ Custom layout: `<canonical-root>/<sha256(resolve(cwd))[0:32]>/pi-sessions/<session-hash>/`. Only extension SQLite/checkpoints move—not auth, settings/rules, model caches or IDE data. Fileless and LOCAL compaction/tree stores ignore persistent selection entirely, even when its path is unusable.
351
+
352
+ Use a fully qualified native absolute path, not a filesystem/share root, relative/device path, or a path with explicit `.`/`..` components. No tilde/environment expansion occurs. Invalid winning paths fail closed, never falling back to default. POSIX ancestors must be root/current-user owned and not group/other writable, except trusted sticky system temporary directories; after shared directories, components must belong to the current user. Owned destinations are private (0700). User-controlled links/junctions and linked/nonregular fixed SQLite files are rejected; verified root-owned system aliases such as macOS `/var` are supported.
353
+
354
+ On Windows, choose a user-controlled, ACL-protected location. Node-visible links/junctions, type, identity and writability are checked, but ACLs are not hardened and not every reparse-point type is guaranteed to be rejected. The SDK opens by pathname, including lazy checkpoints; these checks are not a sandbox against malicious same-user processes or administrators.
355
+
356
+ Changing root replaces a live pooled agent on the next turn and bootstraps from the Pi transcript. Custom resume/cleanup admits only the exact current custom **session** identity; identity-less legacy, SDK-default, other-root and other-session addresses are never reinterpreted. Old data is retained: no copy, migration, merge or automatic deletion. Run explicit cleanup **before** relocating if desired: cleanup at B can durably mark A's candidates non-retryable, and returning to A does not revive them. Manually retained state remains your responsibility after retiring its sessions and stopping their processes.
329
357
 
330
358
  Config can also set non-secret defaults in `~/.pi/agent/cursor-sdk.json` or trusted `.pi/cursor-sdk.json`. Project config activates only when Pi's project-trust flow reached this extension and approved the project, or the run started with explicit `--approve`; Pi's implicit trust for a project with no recognized resources is not enough. Because project-local package extensions load after the trust event, `pi install -l` users must pass `--approve` on every run that reads or writes `.pi/cursor-sdk.json`. A trust resource added after trust resolution requires restarting pi. `/cursor-runtime ... --save-project` requires the same trust provenance and does not create Pi trust resources automatically. Explicit runtime, fast-default, and HTTP transport saves preserve unrecognized fields, reject malformed or non-object JSON without rewriting it, and serialize concurrent writers. A completed global preference write is retained if Pi's subsequent session-journal append fails, because Pi may already have mutated the in-memory branch; the command reports that partial journal failure and ignores the uncertain session entry until a later successful save or session restart. If a process is force-killed during the tiny update window, the next save reports the `.lock` path; remove it only after confirming no pi process is writing that config.
331
359
 
@@ -340,6 +368,38 @@ Config can also set non-secret defaults in `~/.pi/agent/cursor-sdk.json` or trus
340
368
  }
341
369
  ```
342
370
 
371
+ ### SDK-native custom agents
372
+
373
+ Define named Cursor delegates in user `~/.pi/agent/cursor-sdk.json` or trusted project `.pi/cursor-sdk.json`:
374
+
375
+ ```json
376
+ {
377
+ "subagents": {
378
+ "reviewer": {
379
+ "description": "Review code changes for correctness and maintainability.",
380
+ "prompt": "Inspect the changes and report concrete findings without editing.",
381
+ "model": "grok-4.6:slow",
382
+ "thinking": "high",
383
+ "fast": false
384
+ },
385
+ "helper": {
386
+ "description": "Investigate a focused question.",
387
+ "prompt": "Research the question and return concise evidence.",
388
+ "model": "inherit"
389
+ }
390
+ }
391
+ }
392
+ ```
393
+
394
+ - Names follow this extension's policy: 1–64 characters, starting with an ASCII letter, then letters, digits, `.`, `_`, or `-`. Required `description` and `prompt` must be nonblank strings; text is trimmed. Invalid entries are skipped individually. Invalid optional `model`, `thinking`, or `fast` values are omitted; unsupported fields, including per-entry MCP, are not forwarded.
395
+ - A trusted project with any valid definitions replaces the **whole** user set, not individual names. Empty/all-invalid project sets fall back to user definitions. No CLI, environment, or session override exists. Keep definitions non-secret.
396
+ - `model` uses a registered Cursor model ID **without** the `cursor/` provider prefix; set thinking separately to `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, or `max`. Omitted model and explicit `inherit` both inherit the parent model in SDK 1.0.37; `thinking`/`fast` do not override inherited models.
397
+ - Explicit models use catalog metadata for aliases, context and thinking. `:fast`/`:slow` wins over the entry's `fast`; unsuffixed models use entry `fast`, otherwise the catalog default. Parent thinking, `/cursor-fast`, saved fast defaults and process fast flags do not affect the definition. Unknown IDs pass through unchanged without invented parameters or a catalog request.
398
+ - **SDK 1.0.37 LOCAL ceiling:** its converter sends only the selected model ID or `inherit`, dropping all thinking/fast/context parameters. Thus `grok-4.6:slow` resolves to `grok-4.6`, but does not enforce child slow mode locally. Cloud conversion preserves the full selection; service acceptance/honoring of those parameters is not qualified here. Resource inheritance (`local.subagentInherit`) is not a model-parameter workaround.
399
+ - Definitions are passed through public SDK `agents` on ordinary create/resume and cloud creation. Changed resolved content replaces the local pooled agent on the next turn and rejects stale resume handles, bootstrapping from the Pi transcript; equivalent reordered content reuses it. Resume keys contain only a digest, not definition text. Removing all definitions restores the original no-feature key.
400
+
401
+ This is Cursor SDK-native delegation by configured name, not a second Pi subagent implementation. When exposed, `pi__subagent` remains preferred. LOCAL compaction/tree summary agents receive no definitions, tools, settings or MCP; bug-report streams retain ordinary capabilities.
402
+
343
403
  ### Cloud runtime and acknowledgement
344
404
 
345
405
  Cloud/runtime keys are minimal and explicit. Defaults stay local runtime with the loopback MCP bridge as the sole Pi-tool transport, no inline cloud MCP, and no local-state/env-file forwarding. SDK `customTools` remains deferred pending SDK cancellation/deadline support. Invalid non-empty `--cursor-runtime`, `--cursor-cloud-context`, `PI_CURSOR_RUNTIME`, or `PI_CURSOR_CLOUD_CONTEXT` values fail closed instead of falling through to lower-precedence config.
@@ -443,20 +503,22 @@ Local resume cleanup is explicit and session-ledger scoped:
443
503
  /cursor-local-resume-cleanup --yes
444
504
  ```
445
505
 
446
- It only deletes superseded local `agent-*` IDs that this extension recorded as cleanup candidates, one exact ID at a time through the Cursor SDK using the candidate's recorded store identity (or the SDK default workspace store for legacy candidates without one), and protects agents still resumable from any session-tree branch. Before SDK deletion it verifies and fsyncs an exact intent in the Pi session JSONL, then verifies and fsyncs the result; a missing or non-durable intent prevents deletion, while a missing or non-durable result leaves the durable intent—and a conservative current-process marker—blocking automatic retry. A candidate with a recorded store identity that is invalid for the current session is durably marked non-retryable and excluded from later cleanup attempts. It does not sweep any SDK store or call lower-level empty delete filters. Removing a pi session file does not automatically remove its persisted store directory. After permanently retiring that session and confirming no pi process is using it, a recorded root may be removed manually only when it is the session-derived `<getDefaultSdkStateRoot(cwd)>/pi-sessions/<session-hash>/` path. Never manually remove the SDK default workspace root, which legacy entries may record and other sessions may share.
506
+ With SDK-default storage selected, SDK 1.0.37 retains SDK 1.0.36's workspace-root derivation with SHA256 instead of MD5 and may rename the entire old workspace root on first use. Pi admits only exact cwd/session-derived old or current identities. After a rename, it verifies the recorded agent and cwd in the derived destination before resuming or cleaning up. If both roots exist, recorded legacy identities stay with the legacy store; nothing is merged. Failed renames retain the old store. Same-cwd acquisitions share atomic in-flight root derivation and retain ownership through resume/cleanup admission and open-store disposal; only then may the SDK retry. User-managed links/junctions above the SDK-owned `sdk-agent-store` prefix (such as `~/.cursor` or `~/.cursor/projects`) remain supported. Owned prefix and old/current workspace components are checked before the SDK getter can migrate history; links/non-directories within the owned layout fail closed. Recorded identities must match exact derived roots before any path walk; malformed paths fall back on resume or are durably non-retryable for cleanup. Stop other processes using old SDK state before upgrading; this in-process ownership guard is not a cross-process migration lock.
507
+
508
+ It only deletes superseded local `agent-*` IDs that this extension recorded as cleanup candidates, one exact ID at a time through the Cursor SDK using the candidate's recorded store identity (or, only with default storage selected, the SDK default workspace store for legacy candidates without one), and protects agents still resumable from any session-tree branch. Before SDK deletion it verifies and fsyncs an exact intent in the Pi session JSONL, then verifies and fsyncs the result; a missing or non-durable intent prevents deletion, while a missing or non-durable result leaves the durable intent—and a conservative current-process marker—blocking automatic retry. A candidate with a recorded store identity that is invalid for the current session is durably marked non-retryable and excluded from later cleanup attempts. It does not sweep any SDK store or call lower-level empty delete filters. Removing a pi session file does not automatically remove its persisted store directory. After permanently retiring that session and confirming no pi process is using it, a recorded root may be removed manually only when it is the exact cwd/session-derived current or surviving legacy `pi-sessions/<session-hash>/` directory. Do not remove a stale recorded MD5 path after migration: resolve and verify the actual owning directory first. Never manually remove the SDK default workspace root, which legacy entries may record and other sessions may share.
447
509
 
448
510
  Only enabled local safety values are passed to `Agent.create({ local })`; false/default values are omitted to preserve the current local-agent behavior. Local force is one-shot/manual-only through CLI/env and is passed only to the next `Agent.send({ local: { force: true } })`. Local resume is enabled by default for local runtime; opt out with `local.resume: false`, `--cursor-no-local-resume`, or `PI_CURSOR_LOCAL_RESUME=0`. Changes take effect on the next turn without recreating a healthy pooled agent.
449
511
 
450
512
  ## Images
451
513
 
452
- Images from the latest user message are forwarded to Cursor. Historical images are kept out of the transcript and appear only as `[image omitted from transcript]` placeholders, so follow-up questions about an earlier image should reattach the image or include a textual description. The extension advertises `text` and `image` input for Cursor models because Cursor's SDK accepts image messages and Cursor models are expected to support them.
514
+ For request-equivalent native session inputs, images from the latest pending native user message are forwarded to Cursor, even when hidden model-visible notices follow it. Those notices travel as background context alongside the request, and the pending input group remains required under transcript budgeting. A custom-only continuation does not resubmit an old request or attachment. Request-local transforms that change payload/order lack canonical origin and retain conservative last-converted-user selection. Historical images are kept out of the transcript and appear only as `[image omitted from transcript]` placeholders, so follow-up questions about an earlier image should reattach the image or include a textual description. The extension advertises `text` and `image` input for Cursor models because Cursor's SDK accepts image messages and Cursor models are expected to support them.
453
515
 
454
516
 
455
517
  ## Context, compaction, and Cursor usage
456
518
 
457
519
  Pi's default footer and `/stats` remain native. Assistant usage components are additive and describe the current context; cumulative Cursor billing never drives Pi's overflow or compaction checks. When fresh LOCAL SDK usage is unavailable, a historical occupancy floor is used only if the owning native projection matches the actual request and the same-model measurement follows the latest native compaction or context edit. Quoted summary text and wall-clock timestamps do not establish a boundary.
458
520
 
459
- LOCAL compaction and tree summaries use a fresh text-only SDK agent: `tools: []`, no ambient settings or MCP, no pi bridge, no tool manifest/replay, `agent` mode even when the conversation uses `plan`, and a temporary store removed on completion, cancellation, or failure. Ordinary turns retain their configured capabilities. Cloud does not support the same tool restriction; bug-report streams have no public purpose hook and retain ordinary capabilities rather than being guessed from their text. Direct and summary cancellation depends on SDK settlement; SDK 1.0.32 provides no completion deadline, so a controller that never settles can leave cancellation waiting.
521
+ LOCAL compaction and tree summaries use a fresh text-only SDK agent: `tools: []`, no ambient settings or MCP, no pi bridge, no tool manifest/replay, `agent` mode even when the conversation uses `plan`, and a temporary store removed on completion, cancellation, or failure. Ordinary turns retain their configured capabilities. Cloud does not support the same tool restriction; bug-report streams have no public purpose hook and retain ordinary capabilities rather than being guessed from their text. Direct and summary cancellation depends on SDK settlement; SDK 1.0.37 provides no public completion deadline, so a controller that never settles can leave cancellation waiting.
460
522
 
461
523
  Use the separate accounting view for recorded Cursor facts:
462
524
 
@@ -485,19 +547,21 @@ Local Cursor runs use two separate tool surfaces:
485
547
  - **Cursor-native surface:** Cursor local-agent tools, Cursor settings, plugins, and configured Cursor MCP servers. These remain owned by the Cursor SDK local agent path. Pi CLI tool toggles such as `--no-tools`, `--tools`, and `--exclude-tools` do not disable this Cursor-native surface.
486
548
  - **pi bridge surface:** pi-cursor-sdk exposes bridgeable active pi tools through a per-run local loopback MCP bridge when the bridge is enabled and the current pi tool registry has exposed tools. Pi CLI tool toggles affect this bridge surface because they change pi's active tool registry.
487
549
 
488
- The bridge uses stable MCP v2 with `@modelcontextprotocol/server@2.1.0`, `@modelcontextprotocol/hono@2.0.1`, `hono@4.13.9`, and `@hono/node-server@2.1.1`, bundled as its runtime closure. It binds only to loopback and validates Hono `Host` and `Origin` headers.
550
+ The bridge uses stable MCP v2 with `@modelcontextprotocol/server@2.3.1`, `@modelcontextprotocol/hono@2.0.2`, `hono@4.13.13`, and `@hono/node-server@2.1.3`, bundled as its runtime closure. It binds only to loopback and validates Hono `Host` and `Origin` headers.
489
551
 
490
552
  Bridge capabilities are snapshotted from `pi.getActiveTools()` and `pi.getAllTools()` for each Cursor run, including per-tool prompt guidelines when pi exposes them. Cursor sees active bridgeable pi tools as collision-safe MCP names such as `pi__sem_reindex` only when they are exposed in that current run. When exposed, Cursor is instructed to prefer `pi__mcp` for MCP work and `pi__subagent` for delegation; Cursor-configured MCP and Cursor-native subagents are fallbacks when the matching pi tool is not exposed or is unavailable. Pi session output, tool cards, confirmations, hooks, renderers, history, and abort behavior use the real pi tool name, such as `sem_reindex`. The bridge queues Cursor's MCP call, emits a normal pi `toolCall`, waits for the matching pi `toolResult`, and resolves that result back into the same live Cursor SDK run without creating a new `Agent`, unless the run was disposed, aborted, or cancelled. The bridge does not call pi tool `execute()` handlers directly.
491
553
 
492
- Overlapping built-in pi tools (`read`, `bash`, `write`, `edit`, `grep`, `find`, `ls`) are hidden by default because Cursor local agents already have native equivalents. Extension/custom tools and non-overlapping active tools present in pi's active tool registry normally remain exposed. The bridge also exposes `cursor_ask_question` as `pi__cursor_ask_question` when enabled, allowing Cursor to ask the user through pi UI instead of silently choosing a default. For local runtime, when pi has visible Agent Skills loaded, the extension rewrites pi's skill catalog for Cursor and exposes `cursor_activate_skill` as `pi__cursor_activate_skill`; Cursor should call that bridge tool with a listed skill name to load the full `SKILL.md` and bundled resource list before applying the skill. If the local bridge is disabled, the catalog remains available and instructs Cursor to fall back to reading the listed `SKILL.md` path directly. Cloud runtime preserves Pi project instructions but omits Pi's local skill catalog and keeps `cursor_activate_skill` inactive because the bridge and local absolute skill paths are unavailable there.
554
+ Overlapping built-in pi tools (`read`, `bash`, `write`, `edit`, `grep`, `find`, `ls`) are hidden by default because Cursor local agents already have native equivalents. Extension/custom tools and non-overlapping active tools present in pi's active tool registry normally remain exposed. The bridge also exposes `cursor_ask_question` as `pi__cursor_ask_question` when `PI_CURSOR_ASK_QUESTION=1`. It is off by default so Cursor does not block on questionnaires. For local runtime, when pi has visible Agent Skills loaded, the extension rewrites pi's skill catalog for Cursor and exposes `cursor_activate_skill` as `pi__cursor_activate_skill`; Cursor should call that bridge tool with a listed skill name to load the full `SKILL.md` and bundled resource list before applying the skill. If the local bridge is disabled, the catalog remains available and instructs Cursor to fall back to reading the listed `SKILL.md` path directly. Cloud runtime preserves Pi project instructions but omits Pi's local skill catalog and keeps `cursor_activate_skill` inactive because the bridge and local absolute skill paths are unavailable there.
493
555
 
494
556
  Cursor-native tool replay is separate from the bridge. Replay cards are display-only recorded Cursor SDK activity. They never re-run Cursor-side commands, reapply Cursor edits, call MCP servers, or mutate pi state. See [Cursor native tool replay](docs/cursor-native-tool-replay.md).
495
557
 
558
+ Footer display control: `PI_CURSOR_FOOTER=0` hides the Cursor status without hiding Pi's model or usage footer. Like other boolean controls, it accepts `0`, `false`, `off`, `none`, `no`, and `disabled` to hide; `1`, `true`, `on`, `yes`, and `enabled` to show (case-insensitive). Unset, blank, or unrecognized values keep the default visible status.
559
+
496
560
  Bridge controls:
497
561
 
498
562
  ```bash
499
- # Keep the pi bridge but disable Cursor's interactive question tool.
500
- PI_CURSOR_ASK_QUESTION=0 pi --model cursor/grok-4.6
563
+ # Opt in to Cursor's interactive question tool through pi UI.
564
+ PI_CURSOR_ASK_QUESTION=1 pi --model cursor/grok-4.6
501
565
 
502
566
  # Roll back to Cursor SDK tools/settings/MCP only; do not expose active pi tools through the bridge.
503
567
  PI_CURSOR_PI_TOOL_BRIDGE=0 pi --model cursor/grok-4.6
@@ -530,12 +594,25 @@ PI_CURSOR_PI_TOOL_BRIDGE_DEBUG=1 pi --model cursor/grok-4.6
530
594
 
531
595
  On bootstrap sends, a compact **callable tool surfaces** block is injected into the Cursor prompt by default. It reminds the model that Cursor host/configured MCP tools are controlled by Cursor, while pi tool toggles only affect pi tools/bridge exposure; when bridge tools are exposed, it lists the current `pi__*` names. Disable with `PI_CURSOR_TOOL_MANIFEST=0`.
532
596
 
533
- `PI_CURSOR_ASK_QUESTION=0` disables only `cursor_ask_question`, leaving the rest of the pi bridge available; it is enabled by default. `PI_CURSOR_PI_TOOL_BRIDGE=0` is the supported rollback flag and disables the bridge entirely. Both flags treat `false`, `off`, `none`, `no`, and `disabled` as off; `1`, `true`, `on`, `yes`, and `enabled` as on. `PI_CURSOR_EXPOSE_BUILTIN_TOOLS=1` opts in to exposing overlapping pi tool names that Cursor already has native equivalents for. The installed Cursor SDK uses a 60-second MCP protocol default with no public per-server timeout option. pi-cursor-sdk overrides that seam in two directions by default: MCP `callTool` requests are extended to 3600 seconds for long-running local MCP tools (including the pi bridge and configured Cursor MCP servers), and known MCP initialize/listTools requests on first send are shortened to 10 seconds so unavailable configured MCP servers fail fast instead of blocking for a full minute. Unknown Cursor SDK MCP protocol timeout stacks keep the SDK default instead of being shortened. Override tool-call timeouts with `PI_CURSOR_MCP_TOOL_TIMEOUT_MS` or `PI_CURSOR_MCP_TOOL_TIMEOUT_SECONDS`, and first-send initialize/listTools timeouts with `PI_CURSOR_MCP_CONNECT_TIMEOUT_MS` or `PI_CURSOR_MCP_CONNECT_TIMEOUT_SECONDS`. Bridged calls also have a local fail-closed deadline that defaults to the effective MCP tool timeout; lower it with `PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS` when a lost pi result should fail sooner. On expiry, the bridge rejects and removes the pending call and aborts active pi execution when available. The bridge's `listTools` handler returns its snapshot synchronously, so a Cursor UI label such as `GetMcpTools` does not by itself identify a `listTools` deadlock; the durable bridge waiter is `CallTool` awaiting its matching pi result.
597
+ `PI_CURSOR_ASK_QUESTION=1` enables only `cursor_ask_question`, leaving the rest of the pi bridge available; it is off by default. `PI_CURSOR_PI_TOOL_BRIDGE=0` is the supported rollback flag and disables the bridge entirely. Both flags treat `false`, `off`, `none`, `no`, and `disabled` as off; `1`, `true`, `on`, `yes`, and `enabled` as on. `PI_CURSOR_EXPOSE_BUILTIN_TOOLS=1` opts in to exposing overlapping pi tool names that Cursor already has native equivalents for. The installed Cursor SDK uses a 60-second MCP protocol default with no public per-server timeout option. pi-cursor-sdk overrides that seam in two directions by default: MCP `callTool` requests are extended to 3600 seconds for long-running local MCP tools (including the pi bridge and configured Cursor MCP servers), and known MCP initialize/listTools requests on first send are shortened to 10 seconds so unavailable configured MCP servers fail fast instead of blocking for a full minute. Unknown Cursor SDK MCP protocol timeout stacks keep the SDK default instead of being shortened. Override tool-call timeouts with `PI_CURSOR_MCP_TOOL_TIMEOUT_MS` or `PI_CURSOR_MCP_TOOL_TIMEOUT_SECONDS`, and first-send initialize/listTools timeouts with `PI_CURSOR_MCP_CONNECT_TIMEOUT_MS` or `PI_CURSOR_MCP_CONNECT_TIMEOUT_SECONDS`. Bridged calls also have a local fail-closed deadline that defaults to the effective MCP tool timeout; lower it with `PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS` when a lost pi result should fail sooner. On expiry, the bridge rejects and removes the pending call and aborts active pi execution when available. The bridge's `listTools` handler returns its snapshot synchronously, so a Cursor UI label such as `GetMcpTools` does not by itself identify a `listTools` deadlock; the durable bridge waiter is `CallTool` awaiting its matching pi result.
598
+
599
+ Pending pi bridge calls keep their owning local Cursor live run active, including queued calls, long-running tools, and questions awaiting human input. After the last owned call settles and the provider drain lease ends, the full idle cleanup window (five minutes by default) restarts—even if cleanup was requested before the lease. A pending call in another session does not delay cleanup. This is not an answer timeout: explicit abort/shutdown/reset/compaction and the fail-closed MCP/bridge deadline (one hour by default) still clean up pending work. Abandoned display-only native replay retains its idle expiry.
534
600
 
535
- `PI_CURSOR_HTTP_1_1=true` maps to the Cursor SDK `Cursor.configure({ local: { useHttp1ForAgent: true } })` compatibility mode for corporate VPN/proxy environments where HTTP/2 streams fail. In interactive sessions, `/cursor-http on`, `/cursor-http off`, and `/cursor-http toggle` set the branch-scoped session preference and save the user default as `local.useHttp1ForAgent` in `~/.pi/agent/cursor-sdk.json`; `/cursor-http` with no argument reports the effective state. Precedence is session command/history, explicit `PI_CURSOR_HTTP_1_1`, user config, then the built-in unset default; project config is ignored for this user-level compatibility choice. Unset performs no SDK configuration, preserving the existing default path. Session shutdown clears extension-owned SDK transport state before module reload. Changing the effective setting splits the local agent pool so an agent created under another transport is not reused. When enabled, the local Cursor footer shows `http1` (for example `cursor:local · fast:on · http1`); cloud status never does. This affects Cursor SDK local-agent backend streams only; it does not configure HTTP proxies, TLS certificates, or HTTP/3.
601
+ `PI_CURSOR_LIVE_RUN_IDLE_DISPOSE_MS` sets that window for eligible retained local replay runs. It defaults to `300000` (five minutes); only decimal digits representing an integer from `1` through `2147483647` are accepted. Unset, blank, malformed (including surrounding whitespace), and out-of-range values fall back to five minutes. For example, `PI_CURSOR_LIVE_RUN_IDLE_DISPOSE_MS=900000 pi --model cursor/grok-4.6` selects fifteen minutes. The full configured window restarts after the last owned pending call settles and the provider drain lease ends. This environment-only setting does not change bridge/MCP deadlines or explicit abort/shutdown cleanup, and is not a fix for backend authentication, transport, or lost-executor failures.
602
+
603
+ `PI_CURSOR_HTTP_1_1=true` maps to the Cursor SDK `Cursor.configure({ local: { useHttp1ForAgent: true } })` compatibility mode for corporate VPN/proxy environments where HTTP/2 streams fail. In interactive sessions, `/cursor-http on`, `/cursor-http off`, and `/cursor-http toggle` set the branch-scoped session preference and save the user default as `local.useHttp1ForAgent` in `~/.pi/agent/cursor-sdk.json`; `/cursor-http` with no argument reports the effective state. Precedence is session command/history, explicit `PI_CURSOR_HTTP_1_1`, user config, then the built-in unset default; project config is ignored for this user-level compatibility choice. Unset performs no SDK configuration, preserving the existing default path. Session shutdown clears extension-owned SDK transport state before module reload. Changing the effective setting splits the local agent pool so an agent created under another transport is not reused. When enabled, the local Cursor footer shows `http1` (for example `cursor:local · fast:on · http1`); cloud status never does. This affects Cursor SDK local-agent backend streams only; it does not configure HTTP proxies, TLS certificates, or HTTP/3. SDK 1.0.37 vendors its patched Node ConnectRPC client; its HTTP/2 default ping interval is 59 seconds and idle connection timeout is 29 seconds. Those are connection settings, not a model-turn deadline or a promise of service recovery.
536
604
 
537
605
  `PI_CURSOR_PI_TOOL_BRIDGE_DEBUG=1` is off by default and emits typed, allowlisted, scrubbed single-line JSONL records to `process.stderr`. These records are operational diagnostics, not anonymous telemetry: they intentionally include tool names, safe correlation IDs, bridge run state, exposed pi↔MCP name pairs, queued requests, result resolution, rejection, cancellation, and pending counts. They must not include endpoint URLs, endpoint path components, endpoint tokens, raw args/results, stdout/stderr payloads, file contents, Cursor settings output, API keys, bearer tokens, cookies, session credentials, or secrets. Do not enable or share bridge debug logs where tool names themselves are sensitive.
538
606
 
607
+ Interpret the bridge diagnostic records by their boundary:
608
+
609
+ - `run_created` / `tools_exposed`: bridge exposure, not a client connection.
610
+ - `mcp_initialized`: the server received a validated `notifications/initialized`.
611
+ - `mcp_tools_list`: the catalog handler produced `toolCount` tools after request validation, not proof the client received or model consumed them.
612
+ - `request_queued` / `request_resolved` / `request_rejected`: actual bridge call handling.
613
+
614
+ These server observations do not identify the client as Cursor or prove ongoing connection health. Missing receipts do not diagnose why a client/model made no request. `/cursor-tools` cannot inspect an already captured run's surface. See [Cursor tool surfaces](docs/cursor-tool-surfaces.md#diagnosing-advertised-but-unused-bridge-tools).
615
+
539
616
  ### Maintainer cost-conscious verification
540
617
 
541
618
  Run offline/faux tests, native contracts, type checks, builds, and package checks first; preserve offline cross-platform CI. Reuse retained evidence for unchanged tested inputs. Real Cursor calls are only for the smallest meaningful changed-behavior check that needs real-service proof, on one representative environment. Docs/metadata-only changes need no paid testing. Do not replay full paid campaigns, run host matrices merely for matrix coverage, or automatically retry paid failures. Automated Cursor PR reviews continue unchanged.
@@ -556,20 +633,22 @@ See [Cursor testing lessons](docs/cursor-testing-lessons.md#cursor-sdk-event-cap
556
633
 
557
634
  ## Fallback models
558
635
 
559
- If startup has no stored `/login` key or `CURSOR_API_KEY`, model discovery fails, or discovery returns no models, the extension registers a bundled fallback snapshot of the latest reviewed Cursor SDK model catalog and notifies interactive users when possible. Pi CLI `--api-key` remains available to provider turns but is not parsed independently during startup discovery.
636
+ If no matching cached catalog is available in a cache-only phase, auth is missing, or live discovery fails or returns no models, the extension retains known bundled fallback identities and notifies interactive users when possible. By default these models remain available without auth. With `PI_CURSOR_HIDE_MODELS_WHEN_LOGGED_OUT=1`, unauthenticated picker/list availability is empty, but known CLI selection and native login remain functional. Pi owns `--api-key` parsing.
560
637
 
561
- The fallback snapshot includes Grok 4.6, Composer 2.5 (`composer-2.5` and `composer-2-5`), Composer 2, Cursor's GPT-5.6 Luna/Sol/Terra models, Claude, Gemini, Grok 4.5, Kimi, and other model IDs exposed by the reviewed `Cursor.models.list()` output. Recommended local/smoke runs use `cursor/grok-4.6`. Pi's separate `openai-codex` catalog is owned by Pi itself and includes native `gpt-5.6-luna`, `gpt-5.6-sol`, and `gpt-5.6-terra` support. The exact checked-in Cursor snapshot lives in `src/cursor-fallback-models.generated.ts`. A dated maintainer capture documents the assistant-visible [Cursor system prompts and tool guidance](https://github.com/fitchmultz/pi-cursor-sdk/blob/main/docs/evidence/cursor-system-prompts-2026-08-02/README.md) for Grok 4.5, Opus 5, Fable 5, and the GPT-5.6 Sol/Terra/Luna family.
638
+ The fallback snapshot includes Grok 4.6, Composer 2.5 (`composer-2.5` and `composer-2-5`), Composer 2, Cursor's GPT-5.6 Luna/Sol/Terra models, Claude, Gemini, Grok 4.5, Kimi, and other model IDs exposed by the reviewed `Cursor.models.list()` output. Recommended local/smoke runs use `cursor/grok-4.6`. Pi's separate `openai-codex` catalog is owned by Pi itself and includes native `gpt-5.6-luna`, `gpt-5.6-sol`, and `gpt-5.6-terra` support. The exact checked-in Cursor snapshot lives in `src/cursor-fallback-models.generated.ts`; its generator provenance records SDK 1.0.37 and 46 models from the authenticated catalog-only refresh on 2026-10-07. That refresh added Claude Haiku 5.5 (`claude-haiku-5-5`), preserving all 45 prior model records from the SDK 1.0.36 capture on 2026-10-06. The 33 bundled checkpoint-derived entries were unchanged; no Agent/model turn or Cloud run was performed. A dated maintainer capture documents the assistant-visible [Cursor system prompts and tool guidance](https://github.com/fitchmultz/pi-cursor-sdk/blob/main/docs/evidence/cursor-system-prompts-2026-08-02/README.md) for Grok 4.5, Opus 5, Fable 5, and the GPT-5.6 Sol/Terra/Luna family.
562
639
 
563
640
  Actual Cursor runs still need a key from `/login`, `CURSOR_API_KEY`, or `--api-key`. If you add auth after startup, run `/cursor-refresh-models` to refresh the full live Cursor model catalog without restarting pi.
564
641
 
565
642
  ## Limits
566
643
 
644
+ - **Commit/PR attribution has no supported opt-out.** SDK 1.0.37 exposes neither attribution control through public create/local/send/configure options. CLI-file edits and SDK-internal patches are not supported extension settings; [#302](https://github.com/fitchmultz/pi-cursor-sdk/issues/302) tracks both controls.
645
+
567
646
  - **Cloud runtime is explicit and minimal.** Local remains the default. Cloud runs create Cursor cloud agents only after first-use acknowledgement and safety preflight, use fresh context by default, do not expose the pi bridge or local MCP, do not forward pi env vars, support explicit Cursor-managed environment selection, name agents from the pi session title when available, stream display-only agent/run/branch/PR/artifact/raw-usage telemetry when available, and record only explicit session-branch lifecycle commands for cleanup (`/cursor-cloud list|archive|delete`).
568
647
  - **The pi tool bridge is local and MCP-backed.** Bridgeable active pi tools are exposed to local Cursor agents through a tokenized `127.0.0.1` MCP endpoint; internal Cursor replay activity names are excluded, and overlapping built-in pi tools are hidden by default. Set `PI_CURSOR_PI_TOOL_BRIDGE=0` to disable it or `PI_CURSOR_EXPOSE_BUILTIN_TOOLS=1` to expose overlapping built-ins too.
569
648
  - **Cursor native tool replay is display-only.** Replay renders recorded Cursor SDK activity and never re-runs Cursor-side commands, reapplies Cursor edits, calls MCP servers, or mutates pi state. Workflow tools such as Cursor mode/task/todo/plan activity are not pi workflow controls. See [Cursor native tool replay](docs/cursor-native-tool-replay.md) for supported replay cards, ordering, conflict handling, and opt-out flags.
570
649
  - **Cursor run state can span tool-use turns.** Within a pi session, the extension reuses one Cursor SDK agent across compatible follow-up turns and sends incremental prompts when context still matches. It recreates the agent when context diverges, after compaction or `/tree` navigation, on API key changes, after send errors, or on session shutdown. For bridged pi tools, the matching pi `toolResult` resolves into the same live Cursor SDK run without creating a new `Agent`, unless the run was disposed, aborted, or cancelled. Replay can also split one live Cursor SDK run across pi `toolUse` turns for display.
571
650
  - **Final assistant text is the last non-empty text part.** Composer responses can produce one assistant message with early progress `text`, thinking/tool metadata, and a later final `text` report. Consumers that need a final answer should scan assistant message content from the end and use the last non-empty `text` part, not the first. Cursor `thinking` deltas are shown as thinking traces when the SDK emits them; those traces can include draft answers or copied exact-output targets and are intentionally not collapsed by this extension.
572
- - **Cursor setting sources default to all.** The extension passes `local.settingSources: ["all"]` by default so configured Cursor MCP servers, plugin tools, project/user settings, and related Cursor-native capabilities are available like they are in Cursor. To narrow loading, set a comma-separated list such as `PI_CURSOR_SETTING_SOURCES=project,user,plugins`. To disable ambient setting sources, set `PI_CURSOR_SETTING_SOURCES=none`. Direct Cursor SDK bootstrap logs (settings, skills, hook-load compatibility warnings, and similar) are suppressed so they do not pollute the TUI.
651
+ - **Cursor setting sources default to all.** The extension passes `local.settingSources: ["all"]` by default so configured Cursor MCP servers, plugin tools, project/user settings, and related Cursor-native capabilities are available like they are in Cursor. To narrow loading, set a comma-separated list such as `PI_CURSOR_SETTING_SOURCES=project,user,plugins`. To disable ambient setting sources, set `PI_CURSOR_SETTING_SOURCES=none`. Verified framed SDK inventory/rules/skills completion logs and exact hook-compatibility notices are filtered without changing settings, hooks, plugin trust, or parser enforcement. An outside-root local-plugin symlink rejection or the exact native-parser-unavailable warning instead produces a bounded native notice with recovery guidance, recorded as non-model session data without raw paths. Outside the retained creation-only mute around `Agent.create()`, other failures (including hook symlink refusals, ignore-mapping errors, and missing ripgrep configuration) retain their original output. The two recognized capability notices escape that creation mute.
573
652
  - **AGENTS.md / CLAUDE.md are not duplicated on Cursor models when Cursor loads the same rules.** Pi discovers global and project context files (`AGENTS.md`, `CLAUDE.md`, and case variants) unless you start with `-nc`. On `cursor/*` models the extension removes only `<project_instructions>` blocks that overlap Cursor `settingSources` via the `before_agent_start` hook: `user` for `~/.pi/agent/AGENTS.md`, `project` for repo/parent `AGENTS.md` and `CLAUDE.md` (verified Cursor behavior: local agents load project `AGENTS.md` and `CLAUDE.md` alongside Cursor rules). `~/.pi/agent/CLAUDE.md` is not stripped (Cursor user rules use `~/.claude/CLAUDE.md`, not pi's agent dir). With `PI_CURSOR_SETTING_SOURCES=none` or `plugins`-only, pi context is left intact. Set `PI_CURSOR_PRESERVE_PI_AGENTS_MD=1` to keep duplicate injection.
574
653
  - **Max Mode is not a manual pi variant.** Cursor's SDK may enable Max Mode automatically for models that require it. This extension only advertises exact context-window variants that the SDK catalog exposes and otherwise uses conservative SDK-derived default/non-Max context windows.
575
654
  - **Output token limits are conservative.** Cursor SDK model metadata does not currently expose output token limits directly.
@@ -586,6 +665,8 @@ When a Cursor run fails after auth is configured, pi surfaces scrubbed provider
586
665
 
587
666
  Aborted runs now include a likely cause when determinable, for example `Cancelled: prompt interrupted.` for user cancel or `Cancelled: Cursor SDK run was cancelled.` for SDK-side cancellation.
588
667
 
668
+ SDK 1.0.37 source preserves SDK 1.0.36's client bearer refresh and unauthenticated handling, but those mechanisms do not establish the cause of [#247](https://github.com/fitchmultz/pi-cursor-sdk/issues/247)'s historical idle failure. Reloading filesystem config is not a public auth-reset API. No guessed idle TTL or extension-level automatic resend is added: resending can duplicate executed tool effects.
669
+
589
670
  Network failures from the Cursor SDK connect layer (for example `ConnectError: read ETIMEDOUT` or `ConnectError: [aborted] read ECONNRESET`) surface as scrubbed `Network error` messages instead of crashing pi, matching pi's native auto-retry classifier. The SDK-provenance `WriteIterableClosedError: WritableIterable is closed` race remains guarded for the Pi session lifecycle; Connect/network suppression remains active-turn scoped; raw Cursor SDK `AbortError` DOMExceptions are suppressed while any provider turn or session process-error guard is active. Unrelated failures remain fatal. The old raw child-stdin EPIPE workaround was removed because Cursor SDK fixed that path by 1.0.27. Persistent failures may indicate a transient Cursor service or network issue.
590
671
 
591
672
  You can also restart pi with a key in the same shell or launcher that starts pi:
@@ -603,7 +684,9 @@ pi --api-key "your-key" --model cursor/grok-4.6 -p "Say ok only"
603
684
 
604
685
  ### Embedded sessions report concurrent Cursor turns
605
686
 
606
- In-process sessions using independent `ModelRuntime` instances (the SDK default on supported Pi hosts) support concurrent turns, children launched inside parent tools, and direct compaction/tree/bug-report summaries. Each provider registration captures its own session, bridge, storage, and debug scope. Fork-inherited tool-result IDs cannot drain a parent's live run; replay wrappers reject foreign-owner or wrong-tool results without consuming the original card or executing work. Native request-header receipts verify the calling session before SDK/storage work, including auxiliary streams. Explicitly sharing a `ModelRuntime` overwrites its Cursor registration: requests from another session fail closed rather than entering the sibling's scope. Use independent runtimes, or run `/cursor-refresh-models`/reload to restore the intended registration. A not-yet-bound or shut-down provider closure cannot send. **Migration from 0.4.0:** bare `ctx.modelRegistry.complete(...)` and `ctx.modelRegistry.streamSimple(...)` calls lack the native receipt and are unsupported for Cursor, including custom compaction integrations; bind/refresh/reload does not fix that path. Use the owning AgentSession's stream path or an independent child AgentSession. CLI flags and their one-shot local-force consumption remain owned by each embedded session runtime across reload. Cursor SDK HTTP/1.1 transport configuration and environment/user defaults remain process-global; branch preferences are session-scoped, not independent SDK transport configurations. See [multi-session embedding semantics](docs/cursor-model-ux-spec.md#multi-session-embedding).
687
+ In-process sessions using independent `ModelRuntime` instances (the SDK default on supported Pi hosts) support concurrent turns, children launched inside parent tools, and direct compaction/tree/bug-report summaries. Each provider registration captures its own session, bridge, storage, and debug scope. Fork-inherited tool-result IDs cannot drain a parent's live run; replay wrappers reject foreign-owner or wrong-tool results without consuming the original card or executing work. Native request-header receipts verify the calling session before SDK/storage work, including auxiliary streams. Explicitly sharing a `ModelRuntime` overwrites its Cursor registration: requests from another session fail closed rather than entering the sibling's scope. Use independent runtimes, or reload the intended session to restore its registration; catalog refresh does not replace a sibling's provider. A not-yet-bound or shut-down provider closure cannot send. **Migration from 0.4.0:** bare `ctx.modelRegistry.complete(...)` and `ctx.modelRegistry.streamSimple(...)` calls lack the native receipt and are unsupported for Cursor, including custom compaction integrations; bind/refresh/reload does not fix that path. Use the owning AgentSession's stream path or an independent child AgentSession. CLI flags and their one-shot local-force consumption remain owned by each embedded session runtime across reload. Cursor SDK HTTP/1.1 transport configuration and environment/user defaults remain process-global; branch preferences are session-scoped, not independent SDK transport configurations. See [multi-session embedding semantics](docs/cursor-model-ux-spec.md#multi-session-embedding).
688
+
689
+ Independent SessionManagers opening the same persisted file have separate transient Cursor pools, generations and live-run ownership. Reload/tree/shutdown of one manager does not invalidate the other's resources. Durable store/resume/lineage identities remain unchanged; an atomic process-local agent claim prevents a sibling from resuming or deleting a still-owned handle. Failed or timed-out SDK disposal retains that claim until successful disposal or process exit. This fixes a reproduced same-file `Cursor session agent scope is closed` trigger, not every cause reported in [#282](https://github.com/fitchmultz/pi-cursor-sdk/issues/282). It is not a cross-process lock or qualification of concurrent real SQLite/journal writes to one file; use native forks or separate files for independent conversations.
607
690
 
608
691
  ### Native shell parsing or module loading fails
609
692
 
@@ -613,11 +696,15 @@ An explicitly set `CURSOR_TREE_SITTER_VENDOR_DIR` is left untouched. Use an abso
613
696
 
614
697
  The automatically selected path is process-wide and inherited by bash commands and child Pi processes. A child running another extension install or worktree treats that inherited value as an explicit override, even if the parent's install has moved or been deleted. To rediscover the child's own parser package, launch it with `env -u CURSOR_TREE_SITTER_VENDOR_DIR pi -e .` (or remove the variable from the child environment on Windows). Alternatively, set an absolute vendor path for the child's install. Inherited overrides are not validated or replaced automatically.
615
698
 
616
- A `ResolveMessage`, missing module, or missing `protoBase64` export is a loader problem, not evidence of a bad API key. Reports involving compiled Bun Pi and embedded hosts remain open; this native-path repair does not change their dependency loading graph. An npm-installed Node Pi is the known working control. Likewise, preserving the reported idle-session `Authentication error` does not establish why an hour-idle session fails or promise automatic recovery.
699
+ A `ResolveMessage`, missing module, or missing `protoBase64` export is a loader problem, not evidence of a bad API key. The static SDK and bridge imports in 0.5.1 also repair the compiled-Bun extension graph. A packed installation reached expected invalid-key handling in official compiled Pi 1.0.3 on macOS arm64. The retained SDK 1.0.36 installed-package probe showed its nested Connect 1.7.0 / Protobuf 1.10.0 graph linking normally; forcing its Protobuf import to the root 2.16.0 package reproduces the exact missing export. That does not establish the unnamed Windows hosts' resolution in [#233](https://github.com/fitchmultz/pi-cursor-sdk/issues/233); their importer-relative paths and bootstrap remain necessary. The credential-free real-SDK first-send test reaches a blocked key-exchange boundary, not authenticated inference or every embedded loader.
700
+
701
+ SDK 1.0.37 source retains the parser-unavailable branch returning `parsingFailed`; the retained SDK 1.0.36 private package probe still executed the command. It does not itself establish why Pi received SIGTERM in the non-Cursor/opencode report [#339](https://github.com/fitchmultz/pi-cursor-sdk/issues/339). Warning text alone cannot identify the emitting artifact or signal sender.
617
702
 
618
703
  ### `pi --list-models cursor` shows no Cursor models
619
704
 
620
- Confirm the package is installed:
705
+ With `PI_CURSOR_HIDE_MODELS_WHEN_LOGGED_OUT=1`, this is expected until Cursor has effective native auth. Run `/login`, supply `CURSOR_API_KEY` or pi's `--api-key`, or unset the flag to restore default fallback availability. Known CLI model selection remains available either way.
706
+
707
+ If the flag is not the cause, confirm the package is installed:
621
708
 
622
709
  ```bash
623
710
  pi list
@@ -635,7 +722,7 @@ That does not mean the model cannot think. It means the Cursor SDK does not expo
635
722
 
636
723
  ### I do not see `cursor:local` / `cursor:cloud` or `plan` in the footer
637
724
 
638
- The Cursor footer appears only while a Cursor model is active. Fast-capable local models show `cursor:local · fast:on` or `cursor:local · fast:off`; Cursor models without a fast parameter show `cursor:local · fast:n/a`. Cloud runtime shows `cursor:cloud · fast:n/a`. Cursor SDK mode is the default `agent` mode when `plan` is absent. When both are active, pi shows one combined Cursor status such as `cursor:local · fast:on · plan` or `cursor:cloud · fast:n/a · plan`.
725
+ The Cursor footer appears only while a Cursor model is active and `PI_CURSOR_FOOTER` is enabled (the default). Remove `PI_CURSOR_FOOTER=0` or set it to `1` to restore the status. Fast-capable local models show `cursor:local · fast:on` or `cursor:local · fast:off`; Cursor models without a fast parameter show `cursor:local · fast:n/a`. Cloud runtime shows `cursor:cloud · fast:n/a`. Cursor SDK mode is the default `agent` mode when `plan` is absent. When both are active, pi shows one combined Cursor status such as `cursor:local · fast:on · plan` or `cursor:cloud · fast:n/a · plan`.
639
726
 
640
727
  ### My Cursor app settings or rules do not seem to apply
641
728
 
@@ -711,34 +798,48 @@ PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS=120000 pi --model cursor/grok-4.6
711
798
 
712
799
  This usually needs session JSONL to classify. Common cases:
713
800
 
714
- - **Model text echo:** Assistant `text` blocks contain lines like `Tool call`, `Cursor activity`, or `call cursor-replay-…` without matching `toolCall` blocks — the Cursor model narrated pi prompt transcript format instead of invoking SDK tools. See [Tool calls listed as plain text (#40 triage)](docs/cursor-testing-lessons.md#tool-calls-listed-as-plain-text-40-triage).
801
+ - **Model text echo:** Assistant `text` blocks contain lines like `Tool call`, `Cursor activity`, or `call cursor-replay-…` without matching `toolCall` blocks — narration is not tool execution. Structured history now uses `Historical tool request/result/error` labels, retaining arguments, IDs and errors without implying an unmatched request completed. This reduces an imitable template; it does not prevent model narration or strip legitimate prose/code examples. Raw assistant history is preserved and prose is never converted into tool calls or automatically resent. See [Tool calls listed as plain text (#40 triage)](docs/cursor-testing-lessons.md#tool-calls-listed-as-plain-text-40-triage).
715
802
  - **Stale replay routing / plan-strip:** Error `toolResult` or error assistant messages contain `Tool grep/cursor/find/ls not found`, or provider debug shows `inactive_trace` after plan-mode execute stripped active tools — tracked in **#52** (distinct from model text echo and #55).
716
803
  - **Replay vs execution:** `cursor-replay-*` IDs and neutral **Cursor MCP** activity cards are display-only recorded Cursor results; they do not re-run browser/MCP work. See [Cursor native tool replay](docs/cursor-native-tool-replay.md).
717
804
  - **Run failure / discarded tools:** A red toast with scrubbed detail may indicate an SDK failure (#55). Started-but-never-completed Cursor tools surface neutral **Cursor … did not complete** activity cards with a bounded reason when the run failed/aborted, produced no assistant text, or involved external/side-effectful tools. Incomplete fast local discovery starts (`read`, `grep`, `glob`, `ls`) are debug-only after a successful text-producing run so stale SDK start events do not create red post-answer cards; maintainer debug for the same gap remains in **#52** (`PI_CURSOR_SDK_EVENT_DEBUG=1`).
718
805
  - **Hard SDK crash:** pi exited with an uncaught Cursor SDK `ConnectError` or `WriteIterableClosedError` instead of showing a normal run error — capture the stack/session tail as a process-guard regression, not #40 text echo.
719
806
 
807
+ Shell correlation accepts legacy names (`shell`, `bash`, `run_terminal_cmd`) with different IDs only when exactly one pending shell has identical arguments; exact IDs take precedence. This is compatibility handling, not evidence that SDK 1.0.37 emits alias-changing callback pairs. Its public shell payload uses `type: "shell"`; retained SDK 1.0.36 installed-accumulator evidence shows `onStep` preserving that completed ToolCall without adding a step ID. Assistant text or stdout progress alone does not establish completion; unmatched shell starts still remain visible and debug capture is unchanged.
808
+
720
809
  Capture `pi --version`, extension version, model, flags, the exact prompt, and a redacted session dir before filing bugs.
721
810
 
722
811
  ### Cursor native tool cards conflict with another extension
723
812
 
724
813
  Cursor native replay is a display enhancement for TUI sessions and structured JSON/RPC consumers. It replays recorded Cursor SDK activity without re-running tools, and print mode remains text-first. See [Cursor native tool replay](docs/cursor-native-tool-replay.md) for conflict behavior and opt-out flags.
725
814
 
815
+ ## Automatic npm releases (maintainers)
816
+
817
+ Follow the [shared release procedure](https://github.com/fitchmultz/.github#automatic-npm-releases): merge a reviewed PR into `main` with an intentional `package.json` version bump and a matching versioned `CHANGELOG.md` section. Automation never bumps versions, overwrites releases, or republishes an existing version. Once configured and enabled, it runs the existing offline compatibility and native macOS/Windows jobs, qualifies one candidate tarball, then waits for `fitchmultz` approval in the `npm` environment.
818
+
819
+ Approve only after checking the exact source commit, version, downloaded candidate tarball and summary against the [release review gate](AGENTS.md#release-review-gate-maintainer) and [cost-conscious verification policy](#maintainer-cost-conscious-verification). Complete the exact-release-diff deep review with zero findings, the documented pre-release catalog check, and any genuinely necessary changed-behavior proof. Approval attests genuine satisfaction of existing requirements; it does not create proof. Authenticated checks remain outside CI; automated Cursor PR reviews remain unchanged, and no routine paid Cloud campaigns or paid retries are added. Automated publication disables npm hooks to publish the checked bytes; existing manual publisher instructions remain valid.
820
+
821
+ Failed/unpublished candidates can retry daily at 12:17 UTC or via manual dispatch of `npm release` on `main` only while the current source still owns the same version, tag, draft, and candidate assets. Inspect their exact source/run identities first: an authentication repair alone does not authorize publishing an old candidate after `main` advances. When source advances beyond a reserved candidate, use the next unused stable version and fresh qualification; never move its tag, overwrite its draft/assets, or relabel old proof. The [0.5.1 changelog](CHANGELOG.md#051-unpublished-source-history) is unpublished source history carried into 0.5.2, not a successful publication record. Set repository variable `NPM_RELEASE_ENABLED` to anything other than `true` to stop new release plans; cancel pending runs separately when needed. Workflow validation is not evidence of a completed real OIDC publication.
822
+
823
+ Publication records are independent: on 2026-10-07, npm listed 0.5.2 as published and `latest`, while GitHub's `v0.5.2` release remained a draft bound to source `9820ae7`. Preserve that tag, draft, and candidate assets unchanged. The 0.5.3 source uses a new version and candidate; its preparation is not proof of npm or GitHub publication.
824
+
726
825
  ## Development
727
826
 
728
- The source qualification baseline is official Pi **0.99.1**, with official Pi latest and current `fitchmultz/pi` main as compatibility targets, optional wildcard Pi/TypeBox host peers, and exact Cursor SDK **1.0.32**. The exact development Pi cohort is 0.99.1, with host TypeBox 1.3.27. Run `npm ci --ignore-scripts` then `npm run check:compat` in an empty HOME/agent profile for credential-free qualification. This builds the manifest entry, runs existing type/unit/package checks, and tests the compiled provider's registration plus production prompt shaping against native Pi transcript/tool transitions. Replay arguments must match their JSON stream deltas. A second native contract runs the registered Cursor provider with only its external SDK transport/storage substituted: real loopback bridge execution, display-only replay, persisted usage, incremental sends, tree navigation, compaction, request-boundary steering, abort and reload/disposal. Tests use no live Cursor service.
827
+ Required qualification targets are the latest stable official Pi and latest maintained `fitchmultz/pi` main, with optional wildcard Pi/TypeBox host peers and exact Cursor SDK **1.0.37**. CI resolves the official version/fork commit once and retains exact SDK/CLI provenance. Types, tests and package checks use each selected host's consistent dependency graph; the locked development Pi **1.0.4** dependencies are reproducible snapshots, not qualification targets. After `npm ci --ignore-scripts`, run `node scripts/ci-compatibility.mjs --automation /path/to/automation` in an empty HOME/agent profile for credential-free latest qualification. Native macOS/Windows checks select the same resolved latest official graph. This builds the manifest entry, runs existing type/unit/package checks, and tests the compiled provider's registration plus production prompt shaping against native Pi transcript/tool transitions. Replay arguments must match their JSON stream deltas. A second native contract runs the registered Cursor provider with only its external SDK transport/storage substituted: real loopback bridge execution, display-only replay, persisted usage, incremental sends, tree navigation, compaction, request-boundary steering, abort and reload/disposal. Tests use no live Cursor service.
729
828
 
730
- TypeScript 7 builds and checks package types. `@typescript/typescript6` is dev-only and used solely by the AST architecture test because TypeScript 7 does not expose a stable compiler API. Vitest 5 runs with `clearMocks: true` by default.
829
+ TypeScript 7 builds and checks package types. Build and typecheck commands invoke `node_modules/typescript/bin/tsc` explicitly to avoid npm's shared `tsc` shim selecting a different compiler. `@typescript/typescript6` is dev-only for AST architecture and installed-SDK contract tests because TypeScript 7 does not expose a stable compiler API. Vitest 5 runs with `clearMocks: true` by default.
731
830
 
732
- Pull-request CI runs that suite once, then checks the installed package offline with the oldest supported official Pi release, the current official release, and a source-built revision of the Pi fork. It checks both npm and Git installations without starting a Cursor model turn. The selected official version and fork commit are printed in the check log. Separate macOS and Windows jobs install with lifecycle scripts, load `node-pty`, and run the platform-build test, typecheck, and pack checks on Node 24.
831
+ Pull-request CI runs that suite once per selected host: the latest stable official Pi and a source-built revision of the latest maintained fork `main`, each using its own consistent dependency graph and the version/commit resolved once for the run. It checks both npm and Git installations against both hosts without starting a Cursor model turn. The selected official version and fork commit are printed in the check log. Separate macOS and Windows jobs install with lifecycle scripts, load `node-pty`, and run the platform-build test, typecheck, and pack checks on Node 24.
733
832
 
734
833
  For authorized uncommitted repairs, qualify an isolated immutable working-tree snapshot without committing:
735
834
 
736
835
  ```bash
737
- node scripts/ci-compatibility.mjs --working-tree --official-only --versions 0.87.1,0.99.1,1.0.2
836
+ node scripts/ci-compatibility.mjs --working-tree --official-only --versions 0.87.1,0.99.1,1.0.3
738
837
  ```
739
838
 
740
839
  This builds and packs the snapshot, checks package loading, and exercises actual official native provider/session flows. The default invocation still requires a clean checkout and includes the maintained fork. `--help` documents selection and exit codes.
741
840
 
841
+ This manual snapshot mode retains explicit older-host qualification for the advertised floor; it is separate from CI's once-resolved latest-only targets. Do not combine manual selection flags with `--automation`.
842
+
742
843
  This is offline compatibility proof, not Cursor authentication, desktop/cloud execution, visual, or all-platform live proof. Add only necessary changed-behavior live evidence under the [cost-conscious verification policy](#maintainer-cost-conscious-verification); the comprehensive paid matrix is optional, and paid Cloud testing is restricted to explicitly Cursor Cloud-focused PRs/issues. Older advertised Pi/Node floors require their own offline compatibility evidence.
743
844
 
744
845
  Run checks: