@jimhoyd/urlcode 0.4.0-alpha.1 → 0.4.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/.claude/skills/urlcode-authoring/SKILL.md +36 -22
  2. package/.claude/skills/urlcode-operations/SKILL.md +16 -22
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CONTRIBUTING.md +20 -16
  5. package/README.md +83 -80
  6. package/ROADMAP.md +61 -331
  7. package/SECURITY.md +23 -8
  8. package/dist/BUILD-MANIFEST.json +42 -47
  9. package/dist/agents-guide.js +18 -18
  10. package/dist/build-static.js +136 -0
  11. package/dist/capabilities.js +85 -31
  12. package/dist/capability-query.js +0 -1
  13. package/dist/cli.js +24 -32
  14. package/dist/compliance-rules/baseline.js +2 -10
  15. package/dist/compliance-rules/privacy.js +5 -16
  16. package/dist/compliance-rules/shared.js +0 -2
  17. package/dist/compliance.js +6 -8
  18. package/dist/config.js +15 -8
  19. package/dist/context.js +9 -10
  20. package/dist/examples.js +2 -2
  21. package/dist/explain-cli.js +7 -5
  22. package/dist/explain.js +10 -5
  23. package/dist/extensions.js +61 -2
  24. package/dist/function-sources.js +34 -2
  25. package/dist/function-worker.js +3 -1
  26. package/dist/functions.js +84 -13
  27. package/dist/guest-api.js +29 -3
  28. package/dist/index.js +3 -6
  29. package/dist/manifest.js +11 -7
  30. package/dist/mcp-authoring.js +2 -2
  31. package/dist/mcp.js +1 -1
  32. package/dist/observability.js +1 -21
  33. package/dist/policies/cache.js +8 -3
  34. package/dist/policies.js +3 -1
  35. package/dist/policy.js +28 -9
  36. package/dist/prerender.js +4 -0
  37. package/dist/project-tests.js +3 -3
  38. package/dist/readiness.js +35 -9
  39. package/dist/route-diff.js +12 -5
  40. package/dist/router.js +5 -7
  41. package/dist/runtime.js +77 -58
  42. package/dist/sandbox.js +48 -0
  43. package/dist/scaffold.js +0 -0
  44. package/dist/scripts/operational-drills.js +12 -54
  45. package/dist/server.js +3 -29
  46. package/dist/tooling.js +1 -1
  47. package/dist/trusted-functions.js +210 -0
  48. package/dist/types/build-static.d.ts +43 -0
  49. package/dist/types/capabilities.d.ts +14 -5
  50. package/dist/types/compliance-rules/shared.d.ts +0 -2
  51. package/dist/types/compliance.d.ts +0 -3
  52. package/dist/types/config.d.ts +2 -1
  53. package/dist/types/context.d.ts +2 -1
  54. package/dist/types/examples.d.ts +1 -1
  55. package/dist/types/explain.d.ts +6 -0
  56. package/dist/types/extensions.d.ts +55 -0
  57. package/dist/types/function-sources.d.ts +4 -0
  58. package/dist/types/functions.d.ts +48 -5
  59. package/dist/types/guest-api.d.ts +1 -0
  60. package/dist/types/index.d.ts +3 -6
  61. package/dist/types/manifest.d.ts +5 -3
  62. package/dist/types/observability.d.ts +1 -14
  63. package/dist/types/project-tests.d.ts +1 -2
  64. package/dist/types/readiness.d.ts +12 -3
  65. package/dist/types/router.d.ts +2 -1
  66. package/dist/types/runtime.d.ts +0 -27
  67. package/dist/types/sandbox.d.ts +12 -0
  68. package/dist/types/scaffold.d.ts +0 -2
  69. package/dist/types/server.d.ts +1 -4
  70. package/dist/types/tooling.d.ts +3 -3
  71. package/dist/types/trusted-functions.d.ts +29 -0
  72. package/dist/types/types.d.ts +22 -8
  73. package/dist/types/verify-deployment.d.ts +2 -2
  74. package/dist/types.js +25 -5
  75. package/dist/typescript-authoring.js +67 -18
  76. package/dist/verify-deployment.js +3 -3
  77. package/docs/AI-AUTHORING.md +109 -10
  78. package/docs/ASSETS.md +2 -1
  79. package/docs/AUTH-BACKUP.md +32 -0
  80. package/docs/AWS.md +4 -4
  81. package/docs/BEST-PRACTICES.md +17 -8
  82. package/docs/CAPABILITIES.md +30 -17
  83. package/docs/CAPACITY.md +128 -31
  84. package/docs/CI-FOLLOWUP-2026-09-19.md +97 -0
  85. package/docs/CI-RELEASE-AUDIT-2026-09-19.md +322 -0
  86. package/docs/CI.md +8 -3
  87. package/docs/CLOUDFLARE.md +1 -2
  88. package/docs/CODEBASE-AUDIT-2026-09-20.md +278 -0
  89. package/docs/COMPLIANCE.md +6 -9
  90. package/docs/DEPLOYMENT-CHECKS.md +1 -1
  91. package/docs/DEVELOPMENT-PIPELINE.md +181 -0
  92. package/docs/EXTENSIONS.md +193 -11
  93. package/docs/FRAMEWORK.md +53 -33
  94. package/docs/FUNCTION-SECURITY.md +173 -32
  95. package/docs/INSTALL.md +0 -5
  96. package/docs/LOAD-TESTING.md +4 -4
  97. package/docs/LOCAL-DEVELOPMENT.md +3 -0
  98. package/docs/MIDDLEWARE.md +27 -16
  99. package/docs/MONITORING.md +2 -19
  100. package/docs/OBSERVABILITY.md +7 -16
  101. package/docs/OPEN-DECISIONS.md +184 -0
  102. package/docs/OPERATIONAL-PROOF.md +26 -30
  103. package/docs/OPERATIONS.md +23 -32
  104. package/docs/POLICIES.md +27 -8
  105. package/docs/PRERENDER.md +25 -13
  106. package/docs/PROJECT-DIRECTION.md +35 -10
  107. package/docs/READINESS.md +6 -2
  108. package/docs/README.md +20 -41
  109. package/docs/RELEASE-0.4.0-alpha.3.md +50 -0
  110. package/docs/RELEASE-READINESS.md +50 -30
  111. package/docs/RELEASE-SECURITY.md +72 -86
  112. package/docs/RESILIENCE.md +16 -15
  113. package/docs/ROUTING.md +7 -10
  114. package/docs/SANDBOX-REVIEW.md +19 -6
  115. package/docs/SCAFFOLDING.md +0 -2
  116. package/docs/SECURITY-AUDIT.md +42 -2
  117. package/docs/SPECIFICATION.md +63 -27
  118. package/docs/SPIKE-AI-FRAMEWORK-BENCHMARK.md +288 -0
  119. package/docs/SPIKE-BUSINESS-SUITE.md +16 -0
  120. package/docs/SPIKE-CORE-LAYERING.md +368 -0
  121. package/docs/SPIKE-DEFAULT-TRUST-MODEL.md +211 -0
  122. package/docs/SPIKE-LAMBDA-COMPILE.md +12 -2
  123. package/docs/STARTERS.md +1 -1
  124. package/docs/STATIC.md +105 -0
  125. package/docs/TOOLING.md +17 -12
  126. package/docs/TUNNELS.md +0 -3
  127. package/docs/TYPESCRIPT-AUTHORING.md +32 -12
  128. package/docs/TYPESCRIPT.md +25 -4
  129. package/docs/VERCEL.md +4 -5
  130. package/docs/VERSION-ALIGNMENT.md +46 -0
  131. package/docs/YAML-GUIDE.md +0 -3
  132. package/docs/YAML-REFERENCE.md +16 -6
  133. package/docs/archive/2026-09-19/EXTENSION-IMPLEMENTATION.md +68 -0
  134. package/docs/{MANAGEMENT-SECURITY.md → archive/2026-09-19/MANAGEMENT-SECURITY.md} +20 -0
  135. package/docs/{NEXT-PHASE-PLAN.md → archive/2026-09-19/NEXT-PHASE-PLAN.md} +26 -8
  136. package/docs/{NEXT-STEPS.md → archive/2026-09-19/NEXT-STEPS.md} +274 -43
  137. package/docs/archive/2026-09-19/OPEN-DECISIONS.md +277 -0
  138. package/docs/archive/2026-09-19/RELEASE-SECURITY.md +186 -0
  139. package/docs/archive/2026-09-19/ROADMAP.md +386 -0
  140. package/docs/{SPIKE-EXTENSION-MODEL.md → archive/2026-09-19/SPIKE-EXTENSION-MODEL.md} +12 -2
  141. package/docs/{SPIKE-EXTENSIONS.md → archive/2026-09-19/SPIKE-EXTENSIONS.md} +28 -12
  142. package/docs/archive/2026-09-19/SPIKE-MONOREPO.md +776 -0
  143. package/docs/{USABILITY-REVIEW.md → archive/2026-09-19/USABILITY-REVIEW.md} +18 -2
  144. package/docs/archive/README.md +27 -0
  145. package/docs/policies/agents.md +1 -1
  146. package/docs/policies/cache.md +13 -0
  147. package/docs/policies/compression.md +3 -2
  148. package/docs/policies/security.md +3 -2
  149. package/examples/assets/example.yaml +2 -2
  150. package/examples/aws/example.yaml +1 -1
  151. package/examples/cloudflare/example.yaml +1 -1
  152. package/examples/conditions/example.yaml +1 -1
  153. package/examples/cookbook/example.yaml +1 -1
  154. package/examples/cookbook/middleware/bucket.mjs +12 -2
  155. package/examples/cookbook/middleware/locale.mjs +7 -3
  156. package/examples/cookbook/route-index.json +1 -1
  157. package/examples/cookbook/routes/middleware.yaml +1 -1
  158. package/examples/egress/example.yaml +1 -1
  159. package/examples/extensions/example.yaml +1 -1
  160. package/examples/prerender/README.md +14 -6
  161. package/examples/prerender/example.yaml +1 -1
  162. package/examples/prerender/functions/page.mjs +4 -2
  163. package/examples/prerender/middleware/template.mjs +1 -1
  164. package/examples/prerender/prerender.mjs +1 -1
  165. package/examples/prerender/urlcode.yaml +8 -4
  166. package/examples/provider-conformance/example.yaml +1 -1
  167. package/examples/vercel/example.yaml +1 -1
  168. package/llms-full.txt +686 -239
  169. package/llms.txt +27 -15
  170. package/package.json +32 -5
  171. package/packaging/claude-plugin/.claude-plugin/plugin.json +2 -2
  172. package/packaging/claude-plugin/skills/urlcode-authoring/SKILL.md +36 -22
  173. package/packaging/claude-plugin/skills/urlcode-operations/SKILL.md +16 -22
  174. package/recipes/authenticated-json-api/README.md +4 -3
  175. package/recipes/authenticated-json-api/functions/profile.mjs +2 -1
  176. package/recipes/authenticated-json-api/recipe.yaml +2 -2
  177. package/recipes/contact-form/functions/contact.mjs +2 -1
  178. package/recipes/contact-form/recipe.yaml +3 -3
  179. package/recipes/cors-api/README.md +2 -2
  180. package/recipes/cors-api/recipe.yaml +2 -2
  181. package/recipes/health-page/README.md +1 -1
  182. package/recipes/health-page/recipe.yaml +1 -1
  183. package/recipes/json-api/README.md +1 -1
  184. package/recipes/json-api/recipe.yaml +4 -4
  185. package/recipes/middleware/README.md +8 -4
  186. package/recipes/middleware/middleware/bucket.mjs +12 -2
  187. package/recipes/middleware/middleware/locale.mjs +7 -3
  188. package/recipes/middleware/recipe.yaml +1 -1
  189. package/recipes/protected-download/README.md +1 -1
  190. package/recipes/protected-download/recipe.yaml +2 -2
  191. package/recipes/redirect/recipe.yaml +1 -1
  192. package/recipes/static-plus-api/README.md +2 -2
  193. package/recipes/static-plus-api/public/index.html +1 -1
  194. package/recipes/static-plus-api/recipe.yaml +2 -2
  195. package/recipes/static-plus-api/urlcode.yaml +1 -1
  196. package/recipes/typescript/README.md +2 -1
  197. package/recipes/typescript/recipe.yaml +5 -5
  198. package/recipes/webhook-receiver/README.md +5 -1
  199. package/recipes/webhook-receiver/recipe.yaml +2 -1
  200. package/recipes/webhook-receiver/urlcode.yaml +7 -0
  201. package/schemas/recipe.schema.json +4 -3
  202. package/schemas/urlcode.schema.json +14 -41
  203. package/skills/urlcode/SKILL.md +32 -11
  204. package/starters/default/AGENTS.md +18 -18
  205. package/starters/default/urlcode.yaml +0 -1
  206. package/dist/link-api.js +0 -136
  207. package/dist/link-cli.js +0 -141
  208. package/dist/link-events.js +0 -76
  209. package/dist/link-records.js +0 -31
  210. package/dist/link-store-worker.js +0 -150
  211. package/dist/link-store.js +0 -250
  212. package/dist/management-policy.js +0 -40
  213. package/dist/sqlite-version.js +0 -6
  214. package/dist/types/link-api.d.ts +0 -30
  215. package/dist/types/link-cli.d.ts +0 -37
  216. package/dist/types/link-events.d.ts +0 -27
  217. package/dist/types/link-records.d.ts +0 -11
  218. package/dist/types/link-store-worker.d.ts +0 -1
  219. package/dist/types/link-store.d.ts +0 -130
  220. package/dist/types/management-policy.d.ts +0 -8
  221. package/dist/types/sqlite-version.d.ts +0 -1
  222. package/docs/DYNAMIC-LINKS.md +0 -61
  223. package/docs/links/cli.md +0 -110
  224. package/docs/links/limits.md +0 -175
  225. package/docs/links/management-api.md +0 -80
  226. package/docs/links/pools.md +0 -75
  227. package/docs/links/setup.md +0 -135
  228. package/docs/yaml/links.md +0 -30
  229. package/examples/live-links/README.md +0 -11
  230. package/examples/live-links/example.yaml +0 -21
  231. package/examples/live-links/tests/requests.json +0 -6
  232. package/examples/live-links/urlcode.yaml +0 -16
package/ROADMAP.md CHANGED
@@ -1,331 +1,61 @@
1
- # Public roadmap
2
-
3
- URLCode is a portable runtime for programmable URL behavior, not a URL
4
- shortener. Live links are one handler in the broader project contract. The
5
- [project direction](docs/PROJECT-DIRECTION.md) explains how application
6
- projects and provider adapters fit without redefining or restricting the free
7
- runtime.
8
-
9
- This is the public delivery sequence. Tests accompany every feature, not a
10
- separate late phase. The stable 0.1 self-hosted release covers much of M0/M1 plus initial
11
- process/container packaging and benchmarks. Provider adapters and the remaining
12
- production-readiness gates remain open.
13
-
14
- ## 0.4.0-alpha.1 — current alpha
15
-
16
- `0.4.0-alpha.1` is the first alpha of the extension contract and the agent
17
- tooling on top of the `0.3.0` self-hosted release. It carries: the
18
- revision-pinned extension contract, capabilities and provider conformance,
19
- strict redirect interchange, bulk import, recipes and search, TypeScript
20
- guests, conditions, bounded proxy and signals, MCP read and authoring modes,
21
- the `context`, `explain`, `manifest` and `schema` queries, short forms,
22
- route-level auth, `init --with`, the agent benchmark harness, `llms-full`,
23
- and the generated `AGENTS.md` and skill. It is an alpha: provider
24
- deployments, soak and independent security review remain open. The
25
- extension packages declare `@jimhoyd/urlcode >=0.4.0-alpha.1 <0.5.0` and
26
- are published after core.
27
-
28
- ## Extensions: accounts, administration and presentation — implemented, unreleased
29
-
30
- The runtime now carries a generic, revision-pinned extension contract
31
- (`@jimhoyd/urlcode/extensions`, [extensions](docs/EXTENSIONS.md)): a project
32
- declares versioned `extensions.<name>` blocks, exclusive `extension` mounts and
33
- `policies.extensions` requirements; the operator supplies the implementations
34
- in a host file loaded with `--host-file`, outside the project. Guest requests
35
- never see `Cookie`, `Authorization` or declared credential headers. Cloudflare
36
- refuses extensions until its artifact format can run them.
37
-
38
- The implementations live in their own repositories, each with an
39
- implementation-status file that is the authoritative feature list:
40
- [urlcode-auth](https://github.com/jimhoyd-com/urlcode-auth) (accounts, sessions,
41
- MFA, roles, account page, operator CLI), [urlcode-admin](https://github.com/jimhoyd-com/urlcode-admin)
42
- (users, sessions, roles, audit, approvals, cases, impersonation) and
43
- [urlcode-ui](https://github.com/jimhoyd-com/urlcode-ui) (escaped templates,
44
- partials, themes, translations). All three are Apache-2.0 and published to
45
- npm as `0.1.0-alpha.1` while first-release acceptance is reviewed; see
46
- [issue 58](https://github.com/jimhoyd-com/urlcode/issues/58) for what remains:
47
- browser and device WebAuthn coverage, accessibility assessment, soak, backup
48
- and recovery drills on a deployment, live provider senders and independent
49
- security review. [The framework](docs/FRAMEWORK.md) describes how the four
50
- packages compose, and [next steps](docs/NEXT-STEPS.md) is the phased plan to
51
- close the remaining gaps.
52
-
53
- ## Capability foundation — implemented, unreleased
54
-
55
- `urlcode capabilities [--target self-hosted|cloudflare|aws|vercel] [--json]`
56
- and the public capability API centralize target support for handlers, bindings
57
- and effective policies. Runtime activation and Cloudflare builds use the shared
58
- preflight; unknown targets fail closed and unsupported requirements identify the
59
- route and capability before resources or artifacts are created. The existing
60
- compiled route IR is documented, not replaced. Configuration-dependent and
61
- delegated behavior remain explicit; all provider deployments remain unverified.
62
- See [capabilities](docs/CAPABILITIES.md) and the
63
- [next-phase review and implementation status](docs/NEXT-PHASE-PLAN.md).
64
-
65
- ## Portability and URL behavior — implemented, unreleased
66
-
67
- Strict redirect interchange supports CSV/JSON/YAML, Netlify and Cloudflare
68
- `_redirects`, a bounded Netlify TOML subset and Vercel redirects. Conversion
69
- reports refuse unsupported semantics; provider differences require explicit
70
- acknowledgment and are never called lossless. A synthetic conformance fixture
71
- and bounded HTTPS runner distinguish local adapter tests from observed
72
- provider deployments. Actual Cloudflare/AWS/Vercel deployment evidence remains
73
- pending; this does not complete M4.
74
-
75
- Exact query/header/cookie/origin/method conditions and disjoint conditional
76
- redirect/response cases run in the self-hosted, AWS and Vercel runtimes.
77
- Cloudflare refuses these until its compiler can preserve their semantics.
78
- Self-hosted proxy and webhook signals use explicit revision-pinned operator
79
- origin grants, connection-pinned public DNS and bounded transport. Signals
80
- have no durable delivery or retry guarantee. Other targets refuse proxy and
81
- signals. See [conditions](docs/CONDITIONS.md), [egress](docs/EGRESS.md),
82
- [interchange](docs/INTERCHANGE.md) and
83
- [provider verification](docs/PROVIDER-VERIFICATION.md).
84
-
85
- ## Developer ecosystem — implemented, unreleased
86
-
87
- Bundled Git-owned recipes, safe bulk imports into route includes, build-time
88
- TypeScript guest transpilation, read-only inspection APIs and optional stdio
89
- MCP tooling are available. The runtime still executes only JavaScript inside
90
- QuickJS/WASM; TypeScript authoring does not add host execution. Bulk benchmarks
91
- successfully cover 1,000, 10,000 and 100,000 routes without relaxing parser
92
- limits. See [recipes](docs/RECIPES.md), [bulk evidence](docs/BULK.md),
93
- [TypeScript authoring](docs/TYPESCRIPT-AUTHORING.md) and
94
- [SDK/MCP](docs/TOOLING.md). These features do not supply durable signals,
95
- protected downloads, a remote marketplace or provider deployment proof.
96
-
97
- ## TypeScript source and shipped declarations — implemented, unreleased
98
-
99
- The runtime, scripts, tests and benchmarks are TypeScript under a strict
100
- configuration, checked by `npm run typecheck` inside `npm run verify`. The
101
- package ships `dist/`: Node's own type stripping of the source with the
102
- specifier extension rewritten, so it is the same JavaScript line for line,
103
- plus `.d.ts` declarations for every export (`urlcode`, `@jimhoyd/urlcode/plugins`,
104
- `@jimhoyd/urlcode/policies`, `@jimhoyd/urlcode/observability`, `@jimhoyd/urlcode/compliance`,
105
- `@jimhoyd/urlcode/prerender` and the three provider entries). `dist` is never
106
- committed; the build runs in the digest-pinned release container, its hashes
107
- are recorded in the manifest, and a CI job builds twice and diffs the trees.
108
- Measured cold start, throughput and memory of `dist/` equal the previous
109
- JavaScript (see [performance](docs/PERFORMANCE.md)). Contributors need Node
110
- 22.18+ to run the source directly; installed packages still run on 22.13+.
111
- See [TypeScript](docs/TYPESCRIPT.md).
112
-
113
- ## Host policies and plugins — implemented, unreleased
114
-
115
- A `policies` block in YAML, reusable `profiles` and an operator plugin API
116
- close the gaps the [extensions spike](docs/SPIKE-EXTENSIONS.md) ranked
117
- highest: no cross-cutting behavior, no per-client throttle, no bot policy, no
118
- security-header preset, no compression and no response cache. Five policies
119
- (`throttle`, `agents`, `security`, `compression`, `cache`) run in the host
120
- process after route match and before the route contract, all off by default,
121
- with a per-target table that refuses at activation what a target cannot
122
- enforce: the serverless adapters take `agents`, `security`, `cache` and
123
- route-partitioned `throttle`; the Cloudflare build compiles `agents` and
124
- `security` into the artifact and refuses the rest with the route named.
125
- `--trusted-proxies` names the hops allowed to set `X-Forwarded-For` for client
126
- identity. Plugins are host code passed to `startServer` and the adapters on
127
- the same hook seam the policies use; nothing in YAML names one. See
128
- [policies](docs/POLICIES.md) and [plugins](docs/PLUGINS.md).
129
-
130
- This checkpoint is on a branch and not in a published release. An
131
- interoperability review of the five policies together, the spike's `report`
132
- mode headers on every target and the audit's policy table remain open, and no
133
- deployment has exercised a policy on a provider.
134
-
135
- ## Provider adapters — Vercel and AWS Lambda native handlers
136
-
137
- `@jimhoyd/urlcode/vercel` serves a project as a Vercel Node function, reusing the
138
- runtime's transport-agnostic handle() and a shared response writer, so a
139
- deployment returns byte-identical status, body and headers to the self-hosted
140
- server. Bindings arrive through a `URLCODE_POLICY` environment variable holding
141
- the same revision-pinned grant document the operator policy file carries.
142
-
143
- Native handlers only: isolated functions, middleware and stored live links are
144
- refused at activation, because every cold start would pay worker and WASM
145
- startup and a serverless filesystem cannot hold a durable link store. The
146
- `@jimhoyd/urlcode/aws` does the same for a Lambda Function URL or API Gateway HTTP API.
147
- Payload format 2.0 only: format 1.0 supplies an already-decoded path and query,
148
- and this runtime rejects ambiguous encoding deliberately, so rebuilding a target
149
- from decoded parts would misrepresent the request. Response policy, including
150
- content length, now lives in one place shared by every host rather than partly
151
- relying on Node's implicit behaviour.
152
-
153
- Neither adapter has been deployed; see the [Vercel](docs/VERCEL.md) and
154
- [AWS](docs/AWS.md) guides, which state what stays unverified as a result.
155
-
156
- ## Provider targets — Cloudflare Workers
157
-
158
- Cloudflare Workers has no worker threads, no filesystem and no runtime code
159
- generation, so it gets a compiler rather than an adapter: `urlcode build
160
- --target cloudflare` emits a Worker, the compiled routes and Ajv standalone
161
- validators, and `@jimhoyd/urlcode/cloudflare` serves them with the same matching, request
162
- policy and response policy as every other host. Declarative routes only —
163
- redirects and declared responses with parameters, defaults, validation, response
164
- headers, `enabled` and `expires`. Functions, middleware, stored links, assets and
165
- bindings are refused at build time with the route named, so an unsupported
166
- project fails the build instead of the deployment. Bindings are refused even as
167
- literals, because a build artifact must never carry a secret.
168
-
169
- Making this possible moved request-time matching into `src/match.ts` and header
170
- validation into `src/header-validation.ts`, both free of Node imports, so one
171
- implementation now serves the Node server, the serverless adapters and the
172
- Worker. `test/header-validation.test.ts` compares the header rules against
173
- `node:http` across the full character range, because disagreeing there is header
174
- injection, and `test/cloudflare.test.ts` asserts the Worker and the self-hosted
175
- server return the same status, body and headers for the same project.
176
-
177
- This has not been deployed to Cloudflare; see the
178
- [Cloudflare guide](docs/CLOUDFLARE.md) for the two request-level differences the
179
- platform imposes and what stays unverified.
180
-
181
- ## Installation and publication — 0.1.0
182
-
183
- Added a tag-driven release workflow that reuses the audited candidate build path,
184
- publishes a GitHub release with the signed tarball, SBOM, manifest, `SHA256SUMS`
185
- and a rendered Homebrew formula, and optionally publishes to npm (with
186
- provenance) and GHCR behind repository variables. Added a checksum-verifying
187
- `install.sh`, a Homebrew formula template rendered only from measured bytes, and
188
- an [installation guide](docs/INSTALL.md) covering npm, Homebrew, the script, the
189
- container and provenance verification.
190
-
191
- 0.1.0 was released from this pipeline: the GitHub release carries the signed
192
- tarball, SBOM, manifest, `SHA256SUMS` and Homebrew formula, and an install from
193
- the published release was verified end to end. npm and GHCR publication stay
194
- opt-in and remain unproven until enabled, so the Homebrew formula's registry URL
195
- does not resolve yet.
196
-
197
- Added tunnel and [monitoring](docs/MONITORING.md) recipes, and extended
198
- `urlcode benchmark` to measure a running deployment through its real path with
199
- warm-up and shed/transport separation; see [load testing](docs/LOAD-TESTING.md).
200
- M3's remaining gap is sustained soak and slow-peer behaviour, which that tool
201
- does not cover.
202
-
203
- ## Hardening checkpoint — alpha.8
204
-
205
- Bound HTTP admission and inactive sockets, drain accepted link writes on shutdown,
206
- reject invalid store metadata, and correct management defaults/method responses.
207
- The [readiness register](docs/RELEASE-READINESS.md) distinguishes tested safeguards
208
- from deployment and stable-release gates. Feature breadth does not imply stability.
209
-
210
- ## Live short links — alpha.8
211
-
212
- Implemented an optional native `link` handler, local SQLite persistence, CLI CRUD
213
- and a separate authenticated management API. Links become visible without YAML
214
- changes/reloads; versioned writes prevent silent lost updates. No guest storage
215
- or network access is added. Same-host only; distributed storage, general state,
216
- user accounts and provider adapters remain open. See [dynamic links](docs/DYNAMIC-LINKS.md).
217
-
218
- ## Middleware — alpha.7
219
-
220
- Implemented route-local ordered `next()` middleware around every handler, early
221
- responses, request-local state and shared sandbox deadlines. Plain native routes
222
- retain their fast path. Native bodies stay opaque; middleware coverage requires
223
- explicit assertions. See [middleware](docs/MIDDLEWARE.md).
224
-
225
- ## One starter — alpha.6
226
-
227
- `urlcode init <directory>` always creates the same function-plus-redirect project.
228
- There is no template selector. The public urlcode-template repository mirrors
229
- those examples with a pinned npm dependency. Richer asset examples remain under
230
- examples/assets. Historical starter branches are not maintained.
231
-
232
- ## Route readiness and local project benchmarks — alpha.5
233
-
234
- Implemented route inventory, expected-count checks, active route/method coverage,
235
- generated native probes plus explicit fixtures, and bounded assertion-aware local
236
- benchmarks. [Readiness](docs/READINESS.md) documents the gate and remaining deployment,
237
- soak, remote-destination and business-coverage work. This does not complete M3/M4.
238
-
239
- ## HTTP configuration and standalone starter — 0.1.0-alpha.4
240
-
241
- Implemented bounded request body/media-type/JSON checks, literal response headers
242
- and separate Set-Cookie values, and native text/JSON responses. See [HTTP](docs/HTTP.md)
243
- for precise scope; automatic CORS, multipart, streaming and other listed features
244
- remain open. The public [urlcode-template](https://github.com/jimhoyd-com/urlcode-template)
245
- provides two routes with a pinned runtime dependency and cross-platform CI.
246
-
247
- ## Native assets — 0.1.0-alpha.3
248
-
249
- Implemented the page/static/download portion of M2: project-contained asset
250
- snapshots, automatic MIME types, attachment names, HEAD, cache validators and
251
- single byte ranges. Dedicated public directories, symlink/hardlink rejection and
252
- bounded memory are part of the contract. [Asset guide](docs/ASSETS.md).
253
- Bulk tools, recipes and best-effort signals were added in the unreleased next-phase work above; they were not part of alpha.3.
254
-
255
- ## Security correction — 0.1.0-alpha.2
256
-
257
- All function code is untrusted. Node host execution has been replaced by
258
- QuickJS/WebAssembly isolation with fresh invocation state, no ambient host or
259
- network APIs, bounded resources, restricted module graphs and revision-pinned
260
- operator binding policy. This protection is part of the free product. See the
261
- [security model](docs/FUNCTION-SECURITY.md). Full Fetch/Node
262
- API compatibility and network integrations were not part of that alpha and
263
- remain outside the 0.1 contract.
264
-
265
- ## Earlier implementation checkpoint — 0.1.0-alpha.1
266
-
267
- Implemented: versioned strict YAML/JSON Schema subset, explicit file composition,
268
- redirect/parameter semantics, JavaScript Request/Response functions with bounded
269
- workers, scoped binding context, init/add/validate/dev/serve/test/doctor, indexed
270
- snapshots, last-good reloads, graceful shutdown, health/readiness, safe request
271
- logs, two runnable starters, ESLint and unit/HTTP/package tests. Cross-platform
272
- CI and a non-root container build are included. See the [contract](docs/SPECIFICATION.md)
273
- and [operations guide](docs/OPERATIONS.md) for exact support and evidence limits.
274
-
275
- Still open in the early contract: host namespaces, stable identity beyond paths,
276
- fuller parameter vocabulary. Build-time TypeScript authoring and capability planning are now implemented in the unreleased work above.
277
- No claims of complete M0/M1 or stable production readiness. M2–M4 work continues
278
- in the order below; a few independently useful operational foundations shipped early.
279
-
280
-
281
- | Milestone | Scope | Completion evidence |
282
- |---|---|---|
283
- | M0 — contract/build loop | YAML schema, matching/input semantics, function API, composition, runtime/packaging prototype, CI | Fixture validates; invalid definitions fail; verification runs |
284
- | M1 — local alpha | CLI, aliases, redirects, parameters, custom functions, env/secrets, indexed routes and reload | Redirect plus function tested locally without accounts/DB; invalid reload preserves working version |
285
- | M2 — bulk/reusable behavior | CSV/YAML/JSON, safe bulk edits/checks, templates, best-effort async signals, simple pages/static/downloads | 10k-route example, local side-effect tests, safe file serving, benchmark datasets |
286
- | M3 — self-hosted beta | Process/container deployment, domain/TLS guide, packages/Homebrew, ngrok, monitoring and load tools | Install, test, deploy, observe and roll back a real project |
287
- | M4 — provider public release | Cloudflare/AWS/Vercel adapters, provider conversion, capability/limit checks and stable docs | Baseline redirect/parameter/function fixtures on each advertised initial target; additional capability gaps explicit |
288
- | M5 — advanced public features | Bounded proxies, protected/one-time downloads, durable signals/state, broader catalog and API/SDK/MCP | Feature-specific guarantees, tests and portable capability reports |
289
-
290
- The first provider-capable public release is M4; the 0.1 self-hosted release is
291
- useful within its documented scope. A marketplace and advanced stateful
292
- features are not prerequisites. No web UI/TUI or framework-hosting platform.
293
- Netlify starts as redirect interchange after the initial provider adapters.
294
-
295
- ## Launch and stabilize the free version
296
-
297
- Stability means repeatable installs/upgrades, dependable routing/functions,
298
- working deployment and rollback, useful diagnostics, and serious recurring
299
- issues from actual users addressed. Feedback begins with usable alphas, but the
300
- free version is not stable until that evidence exists; do not invent a calendar
301
- deadline or adoption-count threshold.
302
-
303
- Keep the architectural direction: reusable runtime/compiler, provider adapters,
304
- separate configuration and secrets, versioned artifacts, Git-owned definitions
305
- and observable behavior. Avoid assumptions that would force users to rewrite
306
- projects later. No artificial restrictions in the free version; it is licensed
307
- under Apache-2.0.
308
-
309
- ## Starter delivery
310
-
311
- The [starter plan](docs/STARTERS.md) makes both Git clone and CLI initialization
312
- release requirements: one function-plus-redirect starter in M1, bulk-growth examples in
313
- M2, and the business foundation with self-host tooling in M3. Provider recipes
314
- follow tested M4 adapters. All use the same runtime and portable project format.
315
-
316
- ## Quality gates
317
-
318
- - Same fixtures pass on the local reference and each claimed runtime adapter.
319
- A static exporter alone is not a complete function-capable adapter.
320
- - Pure redirects avoid Lambda/per-route user functions; generated shared routing
321
- is allowed where native provider rules cannot preserve behavior.
322
- - CSV exports report unsupported nested content instead of silently losing it.
323
- - 1k/10k/100k datasets measure compile/reload, memory, latency and throughput.
324
- - Default tests run against local HTTP/fake services; ngrok is optional.
325
- - Load tests use bounded owned targets and do not follow third-party redirects.
326
- - Invalid reload preserves working config; secret values stay out of artifacts.
327
- - Installation claims match tested OS/architecture packages.
328
-
329
- Implementation runtime, exact schema/function API, first adapter order and package
330
- format are decided through early prototypes. Do not invent performance targets
331
- or advertise all providers before they pass tests.
1
+ # Roadmap
2
+
3
+ URLCode lets people and agents describe URL behavior in YAML and write application
4
+ code only where the framework cannot express it. The free Apache-2.0 runtime
5
+ stays useful on its own. [Project direction](docs/PROJECT-DIRECTION.md) owns the
6
+ principles; [the specification](docs/SPECIFICATION.md) owns implemented behavior.
7
+
8
+ ## What works now
9
+
10
+ The source at `db375bf` provides declarative routing, responses, assets, policies,
11
+ conditions, proxy/signals, trusted Node functions and middleware, and opt-in
12
+ `sandbox: true` isolation. Target support differs: use `urlcode capabilities`
13
+ before promising a deployment. Stored short links have no supported package.
14
+
15
+ Auth, admin, UI and middleware are separate optional packages. Auth/admin already
16
+ render through the shared UI kit when configured. Core includes scaffolding,
17
+ searchable recipes/examples, compact context, schema queries, a semantic manifest,
18
+ and MCP inspection with separately enabled authoring. These are implemented,
19
+ not future phases. See [the framework](docs/FRAMEWORK.md).
20
+
21
+ ## Next work
22
+
23
+ Monorepo work is starting now. Move middleware in as a separate package before
24
+ folding it into core; coordinate the guidance cleanup with that migration.
25
+
26
+ 1. **Make the existing product coherent.** Keep docs, examples, generated LLM
27
+ resources, installed skills and the standalone template consistent with their
28
+ runtime version. Resolve the [open decisions](docs/OPEN-DECISIONS.md).
29
+ [Issue 168](https://github.com/jimhoyd-com/urlcode/issues/168) tracks checking
30
+ schema-invalid documentation examples beyond the existing prose checks.
31
+ [Issue 174](https://github.com/jimhoyd-com/urlcode/issues/174) retains the
32
+ extension-schema retrieval proposal.
33
+ 2. **Measure the agent experience.** The benchmark harness and authoring evals
34
+ exist, but the committed baseline is a stub, not a real-model measurement.
35
+ [Issue 173](https://github.com/jimhoyd-com/urlcode/issues/173) tracks the
36
+ measurement. Run the existing tasks, retain the raw results and use observed friction to
37
+ choose improvements. See [the benchmark](benchmarks/agent/README.md) and
38
+ [the broader experiment proposal](docs/SPIKE-AI-FRAMEWORK-BENCHMARK.md).
39
+ 3. **Close release evidence gaps.** Browser/device coverage, accessibility,
40
+ independent security review, deployed recovery/soak tests and real provider
41
+ verification remain distinct from source implementation and local tests.
42
+ [Issue 58](https://github.com/jimhoyd-com/urlcode/issues/58) and
43
+ [release readiness](docs/RELEASE-READINESS.md) retain those gates. Live
44
+ Google/Apple/SES checks remain explicitly deferred.
45
+ 4. **After the monorepo move, consolidate middleware into core.** Move the
46
+ existing middleware package first, preserving behavior.
47
+ [issue 172](https://github.com/jimhoyd-com/urlcode/issues/172) tracks the later consolidation
48
+ and consumer migration; package retirement is not part of the initial move. Static targets continue rejecting
49
+ request-time middleware.
50
+ 5. **Choose expansion from evidence.** Collections, a business application suite,
51
+ and per-route Lambda compilation are proposals,
52
+ not available features. Decide scope before implementing them.
53
+
54
+ ## Records and ownership
55
+
56
+ Track actionable defects and feature gaps in the owning repository's issues.
57
+ This page explains sequence; package contracts explain behavior; dated evidence
58
+ states what was actually tested. Completed and superseded plans live in the
59
+ [archive](docs/archive/README.md), including the previous release chronology
60
+ and detailed phase plan. Archiving an implementation plan does not close its
61
+ remaining operational acceptance gates.
package/SECURITY.md CHANGED
@@ -1,13 +1,28 @@
1
1
  # Security
2
2
 
3
- Application functions are **untrusted by default**. Alpha.2 replaces direct Node
4
- execution with QuickJS/WebAssembly isolation. Worker threads alone are not the
5
- security boundary. There is no unrestricted host-execution fallback.
6
-
7
- Guests have no Node, filesystem, shell, network or ambient process-environment
8
- access. Each invocation gets fresh state and bounded resources. Imports stay
9
- inside a snapshotted project module graph. Binding grants come from operator
10
- policy outside the project and are pinned to the configuration/code revision.
3
+ Project `function`/`middleware` code is **trusted and unsandboxed by default**:
4
+ it runs directly in the host process, exactly like any other project code,
5
+ with full Node, filesystem and network access (docs/SPIKE-DEFAULT-TRUST-MODEL.md).
6
+ A route opts into isolation explicitly with `sandbox: true`, which dispatches
7
+ that route through the QuickJS/WebAssembly worker pool instead unchanged
8
+ from the isolation this project has always provided, still the boundary to
9
+ reach for when a route's code specifically warrants it (input from a source
10
+ the project doesn't fully trust, a contribution nobody has reviewed, logic
11
+ handling an especially sensitive secret).
12
+
13
+ A `sandbox: true` guest has no Node, filesystem, shell, network or ambient
14
+ process-environment access. Each invocation gets fresh state and bounded
15
+ resources. Imports stay inside a snapshotted project module graph. Binding
16
+ grants — for a trusted route as much as a sandboxed one — come from operator
17
+ policy outside the project and are pinned to the configuration/code revision;
18
+ trusting a route's code by default does not grant it any `env`/`secrets` it
19
+ was not explicitly declared and pinned to receive. This is a claim about what
20
+ URLCode injects into `context.env`/`context.secrets` for a route, not an
21
+ access-control boundary on trusted code itself: a trusted (non-`sandbox`)
22
+ route runs with full Node access by design, so its own code can read
23
+ `process.env`, the filesystem or the network independently of anything the
24
+ binding grant declared or withheld. The grant only governs what URLCode hands
25
+ that code through `context`; it is not a restriction the code is confined to.
11
26
  See the [security model and policy instructions](docs/FUNCTION-SECURITY.md).
12
27
 
13
28
  The host/runtime and sandbox engine still require patching, independent review
@@ -3,88 +3,83 @@
3
3
  "files": {
4
4
  "dist/adapters.js": "a7153ec52f2ed7e0cdd8ed7d433504815f402ec53b2b1c3d38d0cf0e2fcf6509",
5
5
  "dist/agent-lists.js": "35ab484198897501d011cb6cc00b5a6787192e19df29c97646e8c118fcc19eef",
6
- "dist/agents-guide.js": "9cecc60690fe91e1f09a5298273c1d918428f114b5abb11f40f37f341668309c",
6
+ "dist/agents-guide.js": "0b19909aee3f8a1039c34c43ff58116ec1bc3f1875e3dbc34b3b01655273201c",
7
7
  "dist/assets.js": "0833b093d2fe457ce68281110dc07d47914992753607741c13b339d92c76cf5c",
8
8
  "dist/authoring-files.js": "ad32814f9ae9c549c6247396f982aa700d13a293cc0a589609eccc68f8965550",
9
9
  "dist/authoring.js": "ec5240e8686c124f4601229b45f89ce112d9eeb9d35e3059fe55e93056c45209",
10
10
  "dist/aws.js": "7d8e3a97b4f6dbefbd68da058f05192469d1efcaed5458b284863ebe462e060e",
11
11
  "dist/build-cloudflare.js": "af4f49ad45287d7c4105bb84b1592b5b8e76c930f7159505338298f7c5fd5651",
12
+ "dist/build-static.js": "fe01ef4fcc66d83d8be7a787538b55974e84fd3d7c89e26f0a2f1a152762d565",
12
13
  "dist/bulk.js": "aac88d422bd9a7a341a421fb4e29ff5580b28d39250b7f1f5315ba20ae92da8a",
13
- "dist/capabilities.js": "c1e28c7de676c3b43c154d6f767749a1b34df78a64c58b5c23ad95339f964608",
14
- "dist/capability-query.js": "850525d542aeeaeb4f89397ac57c6f89daad3fe3fa02ecb0332ea9f75d140b32",
14
+ "dist/capabilities.js": "28dba05b3851b8b12b3c1b809af87b732f84d601c737afe9225abe429886e691",
15
+ "dist/capability-query.js": "ba148b27c6a60f8c895f13f26468b16c18ae0a5cddea26b602965c8efbba90ae",
15
16
  "dist/catalog.js": "ab1c01c9296cc277d2bd4fd682aeb053656a7d9f91c61974f4b78feea0211de8",
16
- "dist/cli.js": "4cba007ed3666fdfdf9fc676de1e346ab8196e3907dc2541eeb3e59842d9891a",
17
+ "dist/cli.js": "ff3e583bd43044bdc06122e33c6137f400f677967ebff1ab49900b517682531c",
17
18
  "dist/client-address.js": "9d0d01466aab23124330605c5a0e0f981f87c897858acfad909f546a63df165b",
18
19
  "dist/cloudflare.js": "17b43b0a6b6a0ef8a893415c989e4ae3976d97cc966adbf897b785f9adc472e3",
19
- "dist/compliance-rules/baseline.js": "0a0c03d932f30797c4837c78c6b64ca6bb88f2ca947eb7f6adf5fdcdd280616d",
20
- "dist/compliance-rules/privacy.js": "0e4d12106cf777299a7d30451f53c7b996f202fe53d7e1047b69f5df2a74a53d",
21
- "dist/compliance-rules/shared.js": "595a7ee3a5af8c52197c5c9cbf09f4289a234e52b7a198afdd498be9be8d28a1",
20
+ "dist/compliance-rules/baseline.js": "6296dea6bcb9f9bb80ed6ed5ab2f456e7f74e6de2be5d2d98ca8c983fb4df3ab",
21
+ "dist/compliance-rules/privacy.js": "4cfb1c07d7df698c362dfc8761cd3bba893769e92d7fb0a3901e1c2d25e801f1",
22
+ "dist/compliance-rules/shared.js": "86fd6db6a93375689acc64975cbc394ce9452dea21ae5941e743f99822515995",
22
23
  "dist/compliance-rules/strict.js": "73ee13c2f893acf20cc3d44bf054e58c1474dec52eafe0cf2ce7f4eb96a3bc53",
23
- "dist/compliance.js": "e956dc89b0b729fed7031297b8d7554141110334e670edf5cedc3d052a8fb3e4",
24
+ "dist/compliance.js": "29a18da3cefea94802ac7d817d1ab4e3674abd5c3ac4ef893cb8b01c6a23fb61",
24
25
  "dist/conditions.js": "ff25e97da550a3bdd80af55522045669438aa31a77d2bc83ad602bcefdee0475",
25
26
  "dist/config-worker.js": "bc2170d60c35f8d5de227cbfc4c5067dc61d7cbc5b98aed88e68a11797072da5",
26
- "dist/config.js": "8efc2cfc24e9a958770d73aa8464d18c81d7a9a1d2398398cd9cc2776e639127",
27
- "dist/context.js": "a6b0278b4fd478175f43b1ef5ae640ce6e0782c906c6fd2c7d1aebaf5a31c918",
27
+ "dist/config.js": "0cd82b4c407848f9c66e804a6dd4bf9a8a8503264e51584456578073e0f01921",
28
+ "dist/context.js": "549a53e4738b9c20a1ec55614027f758026fb5860bf4ac962ce22d7029e48df0",
28
29
  "dist/ecosystem-cli.js": "1e71bacd53d6fa8c7857cfcce3c3012ce054771a434b78d1f39e892e32642edd",
29
30
  "dist/egress.js": "2ae29fe2cb4590fd2f715abe6817db47fed2f50dd31f37946ecf42eafbb0dd9e",
30
31
  "dist/errors.js": "a908e66496afebbdd632a8c159a6e14d23f8f38798a0b4342ca122f2511c6cde",
31
- "dist/examples.js": "8de9917a82fb04e44a3182d57c6a95cc730feb8b22a37d54b9b3c4177aa83111",
32
- "dist/explain-cli.js": "c5414e9627f428f0d8efa4e4f3f89951ea10a6b3fe1d7f633e48f71a792406d2",
33
- "dist/explain.js": "5dd271b699c9b852fbaa4db271d9a370fe98fca43b1d0ac018de0c0b047bf7b8",
34
- "dist/extensions.js": "7402ff86017fca83a0e08a50b402bc428056566d63511aa84d609e252dc456e8",
35
- "dist/function-sources.js": "f6e8bdd9d4ef728b44c6e1f08c601b11fc4ad3e0c104dacf4fea0b71874ea4e7",
36
- "dist/function-worker.js": "3f5bad4f1b5cb812924c2dcc73ece6f816cf6aac26cd471fd1030dcfbf009c3b",
37
- "dist/functions.js": "6b1e5d4a3f8db17d4e5df261b98ed15f5f0c5e5507a6fc0f472e9f94ed2b6090",
38
- "dist/guest-api.js": "bc2501496a6ef9fd20dddb606fbc6fd557d534dd075e7ad38406248b230013ed",
32
+ "dist/examples.js": "89ae2b764a688fe52acfb9b94d3d262d7742401ebd0ef10c9ebfc76edfa5631c",
33
+ "dist/explain-cli.js": "f0f8f3b5046430d03c6abb629b38651c9c734b03456040735ce9d7e582b2bcd5",
34
+ "dist/explain.js": "dff1ed9a1bd818906ea867f4fb6d4601397943f9bdc4fceccf1809a365f95168",
35
+ "dist/extensions.js": "0506ec6289fa0582399d8c6d27727ffeb629bd442264248c921c63cc5b46ff01",
36
+ "dist/function-sources.js": "16fad4abc81c7ee07b6cbcef2d23a9fc50e97a17cb4dde1db53469bbb555c96f",
37
+ "dist/function-worker.js": "35771790ada4e1b36d447d4967a5e6cf0b543f32944e4c904f5fbf8998e824a5",
38
+ "dist/functions.js": "0f09d1bd27eb655ceb5900a4a5e2b760d2028b02cb637a6a89a4eb5940828008",
39
+ "dist/guest-api.js": "49aec9ed72733ad119e63bcfcee18158dcc8ceb951e1823b8947f6407ff24afc",
39
40
  "dist/header-validation.js": "465181dbb08ff05f52defdd29fda025c0c64589bf319fa87fa6d3ab4b68216d5",
40
41
  "dist/http-policy.js": "4cb187642269078ddf3460a3f1813dc57878a616a6f8132ef8f8d3b4b91ebb56",
41
42
  "dist/http-response.js": "5fc3bb9eb932a3fd2fbc72c361416a5f1439b8bf45b2be37baca1c6446abf40c",
42
- "dist/index.js": "53648d88b0db7d9168d2f212ea4a28b7fd3ead6238c99c0b8d7d41536274d6d4",
43
+ "dist/index.js": "7e9f6ec8a125e2dfd4230b2ecd17ac513c0153d778a57bbcee7a1a9cd9681f81",
43
44
  "dist/init-with.js": "8371f568867ebdc6ab8e9aa762234ae2aa015865f46aa901254528e20d69b791",
44
45
  "dist/interchange-cli.js": "35bd70ba8077af5c3e39404ff0e5d28707632090a59a90645141252449fd3f04",
45
46
  "dist/interchange.js": "26789420af33344d9a08c00fe6b2708aa71994224df527b3075295be2151611e",
46
- "dist/link-api.js": "0d1f2fb5ef8cd6fda7b071d3e08c53eb4b1c01d4003167af2f400949b70dea4f",
47
- "dist/link-cli.js": "c4e2121a3e66f33c640832a7cb362a6a1db8b6d91d55a4239ce38ba0ced67b22",
48
- "dist/link-events.js": "502a6038a538fa43094a9ba9c7546f504b4a1832a1377f26ca8cb69c2326670e",
49
- "dist/link-records.js": "ef67a58cd107db0c3ac1c0ffd7b32817553606cf69bb3002da4ca0138c272f69",
50
- "dist/link-store-worker.js": "0080452bbada2154b923449cd14596579bde94ad5f8dab94ecc84aa0d59c089b",
51
- "dist/link-store.js": "526cdbe1b917cc7a74fb6edbbf13717d823ace5b5d6a5f89bc91438056a10b37",
52
47
  "dist/logging.js": "8ec57fea26983aa071b05fe15d680d6550b03488101163ed9666da674118cf31",
53
- "dist/management-policy.js": "bd5563da52c53ace71b01daed0d2a492baeb3f26f5ec5ee1b0981c2b88df9ffa",
54
- "dist/manifest.js": "d4f58f936febbabf09ec1706baae7c1cb186dcd8a3d29b5725dad5b6eaf43a3f",
48
+ "dist/manifest.js": "aa450ff88d44b184ed1ad3331d1f81005a844a9f971e9e12dfa039952839bc75",
55
49
  "dist/match.js": "53ebcc2cda529a8d07fb83f8cb69a1446036ffc1641af3c4bd45a55851bded28",
56
- "dist/mcp-authoring.js": "5030f52ef9c7ebc7b97305fcce687eb0a0d6164e34fda87f8278135a1e6f3d65",
57
- "dist/mcp.js": "ac96c5a094d7cc88cf16d1d1e3c23f45773729fe28855f921581badb2b95eb89",
58
- "dist/observability.js": "13a22b9e34cf8da3739856eeada8522fb6c43765386cae07c6aa0981447fcb83",
50
+ "dist/mcp-authoring.js": "4987b0ba08999309e07aea1b8bb31f4600cec22d79998e6982e56f765070587a",
51
+ "dist/mcp.js": "fa44f5f9e0bc4ca9790d1d1eb461147673c1539cf1704a4daae9bad30e4120eb",
52
+ "dist/observability.js": "f4b1ab496f051fe3ef2ed36b2b2e469c63a8940700e2df852e6ff2d9cccdd5ae",
59
53
  "dist/operator-host.js": "e3dac9d43a83beb775202b4ab9eeeba7ac63cebfc5dcc669be38d825be587bd0",
60
54
  "dist/plugins.js": "a61aa933cd9e1b41020b86fae78aa3a7f45f5313124aa11b50cb57898722385e",
61
55
  "dist/policies/agents.js": "c1dbc1e90339f472eeeb2372f7f4637f59a5d210797ea680ac8120a02aa20c10",
62
- "dist/policies/cache.js": "ef16d7e592526c29f865b2693faa2c8afbea41c6526687563dffcb13a77fc1f7",
56
+ "dist/policies/cache.js": "03f79b91694bb78a98de4473384e5110e1ae1c3c83d46f929495d03af04d9da1",
63
57
  "dist/policies/compression.js": "800f3ae3b1a4c1fe58c3d9908364ea9d78f655ff50c7f7589f584378e7f194b0",
64
58
  "dist/policies/security.js": "2b3bfdf82140156fea4b162adc28ee43ccd85c402fb200680dbb8d8706417420",
65
59
  "dist/policies/throttle.js": "bbb0cb1c24cf70d0a1ac32fc0618efb6c44e5b5d42564842f9c585ff7e501603",
66
- "dist/policies.js": "23fa019b7bf1cdedcc5f7772d2f157e4b381a554bce9e84594c2be4a0f8f76b8",
67
- "dist/policy.js": "8285ed144ba42fd34e926e526cd4dcf60d5ab3668adf4f0b797f074ebd5243ce",
68
- "dist/prerender.js": "0386ea2411e00b9563b5349133f1d723947b01f837fa92d4c61a699c9cfb5cdb",
69
- "dist/project-tests.js": "225761d36bbe7e185c49c10c0334e579caf7d98647c9941faa4b0ea6406522fa",
60
+ "dist/policies.js": "3750a7032ec7326aa544f4808683ad9eb91d4f2c5afe79904420cd8a355710a9",
61
+ "dist/policy.js": "33c527008fafe4af18243ba668d069517c20659150f9f1d1a5a1d076e8724f89",
62
+ "dist/prerender.js": "6210999e848ab86c87f265943960ef63716896da7a40e248221a6a30425c56b8",
63
+ "dist/project-tests.js": "445eaa139d2f1a2534369cfdeef081ef518de03218a467e7c5c2059caf840270",
70
64
  "dist/provider-verification.js": "ffcf9f05e8cb5f71ea46a97e279e8a613fdfdf9435ab02bd57af11e2680a9107",
71
65
  "dist/proxy.js": "34107e59ac0dbbea090efa3cf5badf3226c5302ba25e8f8ff9b2b5596ed80e50",
72
- "dist/readiness.js": "d419b09a83dc8e6790be7c91ba4e1a2a5cf9b141577c98bd24e99a3609553649",
66
+ "dist/readiness.js": "90b54bc0cf60dd155d05789a1aad767bd67483d5fa6064ae8b1143f8cf9e06b2",
73
67
  "dist/recipes.js": "11853f23e63c3c65c5bed03a278cde0349d28c9fa23266c9907a2df318bb5fc3",
74
- "dist/route-diff.js": "eebac076a886ddfb2bf5b97ea09d81f888e7bb0063d482eddb8e5fef9acea107",
75
- "dist/router.js": "4315585232561c1737e579a2cbd990596d337b37565dd449bcb1bbaa6abbfb13",
76
- "dist/runtime.js": "f6f1bfa320a427423d66be845de3368552b1f4cca4a28136b913ac26fb9d6169",
77
- "dist/scaffold.js": "9dd30112e070ec554bd7cae1ca0a8b03642632be57411ba76a72972f4ba49b3e",
68
+ "dist/route-diff.js": "8d71d50d332ffaaed588656bd32aa36763260d1ad87bb62d7ea1c8fb23383969",
69
+ "dist/router.js": "cf831025d5ed6778d1d6a0e541177799794e76766c82084ded81d3e87317ca1e",
70
+ "dist/runtime.js": "0470dcab0774d2da3336e9ce76a4853757bf96081e52bd741f6b44c1bdd4161f",
71
+ "dist/sandbox.js": "c88c5aa5dd95b4f55f1ba62da7969ad66dbd97c30f72e5b5f2817a2098ac1c65",
72
+ "dist/scaffold.js": "3ef243aceca7ddf2780aa2c8c04ae17edd07682d3a418fd5d65ba00f5c762f14",
78
73
  "dist/schema-query.js": "bfd1844acd8d54ac361115191fcfbaf828a67e223b9ec6e9c22f158761af149b",
79
- "dist/server.js": "d8c78d1695b3c11328f3f983281fba78c2aca6a66cf755b39ecf4ec2ec4b6f29",
74
+ "dist/server.js": "d878bc8f0d6a05f8fd25997cace3150e2ff4d44ee9c8f4b5530e29601e164be1",
80
75
  "dist/signals.js": "b55e54efc8fb6703e08f2a1e808ec8e011bda67738db8ceadf1b248f695795be",
81
76
  "dist/site.js": "c40a06a6f9e2d6d3bea94727783c115fed4309bb0190787f58434eed64cbde84",
82
- "dist/sqlite-version.js": "a3a08d99064bd0f35847e288027e00a516efdd61c675bfbbe7726e3aa900f0d1",
83
- "dist/tooling.js": "eaf9aa49df17b5ab3bc538976b2849fac52b5ca779b6e814fd7ca592ecd757b7",
84
- "dist/types.js": "8579202bf322e542969bbd9e5b98774963b12ac69bdf362eebfcb068de2d5421",
85
- "dist/typescript-authoring.js": "156c617c2cbf992c299dbbbd5398500f0f30d1c90df8630509036da4ffd7cae9",
77
+ "dist/tooling.js": "7409db98422325cd4181d073d645ea57debca0e54cb151123474b85f4d4ed7dc",
78
+ "dist/trusted-functions.js": "befd256848be786f97e372c6af0e05ac08a0c93baed38bf2470ea49bc00dd3e4",
79
+ "dist/types.js": "2fe7664dbb5695ec72114197abde72de4031df9c3b211740eacefa68e9b21844",
80
+ "dist/typescript-authoring.js": "2e98498a15bdbb76f36fbee84afb7c42ca95bbf80a2e6dd4040147f3b1642a29",
86
81
  "dist/vercel.js": "a0da20c095d0c7fa8f579ed4dd5951e7a34191f8a72a57c5e782c9eab39f6f08",
87
- "dist/verify-deployment.js": "cac5d10ea18ae5f699df0eb0a5229837297c7627b47e65140f053820cae2414d",
88
- "dist/scripts/operational-drills.js": "b7e9448279c59ee9de62023055a9ff5c7a60bcceed4c33d023edc612f5575af9"
82
+ "dist/verify-deployment.js": "0c2e68f3cf258a364728c801411df5284343bc01b75a64fe275ff84e397e998b",
83
+ "dist/scripts/operational-drills.js": "c26c406d28013cc554b25a5b6bf8baf4e71d5e67e50d866fae546f538a192317"
89
84
  }
90
85
  }