pi-cursor-sdk 0.4.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (799) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +169 -37
  3. package/dist/context-window-cache.js +0 -6
  4. package/dist/context.js +61 -34
  5. package/dist/cursor-api-key.js +34 -19
  6. package/dist/cursor-cloud-lifecycle.js +122 -98
  7. package/dist/cursor-cloud-options.js +1 -0
  8. package/dist/cursor-config.js +59 -0
  9. package/dist/cursor-custom-store-path.js +177 -0
  10. package/dist/cursor-custom-subagent-definitions.js +14 -0
  11. package/dist/cursor-durable-fs.js +97 -3
  12. package/dist/cursor-fallback-models.generated.js +288 -1
  13. package/dist/cursor-fallback-warning.js +10 -4
  14. package/dist/cursor-http1.js +8 -8
  15. package/dist/cursor-live-run-coordinator.js +31 -15
  16. package/dist/cursor-mcp-timeout-override.js +3 -1
  17. package/dist/cursor-native-replay-routing.js +1 -1
  18. package/dist/cursor-native-tool-display-registration.js +46 -22
  19. package/dist/cursor-native-tool-display-state.js +57 -22
  20. package/dist/cursor-native-tool-display-tools.js +5 -6
  21. package/dist/cursor-pi-tool-bridge-constants.js +23 -2
  22. package/dist/cursor-pi-tool-bridge-run.js +28 -3
  23. package/dist/cursor-pi-tool-bridge-server.js +1 -1
  24. package/dist/cursor-pi-tool-bridge-snapshot.js +1 -1
  25. package/dist/cursor-pi-tool-bridge.js +31 -9
  26. package/dist/cursor-provider-binding.js +118 -0
  27. package/dist/cursor-provider-errors.js +61 -33
  28. package/dist/cursor-provider-lazy.js +23 -11
  29. package/dist/cursor-provider-live-run-drain.js +25 -16
  30. package/dist/cursor-provider-run-finalizer.js +21 -9
  31. package/dist/cursor-provider-turn-coordinator.js +1 -0
  32. package/dist/cursor-provider-turn-display-router.js +4 -0
  33. package/dist/cursor-provider-turn-emit.js +1 -0
  34. package/dist/cursor-provider-turn-finalize.js +29 -20
  35. package/dist/cursor-provider-turn-prepare.js +49 -20
  36. package/dist/cursor-provider-turn-runner.js +37 -11
  37. package/dist/cursor-provider-turn-send.js +22 -9
  38. package/dist/cursor-provider-turn-summary.js +89 -0
  39. package/dist/cursor-provider-turn-tool-ledger.js +13 -7
  40. package/dist/cursor-provider.js +10 -3
  41. package/dist/cursor-question-tool.js +5 -5
  42. package/dist/cursor-request-provenance.js +53 -0
  43. package/dist/cursor-ripgrep-path.js +14 -3
  44. package/dist/cursor-runtime-state.js +50 -43
  45. package/dist/cursor-sdk-billed-usage.js +54 -75
  46. package/dist/cursor-sdk-event-debug-session.js +5 -6
  47. package/dist/cursor-sdk-event-debug.js +9 -6
  48. package/dist/cursor-sdk-output-filter.js +1 -1
  49. package/dist/cursor-sdk-process-error-guard.js +9 -10
  50. package/dist/cursor-sdk-runtime.js +13 -1
  51. package/dist/cursor-sdk-vendor-env.js +20 -0
  52. package/dist/cursor-session-agent-cleanup.js +31 -28
  53. package/dist/cursor-session-agent-lifecycle.js +18 -9
  54. package/dist/cursor-session-agent-lineage.js +28 -12
  55. package/dist/cursor-session-agent-resume.js +51 -35
  56. package/dist/cursor-session-agent.js +47 -25
  57. package/dist/cursor-session-compaction-prep.js +2 -7
  58. package/dist/cursor-session-scope.js +71 -39
  59. package/dist/cursor-session-send-policy.js +2 -2
  60. package/dist/cursor-session-settings.js +61 -0
  61. package/dist/cursor-session-store.js +235 -45
  62. package/dist/cursor-skill-tool.js +32 -49
  63. package/dist/cursor-state.js +78 -65
  64. package/dist/cursor-tool-manifest.js +1 -1
  65. package/dist/cursor-usage-accounting.js +13 -70
  66. package/dist/cursor-usage-command.js +89 -0
  67. package/dist/cursor-usage-ledger.js +512 -0
  68. package/dist/index.js +29 -35
  69. package/dist/model-discovery.js +62 -37
  70. package/dist/model-list-cache.js +12 -1
  71. package/docs/cursor-dogfood-checklist.md +3 -3
  72. package/docs/cursor-live-smoke-checklist.md +15 -15
  73. package/docs/cursor-model-ux-spec.md +124 -39
  74. package/docs/cursor-native-tool-replay.md +18 -8
  75. package/docs/cursor-native-tool-visual-audit.md +8 -8
  76. package/docs/cursor-testing-lessons.md +87 -25
  77. package/docs/cursor-tool-surfaces.md +4 -4
  78. package/docs/platform-smoke-implementation.md +10 -6
  79. package/docs/platform-smoke.md +35 -46
  80. package/node_modules/@hono/node-server/README.md +21 -10
  81. package/node_modules/@hono/node-server/dist/early-hints.cjs +1 -1
  82. package/node_modules/@hono/node-server/dist/early-hints.mjs +1 -1
  83. package/node_modules/@hono/node-server/dist/index.cjs +41 -19
  84. package/node_modules/@hono/node-server/dist/index.mjs +42 -20
  85. package/node_modules/@hono/node-server/dist/serve-static.cjs +1 -0
  86. package/node_modules/@hono/node-server/dist/serve-static.d.cts +2 -1
  87. package/node_modules/@hono/node-server/dist/serve-static.d.mts +2 -1
  88. package/node_modules/@hono/node-server/dist/serve-static.mjs +1 -0
  89. package/node_modules/@hono/node-server/package.json +3 -2
  90. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts → auth-Anm-lwWi.d.mts} +9 -8
  91. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts.map → auth-Anm-lwWi.d.mts.map} +1 -1
  92. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs → auth-BNDyLTqp.mjs} +5 -3
  93. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs.map → auth-BNDyLTqp.mjs.map} +1 -1
  94. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs → auth-D1CeV_Jr.cjs} +5 -3
  95. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs.map → auth-D1CeV_Jr.cjs.map} +1 -1
  96. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts → auth-V9XJSCfa.d.cts} +9 -8
  97. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts.map → auth-V9XJSCfa.d.cts.map} +1 -1
  98. package/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
  99. package/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
  100. package/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
  101. package/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
  102. package/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
  103. package/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
  104. package/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
  105. package/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
  106. package/node_modules/@modelcontextprotocol/core/package.json +2 -2
  107. package/node_modules/@modelcontextprotocol/hono/README.md +7 -5
  108. package/node_modules/@modelcontextprotocol/hono/dist/index.cjs.map +1 -1
  109. package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts +5 -0
  110. package/node_modules/@modelcontextprotocol/hono/dist/index.d.cts.map +1 -1
  111. package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts +5 -0
  112. package/node_modules/@modelcontextprotocol/hono/dist/index.d.mts.map +1 -1
  113. package/node_modules/@modelcontextprotocol/hono/dist/index.mjs.map +1 -1
  114. package/node_modules/@modelcontextprotocol/hono/package.json +4 -4
  115. package/node_modules/@modelcontextprotocol/server/README.md +1 -7
  116. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-Bt6U_Fqb.d.mts → createMcpHandler-D4NN8WsG.d.mts} +35 -13
  117. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-D4NN8WsG.d.mts.map +1 -0
  118. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-BLVe3qmU.d.cts → createMcpHandler-DZmmlN8e.d.cts} +35 -13
  119. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DZmmlN8e.d.cts.map +1 -0
  120. package/node_modules/@modelcontextprotocol/server/dist/index.cjs +32 -5
  121. package/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
  122. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts +41 -5
  123. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
  124. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts +41 -5
  125. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
  126. package/node_modules/@modelcontextprotocol/server/dist/index.mjs +32 -5
  127. package/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
  128. package/node_modules/@modelcontextprotocol/server/dist/{mcp-DUcCQSTW.cjs → mcp-BumlNux0.cjs} +73 -23
  129. package/node_modules/@modelcontextprotocol/server/dist/mcp-BumlNux0.cjs.map +1 -0
  130. package/node_modules/@modelcontextprotocol/server/dist/{mcp-Dw2OlZ1f.mjs → mcp-DIH4cS6P.mjs} +73 -23
  131. package/node_modules/@modelcontextprotocol/server/dist/mcp-DIH4cS6P.mjs.map +1 -0
  132. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +1 -1
  133. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +1 -1
  134. package/node_modules/@modelcontextprotocol/server/dist/{src-CgFsfg3E.cjs → src-BhnGYybN.cjs} +29 -11
  135. package/node_modules/@modelcontextprotocol/server/dist/src-BhnGYybN.cjs.map +1 -0
  136. package/node_modules/@modelcontextprotocol/server/dist/{src-D-y6h4N7.mjs → src-Cqbh3MYc.mjs} +29 -11
  137. package/node_modules/@modelcontextprotocol/server/dist/src-Cqbh3MYc.mjs.map +1 -0
  138. package/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +2 -2
  139. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +1 -1
  140. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +1 -1
  141. package/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +2 -2
  142. package/node_modules/@modelcontextprotocol/server/package.json +4 -4
  143. package/node_modules/hono/dist/_virtual/_rolldown/runtime.js +13 -0
  144. package/node_modules/hono/dist/adapter/aws-lambda/conninfo.js +42 -23
  145. package/node_modules/hono/dist/adapter/aws-lambda/handler.js +318 -344
  146. package/node_modules/hono/dist/adapter/aws-lambda/index.js +2 -8
  147. package/node_modules/hono/dist/adapter/aws-lambda/types.js +1 -0
  148. package/node_modules/hono/dist/adapter/bun/conninfo.js +20 -25
  149. package/node_modules/hono/dist/adapter/bun/index.js +3 -13
  150. package/node_modules/hono/dist/adapter/bun/serve-static.js +27 -27
  151. package/node_modules/hono/dist/adapter/bun/server.js +11 -5
  152. package/node_modules/hono/dist/adapter/bun/ssg.js +25 -15
  153. package/node_modules/hono/dist/adapter/bun/websocket.js +61 -68
  154. package/node_modules/hono/dist/adapter/cloudflare-pages/conninfo.js +24 -9
  155. package/node_modules/hono/dist/adapter/cloudflare-pages/handler.js +59 -62
  156. package/node_modules/hono/dist/adapter/cloudflare-pages/index.js +2 -8
  157. package/node_modules/hono/dist/adapter/cloudflare-workers/conninfo.js +7 -9
  158. package/node_modules/hono/dist/adapter/cloudflare-workers/index.js +3 -8
  159. package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static-module.js +5 -6
  160. package/node_modules/hono/dist/adapter/cloudflare-workers/serve-static.js +26 -20
  161. package/node_modules/hono/dist/adapter/cloudflare-workers/utils.js +21 -34
  162. package/node_modules/hono/dist/adapter/cloudflare-workers/websocket.js +31 -39
  163. package/node_modules/hono/dist/adapter/deno/conninfo.js +16 -13
  164. package/node_modules/hono/dist/adapter/deno/deno.d.js +1 -0
  165. package/node_modules/hono/dist/adapter/deno/index.js +3 -10
  166. package/node_modules/hono/dist/adapter/deno/serve-static.js +33 -38
  167. package/node_modules/hono/dist/adapter/deno/ssg.js +27 -16
  168. package/node_modules/hono/dist/adapter/deno/websocket.js +30 -30
  169. package/node_modules/hono/dist/adapter/lambda-edge/conninfo.js +7 -9
  170. package/node_modules/hono/dist/adapter/lambda-edge/handler.js +102 -101
  171. package/node_modules/hono/dist/adapter/lambda-edge/index.js +2 -6
  172. package/node_modules/hono/dist/adapter/netlify/conninfo.js +24 -9
  173. package/node_modules/hono/dist/adapter/netlify/handler.js +10 -8
  174. package/node_modules/hono/dist/adapter/netlify/index.js +3 -2
  175. package/node_modules/hono/dist/adapter/netlify/mod.js +2 -6
  176. package/node_modules/hono/dist/adapter/service-worker/handler.js +15 -19
  177. package/node_modules/hono/dist/adapter/service-worker/index.js +23 -7
  178. package/node_modules/hono/dist/adapter/service-worker/types.js +1 -0
  179. package/node_modules/hono/dist/adapter/vercel/conninfo.js +7 -10
  180. package/node_modules/hono/dist/adapter/vercel/handler.js +8 -6
  181. package/node_modules/hono/dist/adapter/vercel/index.js +2 -6
  182. package/node_modules/hono/dist/cjs/_virtual/_rolldown/runtime.js +33 -0
  183. package/node_modules/hono/dist/cjs/adapter/aws-lambda/conninfo.js +42 -44
  184. package/node_modules/hono/dist/cjs/adapter/aws-lambda/handler.js +326 -373
  185. package/node_modules/hono/dist/cjs/adapter/aws-lambda/index.js +7 -34
  186. package/node_modules/hono/dist/cjs/adapter/aws-lambda/types.js +0 -15
  187. package/node_modules/hono/dist/cjs/adapter/bun/conninfo.js +21 -47
  188. package/node_modules/hono/dist/cjs/adapter/bun/index.js +14 -45
  189. package/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +29 -50
  190. package/node_modules/hono/dist/cjs/adapter/bun/server.js +11 -26
  191. package/node_modules/hono/dist/cjs/adapter/bun/ssg.js +24 -35
  192. package/node_modules/hono/dist/cjs/adapter/bun/websocket.js +63 -91
  193. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/conninfo.js +25 -31
  194. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/handler.js +61 -85
  195. package/node_modules/hono/dist/cjs/adapter/cloudflare-pages/index.js +7 -34
  196. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/conninfo.js +8 -31
  197. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/index.js +7 -33
  198. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static-module.js +7 -29
  199. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/serve-static.js +27 -42
  200. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/utils.js +21 -55
  201. package/node_modules/hono/dist/cjs/adapter/cloudflare-workers/websocket.js +33 -62
  202. package/node_modules/hono/dist/cjs/adapter/deno/conninfo.js +16 -34
  203. package/node_modules/hono/dist/cjs/adapter/deno/index.js +10 -38
  204. package/node_modules/hono/dist/cjs/adapter/deno/serve-static.js +33 -59
  205. package/node_modules/hono/dist/cjs/adapter/deno/ssg.js +27 -37
  206. package/node_modules/hono/dist/cjs/adapter/deno/websocket.js +32 -53
  207. package/node_modules/hono/dist/cjs/adapter/lambda-edge/conninfo.js +8 -31
  208. package/node_modules/hono/dist/cjs/adapter/lambda-edge/handler.js +102 -130
  209. package/node_modules/hono/dist/cjs/adapter/lambda-edge/index.js +5 -30
  210. package/node_modules/hono/dist/cjs/adapter/netlify/conninfo.js +25 -31
  211. package/node_modules/hono/dist/cjs/adapter/netlify/handler.js +10 -29
  212. package/node_modules/hono/dist/cjs/adapter/netlify/index.js +5 -21
  213. package/node_modules/hono/dist/cjs/adapter/netlify/mod.js +5 -30
  214. package/node_modules/hono/dist/cjs/adapter/service-worker/handler.js +16 -41
  215. package/node_modules/hono/dist/cjs/adapter/service-worker/index.js +25 -30
  216. package/node_modules/hono/dist/cjs/adapter/service-worker/types.js +0 -15
  217. package/node_modules/hono/dist/cjs/adapter/vercel/conninfo.js +8 -32
  218. package/node_modules/hono/dist/cjs/adapter/vercel/handler.js +8 -27
  219. package/node_modules/hono/dist/cjs/adapter/vercel/index.js +5 -30
  220. package/node_modules/hono/dist/cjs/client/client.js +139 -212
  221. package/node_modules/hono/dist/cjs/client/fetch-result-please.js +62 -80
  222. package/node_modules/hono/dist/cjs/client/index.js +7 -32
  223. package/node_modules/hono/dist/cjs/client/types.js +0 -15
  224. package/node_modules/hono/dist/cjs/client/utils.js +54 -92
  225. package/node_modules/hono/dist/cjs/compose.js +49 -66
  226. package/node_modules/hono/dist/cjs/context.js +379 -450
  227. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +47 -72
  228. package/node_modules/hono/dist/cjs/helper/accepts/index.js +3 -27
  229. package/node_modules/hono/dist/cjs/helper/adapter/index.js +33 -73
  230. package/node_modules/hono/dist/cjs/helper/conninfo/index.js +0 -15
  231. package/node_modules/hono/dist/cjs/helper/conninfo/types.js +0 -15
  232. package/node_modules/hono/dist/cjs/helper/cookie/index.js +75 -116
  233. package/node_modules/hono/dist/cjs/helper/css/common.js +165 -244
  234. package/node_modules/hono/dist/cjs/helper/css/index.js +136 -151
  235. package/node_modules/hono/dist/cjs/helper/dev/index.js +45 -71
  236. package/node_modules/hono/dist/cjs/helper/factory/index.js +30 -51
  237. package/node_modules/hono/dist/cjs/helper/html/index.js +32 -62
  238. package/node_modules/hono/dist/cjs/helper/proxy/index.js +113 -106
  239. package/node_modules/hono/dist/cjs/helper/route/index.js +123 -66
  240. package/node_modules/hono/dist/cjs/helper/ssg/index.js +19 -43
  241. package/node_modules/hono/dist/cjs/helper/ssg/middleware.js +56 -64
  242. package/node_modules/hono/dist/cjs/helper/ssg/plugins.js +55 -57
  243. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +196 -296
  244. package/node_modules/hono/dist/cjs/helper/ssg/utils.js +47 -90
  245. package/node_modules/hono/dist/cjs/helper/streaming/index.js +8 -35
  246. package/node_modules/hono/dist/cjs/helper/streaming/sse.js +53 -85
  247. package/node_modules/hono/dist/cjs/helper/streaming/stream.js +23 -53
  248. package/node_modules/hono/dist/cjs/helper/streaming/text.js +10 -32
  249. package/node_modules/hono/dist/cjs/helper/streaming/utils.js +13 -32
  250. package/node_modules/hono/dist/cjs/helper/testing/index.js +16 -31
  251. package/node_modules/hono/dist/cjs/helper/websocket/index.js +51 -76
  252. package/node_modules/hono/dist/cjs/hono-base.js +347 -403
  253. package/node_modules/hono/dist/cjs/hono.js +28 -42
  254. package/node_modules/hono/dist/cjs/http-exception.js +55 -56
  255. package/node_modules/hono/dist/cjs/index.js +22 -30
  256. package/node_modules/hono/dist/cjs/jsx/base.js +237 -366
  257. package/node_modules/hono/dist/cjs/jsx/children.js +16 -41
  258. package/node_modules/hono/dist/cjs/jsx/components.js +119 -192
  259. package/node_modules/hono/dist/cjs/jsx/constants.js +15 -42
  260. package/node_modules/hono/dist/cjs/jsx/context.js +144 -162
  261. package/node_modules/hono/dist/cjs/jsx/dom/client.js +49 -69
  262. package/node_modules/hono/dist/cjs/jsx/dom/components.js +23 -52
  263. package/node_modules/hono/dist/cjs/jsx/dom/context.js +39 -67
  264. package/node_modules/hono/dist/cjs/jsx/dom/css.js +143 -158
  265. package/node_modules/hono/dist/cjs/jsx/dom/hooks/index.js +55 -64
  266. package/node_modules/hono/dist/cjs/jsx/dom/index.js +114 -173
  267. package/node_modules/hono/dist/cjs/jsx/dom/intrinsic-element/components.js +282 -375
  268. package/node_modules/hono/dist/cjs/jsx/dom/jsx-dev-runtime.js +14 -49
  269. package/node_modules/hono/dist/cjs/jsx/dom/jsx-runtime.js +5 -32
  270. package/node_modules/hono/dist/cjs/jsx/dom/render.js +469 -623
  271. package/node_modules/hono/dist/cjs/jsx/dom/server.js +37 -64
  272. package/node_modules/hono/dist/cjs/jsx/dom/utils.js +7 -30
  273. package/node_modules/hono/dist/cjs/jsx/hooks/index.js +225 -318
  274. package/node_modules/hono/dist/cjs/jsx/index.js +86 -135
  275. package/node_modules/hono/dist/cjs/jsx/intrinsic-element/common.js +20 -43
  276. package/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +117 -168
  277. package/node_modules/hono/dist/cjs/jsx/intrinsic-elements.js +0 -15
  278. package/node_modules/hono/dist/cjs/jsx/jsx-dev-runtime.js +14 -39
  279. package/node_modules/hono/dist/cjs/jsx/jsx-runtime.js +34 -68
  280. package/node_modules/hono/dist/cjs/jsx/streaming.js +123 -166
  281. package/node_modules/hono/dist/cjs/jsx/types.js +0 -15
  282. package/node_modules/hono/dist/cjs/jsx/utils.js +91 -175
  283. package/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +98 -86
  284. package/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +92 -109
  285. package/node_modules/hono/dist/cjs/middleware/body-limit/index.js +66 -72
  286. package/node_modules/hono/dist/cjs/middleware/cache/index.js +153 -199
  287. package/node_modules/hono/dist/cjs/middleware/combine/index.js +135 -95
  288. package/node_modules/hono/dist/cjs/middleware/compress/index.js +73 -88
  289. package/node_modules/hono/dist/cjs/middleware/context-storage/index.js +49 -41
  290. package/node_modules/hono/dist/cjs/middleware/cors/index.js +107 -107
  291. package/node_modules/hono/dist/cjs/middleware/csrf/index.js +101 -72
  292. package/node_modules/hono/dist/cjs/middleware/etag/digest.js +58 -97
  293. package/node_modules/hono/dist/cjs/middleware/etag/index.js +71 -91
  294. package/node_modules/hono/dist/cjs/middleware/ip-restriction/index.js +161 -169
  295. package/node_modules/hono/dist/cjs/middleware/jsx-renderer/index.js +99 -77
  296. package/node_modules/hono/dist/cjs/middleware/jwk/index.js +3 -27
  297. package/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +118 -135
  298. package/node_modules/hono/dist/cjs/middleware/jwt/index.js +9 -38
  299. package/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +120 -141
  300. package/node_modules/hono/dist/cjs/middleware/language/index.js +7 -35
  301. package/node_modules/hono/dist/cjs/middleware/language/language.js +184 -182
  302. package/node_modules/hono/dist/cjs/middleware/logger/index.js +41 -62
  303. package/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +82 -88
  304. package/node_modules/hono/dist/cjs/middleware/method-override/index.js +101 -102
  305. package/node_modules/hono/dist/cjs/middleware/mount/index.js +71 -0
  306. package/node_modules/hono/dist/cjs/middleware/powered-by/index.js +23 -30
  307. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +38 -42
  308. package/node_modules/hono/dist/cjs/middleware/request-id/index.js +3 -27
  309. package/node_modules/hono/dist/cjs/middleware/request-id/request-id.js +34 -42
  310. package/node_modules/hono/dist/cjs/middleware/secure-headers/index.js +4 -29
  311. package/node_modules/hono/dist/cjs/middleware/secure-headers/permissions-policy.js +0 -15
  312. package/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +142 -174
  313. package/node_modules/hono/dist/cjs/middleware/serve-static/index.js +56 -93
  314. package/node_modules/hono/dist/cjs/middleware/serve-static/path.js +15 -38
  315. package/node_modules/hono/dist/cjs/middleware/timeout/index.js +40 -45
  316. package/node_modules/hono/dist/cjs/middleware/timing/index.js +7 -35
  317. package/node_modules/hono/dist/cjs/middleware/timing/timing.js +177 -118
  318. package/node_modules/hono/dist/cjs/middleware/trailing-slash/index.js +85 -58
  319. package/node_modules/hono/dist/cjs/preset/quick.js +18 -37
  320. package/node_modules/hono/dist/cjs/preset/tiny.js +15 -33
  321. package/node_modules/hono/dist/cjs/request/constants.js +5 -27
  322. package/node_modules/hono/dist/cjs/request.js +334 -346
  323. package/node_modules/hono/dist/cjs/router/linear-router/index.js +3 -27
  324. package/node_modules/hono/dist/cjs/router/linear-router/router.js +95 -143
  325. package/node_modules/hono/dist/cjs/router/pattern-router/index.js +3 -27
  326. package/node_modules/hono/dist/cjs/router/pattern-router/router.js +41 -63
  327. package/node_modules/hono/dist/cjs/router/reg-exp-router/index.js +7 -34
  328. package/node_modules/hono/dist/cjs/router/reg-exp-router/matcher.js +18 -45
  329. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +91 -135
  330. package/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +92 -161
  331. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +98 -147
  332. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +73 -89
  333. package/node_modules/hono/dist/cjs/router/smart-router/index.js +3 -27
  334. package/node_modules/hono/dist/cjs/router/smart-router/router.js +49 -79
  335. package/node_modules/hono/dist/cjs/router/trie-router/index.js +3 -27
  336. package/node_modules/hono/dist/cjs/router/trie-router/node.js +134 -186
  337. package/node_modules/hono/dist/cjs/router/trie-router/router.js +15 -39
  338. package/node_modules/hono/dist/cjs/router/utils.js +5 -27
  339. package/node_modules/hono/dist/cjs/router.js +37 -37
  340. package/node_modules/hono/dist/cjs/types.js +5 -28
  341. package/node_modules/hono/dist/cjs/utils/accept.js +177 -225
  342. package/node_modules/hono/dist/cjs/utils/basic-auth.js +16 -40
  343. package/node_modules/hono/dist/cjs/utils/body.js +84 -110
  344. package/node_modules/hono/dist/cjs/utils/buffer.js +43 -91
  345. package/node_modules/hono/dist/cjs/utils/color.js +35 -44
  346. package/node_modules/hono/dist/cjs/utils/compress.js +11 -26
  347. package/node_modules/hono/dist/cjs/utils/concurrent.js +29 -59
  348. package/node_modules/hono/dist/cjs/utils/constants.js +7 -26
  349. package/node_modules/hono/dist/cjs/utils/cookie.js +107 -177
  350. package/node_modules/hono/dist/cjs/utils/crypto.js +30 -61
  351. package/node_modules/hono/dist/cjs/utils/encode.js +31 -48
  352. package/node_modules/hono/dist/cjs/utils/filepath.js +23 -54
  353. package/node_modules/hono/dist/cjs/utils/handler.js +11 -33
  354. package/node_modules/hono/dist/cjs/utils/headers.js +0 -15
  355. package/node_modules/hono/dist/cjs/utils/html.js +96 -137
  356. package/node_modules/hono/dist/cjs/utils/http-status.js +0 -15
  357. package/node_modules/hono/dist/cjs/utils/ipaddr.js +213 -286
  358. package/node_modules/hono/dist/cjs/utils/jwt/index.js +14 -27
  359. package/node_modules/hono/dist/cjs/utils/jwt/jwa.js +25 -42
  360. package/node_modules/hono/dist/cjs/utils/jwt/jws.js +119 -199
  361. package/node_modules/hono/dist/cjs/utils/jwt/jwt.js +122 -206
  362. package/node_modules/hono/dist/cjs/utils/jwt/types.js +122 -159
  363. package/node_modules/hono/dist/cjs/utils/jwt/utf8.js +9 -28
  364. package/node_modules/hono/dist/cjs/utils/mime.js +75 -101
  365. package/node_modules/hono/dist/cjs/utils/stream.js +88 -111
  366. package/node_modules/hono/dist/cjs/utils/types.js +0 -15
  367. package/node_modules/hono/dist/cjs/utils/url.js +185 -234
  368. package/node_modules/hono/dist/cjs/validator/index.js +3 -27
  369. package/node_modules/hono/dist/cjs/validator/utils.js +0 -15
  370. package/node_modules/hono/dist/cjs/validator/validator.js +60 -103
  371. package/node_modules/hono/dist/client/client.js +138 -197
  372. package/node_modules/hono/dist/client/fetch-result-please.js +59 -56
  373. package/node_modules/hono/dist/client/index.js +3 -7
  374. package/node_modules/hono/dist/client/types.js +1 -0
  375. package/node_modules/hono/dist/client/utils.js +51 -68
  376. package/node_modules/hono/dist/compose.js +49 -45
  377. package/node_modules/hono/dist/context.js +376 -426
  378. package/node_modules/hono/dist/helper/accepts/accepts.js +47 -51
  379. package/node_modules/hono/dist/helper/accepts/index.js +1 -4
  380. package/node_modules/hono/dist/helper/adapter/index.js +33 -52
  381. package/node_modules/hono/dist/helper/conninfo/index.js +1 -0
  382. package/node_modules/hono/dist/helper/conninfo/types.js +1 -0
  383. package/node_modules/hono/dist/helper/cookie/index.js +74 -94
  384. package/node_modules/hono/dist/helper/css/common.js +167 -225
  385. package/node_modules/hono/dist/helper/css/index.js +132 -137
  386. package/node_modules/hono/dist/helper/dev/index.js +44 -49
  387. package/node_modules/hono/dist/helper/factory/index.js +27 -27
  388. package/node_modules/hono/dist/helper/html/index.js +30 -39
  389. package/node_modules/hono/dist/helper/proxy/index.js +116 -88
  390. package/node_modules/hono/dist/helper/route/index.js +121 -43
  391. package/node_modules/hono/dist/helper/ssg/index.js +3 -18
  392. package/node_modules/hono/dist/helper/ssg/middleware.js +53 -40
  393. package/node_modules/hono/dist/helper/ssg/plugins.js +55 -36
  394. package/node_modules/hono/dist/helper/ssg/ssg.js +198 -283
  395. package/node_modules/hono/dist/helper/ssg/utils.js +53 -75
  396. package/node_modules/hono/dist/helper/streaming/index.js +2 -8
  397. package/node_modules/hono/dist/helper/streaming/sse.js +50 -61
  398. package/node_modules/hono/dist/helper/streaming/stream.js +22 -31
  399. package/node_modules/hono/dist/helper/streaming/text.js +9 -10
  400. package/node_modules/hono/dist/helper/streaming/utils.js +9 -12
  401. package/node_modules/hono/dist/helper/testing/index.js +16 -10
  402. package/node_modules/hono/dist/helper/websocket/index.js +49 -53
  403. package/node_modules/hono/dist/hono-base.js +344 -379
  404. package/node_modules/hono/dist/hono.js +27 -20
  405. package/node_modules/hono/dist/http-exception.js +53 -33
  406. package/node_modules/hono/dist/index.js +19 -6
  407. package/node_modules/hono/dist/jsx/base.js +231 -340
  408. package/node_modules/hono/dist/jsx/children.js +16 -20
  409. package/node_modules/hono/dist/jsx/components.js +118 -170
  410. package/node_modules/hono/dist/jsx/constants.js +9 -15
  411. package/node_modules/hono/dist/jsx/context.js +153 -150
  412. package/node_modules/hono/dist/jsx/dom/client.js +45 -48
  413. package/node_modules/hono/dist/jsx/dom/components.js +21 -29
  414. package/node_modules/hono/dist/jsx/dom/context.js +37 -44
  415. package/node_modules/hono/dist/jsx/dom/css.js +142 -147
  416. package/node_modules/hono/dist/jsx/dom/hooks/index.js +52 -40
  417. package/node_modules/hono/dist/jsx/dom/index.js +71 -134
  418. package/node_modules/hono/dist/jsx/dom/intrinsic-element/components.js +275 -359
  419. package/node_modules/hono/dist/jsx/dom/jsx-dev-runtime.js +14 -18
  420. package/node_modules/hono/dist/jsx/dom/jsx-runtime.js +2 -8
  421. package/node_modules/hono/dist/jsx/dom/render.js +492 -631
  422. package/node_modules/hono/dist/jsx/dom/server.js +32 -32
  423. package/node_modules/hono/dist/jsx/dom/utils.js +6 -8
  424. package/node_modules/hono/dist/jsx/hooks/index.js +236 -308
  425. package/node_modules/hono/dist/jsx/index.js +45 -98
  426. package/node_modules/hono/dist/jsx/intrinsic-element/common.js +20 -22
  427. package/node_modules/hono/dist/jsx/intrinsic-element/components.js +113 -154
  428. package/node_modules/hono/dist/jsx/intrinsic-elements.js +1 -0
  429. package/node_modules/hono/dist/jsx/jsx-dev-runtime.js +12 -16
  430. package/node_modules/hono/dist/jsx/jsx-runtime.js +29 -42
  431. package/node_modules/hono/dist/jsx/streaming.js +120 -142
  432. package/node_modules/hono/dist/jsx/types.js +1 -0
  433. package/node_modules/hono/dist/jsx/utils.js +105 -168
  434. package/node_modules/hono/dist/middleware/basic-auth/index.js +96 -63
  435. package/node_modules/hono/dist/middleware/bearer-auth/index.js +93 -89
  436. package/node_modules/hono/dist/middleware/body-limit/index.js +66 -51
  437. package/node_modules/hono/dist/middleware/cache/index.js +165 -190
  438. package/node_modules/hono/dist/middleware/combine/index.js +134 -73
  439. package/node_modules/hono/dist/middleware/compress/index.js +75 -69
  440. package/node_modules/hono/dist/middleware/context-storage/index.js +49 -19
  441. package/node_modules/hono/dist/middleware/cors/index.js +107 -86
  442. package/node_modules/hono/dist/middleware/csrf/index.js +103 -53
  443. package/node_modules/hono/dist/middleware/etag/digest.js +59 -77
  444. package/node_modules/hono/dist/middleware/etag/index.js +71 -70
  445. package/node_modules/hono/dist/middleware/ip-restriction/index.js +163 -158
  446. package/node_modules/hono/dist/middleware/jsx-renderer/index.js +97 -54
  447. package/node_modules/hono/dist/middleware/jwk/index.js +1 -4
  448. package/node_modules/hono/dist/middleware/jwk/jwk.js +116 -112
  449. package/node_modules/hono/dist/middleware/jwt/index.js +2 -10
  450. package/node_modules/hono/dist/middleware/jwt/jwt.js +114 -114
  451. package/node_modules/hono/dist/middleware/language/index.js +2 -15
  452. package/node_modules/hono/dist/middleware/language/language.js +180 -157
  453. package/node_modules/hono/dist/middleware/logger/index.js +43 -37
  454. package/node_modules/hono/dist/middleware/method-not-allowed/index.js +81 -66
  455. package/node_modules/hono/dist/middleware/method-override/index.js +101 -81
  456. package/node_modules/hono/dist/middleware/mount/index.js +70 -0
  457. package/node_modules/hono/dist/middleware/powered-by/index.js +23 -9
  458. package/node_modules/hono/dist/middleware/pretty-json/index.js +39 -22
  459. package/node_modules/hono/dist/middleware/request-id/index.js +1 -4
  460. package/node_modules/hono/dist/middleware/request-id/request-id.js +33 -20
  461. package/node_modules/hono/dist/middleware/secure-headers/index.js +1 -5
  462. package/node_modules/hono/dist/middleware/secure-headers/permissions-policy.js +1 -0
  463. package/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +144 -155
  464. package/node_modules/hono/dist/middleware/serve-static/index.js +56 -72
  465. package/node_modules/hono/dist/middleware/serve-static/path.js +15 -17
  466. package/node_modules/hono/dist/middleware/timeout/index.js +40 -23
  467. package/node_modules/hono/dist/middleware/timing/index.js +2 -9
  468. package/node_modules/hono/dist/middleware/timing/timing.js +177 -97
  469. package/node_modules/hono/dist/middleware/trailing-slash/index.js +85 -37
  470. package/node_modules/hono/dist/preset/quick.js +17 -15
  471. package/node_modules/hono/dist/preset/tiny.js +14 -11
  472. package/node_modules/hono/dist/request/constants.js +4 -5
  473. package/node_modules/hono/dist/request.js +328 -319
  474. package/node_modules/hono/dist/router/linear-router/index.js +1 -4
  475. package/node_modules/hono/dist/router/linear-router/router.js +93 -120
  476. package/node_modules/hono/dist/router/pattern-router/index.js +1 -4
  477. package/node_modules/hono/dist/router/pattern-router/router.js +39 -40
  478. package/node_modules/hono/dist/router/reg-exp-router/index.js +1 -7
  479. package/node_modules/hono/dist/router/reg-exp-router/matcher.js +17 -23
  480. package/node_modules/hono/dist/router/reg-exp-router/node.js +87 -110
  481. package/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +89 -137
  482. package/node_modules/hono/dist/router/reg-exp-router/router.js +92 -129
  483. package/node_modules/hono/dist/router/reg-exp-router/trie.js +69 -64
  484. package/node_modules/hono/dist/router/smart-router/index.js +1 -4
  485. package/node_modules/hono/dist/router/smart-router/router.js +46 -55
  486. package/node_modules/hono/dist/router/trie-router/index.js +1 -4
  487. package/node_modules/hono/dist/router/trie-router/node.js +131 -162
  488. package/node_modules/hono/dist/router/trie-router/router.js +11 -14
  489. package/node_modules/hono/dist/router/utils.js +4 -5
  490. package/node_modules/hono/dist/router.js +35 -14
  491. package/node_modules/hono/dist/types/adapter/aws-lambda/conninfo.d.ts +4 -1
  492. package/node_modules/hono/dist/types/adapter/aws-lambda/handler.d.ts +150 -104
  493. package/node_modules/hono/dist/types/adapter/aws-lambda/index.d.ts +4 -8
  494. package/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +152 -122
  495. package/node_modules/hono/dist/types/adapter/bun/conninfo.d.ts +4 -1
  496. package/node_modules/hono/dist/types/adapter/bun/index.d.ts +6 -10
  497. package/node_modules/hono/dist/types/adapter/bun/serve-static.d.ts +7 -2
  498. package/node_modules/hono/dist/types/adapter/bun/server.d.ts +4 -5
  499. package/node_modules/hono/dist/types/adapter/bun/ssg.d.ts +5 -1
  500. package/node_modules/hono/dist/types/adapter/bun/websocket.d.ts +31 -16
  501. package/node_modules/hono/dist/types/adapter/cloudflare-pages/conninfo.d.ts +4 -1
  502. package/node_modules/hono/dist/types/adapter/cloudflare-pages/handler.d.ts +29 -17
  503. package/node_modules/hono/dist/types/adapter/cloudflare-pages/index.d.ts +3 -7
  504. package/node_modules/hono/dist/types/adapter/cloudflare-workers/conninfo.d.ts +6 -1
  505. package/node_modules/hono/dist/types/adapter/cloudflare-workers/index.d.ts +4 -7
  506. package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static-module.d.ts +5 -2
  507. package/node_modules/hono/dist/types/adapter/cloudflare-workers/serve-static.d.ts +10 -5
  508. package/node_modules/hono/dist/types/adapter/cloudflare-workers/utils.d.ts +10 -2
  509. package/node_modules/hono/dist/types/adapter/cloudflare-workers/websocket.d.ts +6 -1
  510. package/node_modules/hono/dist/types/adapter/deno/conninfo.d.ts +4 -1
  511. package/node_modules/hono/dist/types/adapter/deno/deno.d.ts +1 -0
  512. package/node_modules/hono/dist/types/adapter/deno/index.d.ts +5 -8
  513. package/node_modules/hono/dist/types/adapter/deno/serve-static.d.ts +7 -2
  514. package/node_modules/hono/dist/types/adapter/deno/ssg.d.ts +5 -1
  515. package/node_modules/hono/dist/types/adapter/deno/websocket.d.ts +6 -1
  516. package/node_modules/hono/dist/types/adapter/lambda-edge/conninfo.d.ts +6 -1
  517. package/node_modules/hono/dist/types/adapter/lambda-edge/handler.d.ts +83 -57
  518. package/node_modules/hono/dist/types/adapter/lambda-edge/index.d.ts +3 -7
  519. package/node_modules/hono/dist/types/adapter/netlify/conninfo.d.ts +4 -1
  520. package/node_modules/hono/dist/types/adapter/netlify/handler.d.ts +6 -1
  521. package/node_modules/hono/dist/types/adapter/netlify/index.d.ts +3 -5
  522. package/node_modules/hono/dist/types/adapter/netlify/mod.d.ts +3 -2
  523. package/node_modules/hono/dist/types/adapter/service-worker/handler.d.ts +9 -7
  524. package/node_modules/hono/dist/types/adapter/service-worker/index.d.ts +7 -9
  525. package/node_modules/hono/dist/types/adapter/service-worker/types.d.ts +12 -7
  526. package/node_modules/hono/dist/types/adapter/vercel/conninfo.d.ts +6 -1
  527. package/node_modules/hono/dist/types/adapter/vercel/handler.d.ts +6 -1
  528. package/node_modules/hono/dist/types/adapter/vercel/index.d.ts +3 -6
  529. package/node_modules/hono/dist/types/client/client.d.ts +5 -3
  530. package/node_modules/hono/dist/types/client/fetch-result-please.d.ts +21 -19
  531. package/node_modules/hono/dist/types/client/index.d.ts +5 -7
  532. package/node_modules/hono/dist/types/client/types.d.ts +134 -159
  533. package/node_modules/hono/dist/types/client/utils.d.ts +6 -4
  534. package/node_modules/hono/dist/types/compose.d.ts +4 -2
  535. package/node_modules/hono/dist/types/context.d.ts +335 -335
  536. package/node_modules/hono/dist/types/helper/accepts/accepts.d.ts +11 -9
  537. package/node_modules/hono/dist/types/helper/accepts/index.d.ts +2 -5
  538. package/node_modules/hono/dist/types/helper/adapter/index.d.ts +4 -6
  539. package/node_modules/hono/dist/types/helper/conninfo/index.d.ts +2 -5
  540. package/node_modules/hono/dist/types/helper/conninfo/types.d.ts +25 -23
  541. package/node_modules/hono/dist/types/helper/cookie/index.d.ts +10 -12
  542. package/node_modules/hono/dist/types/helper/css/common.d.ts +11 -9
  543. package/node_modules/hono/dist/types/helper/css/index.d.ts +26 -28
  544. package/node_modules/hono/dist/types/helper/dev/index.d.ts +10 -12
  545. package/node_modules/hono/dist/types/helper/factory/index.d.ts +26 -73
  546. package/node_modules/hono/dist/types/helper/html/index.d.ts +4 -7
  547. package/node_modules/hono/dist/types/helper/proxy/index.d.ts +19 -21
  548. package/node_modules/hono/dist/types/helper/route/index.d.ts +4 -2
  549. package/node_modules/hono/dist/types/helper/ssg/index.d.ts +4 -7
  550. package/node_modules/hono/dist/types/helper/ssg/middleware.d.ts +8 -6
  551. package/node_modules/hono/dist/types/helper/ssg/plugins.d.ts +3 -1
  552. package/node_modules/hono/dist/types/helper/ssg/ssg.d.ts +38 -36
  553. package/node_modules/hono/dist/types/helper/ssg/utils.d.ts +5 -3
  554. package/node_modules/hono/dist/types/helper/streaming/index.d.ts +4 -8
  555. package/node_modules/hono/dist/types/helper/streaming/sse.d.ts +10 -8
  556. package/node_modules/hono/dist/types/helper/streaming/stream.d.ts +4 -2
  557. package/node_modules/hono/dist/types/helper/streaming/text.d.ts +4 -2
  558. package/node_modules/hono/dist/types/helper/streaming/utils.d.ts +2 -0
  559. package/node_modules/hono/dist/types/helper/testing/index.d.ts +7 -9
  560. package/node_modules/hono/dist/types/helper/websocket/index.d.ts +30 -33
  561. package/node_modules/hono/dist/types/hono-base.d.ts +210 -210
  562. package/node_modules/hono/dist/types/hono.d.ts +11 -10
  563. package/node_modules/hono/dist/types/http-exception.d.ts +20 -22
  564. package/node_modules/hono/dist/types/index.d.ts +6 -37
  565. package/node_modules/hono/dist/types/jsx/base.d.ts +37 -35
  566. package/node_modules/hono/dist/types/jsx/children.d.ts +8 -6
  567. package/node_modules/hono/dist/types/jsx/components.d.ts +8 -5
  568. package/node_modules/hono/dist/types/jsx/constants.d.ts +2 -0
  569. package/node_modules/hono/dist/types/jsx/context.d.ts +9 -6
  570. package/node_modules/hono/dist/types/jsx/dom/client.d.ts +9 -10
  571. package/node_modules/hono/dist/types/jsx/dom/components.d.ts +9 -6
  572. package/node_modules/hono/dist/types/jsx/dom/context.d.ts +3 -1
  573. package/node_modules/hono/dist/types/jsx/dom/css.d.ts +27 -30
  574. package/node_modules/hono/dist/types/jsx/dom/hooks/index.d.ts +11 -12
  575. package/node_modules/hono/dist/types/jsx/dom/index.d.ts +79 -83
  576. package/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +9 -5
  577. package/node_modules/hono/dist/types/jsx/dom/jsx-dev-runtime.d.ts +4 -6
  578. package/node_modules/hono/dist/types/jsx/dom/jsx-runtime.d.ts +3 -7
  579. package/node_modules/hono/dist/types/jsx/dom/render.d.ts +32 -50
  580. package/node_modules/hono/dist/types/jsx/dom/server.d.ts +87 -85
  581. package/node_modules/hono/dist/types/jsx/dom/utils.d.ts +2 -0
  582. package/node_modules/hono/dist/types/jsx/hooks/index.d.ts +16 -16
  583. package/node_modules/hono/dist/types/jsx/index.d.ts +71 -73
  584. package/node_modules/hono/dist/types/jsx/intrinsic-element/common.d.ts +3 -1
  585. package/node_modules/hono/dist/types/jsx/intrinsic-element/components.d.ts +7 -4
  586. package/node_modules/hono/dist/types/jsx/intrinsic-elements.d.ts +708 -708
  587. package/node_modules/hono/dist/types/jsx/jsx-dev-runtime.d.ts +4 -7
  588. package/node_modules/hono/dist/types/jsx/jsx-runtime.d.ts +7 -10
  589. package/node_modules/hono/dist/types/jsx/streaming.d.ts +9 -10
  590. package/node_modules/hono/dist/types/jsx/types.d.ts +12 -13
  591. package/node_modules/hono/dist/types/jsx/utils.d.ts +2 -0
  592. package/node_modules/hono/dist/types/middleware/basic-auth/index.d.ts +17 -19
  593. package/node_modules/hono/dist/types/middleware/bearer-auth/index.d.ts +46 -48
  594. package/node_modules/hono/dist/types/middleware/body-limit/index.d.ts +6 -8
  595. package/node_modules/hono/dist/types/middleware/cache/index.d.ts +13 -15
  596. package/node_modules/hono/dist/types/middleware/combine/index.d.ts +4 -6
  597. package/node_modules/hono/dist/types/middleware/compress/index.d.ts +9 -10
  598. package/node_modules/hono/dist/types/middleware/context-storage/index.d.ts +4 -6
  599. package/node_modules/hono/dist/types/middleware/cors/index.d.ts +10 -12
  600. package/node_modules/hono/dist/types/middleware/csrf/index.d.ts +6 -8
  601. package/node_modules/hono/dist/types/middleware/etag/digest.d.ts +2 -0
  602. package/node_modules/hono/dist/types/middleware/etag/index.d.ts +6 -8
  603. package/node_modules/hono/dist/types/middleware/ip-restriction/index.d.ts +11 -12
  604. package/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +11 -11
  605. package/node_modules/hono/dist/types/middleware/jwk/index.d.ts +2 -1
  606. package/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +20 -23
  607. package/node_modules/hono/dist/types/middleware/jwt/index.d.ts +7 -6
  608. package/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +28 -30
  609. package/node_modules/hono/dist/types/middleware/language/index.d.ts +6 -5
  610. package/node_modules/hono/dist/types/middleware/language/language.d.ts +42 -44
  611. package/node_modules/hono/dist/types/middleware/logger/index.d.ts +3 -5
  612. package/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +7 -9
  613. package/node_modules/hono/dist/types/middleware/method-override/index.d.ts +14 -16
  614. package/node_modules/hono/dist/types/middleware/mount/index.d.ts +46 -0
  615. package/node_modules/hono/dist/types/middleware/powered-by/index.d.ts +8 -10
  616. package/node_modules/hono/dist/types/middleware/pretty-json/index.d.ts +18 -20
  617. package/node_modules/hono/dist/types/middleware/request-id/index.d.ts +6 -5
  618. package/node_modules/hono/dist/types/middleware/request-id/request-id.d.ts +9 -11
  619. package/node_modules/hono/dist/types/middleware/secure-headers/index.d.ts +6 -6
  620. package/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +2 -0
  621. package/node_modules/hono/dist/types/middleware/secure-headers/secure-headers.d.ts +55 -57
  622. package/node_modules/hono/dist/types/middleware/serve-static/index.d.ts +24 -24
  623. package/node_modules/hono/dist/types/middleware/serve-static/path.d.ts +2 -0
  624. package/node_modules/hono/dist/types/middleware/timeout/index.d.ts +5 -7
  625. package/node_modules/hono/dist/types/middleware/timing/index.d.ts +6 -5
  626. package/node_modules/hono/dist/types/middleware/timing/timing.d.ts +17 -20
  627. package/node_modules/hono/dist/types/middleware/trailing-slash/index.d.ts +35 -37
  628. package/node_modules/hono/dist/types/preset/quick.d.ts +6 -9
  629. package/node_modules/hono/dist/types/preset/tiny.d.ts +6 -9
  630. package/node_modules/hono/dist/types/request/constants.d.ts +2 -0
  631. package/node_modules/hono/dist/types/request.d.ts +288 -286
  632. package/node_modules/hono/dist/types/router/linear-router/index.d.ts +2 -5
  633. package/node_modules/hono/dist/types/router/linear-router/router.d.ts +7 -5
  634. package/node_modules/hono/dist/types/router/pattern-router/index.d.ts +2 -5
  635. package/node_modules/hono/dist/types/router/pattern-router/router.d.ts +7 -5
  636. package/node_modules/hono/dist/types/router/reg-exp-router/index.d.ts +3 -6
  637. package/node_modules/hono/dist/types/router/reg-exp-router/matcher.d.ts +3 -1
  638. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +6 -4
  639. package/node_modules/hono/dist/types/router/reg-exp-router/prepared-router.d.ts +11 -10
  640. package/node_modules/hono/dist/types/router/reg-exp-router/router.d.ts +10 -9
  641. package/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +7 -5
  642. package/node_modules/hono/dist/types/router/smart-router/index.d.ts +2 -5
  643. package/node_modules/hono/dist/types/router/smart-router/router.d.ts +11 -9
  644. package/node_modules/hono/dist/types/router/trie-router/index.d.ts +2 -5
  645. package/node_modules/hono/dist/types/router/trie-router/node.d.ts +6 -4
  646. package/node_modules/hono/dist/types/router/trie-router/router.d.ts +7 -5
  647. package/node_modules/hono/dist/types/router/utils.d.ts +2 -0
  648. package/node_modules/hono/dist/types/router.d.ts +23 -22
  649. package/node_modules/hono/dist/types/types.d.ts +146 -505
  650. package/node_modules/hono/dist/types/utils/accept.d.ts +5 -3
  651. package/node_modules/hono/dist/types/utils/basic-auth.d.ts +4 -2
  652. package/node_modules/hono/dist/types/utils/body.d.ts +46 -50
  653. package/node_modules/hono/dist/types/utils/buffer.d.ts +7 -5
  654. package/node_modules/hono/dist/types/utils/color.d.ts +2 -0
  655. package/node_modules/hono/dist/types/utils/compress.d.ts +2 -0
  656. package/node_modules/hono/dist/types/utils/concurrent.d.ts +6 -4
  657. package/node_modules/hono/dist/types/utils/constants.d.ts +2 -0
  658. package/node_modules/hono/dist/types/utils/cookie.d.ts +20 -18
  659. package/node_modules/hono/dist/types/utils/crypto.d.ts +5 -7
  660. package/node_modules/hono/dist/types/utils/encode.d.ts +2 -0
  661. package/node_modules/hono/dist/types/utils/filepath.d.ts +5 -3
  662. package/node_modules/hono/dist/types/utils/handler.d.ts +2 -0
  663. package/node_modules/hono/dist/types/utils/headers.d.ts +2 -0
  664. package/node_modules/hono/dist/types/utils/html.d.ts +11 -9
  665. package/node_modules/hono/dist/types/utils/http-status.d.ts +2 -0
  666. package/node_modules/hono/dist/types/utils/ipaddr.d.ts +4 -6
  667. package/node_modules/hono/dist/types/utils/jwt/index.d.ts +18 -12
  668. package/node_modules/hono/dist/types/utils/jwt/jwa.d.ts +15 -13
  669. package/node_modules/hono/dist/types/utils/jwt/jws.d.ts +4 -7
  670. package/node_modules/hono/dist/types/utils/jwt/jwt.d.ts +26 -29
  671. package/node_modules/hono/dist/types/utils/jwt/types.d.ts +48 -45
  672. package/node_modules/hono/dist/types/utils/jwt/utf8.d.ts +2 -0
  673. package/node_modules/hono/dist/types/utils/mime.d.ts +60 -57
  674. package/node_modules/hono/dist/types/utils/stream.d.ts +27 -25
  675. package/node_modules/hono/dist/types/utils/types.d.ts +14 -26
  676. package/node_modules/hono/dist/types/utils/url.d.ts +2 -0
  677. package/node_modules/hono/dist/types/validator/index.d.ts +3 -7
  678. package/node_modules/hono/dist/types/validator/utils.d.ts +6 -8
  679. package/node_modules/hono/dist/types/validator/validator.d.ts +11 -9
  680. package/node_modules/hono/dist/types.js +4 -6
  681. package/node_modules/hono/dist/utils/accept.js +185 -212
  682. package/node_modules/hono/dist/utils/basic-auth.js +18 -21
  683. package/node_modules/hono/dist/utils/body.js +87 -92
  684. package/node_modules/hono/dist/utils/buffer.js +44 -71
  685. package/node_modules/hono/dist/utils/color.js +33 -21
  686. package/node_modules/hono/dist/utils/compress.js +11 -5
  687. package/node_modules/hono/dist/utils/concurrent.js +29 -38
  688. package/node_modules/hono/dist/utils/constants.js +7 -5
  689. package/node_modules/hono/dist/utils/cookie.js +114 -163
  690. package/node_modules/hono/dist/utils/crypto.js +30 -40
  691. package/node_modules/hono/dist/utils/encode.js +30 -26
  692. package/node_modules/hono/dist/utils/filepath.js +23 -33
  693. package/node_modules/hono/dist/utils/handler.js +10 -11
  694. package/node_modules/hono/dist/utils/headers.js +1 -0
  695. package/node_modules/hono/dist/utils/html.js +97 -117
  696. package/node_modules/hono/dist/utils/http-status.js +1 -0
  697. package/node_modules/hono/dist/utils/ipaddr.js +227 -279
  698. package/node_modules/hono/dist/utils/jwt/index.js +12 -4
  699. package/node_modules/hono/dist/utils/jwt/jwa.js +24 -20
  700. package/node_modules/hono/dist/utils/jwt/jws.js +115 -174
  701. package/node_modules/hono/dist/utils/jwt/jwt.js +120 -198
  702. package/node_modules/hono/dist/utils/jwt/types.js +79 -95
  703. package/node_modules/hono/dist/utils/jwt/utf8.js +9 -7
  704. package/node_modules/hono/dist/utils/mime.js +74 -79
  705. package/node_modules/hono/dist/utils/stream.js +86 -88
  706. package/node_modules/hono/dist/utils/types.js +1 -0
  707. package/node_modules/hono/dist/utils/url.js +187 -215
  708. package/node_modules/hono/dist/validator/index.js +1 -4
  709. package/node_modules/hono/dist/validator/utils.js +1 -0
  710. package/node_modules/hono/dist/validator/validator.js +61 -83
  711. package/node_modules/hono/package.json +35 -27
  712. package/package.json +16 -14
  713. package/scripts/cloud-runtime-smoke.mjs +4 -2
  714. package/scripts/lib/cursor-sdk-output-filter.d.mts +1 -0
  715. package/scripts/lib/cursor-sdk-output-filter.mjs +1 -0
  716. package/scripts/local-resume-smoke.mjs +1 -1
  717. package/scripts/platform-smoke/artifacts.mjs +7 -1
  718. package/scripts/platform-smoke/card-detect.mjs +2 -8
  719. package/scripts/platform-smoke/targets.mjs +8 -15
  720. package/scripts/platform-smoke/visual-evidence.mjs +7 -2
  721. package/scripts/tmux-live-smoke.sh +57 -90
  722. package/shared/cursor-sdk-output-filter.d.mts +3 -0
  723. package/shared/cursor-sdk-output-filter.mjs +117 -44
  724. package/src/context-window-cache.ts +0 -6
  725. package/src/context.ts +65 -33
  726. package/src/cursor-api-key.ts +37 -17
  727. package/src/cursor-cloud-lifecycle.ts +124 -98
  728. package/src/cursor-cloud-options.ts +2 -0
  729. package/src/cursor-config.ts +76 -0
  730. package/src/cursor-custom-store-path.ts +151 -0
  731. package/src/cursor-custom-subagent-definitions.ts +21 -0
  732. package/src/cursor-durable-fs.ts +65 -3
  733. package/src/cursor-fallback-models.generated.ts +288 -1
  734. package/src/cursor-fallback-warning.ts +9 -5
  735. package/src/cursor-http1.ts +8 -8
  736. package/src/cursor-live-run-coordinator.ts +33 -15
  737. package/src/cursor-mcp-timeout-override.ts +3 -1
  738. package/src/cursor-native-replay-routing.ts +2 -1
  739. package/src/cursor-native-tool-display-registration.ts +48 -24
  740. package/src/cursor-native-tool-display-state.ts +65 -21
  741. package/src/cursor-native-tool-display-tools.ts +7 -4
  742. package/src/cursor-pi-tool-bridge-constants.ts +27 -2
  743. package/src/cursor-pi-tool-bridge-run.ts +32 -3
  744. package/src/cursor-pi-tool-bridge-server.ts +1 -2
  745. package/src/cursor-pi-tool-bridge-snapshot.ts +1 -1
  746. package/src/cursor-pi-tool-bridge-types.ts +3 -0
  747. package/src/cursor-pi-tool-bridge.ts +26 -9
  748. package/src/cursor-provider-binding.ts +121 -0
  749. package/src/cursor-provider-errors.ts +59 -35
  750. package/src/cursor-provider-lazy.ts +21 -15
  751. package/src/cursor-provider-live-run-drain.ts +29 -17
  752. package/src/cursor-provider-run-finalizer.ts +26 -16
  753. package/src/cursor-provider-turn-coordinator.ts +2 -0
  754. package/src/cursor-provider-turn-display-router.ts +5 -0
  755. package/src/cursor-provider-turn-emit.ts +3 -1
  756. package/src/cursor-provider-turn-finalize.ts +38 -23
  757. package/src/cursor-provider-turn-prepare.ts +51 -27
  758. package/src/cursor-provider-turn-runner.ts +40 -13
  759. package/src/cursor-provider-turn-send.ts +23 -15
  760. package/src/cursor-provider-turn-summary.ts +94 -0
  761. package/src/cursor-provider-turn-tool-ledger.ts +12 -7
  762. package/src/cursor-provider-turn-types.ts +37 -4
  763. package/src/cursor-provider.ts +28 -4
  764. package/src/cursor-question-tool.ts +5 -5
  765. package/src/cursor-request-provenance.ts +79 -0
  766. package/src/cursor-ripgrep-path.ts +15 -5
  767. package/src/cursor-runtime-state.ts +53 -48
  768. package/src/cursor-sdk-billed-usage.ts +54 -102
  769. package/src/cursor-sdk-event-debug-session.ts +5 -5
  770. package/src/cursor-sdk-event-debug.ts +10 -6
  771. package/src/cursor-sdk-output-filter.ts +2 -0
  772. package/src/cursor-sdk-process-error-guard.ts +8 -9
  773. package/src/cursor-sdk-runtime.ts +15 -2
  774. package/src/cursor-sdk-vendor-env.ts +22 -0
  775. package/src/cursor-session-agent-cleanup.ts +30 -29
  776. package/src/cursor-session-agent-lifecycle.ts +14 -9
  777. package/src/cursor-session-agent-lineage.ts +26 -12
  778. package/src/cursor-session-agent-resume.ts +49 -36
  779. package/src/cursor-session-agent.ts +57 -27
  780. package/src/cursor-session-compaction-prep.ts +2 -7
  781. package/src/cursor-session-scope.ts +87 -39
  782. package/src/cursor-session-send-policy.ts +2 -2
  783. package/src/cursor-session-settings.ts +72 -0
  784. package/src/cursor-session-store.ts +259 -53
  785. package/src/cursor-skill-tool.ts +37 -61
  786. package/src/cursor-state.ts +81 -69
  787. package/src/cursor-tool-manifest.ts +1 -1
  788. package/src/cursor-usage-accounting.ts +17 -82
  789. package/src/cursor-usage-command.ts +76 -0
  790. package/src/cursor-usage-ledger.ts +500 -0
  791. package/src/index.ts +30 -39
  792. package/src/model-discovery.ts +76 -45
  793. package/src/model-list-cache.ts +11 -1
  794. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +0 -1
  795. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +0 -1
  796. package/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +0 -1
  797. package/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +0 -1
  798. package/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +0 -1
  799. package/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +0 -1
@@ -13,19 +13,21 @@ This document is about replay. Replay is not execution and is not the local pi b
13
13
 
14
14
  | Surface | Names Cursor can call | Names pi shows | IDs | Execution behavior |
15
15
  | --- | --- | --- | --- | --- |
16
- | Local pi MCP bridge | Live MCP names such as `pi__sem_reindex`, only when exposed in the current run | Real pi tool names such as `sem_reindex` | Bridge run and tool IDs begin with `cursor-pi-bridge-*` | Real pi execution through normal pi `toolCall` / `toolResult` flow |
16
+ | Local pi MCP bridge | Live MCP names such as `pi__sem_reindex`, only when exposed in the current run | Real pi tool names such as `sem_reindex` | Run IDs begin with `cursor-pi-bridge-run-*`; tool-call IDs use `cursor-pi-bridge-<32 hex>-t<counter>` and are capped at 64 characters | Real pi execution through normal pi `toolCall` / `toolResult` flow |
17
17
  | Cursor native tool replay | None; replay names are not callable tools | Native-compatible card names or neutral Cursor activity labels | Replay IDs begin with `cursor-replay-*` | Display-only recorded Cursor results; no re-run, file mutation, MCP call, or pi state mutation |
18
18
  | Cursor-native host tools/settings/plugins/MCP | Cursor SDK local-agent tool names, as provided by Cursor | Only replay cards or transcript summaries when reported by the SDK | Cursor SDK-owned IDs | Neither pi bridge nor replay execution; owned by the Cursor SDK local agent path |
19
19
 
20
- Replay labels, replay cards, and transcript tool names are display-only/context-only. Bridge MCP names are also not pi tool names: Cursor must call the exposed `pi__*` MCP name, while pi history and cards use the real pi tool name.
20
+ Replay labels, replay cards, and transcript tool names are display-only/context-only. Bridge MCP names are also not pi tool names: Cursor must call the exposed `pi__*` MCP name, while pi history and cards use the real pi tool name. Older session state may contain UUID-separated bridge tool-call IDs; the runtime continues to recognize those legacy IDs when blocking stale calls.
21
21
 
22
22
  Cursor SDK `plan` mode (`--cursor-mode plan` or `/cursor-mode plan`) can make Cursor produce plan-oriented text and plan/todo activity. Replay still treats Cursor `createPlan`, `updateTodos`, task/mode, and related workflow activity as display-only Cursor activity. It does not switch pi into plan mode, mutate pi todos, or change pi active tools.
23
23
 
24
24
  ## Local pi bridge summary
25
25
 
26
- The bridge is enabled by default when bridgeable active pi tools exist. Cursor sees bridge-owned MCP names such as `pi__sem_reindex`, while pi history and tool cards use the real pi tool name such as `sem_reindex`. The bridge hides overlapping built-in pi tools by default because Cursor already has native equivalents; extension/custom tools and non-overlapping active tools present in pi's active tool registry normally remain exposed. pi-cursor-sdk also registers `cursor_ask_question` for Cursor models when the bridge is enabled and default-on `PI_CURSOR_ASK_QUESTION` is left on, exposed to Cursor as `pi__cursor_ask_question`, so Cursor can ask the user to choose instead of silently defaulting when the pi UI is available. When pi has visible Agent Skills loaded, pi-cursor-sdk registers `cursor_activate_skill`, exposed as `pi__cursor_activate_skill`, so Cursor can load the full pi `SKILL.md` that corresponds to the current pi skill catalog. The bridge does not call pi tool `execute()` handlers directly; it queues the request, emits a real pi `toolCall`, waits for the matching pi `toolResult`, and resolves the Cursor MCP call back into the same live Cursor SDK run without creating a new `Agent`, unless the run was disposed, aborted, or cancelled.
26
+ The bridge is enabled by default when bridgeable active pi tools exist. Cursor sees bridge-owned MCP names such as `pi__sem_reindex`, while pi history and tool cards use the real pi tool name such as `sem_reindex`. The bridge hides overlapping built-in pi tools by default because Cursor already has native equivalents; extension/custom tools and non-overlapping active tools present in pi's active tool registry normally remain exposed. pi-cursor-sdk also registers `cursor_ask_question` for Cursor models when the bridge is enabled and `PI_CURSOR_ASK_QUESTION=1`, exposed to Cursor as `pi__cursor_ask_question`. The tool is off by default. When pi has visible Agent Skills loaded, pi-cursor-sdk registers `cursor_activate_skill`, exposed as `pi__cursor_activate_skill`, so Cursor can load the full pi `SKILL.md` that corresponds to the current pi skill catalog. The bridge does not call pi tool `execute()` handlers directly; it queues the request, emits a real pi `toolCall`, waits for the matching pi `toolResult`, and resolves the Cursor MCP call back into the same live Cursor SDK run without creating a new `Agent`, unless the run was disposed, aborted, or cancelled.
27
27
 
28
- The bridge migrated from legacy `@modelcontextprotocol/sdk` v1 to stable MCP v2. Its bundled runtime closure is `@modelcontextprotocol/server@2.1.0`, `@modelcontextprotocol/hono@2.0.1`, `hono@4.13.9`, and `@hono/node-server@2.1.1`; the server binds loopback and validates Hono `Host` and `Origin` headers.
28
+ Outstanding bridge calls pause the live run's idle-abandonment timer (five minutes by default), including queued/emitted requests and pi tools awaiting an answer. The full idle window resumes after the last matching call settles and the provider drain lease ends, including when cleanup was requested before the lease. Explicit abort/shutdown/reset/compaction and the fail-closed MCP/bridge deadline (one hour by default) still clean up pending work. Display-only native replay without pending bridge work retains its idle expiry.
29
+
30
+ The bridge migrated from legacy `@modelcontextprotocol/sdk` v1 to stable MCP v2. Its bundled runtime closure is `@modelcontextprotocol/server@2.3.1`, `@modelcontextprotocol/hono@2.0.2`, `hono@4.13.13`, and `@hono/node-server@2.1.3`; the server binds loopback and validates Hono `Host` and `Origin` headers.
29
31
 
30
32
  Rollback, timeout, and diagnostics controls:
31
33
 
@@ -41,7 +43,13 @@ PI_CURSOR_MCP_CONNECT_TIMEOUT_MS=5000 pi --model cursor/grok-4.6
41
43
  PI_CURSOR_PI_TOOL_BRIDGE_DEBUG=1 pi --model cursor/grok-4.6
42
44
  ```
43
45
 
44
- `PI_CURSOR_ASK_QUESTION=0` disables only `cursor_ask_question` / `pi__cursor_ask_question`, leaving the rest of the pi bridge available; it is enabled by default. `PI_CURSOR_PI_TOOL_BRIDGE=0` disables the bridge, including `pi__cursor_ask_question`. `PI_CURSOR_EXPOSE_BUILTIN_TOOLS=1` opts in to exposing overlapping pi tool names that Cursor already has native equivalents for (`read`, `bash`, `write`, `edit`, `grep`, `find`, and `ls`). By default those names are hidden even when pi's Cursor replay wrapper has registered them as extension tools; non-overlapping active built-ins remain bridgeable by default. The installed Cursor SDK uses a 60-second MCP protocol default; pi-cursor-sdk overrides that seam by default with 3600 seconds for MCP `callTool` requests and 10 seconds for verified initialize/listTools requests on first send. Bridged calls also have a local fail-closed deadline capped by the effective MCP tool timeout; lower it with `PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS` to reject stale pending state and abort active pi execution sooner. Unknown MCP protocol timeout stacks keep the SDK default. `PI_CURSOR_PI_TOOL_BRIDGE_DEBUG=1` emits typed, allowlisted, scrubbed single-line JSONL bridge diagnostics to `process.stderr` with prefix `[pi-cursor-sdk:bridge]`; it is off by default, uses run-safe IDs that are not reused in endpoint paths, and does not print endpoint URLs/path components/tokens, raw args/results, file contents, or secrets. Cursor-native tools, Cursor settings, plugins, and configured Cursor MCP servers still come from the Cursor SDK local agent path. Cloud Cursor agents are out of scope for this bridge.
46
+ `PI_CURSOR_ASK_QUESTION=1` enables only `cursor_ask_question` / `pi__cursor_ask_question`, leaving the rest of the pi bridge available; it is off by default. `PI_CURSOR_PI_TOOL_BRIDGE=0` disables the bridge, including `pi__cursor_ask_question`. `PI_CURSOR_EXPOSE_BUILTIN_TOOLS=1` opts in to exposing overlapping pi tool names that Cursor already has native equivalents for (`read`, `bash`, `write`, `edit`, `grep`, `find`, and `ls`). By default those names are hidden even when pi's Cursor replay wrapper has registered them as extension tools; non-overlapping active built-ins remain bridgeable by default. The installed Cursor SDK uses a 60-second MCP protocol default; pi-cursor-sdk overrides that seam by default with 3600 seconds for MCP `callTool` requests and 10 seconds for verified initialize/listTools requests on first send. Bridged calls also have a local fail-closed deadline capped by the effective MCP tool timeout; lower it with `PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS` to reject stale pending state and abort active pi execution sooner. Unknown MCP protocol timeout stacks keep the SDK default. `PI_CURSOR_PI_TOOL_BRIDGE_DEBUG=1` emits typed, allowlisted, scrubbed single-line JSONL bridge diagnostics to `process.stderr` with prefix `[pi-cursor-sdk:bridge]`; it is off by default, uses run-safe IDs that are not reused in endpoint paths, and does not print endpoint URLs/path components/tokens, raw args/results, file contents, or secrets. Cursor-native tools, Cursor settings, plugins, and configured Cursor MCP servers still come from the Cursor SDK local agent path. Cloud Cursor agents are out of scope for this bridge.
47
+
48
+ ## Shell correlation and evidence
49
+
50
+ Shell start/completion correlation accepts legacy shell aliases with identical arguments even if IDs differ, but only for a unique pending match. Multiple identical pending shells remain unmatched without an exact ID, which takes precedence. Unmatched shell starts remain visible; assistant text or stdout progress alone does not prove completion.
51
+
52
+ This alias handling is an extension compatibility contract, not an observed alias-changing SDK callback pair. SDK 1.0.36's public started/completed updates carry `callId`, `modelCallId`, and a ToolCall with `type: "shell"`. The installed `run-interaction-accumulator` copies the completed ToolCall into `onStep({ step: { type: "toolCall", message: toolCall } })`, without adding `step.id`, before forwarding the completed delta. An offline provider contract executes that installed producer and checks reconciliation/deduplication; legacy alias tests separately check compatibility inputs. No retained alias-changing service capture establishes that this fixes the reported stale-shell symptom.
45
53
 
46
54
  ## What gets replayed
47
55
 
@@ -66,13 +74,13 @@ When Cursor reports completed tool activity, the extension can display recorded
66
74
 
67
75
  Cursor `glob` activity is displayed through native `find` cards.
68
76
 
69
- For the full `@cursor/sdk@1.0.32` `ToolType` set, disposition matrix, and runtime alias normalization, see [SDK ToolType replay matrix](#sdk-tooltype-replay-matrix) below. Official SDK reference: https://cursor.com/docs/sdk/typescript
77
+ For the full `@cursor/sdk@1.0.36` `ToolType` set, disposition matrix, and runtime alias normalization, see [SDK ToolType replay matrix](#sdk-tooltype-replay-matrix) below. Official SDK reference: https://cursor.com/docs/sdk/typescript
70
78
 
71
79
  Edit and write activity replays through pi-facing `edit` and `write` cards only when replay arguments truthfully satisfy the matching pi schema, but still uses recorded Cursor results only. The adapter passes through truthful Cursor paths, content when Cursor reported it, and recorded diff/details; it does not pretend Cursor's editing schema is pi's schema and it fails closed if a recorded replay result is missing. Cursor `StrReplace` with recorded replacement text displays as native-looking `edit`; path-only Cursor `edit` and notebook edit activity fall back to neutral Cursor activity so pi does not reject the replay before recorded-result handling. Cursor `write` displays as native-looking `write`. Diagnostics, delete, todos/plans, task/subagent, image, MCP, semantic search, screen recording, and web search/fetch activity use neutral Cursor activity cards with pi's default success/error tool shell. Cursor SDK `task` activity is labeled **Cursor subagent** by default because it represents Cursor-spawned child-agent work; `PI_CURSOR_TASK_PRESENTATION=task` keeps the older **Cursor task** wording for comparison. MCP completions whose `toolName` is `WebSearch` / `web_search` / `WebFetch` / similar are labeled **Cursor web search** or **Cursor web fetch** instead of generic **Cursor MCP**. Neutral Cursor activity cards carry display metadata such as `activityTitle` and `activitySummary`, so partial/collapsed cards can say `Cursor plan`, `Cursor todos`, `Cursor subagent`, `Cursor MCP`, `Cursor semantic search`, `Cursor screen recording`, `Cursor web search`, `Cursor web fetch`, or `Cursor edit` instead of only `Cursor activity`. These replay tools only display recorded Cursor results; they never mutate files or execute tool work directly. Replay paths are normalized to workspace-relative paths when possible. Most collapsed replay cards include bounded previews for diffs and text details so small edits, todos, task output, and MCP results are visible without expanding; web search/fetch activity stays summary-only while collapsed because those cards often arrive after final text and can otherwise bury the answer. Ctrl+O expansion shows the recorded details. Edit previews omit raw unified diff headers and show compact numbered changed/context lines using pi's native diff added/removed/context colors, and write previews use syntax highlighting when pi can infer a language from the path. Image generation replay cards show the saved image path in the collapsed summary and render the image inline when pi terminal image display is enabled and the generated file is still readable.
72
80
 
73
81
  ## SDK ToolType replay matrix
74
82
 
75
- Source of truth for SDK tool names: `@cursor/sdk@1.0.32` conversation `ToolType` values and https://cursor.com/docs/sdk/typescript
83
+ Source of truth for SDK tool names: `@cursor/sdk@1.0.36` conversation `ToolType` values and https://cursor.com/docs/sdk/typescript
76
84
 
77
85
  Implementation owners: `src/cursor-tool-presentation-registry.ts` (canonical names, labels, visibility, replay policy, bridge exclusions for internal replay wrappers, alias normalization, and display-spec key completeness), `src/cursor-transcript-tool-specs.ts` (registry-keyed display implementations for transcript formatting and pi display builders), `src/cursor-native-tool-display-replay.ts` (replay card rendering derived from registry replay metadata), and `src/cursor-web-tool-activity.ts` (MCP/web alias remapping before display lookup).
78
86
 
@@ -186,7 +194,7 @@ Lifecycle rules:
186
194
 
187
195
  As Cursor SDK tool completions arrive, the extension mirrors native Codex ordering by ending a tool-use turn, letting pi render the recorded tool results, then continuing with live post-tool Cursor thinking/text, later Cursor tool batches, or Cursor's final answer as the next assistant turn. For plan-mode runs, neutral Cursor plan/todo cards can therefore appear before the final Cursor plan text.
188
196
 
189
- Bridged pi tool calls follow the same visible pi `toolUse` turn shape, but they are real pi tool executions rather than replayed Cursor results. Local usage accounting uses per-turn raw Cursor SDK `turn-ended.usage` when available before the corresponding pi turn is emitted, including cache read/write fields; observed local full-prompt/partition semantics map into disjoint pi input/cache components and set `usage.totalTokens = inputTokens + outputTokens` for occupancy (distinct from published SDK `toTokenUsage` additive totals). If the local SDK reports no usage in time, the provider falls back to local `input/output` activity estimates with `usage.totalTokens` set to the current replayable context estimate, then ignores later usage for that live run rather than risk applying stale usage to the wrong pi turn. Cloud raw usage remains display-only and uses approximate pi message accounting until its field semantics are independently captured.
197
+ Bridged pi tool calls follow the same visible pi `toolUse` turn shape, but they are real pi tool executions rather than replayed Cursor results. Local usage accounting uses per-turn raw Cursor SDK `turn-ended.usage` when available before the corresponding pi turn is emitted, including cache read/write fields; observed local full-prompt/partition semantics map into disjoint pi input/cache components and set `usage.totalTokens = inputTokens + outputTokens` for occupancy (distinct from published SDK `toTokenUsage` additive totals). If the local SDK reports no safely attributable usage in time, the provider estimates the current context; its disjoint input/cache/output components sum to `usage.totalTokens`. Later raw usage is retained by the separate ledger, not applied retroactively to emitted pi messages. Public billed facts never enter native occupancy. Cloud raw telemetry is retained without assuming LOCAL normalization, while native Cloud messages use approximate context accounting. See [context, compaction, and Cursor usage](../README.md#context-compaction-and-cursor-usage).
190
198
 
191
199
  For shell replay, completed `stdout` / `stderr` remain the primary source. While exactly one shell call is active, the provider also emits a bounded scrubbed preview of the first few `shell-output-delta` stdout/stderr chunks so long-running commands show visible progress before completion. If a successful completed shell result is empty, the replay card uses unambiguous buffered delta data as display-only fallback data. Overlapping shell calls make delta attribution ambiguous, so those fallback/progress deltas are dropped rather than guessed. `(no output)` is kept only when no completed output or safe delta fallback is available.
192
200
 
@@ -202,6 +210,8 @@ Bridge MCP names are also not pi tool names. Cursor may see names such as `pi__s
202
210
 
203
211
  Native replay wrappers are registered only for tool names not already owned by another extension. If another extension already owns a wrapper name needed for replay, pi-cursor-sdk skips only the conflicting wrapper and uses the scrubbed Cursor activity transcript for that tool instead.
204
212
 
213
+ Registration checks the current tool owner on every model sync, not once per process. Pi rebuilds its tool registry after `/new`, `/resume`, reloads, and session switches. Cursor reinstalls wrappers over builtins, but if the new session loads another extension's tool, Cursor stops replaying through that name and leaves the other extension untouched. Replay becomes available again when the conflict disappears. A conflicting name is reported to the user only once. Any `cursor-replay-*` call that reaches a Cursor wrapper with no recorded display fails closed instead of running the real tool.
214
+
205
215
  Disable native replay registration entirely:
206
216
 
207
217
  ```bash
@@ -1,16 +1,16 @@
1
1
  # Cursor Native Tool Visual Audit Workflow
2
2
 
3
- > **Platform Smoke (new):** The required cross-platform release gate includes a deterministic visual card matrix across all targets. See [docs/platform-smoke.md](./platform-smoke.md) for the required cards, assertion contract, and platform-matrix budget.
3
+ > **Cost-conscious verification:** Start offline/faux and reuse exact-input retained evidence. For changed visual behavior needing new live proof, select the smallest meaningful check on one representative environment. The comprehensive [platform matrix](./platform-smoke.md) is optional; no full paid campaign replay, matrix-only host coverage, or automatic paid retries. No paid Cloud testing for generic PRs/releases; only explicitly Cursor Cloud-focused PRs/issues may select necessary focused Cloud proof. Automated Cursor PR reviews continue unchanged. Selected visual checks keep their PNG, JSONL, and cleanup contracts.
4
4
 
5
5
  This workflow is the canonical repo path for verifying Cursor SDK tool replay the way a human sees it in pi's interactive TUI, without stealing macOS focus.
6
6
 
7
- Use it before accepting replay-card commits or PRs, and for every Cursor provider/runtime release where TUI card/color behavior could regress. Text logs and JSONL are necessary, but they are not enough when the claim is visual parity: always keep PNGs for the exact prompt, and keep before/after PNGs when reviewing a rendering change.
7
+ Use it when changed replay-card behavior needs new visual proof not covered by offline rendering contracts or valid retained evidence. Text logs and JSONL are not enough for visual-parity claims: keep PNGs for the exact prompt, and before/after PNGs for a rendering comparison. Reuse a valid retained baseline instead of paying to recreate it.
8
8
 
9
- Current validation baseline: Node 24+, exact `@cursor/sdk@1.0.32`, official Pi 0.87.1/latest and current `fitchmultz/pi` main. Local validation packages `@earendil-works/pi-ai`, `@earendil-works/pi-coding-agent`, and `@earendil-works/pi-tui` are exact 0.87.1. Optional published Pi and TypeBox peer dependencies use `"*"` ranges per Pi guidance.
9
+ Current validation baseline: Node 24+, exact `@cursor/sdk@1.0.36`, official Pi 0.87.1/latest and current `fitchmultz/pi` main. Development Pi packages `@earendil-works/pi-ai`, `@earendil-works/pi-coding-agent`, and `@earendil-works/pi-tui` are exact locked 1.0.4 snapshots, with host TypeBox 1.3.27. These locked development snapshots are not qualification targets; resolve latest stable official Pi and current `fitchmultz/pi` main once per workflow run. Optional published Pi and TypeBox peer dependencies use `"*"` ranges per Pi guidance.
10
10
 
11
11
  ## Cursor SDK 1.0.17 / pi 0.79.0 cutover visual record
12
12
 
13
- Record the required cutover validation here or in the final release handoff. The default matrix is native replay only: the runner forces native replay registration on, forces Cursor setting sources off, disables the pi bridge, disables overlapping built-in pi tool exposure, and clears inherited Cursor SDK event-debug artifact env. With `--event-debug`, debug capture writes to a deterministic directory under the visual output directory. Do not commit raw ANSI logs, screenshots, terminal recordings, debug artifacts, or `.debug/visual-smoke` scratch files.
13
+ This section retains historical cutover requirements, not a new mandatory paid campaign. For current changes, select only necessary changed categories and reuse valid retained proof. The default matrix is native replay only: the runner forces native replay registration on, forces Cursor setting sources off, disables the pi bridge, disables overlapping built-in pi tool exposure, and clears inherited Cursor SDK event-debug artifact env. With `--event-debug`, debug capture writes to a deterministic directory under the visual output directory. Do not commit raw ANSI logs, screenshots, terminal recordings, debug artifacts, or `.debug/visual-smoke` scratch files.
14
14
 
15
15
  | Field | Required value / evidence |
16
16
  | --- | --- |
@@ -36,7 +36,7 @@ Required prompt matrix for this cutover:
36
36
  | `read-missing` | `Use only your file read tool to read .debug/visual-smoke/does-not-exist.txt. Then explain the result. Do not use shell, grep, glob, find, ls, edit, or write.` | `toolCall.name=read`, `toolResult.toolName=read`, `isError=true` | True failure is visible, bounded, and distinct from neutral Cursor activity |
37
37
  | `workflow-activity` | `Stay in Cursor plan mode. If Cursor exposes plan, todo, task, or mode activity for this request, use that capability to outline a tiny unit test without editing files. Otherwise answer with a concise numbered plan. Do not use shell or file mutation tools.` | Optional: completed `cursor` activity whose details/source identify `createPlan`, `updateTodos`, `task`, or mode activity. If absent, record this category as not exercised. | Optional: neutral Cursor workflow activity is neutral, not red, and does not mutate pi plan/todo state. If absent, do not claim this visual category passed. |
38
38
 
39
- Do not mark a category passed because the prompt was sent. A category passes only when the PNG shows the expected card and the JSONL shows the expected completed `toolCall` / `toolResult` pair. If Cursor chooses a different tool, rerun with a tighter prompt or record that the category was not exercised.
39
+ Do not mark a category passed because the prompt was sent. A category passes only when the PNG shows the expected card and the JSONL shows the expected completed `toolCall` / `toolResult` pair. If Cursor chooses a different tool, record the category as not exercised and diagnose offline; do not automatically rerun.
40
40
 
41
41
  ## When to use this
42
42
 
@@ -63,7 +63,7 @@ The canonical workflow is now offscreen and browser-rendered:
63
63
  5. Save PNG screenshots with `agent_browser` when the harness is available, or Playwright directly when running outside that harness.
64
64
  6. Inspect the session JSONL for exact persisted `toolCall` / `toolResult` data.
65
65
 
66
- This is the best default focused visual-debug path because it exercises the real pi TUI, captures card class/color/label/order/truncation issues before users see them, avoids desktop focus stealing, and leaves reviewable artifacts. Use visible Terminal/Ghostty screenshots only for terminal-specific or pixel-level bugs that cannot be judged through browser-rendered ANSI. The cross-platform release gate remains [Platform Smoke](./platform-smoke.md).
66
+ This is the best default focused visual-debug path because it exercises the real pi TUI, captures card class/color/label/order/truncation issues before users see them, avoids desktop focus stealing, and leaves reviewable artifacts. Use visible Terminal/Ghostty screenshots only for terminal-specific or pixel-level bugs that cannot be judged through browser-rendered ANSI. See [Platform Smoke](./platform-smoke.md) for focused suite selection and the optional comprehensive matrix.
67
67
 
68
68
  ## Tool stack
69
69
 
@@ -120,7 +120,7 @@ The runner writes the `.png` through Playwright by default. In the pi agent harn
120
120
 
121
121
  ## Before/after comparison
122
122
 
123
- Use a clean worktree for the baseline and the active worktree for the candidate change:
123
+ Reuse an exact-input retained baseline when available. Only if a necessary comparison has no valid retained baseline, use a clean worktree for it and the active worktree for the candidate change:
124
124
 
125
125
  ```bash
126
126
  BASE=/tmp/pi-cursor-visual-review
@@ -137,7 +137,7 @@ git worktree add --detach "$BEFORE_WT" "$BASE_COMMIT"
137
137
  ln -s "$AFTER_WT/node_modules" "$BEFORE_WT/node_modules"
138
138
  ```
139
139
 
140
- Then run the same prompt against both extension dirs:
140
+ Run only the missing side of the comparison; the following commands illustrate each side, not an unconditional two-call requirement:
141
141
 
142
142
  ```bash
143
143
  npm run smoke:visual -- \
@@ -1,12 +1,12 @@
1
1
  # Cursor Testing Lessons
2
2
 
3
- > **Platform Smoke:** The required local cross-platform release gate is `npm run smoke:platform:all`; cloud-runtime changes additionally require `npm run smoke:cloud`. See [the platform smoke runbook](./platform-smoke.md). For portable guidance, see the [implementation reference](./platform-smoke-implementation.md#portability-to-other-pi-extensions) and the repo-local `docs/pi-extension-platform-testing.md` from a Crabbox checkout. The live smoke checklist remains useful for inner-loop development but is not the release gate.
3
+ > **Cost-conscious verification:** Offline/faux checks first; reuse exact-input retained evidence. Only changed behavior needing new real-service proof warrants the smallest meaningful live check on one representative environment. Docs/metadata-only changes need no paid runs. No full paid campaign replay, matrix-only host coverage, or automatic paid retries. No paid Cloud testing for generic PRs/releases; only explicitly Cursor Cloud-focused PRs/issues may select a necessary focused Cloud check. Automated Cursor PR reviews continue unchanged. `npm run smoke:platform:all` is optional comprehensive coverage. See [the platform smoke runbook](./platform-smoke.md) and its [implementation reference](./platform-smoke-implementation.md#portability-to-other-pi-extensions).
4
4
 
5
5
  ## Purpose
6
6
 
7
7
  This document records maintainer testing lessons for `pi-cursor-sdk`. It complements unit tests and the [Cursor live smoke checklist](./cursor-live-smoke-checklist.md). Use it when adding regression coverage, debugging false-green releases, or building isolated smoke harnesses.
8
8
 
9
- For a **minimal one-session dogfood pass** (baseline env, one native + one bridge call, JSONL ID patterns, bootstrap manifest, edit diff card), use the [Cursor dogfood checklist](./cursor-dogfood-checklist.md) as inner-loop evidence before running the platform smoke gate.
9
+ For a **minimal one-session dogfood pass** (baseline env, one native + one bridge call, JSONL ID patterns, bootstrap manifest, edit diff card), use the [Cursor dogfood checklist](./cursor-dogfood-checklist.md) only when its selected changed behavior needs new live proof; do not follow it with a full paid matrix by default.
10
10
 
11
11
  ## Core lesson: integration-shaped bugs beat unit mocks
12
12
 
@@ -50,9 +50,45 @@ If resync runs but `context.tools` is still stale (e.g. only `read` listed), the
50
50
 
51
51
  ## Stock/transcript provider contract
52
52
 
53
- `test/cursor-provider-pi-context.test.ts` drives real `ModelRuntime` / `ModelRegistry` requests into `streamCursor`, with only Cursor SDK execution mocked. Run it against each supported host with all Pi peer imports pinned to that host (including nested native imports); a top-level package version alone is not resolution evidence. Cover official Pi 0.87.1, official latest, and current `fitchmultz/pi` main. The currently validated local `@earendil-works/pi-ai`, `@earendil-works/pi-coding-agent`, and `@earendil-works/pi-tui` packages are 0.87.1.
53
+ `test/cursor-provider-pi-context.test.ts` drives real `ModelRuntime` / `ModelRegistry` requests into `streamCursor`, with only Cursor SDK execution mocked. Run it against each supported host with all Pi peer imports pinned to that host (including nested native imports); a top-level package version alone is not resolution evidence. Cover official Pi 0.87.1, official latest, and current `fitchmultz/pi` main. The direct development Pi packages are locked 1.0.4 snapshots, not qualification targets; resolve latest stable official Pi and current `fitchmultz/pi` main once per workflow run. Their actual nested resolution is recorded with each check, including host TypeBox 1.3.27.
54
54
 
55
- The test covers bootstrap/incremental prompts, empty-vs-absent request tools, native replay/drain, cloud fresh/bootstrap selection, and actual host prompt serialization for context files and skills. It is offline contract evidence, not a replacement for the required live platform/cloud release gates.
55
+ The test covers bootstrap/incremental prompts, empty-vs-absent request tools, native replay/drain, cloud fresh/bootstrap selection, and actual host prompt serialization for context files and skills. `test/native-cursor-flow.test.mjs` additionally exercises the compiled extension through the real loader and registered Cursor provider, substituting only the external SDK transport/storage. It verifies actual bridge tool execution, pending-work idle/abort/shutdown/deadline ownership, replay without file access, persisted usage/lineage, tree, compaction, queued steering, abort and reload/disposal. `test/native-cursor-prompt.test.mjs` owns genuine native input, hidden notices, required-budget input, current attachments, custom-only continuation, equivalent conversion, payload/order-changing rejection, and GitHub comment soft guidance across bootstrap/incremental/custom-only sends. Both owners use `test/helpers/native-cursor-harness.mjs` and run in the explicit `check:compat` list and manual official-host compatibility route; the native-platform Vitest job is not execution evidence for these Node test owners. Explicit `tools` is now an allowlist, not merely an initial active set; use `defaultTools` for a native fixture that allows replay wrappers to activate. `test/native-provider.test.mjs` additionally verifies canonical `SessionManager.appendContextEdit()` plus `refreshContext()`, unchanged raw history, and conversation filtering that preserves system instructions, the current tool declaration, and explicit tool removal (the focused native slice from #271). It is offline contract evidence. Add live proof only for changed behavior that still needs real-service evidence under the cost policy above; do not rerun unchanged live lanes or infer full live coverage from offline tests.
56
+
57
+ ## Maintainer-only offline proof retention
58
+
59
+ Native SQLite fixtures should open the public `SqliteLocalAgentStore` from `@cursor/sdk/sqlite` with an explicit `stateRoot` under their temporary directory, pass it as `localStore` to `createAgentPlatform`, and await `dispose()` in `finally` before removing that directory. `scopedWorkspaceRef` filters agents; it does not relocate storage. Assert the owned `index.db` exists to guard isolation. A fresh missing-agent `checkpointStore.loadLatest()` returning `null` checks the lookup boundary, not per-agent checkpoint database I/O; see `test/cursor-sdk-lazy-import.test.ts`.
60
+
61
+ Two existing test flags retain raw proof in a **fresh private** directory outside the repository (or a gitignored scratch directory):
62
+
63
+ - `PI_CURSOR_TEST_EVIDENCE_DIR` retains native SessionManager JSONL with run/metadata/options sidecars, prompt payloads/roles/images, accepted catalog bytes, terminal/late usage facts and byte-preserving journals, and custom-agent resume proof.
64
+ - `PI_CURSOR_BOOTSTRAP_PROOF_DIR` retains installed SDK output-filter captures as `sdk-capture-{plain,ansi}.json`. Run `test/cursor-sdk-output-filter.test.ts` **before** `test/native-cursor-flow.test.mjs`: the latter consumes `sdk-capture-ansi.json` for its receipt/deferred-wait diagnostic checks. Do not invent capture payloads or reuse an old sealed run directory.
65
+
66
+ The lightweight `test/helpers/raw-test-evidence.mjs` owns only directory/file writes. Payload construction and explicit flag guards stay with each owning test; unset flags perform no evidence I/O. Existing filenames, JSON fields and raw JSONL/journal/Buffer bytes are retained, not converted into a uniform schema. Writes overwrite the same filename within an owned run.
67
+
68
+ For an installed development checkout, this example builds and runs only the offline owners, with Node 24+ and no inherited credentials/profile/host selectors:
69
+
70
+ ```bash
71
+ NODE24="$(command -v node)" # must resolve to Node 24+
72
+ PROOF="$(mktemp -d "${TMPDIR:-/tmp}/cursor-offline-proof.XXXXXX")"
73
+ chmod 700 "$PROOF"
74
+ mkdir -p "$PROOF/home" "$PROOF/agent" "$PROOF/tmp" "$PROOF/xdg"
75
+ offline() {
76
+ env -i PATH="$(dirname "$NODE24"):/usr/bin:/bin" \
77
+ HOME="$PROOF/home" USERPROFILE="$PROOF/home" XDG_CONFIG_HOME="$PROOF/xdg" \
78
+ PI_CODING_AGENT_DIR="$PROOF/agent" TMPDIR="$PROOF/tmp" \
79
+ PI_OFFLINE=1 PI_TELEMETRY=0 PI_SKIP_VERSION_CHECK=1 PI_CURSOR_SETTING_SOURCES=none \
80
+ PI_CURSOR_TEST_EVIDENCE_DIR="$PROOF/sessions" \
81
+ PI_CURSOR_BOOTSTRAP_PROOF_DIR="$PROOF/bootstrap" "$NODE24" "$@"
82
+ }
83
+ offline scripts/build.mjs
84
+ offline node_modules/vitest/vitest.mjs run test/cursor-sdk-output-filter.test.ts \
85
+ test/cursor-provider-stream-usage.test.ts test/cursor-provider-replay-live-run.test.ts \
86
+ test/cursor-session-agent-local-resume.test.ts
87
+ offline --test test/native-provider.test.mjs test/native-cursor-flow.test.mjs \
88
+ test/native-cursor-prompt.test.mjs
89
+ ```
90
+
91
+ These artifacts may include prompts, tool arguments/results, local paths and private session facts. Never print, commit or publish them; never supply real keys to this offline workflow. Inspect persisted joins and bytes privately, then retain or remove only your owned proof directory. Offline artifacts establish the tested local SDK/native contracts, **not** all-host/backend qualification or paid-service acceptance.
56
92
 
57
93
  ## Auth: use `auth.json`, not only env
58
94
 
@@ -132,6 +168,7 @@ Every live check should use its own `--session-dir` under the isolated tree. Do
132
168
  | Inherited shell env | mise/profile hooks hung or polluted runs | Use `env -i ... MISE_DISABLE=1` for isolated pi calls |
133
169
  | No per-check timeout | One stuck prompt blocked entire harness | Wrap each live check with timeout/watchdog |
134
170
  | stdout-only assertions | Missed replay failures persisted only in JSONL | Scan JSONL for `Tool grep/cursor/find/ls not found` |
171
+ | Unspecified “visible” marker source | Conversation recall became an empty-workspace search | Specify conversation history only, with no tools or file inspection; compare actual send payload and SDK events before blaming history loss |
135
172
  | Naive JSONL substring scan | Successful `read` of docs mentioning replay errors looked like failures | `validate-smoke-jsonl.mjs` only flags error `toolResult` / error assistant messages |
136
173
  | Plan strip only on first turn | Under-tested multi-turn resync | Shim strips on every `turn_start`; stress multi-turn separately |
137
174
  | Assuming env auth equals pi auth | False "blocked" or false "pass" in CI-like shells | Check `auth.json` provider keys explicitly when needed |
@@ -169,23 +206,31 @@ Successful tool results are ignored even when file contents mention those string
169
206
 
170
207
  Session summaries can hide per-message usage bugs. When investigating token or compaction regressions, inspect assistant message `usage` rows directly:
171
208
 
172
- - `usage.input`, `usage.output`, `usage.cacheRead`, and `usage.cacheWrite` are additive spend-style counters for the assistant turn.
173
- - `usage.totalTokens` is pi context occupancy for that turn, not a value to sum across all assistant messages.
174
- - Distinguish published SDK `TokenUsage` from observed raw local `turn-ended.usage`: installed `@cursor/sdk` `toTokenUsage` sets `totalTokens = input+output+cacheRead+cacheWrite`, but captured local raw `turn-ended.usage` keeps `inputTokens` as the full prompt while cache fields partition it (see `test/fixtures/cursor-sdk-turn-ended-usage-1.0.23.json` / issue #196). Map raw turn-ended samples to pi as uncached `input = inputTokens - cacheReadTokens - cacheWriteTokens` and `totalTokens = inputTokens + outputTokens`.
209
+ - Native `usage.input`, `output`, `cacheRead`, and `cacheWrite` must sum to `totalTokens` and describe the same current context. Native overflow reads prompt components, not only total; keeping a small total beside cumulative billed input/cache still triggers false compaction.
210
+ - Native configured-price estimates are per emitted message, not complete Cursor invoice totals. Recorded raw/reported/billed sources overlap and must not be summed.
211
+ - Distinguish observed LOCAL full-prompt `turn-ended.usage` from public billed `AgentUsage`: normalize raw input by subtracting its cache partition once. Billed input is already uncached. The captured SDK 1.0.32 case has raw 4232 input / 4096 cache read / 3 output, corrected 136 uncached / 4096 cache / 3 output = 4235; original additive wait/handle total 8331 remains reported telemetry only. Public getter transport coverage verifies the documented disjoint billed contract; do not invent successful live endpoint access when it was unavailable.
175
212
  - No single assistant message should persist SDK/full-agent-context-sized usage outside the selected model window.
176
213
  - Real bad-session evidence should be reduced to a sanitized fixture, like `test/fixtures/cursor-run-usage-compaction-poison.jsonl`, instead of committing raw session JSONL.
177
214
 
178
- The compaction poison fixture mirrors the observed failure shape: one assistant message with `RunResult`-sized input/cache-read counts near 1M immediately before compaction. Regression coverage should prove that such usage falls back to bounded pi estimates before it reaches `AssistantMessage.usage`.
215
+ The compaction poison fixture mirrors the observed failure shape: one assistant message with `RunResult`-sized input/cache-read counts near 1M immediately before compaction. Regression coverage proves that such usage falls back to bounded pi estimates before reaching `AssistantMessage.usage`.
216
+
217
+ Use native registered-provider tests for the full scheduler boundary. `test/native-cursor-flow.test.mjs` covers large cumulative bills with no false compaction, genuine pressure still auto-compacting, and manual compaction persisting after reopen. Its floor controls exercise actual compaction/context-edit source chronology, future/equal clocks, quoted wrappers and request-local transformations without mocking Pi's scheduler, receipt or projection. `test/cursor-provider-binding.test.ts` additionally verifies actual native header/signal identity through sequential compaction summaries, retry and tree navigation.
218
+
219
+ For LOCAL summary isolation, inspect actual SDK create/send options and persisted lineage, not assistant text alone: tools/settings empty, no bridge/MCP/manifest, mode `agent`, fresh IDs, no ordinary resume writes, agent/store disposed. Materialize the fixture's temporary directory and assert it is removed **when the native operation returns**; merely observing `dispose()` or eventual removal misses a terminal-emission/cleanup race. SDK fixtures must honor `tools: []` instead of replaying historical marker-driven tool calls despite the restriction.
220
+
221
+ `test/cursor-usage-ledger.test.ts` uses real public SessionManager custom entries and bounded filesystem journals. It protects restart, optional mirror failure, backward/equal snapshot clocks, revised/aggregate-only/large bills, linear compact-revision storage, unavailable-to-late observations, abandon without a billing fetch, late abort, owner/sibling switches, inherited cross-directory gaps, lost native claims, pricing tiers, torn-tail prefix export/native-fork recovery and malformed/symlink files. Export is a canonical view of facts and uncertainty, not an invented client-run billing join. A failed durable append must not advance recognized accounting.
222
+
223
+ For supported official hosts without committing a repair, use `node scripts/ci-compatibility.mjs --working-tree --official-only --versions 0.87.1,0.99.1,1.0.3`. This hashes an isolated source snapshot, builds/packs it, tests package loading and runs real native session contracts. Keep matching host-peer resolution and exact source evidence; offline SDK transport substitution proves integration, not live service availability. See [context/accounting boundaries](./cursor-model-ux-spec.md#context-and-accounting-boundaries) for the operational ledger ceiling and public-API limits.
179
224
 
180
225
  ### False-positive edge case (2026-05-23)
181
226
 
182
227
  Plan-strip live smoke can make Cursor `read` testing docs that *document* replay failure strings. A naive whole-record JSON scan reported four failures from one successful `read` toolResult (`isError: false`).
183
228
 
184
- When changing replay scan logic:
229
+ For changed replay scan logic, use offline checks and valid exact-input retained evidence first. These are selectable evidence criteria, not a mandatory paid checklist:
185
230
 
186
- 1. Update `scripts/validate-smoke-jsonl.mjs`
187
- 2. Add/adjust cases in `test/validate-smoke-jsonl.test.ts` (error toolResult must still fail; successful read of doc text must pass)
188
- 3. Re-run `npm run smoke:isolated` on a packed temp install before release
231
+ 1. Update `scripts/validate-smoke-jsonl.mjs` for the intended scanner behavior.
232
+ 2. Add/adjust cases in `test/validate-smoke-jsonl.test.ts` (error toolResult must still fail; successful read of doc text must pass).
233
+ 3. Use offline packed-install checks (`SKIP_LIVE=1 npm run smoke:isolated`) or valid exact-input retained proof for packaging/replay evidence. Only if the changed behavior still needs real-service proof, select the smallest meaningful existing live check on one representative environment; do not automatically run the full paid `npm run smoke:isolated` sequence. Keep the selected check's replay assertions, persisted JSONL, visual proof when relevant, and cleanup intact.
189
234
 
190
235
  ## Plan-mode regression scenario
191
236
 
@@ -209,20 +254,33 @@ Pass criteria:
209
254
 
210
255
  ## Local validation ladder
211
256
 
212
- Run local checks first, then the local platform smoke gate before claiming release-ready for provider/runtime changes. Add `npm run smoke:cloud` for cloud-runtime changes:
257
+ Run offline checks first, then reuse retained proof whose tested inputs are unchanged. If changed behavior still needs real-service proof, choose one existing meaningful check on a representative environment. Do not run every command below as a paid ladder; docs/metadata-only changes need zero paid runs.
213
258
 
214
- TypeScript 7 owns builds and type checks. `@typescript/typescript6` is dev-only for the AST architecture test because TypeScript 7 has no stable compiler API. Vitest 5 defaults `clearMocks` to `true`.
259
+ TypeScript 7 owns builds and type checks. `@typescript/typescript6` is dev-only for AST architecture and installed-SDK contract tests because TypeScript 7 has no stable compiler API. Vitest 5 defaults `clearMocks` to `true`.
215
260
 
216
261
  ```bash
217
262
  npm test
218
263
  npm run typecheck
219
264
  npm pack --dry-run
220
- SKIP_LIVE=1 npm run smoke:isolated
221
- npm run smoke:isolated # inner-loop helper; requires auth.json or CURSOR_API_KEY
222
- npm run smoke:live # inner-loop partial tmux checklist subset
223
- npm run smoke:platform:doctor
265
+ SKIP_LIVE=1 npm run smoke:isolated # offline helper
266
+ ```
267
+
268
+ Only when changed behavior requires new local service proof, select the relevant existing suite (example: restart) and one representative target:
269
+
270
+ ```bash
271
+ node scripts/platform-smoke.mjs run --target macos --suite cursor-local-resume-restart
272
+ ```
273
+
274
+ Optional comprehensive coverage, not a default ship step:
275
+
276
+ ```bash
224
277
  npm run smoke:platform:all
225
- npm run smoke:cloud # required for cloud-runtime changes
278
+ ```
279
+
280
+ Only for a PR/issue explicitly focused on Cursor Cloud, and only if this coverage is necessary (the multi-lane matrix is not mandatory):
281
+
282
+ ```bash
283
+ npm run smoke:cloud
226
284
  ```
227
285
 
228
286
  After changing `scripts/validate-smoke-jsonl.mjs` or replay scan expectations, also run:
@@ -231,16 +289,18 @@ After changing `scripts/validate-smoke-jsonl.mjs` or replay scan expectations, a
231
289
  npm test -- test/validate-smoke-jsonl.test.ts
232
290
  ```
233
291
 
234
- Then use the [Cursor live smoke checklist](./cursor-live-smoke-checklist.md) only for focused inner-loop surfaces the scripts do not cover (bridge MCP, abort/cancel, full TUI observation, packaging review, cleanup) before rerunning the local platform smoke gate and, for cloud-runtime changes, `npm run smoke:cloud`.
292
+ Use the [Cursor live smoke checklist](./cursor-live-smoke-checklist.md) as a menu for necessary changed-behavior proof the selected script does not cover, not a full paid campaign. Keep distinct behavior assertions, persisted evidence, visual inspection when relevant, and cleanup intact. Diagnose failures offline; no automatic paid retries.
235
293
 
236
294
  ## What belongs in CI vs platform/manual smoke
237
295
 
238
296
  - **CI / default `npm test`:** mocked provider tests, extension lifecycle tests, JSONL validator tests, script syntax/help checks. No live Cursor calls.
239
- - **Local platform release gate:** `npm run smoke:platform:all` (runs doctor first). Requires real Cursor auth and cross-platform Crabbox setup.
240
- - **Cloud runtime release gate:** `npm run smoke:cloud` for PRs that touch actual cloud runtime execution.
241
- - **Focused manual smoke:** `npm run smoke:isolated`, `npm run smoke:live`, and selected live-checklist sections for inner-loop debugging of behavior mocks cannot reproduce.
297
+ - **Focused local live proof:** a necessary existing single-suite/single-target check for changed behavior only. Reuse valid retained proof instead of repeating unchanged lanes.
298
+ - **Comprehensive local matrix:** `npm run smoke:platform:all` (doctor first), optional rather than an unconditional commit/release gate.
299
+ - **Cloud testing exception:** no paid Cloud testing for generic PRs/releases. Only PRs/issues explicitly focused on Cursor Cloud may select a necessary focused Cloud check. Cloud file touch alone does not qualify; the multi-lane `npm run smoke:cloud` is not mandatory. Run/evidence and agent/repository cleanup contracts remain intact.
300
+ - **Automated Cursor PR reviews:** continue unchanged; do not disable them or introduce extra push/review churn for testing.
301
+ - **Manual helpers:** `smoke:isolated`, `smoke:live`, and selected checklist sections are available, but run only the smallest necessary check.
242
302
 
243
- If platform smoke auth or target setup is unavailable, report the release as **blocked**, not skipped-ready.
303
+ If a selected necessary live check lacks auth or setup, report that specific proof gap, not a pass. Optional unselected matrix lanes do not block landing.
244
304
 
245
305
  ## Cursor SDK event capture probe
246
306
 
@@ -265,7 +325,7 @@ The script writes timestamped artifacts under `--out` (default `/tmp/pi-cursor-s
265
325
 
266
326
  Stdout prints artifact paths and summary counts only. Raw payloads stay on disk and may contain local paths, project text, tool args/results, or secrets — do not commit or share them.
267
327
 
268
- Hard repo rule: Cursor SDK behavior claims must come from the installed `@cursor/sdk` package and/or https://cursor.com/docs/sdk/typescript, not from memory or ad-hoc probes alone. Current validation targets Node 24+, exact `@cursor/sdk@1.0.32`, official Pi 0.87.1/latest, and current `fitchmultz/pi` main.
328
+ Hard repo rule: Cursor SDK behavior claims must come from the installed `@cursor/sdk` package and/or https://cursor.com/docs/sdk/typescript, not from memory or ad-hoc probes alone. Current validation targets Node 24+, exact `@cursor/sdk@1.0.36`, official Pi 0.87.1/latest, and current `fitchmultz/pi` main.
269
329
 
270
330
  ## Pi provider SDK event capture
271
331
 
@@ -458,3 +518,5 @@ rg '"type": "toolCall"|Tool call \(Cursor|cursor-replay-' "$SMOKE_DIR/session"/*
458
518
  - `scripts/lib/` — maintainer plumbing (CLI arg parsing, secret-aware `fail()`, child-process shutdown, shell timeout/auth helpers). Re-exports `shared/` helpers so published smoke/debug scripts stay aligned with provider runtime (`test/maintainer-scripts-lib.test.ts`).
459
519
  - `test/helpers/pi-harness.ts` — canonical fake pi/extension harness (`createPiHarness`, shared model/context/event helpers)
460
520
  - `test/helpers/cursor-provider-harness.ts` — Cursor SDK provider mocks and stream helpers (re-exports pi-harness fixtures; `createNativeToolDisplayPiForTest` for native replay)
521
+
522
+ Compatibility campaign watchdogs must bound setup and suite phases separately. A Linux run passed all unit assertions in 153.52 seconds but exhausted the old combined 180-second build/verify/native command budget as native tests started; killing only npm left children alive while cleanup removed their workspace. A later Ubuntu run exhausted even the independent 180-second verification budget while tests were still passing; it produced no terminal suite summary, so eventual completion and success are unknown. The command helper now defaults build/native and other commands to 180 seconds, and exactly `npm` with arguments `["run", "verify"]` to 360 seconds; explicit caller timeouts, including zero, take precedence. The campaign retains independent phases, stops owned POSIX descendants on a watchdog error, and allows twenty minutes for the complete two-host job. Keep every individual case deadline/assertion unchanged; downstream ENOENT after workspace removal is teardown evidence, not a product regression.
@@ -30,11 +30,11 @@ Default behavior:
30
30
  - The pi bridge exposes **active pi tools** as `pi__*` MCP names when `PI_CURSOR_PI_TOOL_BRIDGE` is enabled (default on).
31
31
  - Overlapping pi builtins (`read`, `bash`, `write`, `edit`, `grep`, `find`, `ls`) are **hidden** from the bridge unless `PI_CURSOR_EXPOSE_BUILTIN_TOOLS=1`.
32
32
 
33
- `pi-cursor-sdk` registers `cursor_ask_question` for Cursor models when the bridge is on and `PI_CURSOR_ASK_QUESTION` is enabled (the default); Cursor sees `pi__cursor_ask_question`. The tool is sequential and emits `pi-cursor-sdk:ask-question:blocked` `{ active }` while awaiting UI input. Set `PI_CURSOR_ASK_QUESTION=0` to remove only this tool while preserving the rest of the bridge. Pending bridged calls use a local deadline capped by the effective MCP tool timeout; `PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS` can lower it. When pi has visible Agent Skills loaded, the extension also rewrites pi's skill catalog for Cursor and activates `cursor_activate_skill`; Cursor sees `pi__cursor_activate_skill` and should call it with a listed skill name before applying that skill. The activation result returns the full `SKILL.md`, the skill directory for relative paths, and a bounded list of bundled `scripts/`, `references/`, and `assets/` files without eagerly reading those resources.
33
+ `pi-cursor-sdk` registers `cursor_ask_question` for Cursor models when the bridge is on and `PI_CURSOR_ASK_QUESTION=1`; Cursor sees `pi__cursor_ask_question`. The tool is sequential and emits `pi-cursor-sdk:ask-question:blocked` `{ active }` while awaiting UI input. It is off by default so Cursor proceeds with a stated assumption instead of prompting. Pending bridged calls use a local deadline capped by the effective MCP tool timeout; `PI_CURSOR_PI_BRIDGE_CALL_TIMEOUT_MS` can lower it. When pi has visible Agent Skills loaded, the extension also rewrites pi's skill catalog for Cursor and activates `cursor_activate_skill`; Cursor sees `pi__cursor_activate_skill` and should call it with a listed skill name before applying that skill. The activation result returns the full `SKILL.md`, the skill directory for relative paths, and a bounded list of bundled `scripts/`, `references/`, and `assets/` files without eagerly reading those resources.
34
34
 
35
35
  ```bash
36
- # Disable only Cursor's interactive question tool
37
- PI_CURSOR_ASK_QUESTION=0 pi --model cursor/grok-4.6
36
+ # Enable Cursor's interactive question tool
37
+ PI_CURSOR_ASK_QUESTION=1 pi --model cursor/grok-4.6
38
38
 
39
39
  # Disable pi bridge entirely
40
40
  PI_CURSOR_PI_TOOL_BRIDGE=0 pi --model cursor/grok-4.6
@@ -79,7 +79,7 @@ To reproduce a **minimal** surface (pi-cursor-sdk + Cursor host only), use exten
79
79
  | ID prefix | Meaning |
80
80
  | --- | --- |
81
81
  | `cursor-replay-*` | Display-only replay of Cursor SDK activity |
82
- | `cursor-pi-bridge-run-*` | Live pi execution via bridge |
82
+ | `cursor-pi-bridge-run-*` (run) / `cursor-pi-bridge-<32 hex>-t<counter>` (tool) | Live pi execution via bridge |
83
83
 
84
84
  Example mistake: treating `cursor-replay-…` as a tool to invoke. Replay never re-runs work.
85
85
 
@@ -1,6 +1,6 @@
1
1
  # Platform Smoke Implementation Reference
2
2
 
3
- Back to the canonical [Platform Smoke Gate runbook](./platform-smoke.md) for release commands, required targets and suites, artifacts, assertions, security, and the release bar.
3
+ Back to the canonical [Platform Smoke runbook](./platform-smoke.md) for cost-conscious verification, focused suite selection, optional comprehensive targets/suites, artifacts, assertions, security, and the release bar. Offline/faux checks and exact-input retained evidence come first; only necessary changed-behavior proof warrants the smallest live check on one representative environment. No paid Cloud testing for generic PRs/releases; only explicitly Cursor Cloud-focused PRs/issues may select a necessary focused Cloud check. Automated Cursor PR reviews continue unchanged.
4
4
 
5
5
  This document records detailed detector, registry, command-rendering, implementation-history, replacement, and portability material. The phase plan is retained as implementation history, not as active release instructions.
6
6
 
@@ -18,13 +18,15 @@ Required behavior:
18
18
  - fail when a card/evidence item has the wrong success/error state;
19
19
  - fail when footer/status is missing or unreadable.
20
20
 
21
- The plain-text card inventory uses Node's `stripVTControlCharacters` on the complete captured ANSI stream. OSC-8 hyperlinks may use either BEL or ST (ESC followed by a backslash) terminators, and a PTY chunk may split either sequence. Do not strip chunks independently or use a greedy OSC regex: that can consume the visible `package.json` label, successful read content, or subsequent cards even when xterm renders them correctly. Raw ANSI remains unchanged for independent xterm/PNG rendering and secret scanning; exact card patterns and JSONL success/error assertions still apply. `test/fixtures/platform-read-hyperlinks.json` retains minimal native/bridge headers from real captures with only the local hyperlink target anonymized.
21
+ The legacy card inventory and required-card assertions use the same rendered xterm buffer lines already collected for visual evidence and screenshots. Raw ANSI stripping cannot reconstruct cursor movement, line erasure, or redraws; `terminal.txt` remains raw diagnostic text, not card evidence. Raw ANSI remains unchanged for xterm/PNG rendering and secret scanning; exact card patterns, wrapped-line matching, and JSONL success/error assertions still apply. `test/fixtures/platform-read-hyperlinks.json` retains minimal native/bridge OSC-8 headers from real captures with only the local hyperlink target anonymized.
22
+
23
+ Run the host renderer regression with `node --test test/platform-smoke-rendered-cards.test.mjs`. It requires the host Playwright Chromium checked by platform doctor and fails, rather than skips, if rendering is unavailable. Default `npm test` does not require a guest/CI browser install; the full platform gate still requires doctor and live rendered-card evidence.
22
24
 
23
25
  Meaningful gap closed: earlier card assertions could pass when the prompt mentioned `pi__read` or a missing-file path even if the actual tool card/result never rendered. The gate now requires JSONL result evidence and per-evidence rendered screenshots for native read, native shell success/failure, native edit diffs, bridge read success/failure, and bridge shell success.
24
26
 
25
27
  ## Registry visual classification
26
28
 
27
- The implementation must classify every `CURSOR_TOOL_PRESENTATION_SPECS` entry from `src/cursor-tool-presentation-registry.ts` as required or excluded for the release visual gate. A validation check fails when a registry entry lacks classification.
29
+ The implementation must classify every `CURSOR_TOOL_PRESENTATION_SPECS` entry from `src/cursor-tool-presentation-registry.ts` as required or excluded for the optional comprehensive visual matrix. A validation check fails when a registry entry lacks classification.
28
30
 
29
31
  Required deterministic cards:
30
32
 
@@ -176,8 +178,10 @@ Update:
176
178
 
177
179
  They must state:
178
180
 
179
- - required local release gate is `npm run smoke:platform:all`;
180
- - cloud-runtime changes additionally require `npm run smoke:cloud`;
181
+ - offline/faux checks and exact-input retained proof come first; new live proof is limited to the smallest meaningful changed-behavior check on one representative environment;
182
+ - `npm run smoke:platform:all` is an optional comprehensive matrix, not an unconditional commit/release gate;
183
+ - no paid Cloud testing for generic PRs/releases; only explicitly Cursor Cloud-focused PRs/issues may select necessary focused Cloud proof, with unchanged run/evidence and cleanup contracts;
184
+ - no full paid campaign replay, matrix-only host coverage, or automatic paid retries; automated Cursor PR reviews continue unchanged;
181
185
  - legacy smoke scripts are inner-loop/debug helpers;
182
186
  - `tmux` visual smoke is not the canonical cross-platform gate.
183
187
 
@@ -195,7 +199,7 @@ Replace or redesign this platform runner if any of these become true:
195
199
  - The full gate exceeds the fixed Cursor invocation budget.
196
200
  - Node 24 + `node-pty` cannot be made reliable on Windows native.
197
201
 
198
- If the gate is replaced, document the new cross-platform release process before removing this one. Existing local smoke scripts remain inner-loop/debug helpers, not release gates.
202
+ If the runner is replaced, document the new verification process before removing it. Keep offline cross-platform contracts and selected-suite evidence fidelity; the comprehensive paid matrix is optional, not a default ship step.
199
203
 
200
204
  ## Portability to other pi extensions
201
205