@rangojs/router 0.5.1 → 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 (448) hide show
  1. package/README.md +5 -1
  2. package/dist/types/browser/event-controller.d.ts +6 -0
  3. package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
  4. package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
  5. package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
  6. package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
  7. package/dist/types/handles/is-thenable.d.ts +2 -4
  8. package/dist/types/rsc/helpers.d.ts +3 -0
  9. package/dist/types/rsc/render-pipeline.d.ts +9 -0
  10. package/dist/types/rsc/routine-plan.d.ts +124 -0
  11. package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
  12. package/dist/types/server/request-context.d.ts +4 -1
  13. package/dist/types/vite/encryption-key.d.ts +2 -0
  14. package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
  15. package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
  16. package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
  17. package/dist/types/vite/utils/shared-utils.d.ts +12 -0
  18. package/dist/vite/index.js +154 -57
  19. package/package.json +3 -3
  20. package/skills/caching/SKILL.md +1 -1
  21. package/skills/mime-routes/SKILL.md +3 -1
  22. package/skills/response-routes/SKILL.md +4 -2
  23. package/skills/typesafety/generated-files-and-cli.md +16 -9
  24. package/skills/typesafety/route-types.md +5 -1
  25. package/skills/use-cache/SKILL.md +47 -0
  26. package/src/browser/event-controller.ts +40 -15
  27. package/src/browser/partial-update.ts +26 -11
  28. package/src/browser/react/NavigationProvider.tsx +7 -0
  29. package/src/cache/cache-runtime.ts +89 -15
  30. package/src/cache/cf/cf-cache-constants.ts +8 -1
  31. package/src/cache/cf/cf-cache-store.ts +41 -64
  32. package/src/cache/cf/cf-cache-types.ts +1 -1
  33. package/src/cache/cf/cf-kv-utils.ts +38 -0
  34. package/src/cache/segment-codec.ts +21 -5
  35. package/src/handles/is-thenable.ts +2 -4
  36. package/src/router/match-middleware/cache-lookup.ts +24 -15
  37. package/src/rsc/handler.ts +26 -5
  38. package/src/rsc/helpers.ts +13 -0
  39. package/src/rsc/progressive-enhancement.ts +247 -70
  40. package/src/rsc/render-pipeline.ts +68 -24
  41. package/src/rsc/routine-plan.ts +359 -0
  42. package/src/rsc/rsc-rendering.ts +555 -302
  43. package/src/rsc/server-action.ts +180 -71
  44. package/src/rsc/shell-capture-constants.ts +18 -0
  45. package/src/rsc/shell-capture.ts +92 -21
  46. package/src/server/request-context.ts +6 -0
  47. package/src/ssr/ssr-root.tsx +1 -0
  48. package/src/vite/encryption-key.ts +29 -0
  49. package/src/vite/plugins/expose-action-id.ts +2 -2
  50. package/src/vite/plugins/expose-internal-ids.ts +46 -0
  51. package/src/vite/plugins/server-ref-hashing.ts +74 -0
  52. package/src/vite/plugins/server-reference-pattern.ts +10 -0
  53. package/src/vite/rango.ts +9 -0
  54. package/src/vite/router-discovery.ts +21 -2
  55. package/src/vite/utils/shared-utils.ts +12 -7
  56. package/dist/types.backup/__internal.d.ts +0 -127
  57. package/dist/types.backup/bin/rango.d.ts +0 -1
  58. package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
  59. package/dist/types.backup/browser/action-fence.d.ts +0 -33
  60. package/dist/types.backup/browser/app-shell.d.ts +0 -34
  61. package/dist/types.backup/browser/app-version.d.ts +0 -6
  62. package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
  63. package/dist/types.backup/browser/cookie-name.d.ts +0 -66
  64. package/dist/types.backup/browser/event-controller.d.ts +0 -221
  65. package/dist/types.backup/browser/history-state.d.ts +0 -26
  66. package/dist/types.backup/browser/index.d.ts +0 -1
  67. package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
  68. package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
  69. package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
  70. package/dist/types.backup/browser/logging.d.ts +0 -33
  71. package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
  72. package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
  73. package/dist/types.backup/browser/navigation-client.d.ts +0 -17
  74. package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
  75. package/dist/types.backup/browser/navigation-store.d.ts +0 -95
  76. package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
  77. package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
  78. package/dist/types.backup/browser/partial-update.d.ts +0 -61
  79. package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
  80. package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
  81. package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
  82. package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
  83. package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
  84. package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
  85. package/dist/types.backup/browser/rango-state.d.ts +0 -52
  86. package/dist/types.backup/browser/react/Link.d.ts +0 -140
  87. package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
  88. package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
  89. package/dist/types.backup/browser/react/context.d.ts +0 -54
  90. package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
  91. package/dist/types.backup/browser/react/index.d.ts +0 -1
  92. package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
  93. package/dist/types.backup/browser/react/location-state.d.ts +0 -29
  94. package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
  95. package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
  96. package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
  97. package/dist/types.backup/browser/react/use-action.d.ts +0 -61
  98. package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
  99. package/dist/types.backup/browser/react/use-href.d.ts +0 -32
  100. package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
  101. package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
  102. package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
  103. package/dist/types.backup/browser/react/use-params.d.ts +0 -21
  104. package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
  105. package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
  106. package/dist/types.backup/browser/react/use-router.d.ts +0 -23
  107. package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
  108. package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
  109. package/dist/types.backup/browser/response-adapter.d.ts +0 -58
  110. package/dist/types.backup/browser/rsc-router.d.ts +0 -141
  111. package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
  112. package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
  113. package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
  114. package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
  115. package/dist/types.backup/browser/types.d.ts +0 -530
  116. package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
  117. package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
  118. package/dist/types.backup/build/generate-manifest.d.ts +0 -100
  119. package/dist/types.backup/build/generate-route-types.d.ts +0 -8
  120. package/dist/types.backup/build/index.d.ts +0 -21
  121. package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
  122. package/dist/types.backup/build/route-trie.d.ts +0 -89
  123. package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
  124. package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
  125. package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
  126. package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
  127. package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
  128. package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
  129. package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
  130. package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
  131. package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
  132. package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
  133. package/dist/types.backup/cache/background-task.d.ts +0 -21
  134. package/dist/types.backup/cache/cache-error.d.ts +0 -71
  135. package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
  136. package/dist/types.backup/cache/cache-policy.d.ts +0 -59
  137. package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
  138. package/dist/types.backup/cache/cache-scope.d.ts +0 -134
  139. package/dist/types.backup/cache/cache-tag.d.ts +0 -79
  140. package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
  141. package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
  142. package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
  143. package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
  144. package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
  145. package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
  146. package/dist/types.backup/cache/cf/index.d.ts +0 -3
  147. package/dist/types.backup/cache/document-cache.d.ts +0 -69
  148. package/dist/types.backup/cache/handle-capture.d.ts +0 -23
  149. package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
  150. package/dist/types.backup/cache/index.d.ts +0 -7
  151. package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
  152. package/dist/types.backup/cache/profile-registry.d.ts +0 -40
  153. package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
  154. package/dist/types.backup/cache/segment-codec.d.ts +0 -78
  155. package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
  156. package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
  157. package/dist/types.backup/cache/taint.d.ts +0 -71
  158. package/dist/types.backup/cache/types.d.ts +0 -407
  159. package/dist/types.backup/cache/vercel/index.d.ts +0 -1
  160. package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
  161. package/dist/types.backup/client.d.ts +0 -184
  162. package/dist/types.backup/client.rsc.d.ts +0 -39
  163. package/dist/types.backup/cloudflare/index.d.ts +0 -7
  164. package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
  165. package/dist/types.backup/component-utils.d.ts +0 -46
  166. package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
  167. package/dist/types.backup/context-var.d.ts +0 -84
  168. package/dist/types.backup/debug.d.ts +0 -57
  169. package/dist/types.backup/decode-loader-results.d.ts +0 -5
  170. package/dist/types.backup/default-error-boundary.d.ts +0 -10
  171. package/dist/types.backup/defer.d.ts +0 -89
  172. package/dist/types.backup/deps/browser.d.ts +0 -1
  173. package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
  174. package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
  175. package/dist/types.backup/deps/rsc.d.ts +0 -1
  176. package/dist/types.backup/deps/ssr.d.ts +0 -1
  177. package/dist/types.backup/encode-kv.d.ts +0 -35
  178. package/dist/types.backup/errors.d.ts +0 -226
  179. package/dist/types.backup/escape-script.d.ts +0 -44
  180. package/dist/types.backup/handle.d.ts +0 -93
  181. package/dist/types.backup/handles/MetaTags.d.ts +0 -17
  182. package/dist/types.backup/handles/Scripts.d.ts +0 -38
  183. package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
  184. package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
  185. package/dist/types.backup/handles/is-thenable.d.ts +0 -12
  186. package/dist/types.backup/handles/meta.d.ts +0 -43
  187. package/dist/types.backup/handles/script.d.ts +0 -139
  188. package/dist/types.backup/host/cookie-handler.d.ts +0 -8
  189. package/dist/types.backup/host/errors.d.ts +0 -40
  190. package/dist/types.backup/host/index.d.ts +0 -33
  191. package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
  192. package/dist/types.backup/host/router.d.ts +0 -12
  193. package/dist/types.backup/host/testing.d.ts +0 -41
  194. package/dist/types.backup/host/types.d.ts +0 -148
  195. package/dist/types.backup/host/utils.d.ts +0 -20
  196. package/dist/types.backup/href-client.d.ts +0 -214
  197. package/dist/types.backup/index.d.ts +0 -112
  198. package/dist/types.backup/index.rsc.d.ts +0 -51
  199. package/dist/types.backup/internal-debug.d.ts +0 -1
  200. package/dist/types.backup/loader-store.d.ts +0 -193
  201. package/dist/types.backup/loader.d.ts +0 -18
  202. package/dist/types.backup/loader.rsc.d.ts +0 -18
  203. package/dist/types.backup/missing-id-error.d.ts +0 -1
  204. package/dist/types.backup/outlet-context.d.ts +0 -12
  205. package/dist/types.backup/outlet-provider.d.ts +0 -12
  206. package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
  207. package/dist/types.backup/prerender/param-hash.d.ts +0 -6
  208. package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
  209. package/dist/types.backup/prerender/store.d.ts +0 -62
  210. package/dist/types.backup/prerender.d.ts +0 -292
  211. package/dist/types.backup/redirect-origin.d.ts +0 -55
  212. package/dist/types.backup/regex-escape.d.ts +0 -6
  213. package/dist/types.backup/render-error-thrower.d.ts +0 -13
  214. package/dist/types.backup/response-utils.d.ts +0 -35
  215. package/dist/types.backup/reverse.d.ts +0 -206
  216. package/dist/types.backup/root-error-boundary.d.ts +0 -32
  217. package/dist/types.backup/route-content-wrapper.d.ts +0 -40
  218. package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
  219. package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
  220. package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
  221. package/dist/types.backup/route-definition/index.d.ts +0 -7
  222. package/dist/types.backup/route-definition/redirect.d.ts +0 -48
  223. package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
  224. package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
  225. package/dist/types.backup/route-definition.d.ts +0 -1
  226. package/dist/types.backup/route-map-builder.d.ts +0 -127
  227. package/dist/types.backup/route-name.d.ts +0 -27
  228. package/dist/types.backup/route-types.d.ts +0 -172
  229. package/dist/types.backup/router/basename.d.ts +0 -10
  230. package/dist/types.backup/router/content-negotiation.d.ts +0 -91
  231. package/dist/types.backup/router/debug-manifest.d.ts +0 -7
  232. package/dist/types.backup/router/error-handling.d.ts +0 -76
  233. package/dist/types.backup/router/find-match.d.ts +0 -19
  234. package/dist/types.backup/router/handler-context.d.ts +0 -41
  235. package/dist/types.backup/router/instrument.d.ts +0 -161
  236. package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
  237. package/dist/types.backup/router/lazy-includes.d.ts +0 -26
  238. package/dist/types.backup/router/loader-resolution.d.ts +0 -63
  239. package/dist/types.backup/router/logging.d.ts +0 -41
  240. package/dist/types.backup/router/manifest.d.ts +0 -8
  241. package/dist/types.backup/router/match-api.d.ts +0 -19
  242. package/dist/types.backup/router/match-context.d.ts +0 -184
  243. package/dist/types.backup/router/match-handlers.d.ts +0 -49
  244. package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
  245. package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
  246. package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
  247. package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
  248. package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
  249. package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
  250. package/dist/types.backup/router/match-pipelines.d.ts +0 -103
  251. package/dist/types.backup/router/match-result.d.ts +0 -114
  252. package/dist/types.backup/router/metrics.d.ts +0 -6
  253. package/dist/types.backup/router/middleware-types.d.ts +0 -74
  254. package/dist/types.backup/router/middleware.d.ts +0 -116
  255. package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
  256. package/dist/types.backup/router/params-util.d.ts +0 -8
  257. package/dist/types.backup/router/parse-pattern.d.ts +0 -38
  258. package/dist/types.backup/router/pattern-matching.d.ts +0 -169
  259. package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
  260. package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
  261. package/dist/types.backup/router/prerender-match.d.ts +0 -50
  262. package/dist/types.backup/router/preview-match.d.ts +0 -22
  263. package/dist/types.backup/router/request-classification.d.ts +0 -104
  264. package/dist/types.backup/router/revalidation.d.ts +0 -57
  265. package/dist/types.backup/router/route-snapshot.d.ts +0 -112
  266. package/dist/types.backup/router/router-context.d.ts +0 -137
  267. package/dist/types.backup/router/router-interfaces.d.ts +0 -432
  268. package/dist/types.backup/router/router-options.d.ts +0 -738
  269. package/dist/types.backup/router/router-registry.d.ts +0 -15
  270. package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
  271. package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
  272. package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
  273. package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
  274. package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
  275. package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
  276. package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
  277. package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
  278. package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
  279. package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
  280. package/dist/types.backup/router/segment-resolution.d.ts +0 -3
  281. package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
  282. package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
  283. package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
  284. package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
  285. package/dist/types.backup/router/telemetry.d.ts +0 -215
  286. package/dist/types.backup/router/timeout.d.ts +0 -68
  287. package/dist/types.backup/router/tracing.d.ts +0 -125
  288. package/dist/types.backup/router/trie-matching.d.ts +0 -32
  289. package/dist/types.backup/router/types.d.ts +0 -98
  290. package/dist/types.backup/router/url-params.d.ts +0 -26
  291. package/dist/types.backup/router.d.ts +0 -7
  292. package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
  293. package/dist/types.backup/rsc/full-payload.d.ts +0 -22
  294. package/dist/types.backup/rsc/handler-context.d.ts +0 -31
  295. package/dist/types.backup/rsc/handler.d.ts +0 -9
  296. package/dist/types.backup/rsc/helpers.d.ts +0 -213
  297. package/dist/types.backup/rsc/index.d.ts +0 -17
  298. package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
  299. package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
  300. package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
  301. package/dist/types.backup/rsc/nonce.d.ts +0 -28
  302. package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
  303. package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
  304. package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
  305. package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
  306. package/dist/types.backup/rsc/response-error.d.ts +0 -19
  307. package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
  308. package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
  309. package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
  310. package/dist/types.backup/rsc/server-action.d.ts +0 -68
  311. package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
  312. package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
  313. package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
  314. package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
  315. package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
  316. package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
  317. package/dist/types.backup/rsc/types.d.ts +0 -290
  318. package/dist/types.backup/runtime-env.d.ts +0 -1
  319. package/dist/types.backup/search-params.d.ts +0 -125
  320. package/dist/types.backup/segment-content-promise.d.ts +0 -13
  321. package/dist/types.backup/segment-fragments.d.ts +0 -56
  322. package/dist/types.backup/segment-loader-promise.d.ts +0 -22
  323. package/dist/types.backup/segment-system.d.ts +0 -84
  324. package/dist/types.backup/serialize.d.ts +0 -164
  325. package/dist/types.backup/server/context.d.ts +0 -494
  326. package/dist/types.backup/server/cookie-parse.d.ts +0 -10
  327. package/dist/types.backup/server/cookie-store.d.ts +0 -107
  328. package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
  329. package/dist/types.backup/server/handle-store.d.ts +0 -100
  330. package/dist/types.backup/server/loader-registry.d.ts +0 -32
  331. package/dist/types.backup/server/request-context.d.ts +0 -596
  332. package/dist/types.backup/server/root-layout.d.ts +0 -3
  333. package/dist/types.backup/server.d.ts +0 -15
  334. package/dist/types.backup/ssr/index.d.ts +0 -233
  335. package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
  336. package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
  337. package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
  338. package/dist/types.backup/static-handler.d.ts +0 -57
  339. package/dist/types.backup/testing/cache-status.d.ts +0 -63
  340. package/dist/types.backup/testing/collect-handle.d.ts +0 -20
  341. package/dist/types.backup/testing/dispatch.d.ts +0 -123
  342. package/dist/types.backup/testing/dom.entry.d.ts +0 -15
  343. package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
  344. package/dist/types.backup/testing/e2e/index.d.ts +0 -30
  345. package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
  346. package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
  347. package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
  348. package/dist/types.backup/testing/e2e/server.d.ts +0 -35
  349. package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
  350. package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
  351. package/dist/types.backup/testing/flight-tree.d.ts +0 -192
  352. package/dist/types.backup/testing/flight.d.ts +0 -115
  353. package/dist/types.backup/testing/flight.entry.d.ts +0 -27
  354. package/dist/types.backup/testing/generated-routes.d.ts +0 -66
  355. package/dist/types.backup/testing/index.d.ts +0 -52
  356. package/dist/types.backup/testing/internal/context.d.ts +0 -225
  357. package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
  358. package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
  359. package/dist/types.backup/testing/render-handler.d.ts +0 -160
  360. package/dist/types.backup/testing/render-route.d.ts +0 -246
  361. package/dist/types.backup/testing/run-loader.d.ts +0 -186
  362. package/dist/types.backup/testing/run-middleware.d.ts +0 -132
  363. package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
  364. package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
  365. package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
  366. package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
  367. package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
  368. package/dist/types.backup/testing/vitest.d.ts +0 -205
  369. package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
  370. package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
  371. package/dist/types.backup/theme/constants.d.ts +0 -39
  372. package/dist/types.backup/theme/index.d.ts +0 -29
  373. package/dist/types.backup/theme/theme-context.d.ts +0 -21
  374. package/dist/types.backup/theme/theme-script.d.ts +0 -26
  375. package/dist/types.backup/theme/types.d.ts +0 -162
  376. package/dist/types.backup/theme/use-theme.d.ts +0 -8
  377. package/dist/types.backup/types/boundaries.d.ts +0 -93
  378. package/dist/types.backup/types/cache-types.d.ts +0 -191
  379. package/dist/types.backup/types/error-types.d.ts +0 -114
  380. package/dist/types.backup/types/global-namespace.d.ts +0 -90
  381. package/dist/types.backup/types/handler-context.d.ts +0 -658
  382. package/dist/types.backup/types/index.d.ts +0 -11
  383. package/dist/types.backup/types/loader-types.d.ts +0 -182
  384. package/dist/types.backup/types/request-scope.d.ts +0 -93
  385. package/dist/types.backup/types/route-config.d.ts +0 -105
  386. package/dist/types.backup/types/route-entry.d.ts +0 -95
  387. package/dist/types.backup/types/segments.d.ts +0 -234
  388. package/dist/types.backup/types.d.ts +0 -1
  389. package/dist/types.backup/urls/include-helper.d.ts +0 -17
  390. package/dist/types.backup/urls/include-provider.d.ts +0 -27
  391. package/dist/types.backup/urls/index.d.ts +0 -6
  392. package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
  393. package/dist/types.backup/urls/path-helper.d.ts +0 -12
  394. package/dist/types.backup/urls/pattern-types.d.ts +0 -166
  395. package/dist/types.backup/urls/response-types.d.ts +0 -67
  396. package/dist/types.backup/urls/type-extraction.d.ts +0 -157
  397. package/dist/types.backup/urls/urls-function.d.ts +0 -24
  398. package/dist/types.backup/urls.d.ts +0 -1
  399. package/dist/types.backup/use-loader.d.ts +0 -150
  400. package/dist/types.backup/vercel/index.d.ts +0 -10
  401. package/dist/types.backup/vercel/tracing.d.ts +0 -70
  402. package/dist/types.backup/vite/debug.d.ts +0 -80
  403. package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
  404. package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
  405. package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
  406. package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
  407. package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
  408. package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
  409. package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
  410. package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
  411. package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
  412. package/dist/types.backup/vite/discovery/state.d.ts +0 -162
  413. package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
  414. package/dist/types.backup/vite/index.d.ts +0 -11
  415. package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
  416. package/dist/types.backup/vite/plugin-types.d.ts +0 -298
  417. package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
  418. package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
  419. package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
  420. package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
  421. package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
  422. package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
  423. package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
  424. package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
  425. package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
  426. package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
  427. package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
  428. package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
  429. package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
  430. package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
  431. package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
  432. package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
  433. package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
  434. package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
  435. package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
  436. package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
  437. package/dist/types.backup/vite/rango.d.ts +0 -29
  438. package/dist/types.backup/vite/router-discovery.d.ts +0 -23
  439. package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
  440. package/dist/types.backup/vite/utils/banner.d.ts +0 -2
  441. package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
  442. package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
  443. package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
  444. package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
  445. package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
  446. package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
  447. package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
  448. package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
@@ -7,6 +7,7 @@ import type { RenderMode, RenderPhase } from "../router/timeout.js";
7
7
  import type { HandlerContext } from "./handler-context.js";
8
8
  import { createResponseWithMergedHeaders } from "./helpers.js";
9
9
  import type { RscPayload } from "./types.js";
10
+ import type { RoutineTrace, RoutineTraceEntry } from "./routine-plan.js";
10
11
 
11
12
  // Canonical unions live in router/timeout.ts (the dependency-free leaf); these
12
13
  // aliases keep the render-pipeline names stable for existing importers.
@@ -191,6 +192,34 @@ function expectCommandResult(
191
192
  return result.value;
192
193
  }
193
194
 
195
+ /**
196
+ * Step helpers: each yields one command and returns its narrowed result, so a
197
+ * plan body reads imperatively while the yielded value stays the plain command
198
+ * the driver interprets (yield-before-execute, exact identity — see
199
+ * docs/design/render-stage-driver.md).
200
+ */
201
+ function* flightStep<TEnv>(
202
+ execute: () => RscFlightStage,
203
+ recordSerializeMetric: boolean,
204
+ ): Generator<RscRenderCommand<TEnv>, RscFlightStage, RscRenderCommandResult> {
205
+ return expectCommandResult(
206
+ yield { type: "flight", execute, recordSerializeMetric },
207
+ "flight",
208
+ );
209
+ }
210
+
211
+ function* htmlStep<TEnv>(
212
+ prepare: () => RscPreparedHtmlRender | Promise<RscPreparedHtmlRender>,
213
+ ): Generator<RscRenderCommand<TEnv>, RscHtmlResult, RscRenderCommandResult> {
214
+ return expectCommandResult(yield { type: "html", prepare }, "html");
215
+ }
216
+
217
+ function* responseStep<TEnv>(
218
+ execute: () => Response,
219
+ ): Generator<RscRenderCommand<TEnv>, Response, RscRenderCommandResult> {
220
+ return expectCommandResult(yield { type: "response", execute }, "response");
221
+ }
222
+
194
223
  /**
195
224
  * Describe the foreground response-construction work without executing it.
196
225
  * Each command is yielded before its work starts; the driver owns execution,
@@ -200,36 +229,24 @@ export function* createRscRenderPlan<TEnv>(
200
229
  input: RscRenderInput<TEnv>,
201
230
  options: RscRenderOptions = {},
202
231
  ): RscRenderPlan<TEnv> {
203
- const flight = expectCommandResult(
204
- yield {
205
- type: "flight",
206
- recordSerializeMetric: input.recordSerializeMetric ?? true,
207
- execute: () => createFlightStage(input, input.init),
208
- },
209
- "flight",
232
+ const flight = yield* flightStep<TEnv>(
233
+ () => createFlightStage(input, input.init),
234
+ input.recordSerializeMetric ?? true,
210
235
  );
211
236
 
212
- let body: BodyInit | null = flight.stream;
213
- let init = input.init;
214
-
215
237
  if (options.html) {
216
- const html = expectCommandResult(
217
- yield {
218
- type: "html",
219
- prepare: () => options.html!(flight),
220
- },
221
- "html",
238
+ const html = options.html;
239
+ const page = yield* htmlStep<TEnv>(() => html(flight));
240
+ return yield* responseStep<TEnv>(() =>
241
+ createResponseWithMergedHeaders(page.body, {
242
+ ...input.init,
243
+ ...page.init,
244
+ }),
222
245
  );
223
- body = html.body;
224
- init = { ...init, ...html.init };
225
246
  }
226
247
 
227
- return expectCommandResult(
228
- yield {
229
- type: "response",
230
- execute: () => createResponseWithMergedHeaders(body, init),
231
- },
232
- "response",
248
+ return yield* responseStep<TEnv>(() =>
249
+ createResponseWithMergedHeaders(flight.stream, input.init),
233
250
  );
234
251
  }
235
252
 
@@ -546,6 +563,33 @@ export function renderRscFlightStage<TEnv>(
546
563
  }
547
564
  }
548
565
 
566
+ /**
567
+ * Feed this driver's stage events (flight/html/response) into a routine flow
568
+ * trace as child entries of the currently running plan step. Stages are
569
+ * strictly sequential, so one `current` slot suffices. Depth is captured at
570
+ * creation: the bridge is built while the caller's render step executes, so
571
+ * children sit one level under it.
572
+ */
573
+ export function createRenderStageTraceBridge(
574
+ trace: RoutineTrace,
575
+ ): (event: RscRenderStageEvent) => void {
576
+ const depth = trace.currentDepth() + 1;
577
+ let current: RoutineTraceEntry | undefined;
578
+ return (event) => {
579
+ if (event.type === "stage:start") {
580
+ current = trace.begin(event.context.phase, "step", depth);
581
+ return;
582
+ }
583
+ if (!current) return;
584
+ if (event.type === "stage:complete") {
585
+ trace.end(current);
586
+ } else {
587
+ trace.fail(current, event.error);
588
+ }
589
+ current = undefined;
590
+ };
591
+ }
592
+
549
593
  export function createRscStageDebugSink(
550
594
  log: (message: string, details?: Record<string, unknown>) => void = (
551
595
  message,
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Routine plans — the request-level extension of the render stage driver
3
+ * (docs/design/routine-plans.md; protocol lineage in render-stage-driver.md).
4
+ * A plan is a synchronous generator that EMITS instructions before their work
5
+ * runs; the runner is the only code that executes them. Two effect shapes:
6
+ *
7
+ * step(name, fn) — sequential work; the plan suspends until its result.
8
+ * handoff(name, fn) — background registration (waitUntil-shaped); completes
9
+ * at scheduling and returns nothing.
10
+ *
11
+ * Plans compose by level: `yield* scope(name, plan)` flattens a nested plan
12
+ * into the same instruction stream while the trace records the scope. Tracking
13
+ * is derived, not declared — "what is running" is the instruction in hand.
14
+ *
15
+ * Deliberate boundaries (see the design doc's "Not built yet, on purpose"):
16
+ * the runner opens no observability spans — effects own their own
17
+ * instrumentation, and the render driver keeps PHASES.ssr — and there is no
18
+ * plan.return abort/cleanup path; the render driver's cleanup rules are the
19
+ * template if a caller ever needs one.
20
+ */
21
+
22
+ import { isThenable } from "../handles/is-thenable.js";
23
+
24
+ export type RoutineEffectKind = "step" | "handoff";
25
+
26
+ export type RoutineCommand =
27
+ | { kind: "step"; name: string; execute: () => unknown }
28
+ | { kind: "handoff"; name: string; execute: () => unknown }
29
+ | { kind: "enter"; name: string }
30
+ | { kind: "exit"; outcome: "done" | "failed"; error?: unknown };
31
+
32
+ export type RoutineCommandResult =
33
+ | { kind: "step"; value: unknown }
34
+ | { kind: "handoff" }
35
+ | { kind: "enter" }
36
+ | { kind: "exit" };
37
+
38
+ /** One imperative step: yields a command, returns its typed result. */
39
+ export type RoutineStep<T> = Generator<RoutineCommand, T, RoutineCommandResult>;
40
+
41
+ /** A full plan is shaped like a step; the alias marks intent at call sites. */
42
+ export type RoutinePlan<TReturn> = RoutineStep<TReturn>;
43
+
44
+ function expectResultKind<K extends RoutineCommandResult["kind"]>(
45
+ result: RoutineCommandResult,
46
+ kind: K,
47
+ name: string,
48
+ ): Extract<RoutineCommandResult, { kind: K }> {
49
+ if (result.kind !== kind) {
50
+ throw new Error(
51
+ `[routine] step "${name}" expected ${kind} result, received ${result.kind}`,
52
+ );
53
+ }
54
+ return result as Extract<RoutineCommandResult, { kind: K }>;
55
+ }
56
+
57
+ /**
58
+ * Sequential work. The `as Awaited<T>` narrow is the trust boundary with the
59
+ * runner, which resumes with the exact value `execute` produced.
60
+ */
61
+ export function* step<T>(
62
+ name: string,
63
+ execute: () => T | Promise<T>,
64
+ ): RoutineStep<Awaited<T>> {
65
+ const result = yield { kind: "step", name, execute };
66
+ return expectResultKind(result, "step", name).value as Awaited<T>;
67
+ }
68
+
69
+ /**
70
+ * Background handoff: successful registration completes the foreground step.
71
+ * A synchronous registration failure is thrown back into the plan, matching a
72
+ * direct waitUntil/scheduler call. A returned promise settles in the background;
73
+ * its rejection marks the trace but never fails the foreground response.
74
+ *
75
+ * Settlement tracking follows the RETURNED value: a returned promise is
76
+ * observed until it settles; a scheduler that fires-and-forgets internally
77
+ * (e.g. scheduleShellCapture via runBackground) returns void, so its trace
78
+ * entry settles at the scheduling call, not at background completion. That is
79
+ * deliberate — the plan's contract ends at the handoff.
80
+ */
81
+ export function* handoff(
82
+ name: string,
83
+ execute: () => unknown,
84
+ ): RoutineStep<void> {
85
+ const result = yield { kind: "handoff", name, execute };
86
+ expectResultKind(result, "handoff", name);
87
+ }
88
+
89
+ /**
90
+ * Run a nested plan as a named scope. `yield*` flattens its instructions into
91
+ * the parent stream; enter/exit only inform the trace. The scope reports its
92
+ * terminal outcome after internal recovery has either succeeded or escaped.
93
+ */
94
+ export function* scope<TReturn>(
95
+ name: string,
96
+ plan: RoutinePlan<TReturn>,
97
+ ): RoutineStep<TReturn> {
98
+ yield { kind: "enter", name };
99
+ try {
100
+ const value = yield* plan;
101
+ assertSynchronousReturn(value);
102
+ yield { kind: "exit", outcome: "done" };
103
+ return value;
104
+ } catch (error) {
105
+ yield { kind: "exit", outcome: "failed", error };
106
+ throw error;
107
+ }
108
+ }
109
+
110
+ export interface RoutineTraceEntry {
111
+ name: string;
112
+ kind: RoutineEffectKind | "scope";
113
+ depth: number;
114
+ /** step/scope: running -> done|failed. handoff: pending -> settled|failed. */
115
+ state: "running" | "pending" | "done" | "settled" | "failed";
116
+ startedAt: number;
117
+ endedAt?: number;
118
+ settledAt?: number;
119
+ error?: unknown;
120
+ }
121
+
122
+ export interface RoutineTrace {
123
+ readonly name: string;
124
+ readonly entries: readonly RoutineTraceEntry[];
125
+ enterScope(name: string): void;
126
+ exitScope(outcome: "done" | "failed", error?: unknown): void;
127
+ /** Scope depth entries currently record at. Bridges (e.g. render stage
128
+ * events feeding child entries under a running step) capture this once and
129
+ * pass `depth + 1` explicitly. */
130
+ currentDepth(): number;
131
+ begin(
132
+ name: string,
133
+ kind: RoutineEffectKind,
134
+ depth?: number,
135
+ ): RoutineTraceEntry;
136
+ end(entry: RoutineTraceEntry): void;
137
+ fail(entry: RoutineTraceEntry, error: unknown): void;
138
+ settle(
139
+ entry: RoutineTraceEntry,
140
+ outcome: { status: "fulfilled" } | { status: "rejected"; error: unknown },
141
+ ): void;
142
+ /** Running scopes plus the foreground instruction currently in hand. */
143
+ active(): RoutineTraceEntry[];
144
+ format(): string;
145
+ formatActive(
146
+ entries?: readonly RoutineTraceEntry[],
147
+ activeAt?: number,
148
+ ): string;
149
+ }
150
+
151
+ export function createRoutineTrace(
152
+ name: string,
153
+ now: () => number = () => performance.now(),
154
+ ): RoutineTrace {
155
+ const entries: RoutineTraceEntry[] = [];
156
+ const scopes: RoutineTraceEntry[] = [];
157
+
158
+ const push = (
159
+ name: string,
160
+ kind: RoutineTraceEntry["kind"],
161
+ state: RoutineTraceEntry["state"],
162
+ depth: number = scopes.length,
163
+ ): RoutineTraceEntry => {
164
+ const entry: RoutineTraceEntry = {
165
+ name,
166
+ kind,
167
+ depth,
168
+ state,
169
+ startedAt: now(),
170
+ };
171
+ entries.push(entry);
172
+ return entry;
173
+ };
174
+
175
+ const active = (): RoutineTraceEntry[] =>
176
+ entries.filter((entry) => entry.state === "running");
177
+
178
+ return {
179
+ name,
180
+ entries,
181
+ enterScope(name) {
182
+ scopes.push(push(name, "scope", "running"));
183
+ },
184
+ exitScope(outcome, error) {
185
+ const scope = scopes.pop();
186
+ if (scope) {
187
+ scope.state = outcome;
188
+ scope.endedAt = now();
189
+ if (outcome === "failed") scope.error = error;
190
+ }
191
+ },
192
+ currentDepth() {
193
+ return scopes.length;
194
+ },
195
+ begin(name, kind, depth) {
196
+ return push(name, kind, kind === "step" ? "running" : "pending", depth);
197
+ },
198
+ end(entry) {
199
+ entry.state = "done";
200
+ entry.endedAt = now();
201
+ },
202
+ fail(entry, error) {
203
+ entry.state = "failed";
204
+ entry.endedAt = now();
205
+ entry.error = error;
206
+ },
207
+ settle(entry, outcome) {
208
+ entry.settledAt = now();
209
+ if (outcome.status === "fulfilled") {
210
+ entry.state = "settled";
211
+ } else {
212
+ entry.state = "failed";
213
+ entry.error = outcome.error;
214
+ }
215
+ },
216
+ active,
217
+ format() {
218
+ return entries
219
+ .map((entry) => {
220
+ const indent = " ".repeat(entry.depth);
221
+ const duration =
222
+ entry.endedAt !== undefined
223
+ ? ` ${(entry.endedAt - entry.startedAt).toFixed(1)}ms`
224
+ : "";
225
+ const settled =
226
+ entry.settledAt !== undefined
227
+ ? ` [${entry.state} +${(entry.settledAt - entry.startedAt).toFixed(1)}ms]`
228
+ : entry.state === "pending"
229
+ ? " [pending]"
230
+ : "";
231
+ const status =
232
+ entry.state === "failed" && entry.settledAt === undefined
233
+ ? " FAILED"
234
+ : "";
235
+ return `${indent}${entry.kind} ${entry.name}${duration}${settled}${status}`;
236
+ })
237
+ .join("\n");
238
+ },
239
+ formatActive(activeEntries = active(), activeAt = now()) {
240
+ return activeEntries
241
+ .map((entry) => {
242
+ const indent = " ".repeat(entry.depth);
243
+ const duration = (activeAt - entry.startedAt).toFixed(1);
244
+ return `${indent}${entry.kind} ${entry.name} ${duration}ms RUNNING`;
245
+ })
246
+ .join("\n");
247
+ },
248
+ };
249
+ }
250
+
251
+ export interface RoutineTraceOwner {
252
+ _activeRoutine?: RoutineTrace;
253
+ }
254
+
255
+ export interface RoutineRunnerOptions {
256
+ trace?: RoutineTrace;
257
+ owner?: RoutineTraceOwner;
258
+ }
259
+
260
+ function assertSynchronousReturn(value: unknown): void {
261
+ if (isThenable(value)) {
262
+ throw new Error(
263
+ "[routine] plans cannot return promises; await asynchronous work with step()",
264
+ );
265
+ }
266
+ }
267
+
268
+ function observeSettlement(
269
+ handle: Promise<unknown>,
270
+ trace: RoutineTrace | undefined,
271
+ entry: RoutineTraceEntry | undefined,
272
+ ): void {
273
+ // Attaching both callbacks marks the rejection handled on this branch, so a
274
+ // fire-and-forget failure never surfaces as an unhandled rejection.
275
+ handle.then(
276
+ () => {
277
+ if (trace && entry) trace.settle(entry, { status: "fulfilled" });
278
+ },
279
+ (error) => {
280
+ if (trace && entry) {
281
+ trace.settle(entry, { status: "rejected", error });
282
+ }
283
+ },
284
+ );
285
+ }
286
+
287
+ /**
288
+ * Interpret a plan. Invariants shared with driveRscRenderPlan: a command is
289
+ * observable before its work runs, `execute` runs exactly once, results and
290
+ * errors resume the plan with exact identity, and a plan-level try/catch
291
+ * around a step is the recovery mechanism.
292
+ */
293
+ export async function runRoutine<TReturn>(
294
+ plan: RoutinePlan<TReturn>,
295
+ options: RoutineRunnerOptions = {},
296
+ ): Promise<TReturn> {
297
+ const trace = options.trace;
298
+ const owner = options.owner;
299
+ const previousTrace = owner?._activeRoutine;
300
+ if (trace && owner) owner._activeRoutine = trace;
301
+
302
+ try {
303
+ let current = plan.next();
304
+ while (!current.done) {
305
+ const command = current.value;
306
+ switch (command.kind) {
307
+ case "enter": {
308
+ trace?.enterScope(command.name);
309
+ current = plan.next({ kind: "enter" });
310
+ break;
311
+ }
312
+ case "exit": {
313
+ trace?.exitScope(command.outcome, command.error);
314
+ current = plan.next({ kind: "exit" });
315
+ break;
316
+ }
317
+ case "step": {
318
+ const entry = trace?.begin(command.name, "step");
319
+ let value: unknown;
320
+ try {
321
+ value = await command.execute();
322
+ } catch (error) {
323
+ if (trace && entry) trace.fail(entry, error);
324
+ // Throw INTO the plan: a catching plan branches to recovery; an
325
+ // uncaught error propagates out of plan.throw with exact identity.
326
+ current = plan.throw(error);
327
+ break;
328
+ }
329
+ if (trace && entry) trace.end(entry);
330
+ current = plan.next({ kind: "step", value });
331
+ break;
332
+ }
333
+ case "handoff": {
334
+ const entry = trace?.begin(command.name, "handoff");
335
+ try {
336
+ const result = command.execute();
337
+ if (isThenable(result)) {
338
+ observeSettlement(Promise.resolve(result), trace, entry);
339
+ } else if (trace && entry) {
340
+ trace.settle(entry, { status: "fulfilled" });
341
+ }
342
+ } catch (error) {
343
+ if (trace && entry) trace.fail(entry, error);
344
+ current = plan.throw(error);
345
+ break;
346
+ }
347
+ current = plan.next({ kind: "handoff" });
348
+ break;
349
+ }
350
+ }
351
+ }
352
+ assertSynchronousReturn(current.value);
353
+ return current.value;
354
+ } finally {
355
+ if (trace && owner?._activeRoutine === trace) {
356
+ owner._activeRoutine = previousTrace;
357
+ }
358
+ }
359
+ }