@jimhoyd/urlcode 0.3.0 → 0.4.0-alpha.1

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 (326) hide show
  1. package/.claude/skills/urlcode-authoring/SKILL.md +106 -0
  2. package/.claude/skills/urlcode-operations/SKILL.md +114 -0
  3. package/.claude-plugin/marketplace.json +18 -0
  4. package/CONTRIBUTING.md +30 -2
  5. package/README.md +157 -230
  6. package/ROADMAP.md +85 -2
  7. package/SECURITY.md +8 -1
  8. package/dist/BUILD-MANIFEST.json +62 -32
  9. package/dist/adapters.js +4 -23
  10. package/dist/agent-lists.js +1 -1
  11. package/dist/agents-guide.js +113 -0
  12. package/dist/authoring-files.js +60 -0
  13. package/dist/authoring.js +11 -1
  14. package/dist/aws.js +4 -3
  15. package/dist/build-cloudflare.js +11 -24
  16. package/dist/bulk.js +37 -0
  17. package/dist/capabilities.js +208 -0
  18. package/dist/capability-query.js +72 -0
  19. package/dist/catalog.js +105 -0
  20. package/dist/cli.js +154 -15
  21. package/dist/client-address.js +1 -1
  22. package/dist/compliance-rules/baseline.js +8 -8
  23. package/dist/compliance-rules/privacy.js +3 -3
  24. package/dist/compliance-rules/strict.js +5 -5
  25. package/dist/conditions.js +88 -0
  26. package/dist/config.js +60 -4
  27. package/dist/context.js +156 -0
  28. package/dist/ecosystem-cli.js +88 -0
  29. package/dist/egress.js +98 -0
  30. package/dist/examples.js +92 -0
  31. package/dist/explain-cli.js +64 -0
  32. package/dist/explain.js +132 -0
  33. package/dist/extensions.js +172 -0
  34. package/dist/function-sources.js +15 -3
  35. package/dist/index.js +37 -0
  36. package/dist/init-with.js +165 -0
  37. package/dist/interchange-cli.js +42 -0
  38. package/dist/interchange.js +189 -0
  39. package/dist/link-cli.js +1 -1
  40. package/dist/management-policy.js +0 -1
  41. package/dist/manifest.js +111 -0
  42. package/dist/match.js +2 -2
  43. package/dist/mcp-authoring.js +147 -0
  44. package/dist/mcp.js +97 -0
  45. package/dist/observability.js +6 -0
  46. package/dist/operator-host.js +29 -0
  47. package/dist/plugins.js +12 -0
  48. package/dist/policies/agents.js +2 -2
  49. package/dist/policies/compression.js +2 -1
  50. package/dist/policies/security.js +0 -0
  51. package/dist/policies.js +1 -1
  52. package/dist/policy.js +29 -7
  53. package/dist/prerender.js +100 -41
  54. package/dist/project-tests.js +3 -3
  55. package/dist/provider-verification.js +92 -0
  56. package/dist/proxy.js +44 -0
  57. package/dist/readiness.js +5 -5
  58. package/dist/recipes.js +41 -0
  59. package/dist/route-diff.js +106 -0
  60. package/dist/router.js +42 -2
  61. package/dist/runtime.js +95 -14
  62. package/dist/schema-query.js +62 -0
  63. package/dist/signals.js +24 -0
  64. package/dist/site.js +0 -0
  65. package/dist/tooling.js +96 -0
  66. package/dist/types/adapters.d.ts +7 -4
  67. package/dist/types/agent-lists.d.ts +0 -1
  68. package/dist/types/agents-guide.d.ts +17 -0
  69. package/dist/types/authoring-files.d.ts +10 -0
  70. package/dist/types/aws.d.ts +3 -1
  71. package/dist/types/build-cloudflare.d.ts +1 -0
  72. package/dist/types/bulk.d.ts +27 -0
  73. package/dist/types/capabilities.d.ts +55 -0
  74. package/dist/types/capability-query.d.ts +24 -0
  75. package/dist/types/catalog.d.ts +65 -0
  76. package/dist/types/client-address.d.ts +0 -1
  77. package/dist/types/compliance-rules/baseline.d.ts +1 -9
  78. package/dist/types/compliance-rules/privacy.d.ts +1 -4
  79. package/dist/types/compliance-rules/strict.d.ts +0 -5
  80. package/dist/types/conditions.d.ts +19 -0
  81. package/dist/types/config.d.ts +20 -2
  82. package/dist/types/context.d.ts +65 -0
  83. package/dist/types/ecosystem-cli.d.ts +17 -0
  84. package/dist/types/egress.d.ts +46 -0
  85. package/dist/types/examples.d.ts +50 -0
  86. package/dist/types/explain-cli.d.ts +11 -0
  87. package/dist/types/explain.d.ts +95 -0
  88. package/dist/types/extensions.d.ts +122 -0
  89. package/dist/types/function-sources.d.ts +5 -0
  90. package/dist/types/index.d.ts +33 -0
  91. package/dist/types/init-with.d.ts +30 -0
  92. package/dist/types/interchange-cli.d.ts +16 -0
  93. package/dist/types/interchange.d.ts +42 -0
  94. package/dist/types/link-cli.d.ts +2 -1
  95. package/dist/types/management-policy.d.ts +0 -1
  96. package/dist/types/manifest.d.ts +81 -0
  97. package/dist/types/match.d.ts +1 -0
  98. package/dist/types/mcp-authoring.d.ts +92 -0
  99. package/dist/types/mcp.d.ts +12 -0
  100. package/dist/types/observability.d.ts +2 -0
  101. package/dist/types/operator-host.d.ts +8 -0
  102. package/dist/types/plugins.d.ts +2 -0
  103. package/dist/types/policies/agents.d.ts +0 -2
  104. package/dist/types/policies/compression.d.ts +2 -0
  105. package/dist/types/policies/security.d.ts +0 -1
  106. package/dist/types/policy.d.ts +15 -4
  107. package/dist/types/project-tests.d.ts +3 -1
  108. package/dist/types/provider-verification.d.ts +53 -0
  109. package/dist/types/proxy.d.ts +21 -0
  110. package/dist/types/readiness.d.ts +1 -1
  111. package/dist/types/recipes.d.ts +30 -0
  112. package/dist/types/route-diff.d.ts +27 -0
  113. package/dist/types/runtime.d.ts +11 -0
  114. package/dist/types/schema-query.d.ts +12 -0
  115. package/dist/types/signals.d.ts +25 -0
  116. package/dist/types/site.d.ts +0 -1
  117. package/dist/types/tooling.d.ts +115 -0
  118. package/dist/types/types.d.ts +57 -0
  119. package/dist/types/typescript-authoring.d.ts +12 -0
  120. package/dist/types/vercel.d.ts +3 -1
  121. package/dist/types/verify-deployment.d.ts +47 -0
  122. package/dist/types.js +21 -2
  123. package/dist/typescript-authoring.js +104 -0
  124. package/dist/vercel.js +4 -3
  125. package/dist/verify-deployment.js +270 -0
  126. package/docs/AI-AUTHORING.md +130 -8
  127. package/docs/BULK.md +79 -0
  128. package/docs/CAPABILITIES.md +179 -0
  129. package/docs/CAPACITY.md +1 -1
  130. package/docs/CI.md +142 -0
  131. package/docs/CONDITIONS.md +74 -0
  132. package/docs/DEPLOYMENT-CHECKS.md +108 -0
  133. package/docs/DYNAMIC-LINKS.md +18 -518
  134. package/docs/EGRESS.md +125 -0
  135. package/docs/EXTENSIONS.md +226 -0
  136. package/docs/FRAMEWORK.md +182 -0
  137. package/docs/INSTALL.md +45 -7
  138. package/docs/INTERCHANGE.md +134 -0
  139. package/docs/MIDDLEWARE-EXAMPLES.md +75 -0
  140. package/docs/MIDDLEWARE.md +2 -0
  141. package/docs/NEXT-PHASE-PLAN.md +90 -0
  142. package/docs/NEXT-STEPS.md +415 -0
  143. package/docs/OBSERVABILITY.md +4 -2
  144. package/docs/OPERATIONAL-PROOF.md +4 -1
  145. package/docs/OPERATIONS.md +6 -3
  146. package/docs/PLUGINS.md +37 -0
  147. package/docs/POLICIES.md +12 -309
  148. package/docs/PRERENDER.md +40 -0
  149. package/docs/PROJECT-DIRECTION.md +42 -0
  150. package/docs/PROVIDER-VERIFICATION.md +84 -0
  151. package/docs/READINESS.md +21 -1
  152. package/docs/README.md +82 -31
  153. package/docs/RECIPES.md +99 -0
  154. package/docs/RELEASE-READINESS.md +11 -9
  155. package/docs/RELEASE-SECURITY.md +27 -4
  156. package/docs/SECURITY-AUDIT.md +1 -1
  157. package/docs/SPECIFICATION.md +95 -8
  158. package/docs/SPIKE-BUSINESS-SUITE.md +1013 -0
  159. package/docs/SPIKE-EXTENSION-MODEL.md +419 -0
  160. package/docs/SPIKE-EXTENSIONS.md +1 -0
  161. package/docs/SPIKE-LAMBDA-COMPILE.md +199 -0
  162. package/docs/STANDARDS.md +150 -142
  163. package/docs/STARTERS.md +21 -1
  164. package/docs/TOOLING.md +291 -0
  165. package/docs/TYPESCRIPT-AUTHORING.md +67 -0
  166. package/docs/TYPESCRIPT.md +1 -1
  167. package/docs/USABILITY-REVIEW.md +123 -0
  168. package/docs/YAML-GUIDE.md +18 -479
  169. package/docs/YAML-REFERENCE.md +127 -16
  170. package/docs/links/cli.md +110 -0
  171. package/docs/links/limits.md +175 -0
  172. package/docs/links/management-api.md +80 -0
  173. package/docs/links/pools.md +75 -0
  174. package/docs/links/setup.md +135 -0
  175. package/docs/policies/agents.md +1 -1
  176. package/docs/policies/contract.md +52 -0
  177. package/docs/policies/hardened.md +56 -0
  178. package/docs/policies/interoperability.md +169 -0
  179. package/docs/policies/operations.md +45 -0
  180. package/docs/yaml/assets.md +36 -0
  181. package/docs/yaml/conditions.md +20 -0
  182. package/docs/yaml/functions.md +160 -0
  183. package/docs/yaml/links.md +30 -0
  184. package/docs/yaml/middleware.md +29 -0
  185. package/docs/yaml/organization.md +74 -0
  186. package/docs/yaml/policies.md +37 -0
  187. package/docs/yaml/redirects.md +64 -0
  188. package/docs/yaml/responses.md +57 -0
  189. package/docs/yaml/site.md +24 -0
  190. package/examples/assets/example.yaml +17 -0
  191. package/examples/aws/example.yaml +20 -0
  192. package/examples/cloudflare/example.yaml +19 -0
  193. package/examples/compliance/example.yaml +11 -0
  194. package/examples/conditions/README.md +12 -0
  195. package/examples/conditions/example.yaml +19 -0
  196. package/examples/conditions/tests/requests.json +13 -0
  197. package/examples/conditions/urlcode.yaml +24 -0
  198. package/examples/cookbook/README.md +8 -4
  199. package/examples/cookbook/example.yaml +17 -0
  200. package/examples/cookbook/functions/catalog.mjs +3 -0
  201. package/examples/cookbook/functions/fail.mjs +4 -0
  202. package/examples/cookbook/functions/items.mjs +3 -0
  203. package/examples/cookbook/functions/profile.mjs +3 -0
  204. package/examples/cookbook/functions/resource.mjs +3 -0
  205. package/examples/cookbook/functions/status.mjs +3 -0
  206. package/examples/cookbook/middleware/auth.mjs +48 -0
  207. package/examples/cookbook/middleware/body.mjs +15 -0
  208. package/examples/cookbook/middleware/bucket.mjs +19 -0
  209. package/examples/cookbook/middleware/cors.mjs +21 -0
  210. package/examples/cookbook/middleware/debug.mjs +13 -0
  211. package/examples/cookbook/middleware/envelope.mjs +11 -0
  212. package/examples/cookbook/middleware/errors.mjs +11 -0
  213. package/examples/cookbook/middleware/etag.mjs +18 -0
  214. package/examples/cookbook/middleware/locale.mjs +16 -0
  215. package/examples/cookbook/middleware/maintenance.mjs +10 -0
  216. package/examples/cookbook/middleware/methods.mjs +15 -0
  217. package/examples/cookbook/middleware/negotiate.mjs +20 -0
  218. package/examples/cookbook/middleware/referer.mjs +12 -0
  219. package/examples/cookbook/middleware/request-id.mjs +16 -0
  220. package/examples/cookbook/route-index.json +676 -0
  221. package/examples/cookbook/routes/middleware.yaml +126 -0
  222. package/examples/cookbook/tests/requests.json +526 -0
  223. package/examples/cookbook/urlcode.yaml +1 -0
  224. package/examples/egress/README.md +22 -0
  225. package/examples/egress/example.yaml +19 -0
  226. package/examples/egress/urlcode.yaml +19 -0
  227. package/examples/extensions/README.md +7 -0
  228. package/examples/extensions/example.yaml +21 -0
  229. package/examples/extensions/urlcode.yaml +25 -0
  230. package/examples/live-links/example.yaml +21 -0
  231. package/examples/monitoring/example.yaml +8 -0
  232. package/examples/prerender/example.yaml +16 -0
  233. package/examples/provider-conformance/README.md +12 -0
  234. package/examples/provider-conformance/example.yaml +14 -0
  235. package/examples/provider-conformance/urlcode.yaml +34 -0
  236. package/examples/tunnel/example.yaml +8 -0
  237. package/examples/vercel/example.yaml +19 -0
  238. package/llms-full.txt +2709 -0
  239. package/llms.txt +48 -19
  240. package/package.json +29 -7
  241. package/packaging/claude-plugin/.claude-plugin/plugin.json +19 -0
  242. package/packaging/claude-plugin/skills/urlcode-authoring/SKILL.md +106 -0
  243. package/packaging/claude-plugin/skills/urlcode-operations/SKILL.md +114 -0
  244. package/recipes/authenticated-json-api/README.md +51 -0
  245. package/recipes/authenticated-json-api/functions/profile.mjs +5 -0
  246. package/recipes/authenticated-json-api/recipe.yaml +34 -0
  247. package/recipes/authenticated-json-api/tests/requests.json +39 -0
  248. package/recipes/authenticated-json-api/urlcode.yaml +12 -0
  249. package/recipes/contact-form/README.md +25 -0
  250. package/recipes/contact-form/functions/contact.mjs +17 -0
  251. package/recipes/contact-form/recipe.yaml +33 -0
  252. package/recipes/contact-form/tests/requests.json +47 -0
  253. package/recipes/contact-form/urlcode.yaml +18 -0
  254. package/recipes/cors-api/README.md +16 -0
  255. package/recipes/cors-api/functions/items.mjs +3 -0
  256. package/recipes/cors-api/middleware/cors.mjs +21 -0
  257. package/recipes/cors-api/recipe.yaml +26 -0
  258. package/recipes/cors-api/tests/requests.json +65 -0
  259. package/recipes/cors-api/urlcode.yaml +12 -0
  260. package/recipes/health-page/README.md +13 -0
  261. package/recipes/health-page/recipe.yaml +23 -0
  262. package/recipes/health-page/tests/requests.json +36 -0
  263. package/recipes/health-page/urlcode.yaml +19 -0
  264. package/recipes/json-api/README.md +6 -0
  265. package/recipes/json-api/functions/echo.mjs +3 -0
  266. package/recipes/json-api/recipe.yaml +25 -0
  267. package/recipes/json-api/tests/requests.json +34 -0
  268. package/recipes/json-api/urlcode.yaml +12 -0
  269. package/recipes/middleware/README.md +34 -0
  270. package/recipes/middleware/functions/catalog.mjs +3 -0
  271. package/recipes/middleware/functions/fail.mjs +4 -0
  272. package/recipes/middleware/functions/items.mjs +3 -0
  273. package/recipes/middleware/functions/profile.mjs +3 -0
  274. package/recipes/middleware/functions/resource.mjs +3 -0
  275. package/recipes/middleware/functions/status.mjs +3 -0
  276. package/recipes/middleware/middleware/auth.mjs +48 -0
  277. package/recipes/middleware/middleware/body.mjs +15 -0
  278. package/recipes/middleware/middleware/bucket.mjs +19 -0
  279. package/recipes/middleware/middleware/cors.mjs +21 -0
  280. package/recipes/middleware/middleware/debug.mjs +13 -0
  281. package/recipes/middleware/middleware/envelope.mjs +11 -0
  282. package/recipes/middleware/middleware/errors.mjs +11 -0
  283. package/recipes/middleware/middleware/etag.mjs +18 -0
  284. package/recipes/middleware/middleware/locale.mjs +16 -0
  285. package/recipes/middleware/middleware/maintenance.mjs +10 -0
  286. package/recipes/middleware/middleware/methods.mjs +15 -0
  287. package/recipes/middleware/middleware/negotiate.mjs +20 -0
  288. package/recipes/middleware/middleware/referer.mjs +12 -0
  289. package/recipes/middleware/middleware/request-id.mjs +16 -0
  290. package/recipes/middleware/public/guide.txt +1 -0
  291. package/recipes/middleware/recipe.yaml +50 -0
  292. package/recipes/middleware/tests/requests.json +528 -0
  293. package/recipes/middleware/urlcode.yaml +127 -0
  294. package/recipes/protected-download/README.md +22 -0
  295. package/recipes/protected-download/files/report.txt +1 -0
  296. package/recipes/protected-download/recipe.yaml +31 -0
  297. package/recipes/protected-download/tests/requests.json +32 -0
  298. package/recipes/protected-download/urlcode.yaml +15 -0
  299. package/recipes/redirect/README.md +7 -0
  300. package/recipes/redirect/recipe.yaml +25 -0
  301. package/recipes/redirect/tests/requests.json +19 -0
  302. package/recipes/redirect/urlcode.yaml +9 -0
  303. package/recipes/static-plus-api/README.md +15 -0
  304. package/recipes/static-plus-api/functions/info.mjs +3 -0
  305. package/recipes/static-plus-api/public/assets/index.html +3 -0
  306. package/recipes/static-plus-api/public/assets/site.css +1 -0
  307. package/recipes/static-plus-api/public/index.html +8 -0
  308. package/recipes/static-plus-api/recipe.yaml +29 -0
  309. package/recipes/static-plus-api/tests/requests.json +56 -0
  310. package/recipes/static-plus-api/urlcode.yaml +23 -0
  311. package/recipes/typescript/README.md +7 -0
  312. package/recipes/typescript/functions/hello.ts +5 -0
  313. package/recipes/typescript/recipe.yaml +23 -0
  314. package/recipes/typescript/tests/requests.json +18 -0
  315. package/recipes/typescript/urlcode.yaml +5 -0
  316. package/recipes/webhook-receiver/README.md +16 -0
  317. package/recipes/webhook-receiver/functions/receive.mjs +16 -0
  318. package/recipes/webhook-receiver/recipe.yaml +26 -0
  319. package/recipes/webhook-receiver/tests/requests.json +59 -0
  320. package/recipes/webhook-receiver/urlcode.yaml +16 -0
  321. package/schemas/recipe.schema.json +138 -0
  322. package/schemas/urlcode.schema.json +656 -80
  323. package/skills/urlcode/SKILL.md +98 -0
  324. package/starters/default/.github/workflows/urlcode.yml +23 -0
  325. package/starters/default/.mcp.json +12 -0
  326. package/starters/default/AGENTS.md +79 -0
@@ -0,0 +1,11 @@
1
+ import type { RuntimeExtension } from './extensions.ts';
2
+ interface Options {
3
+ project: string;
4
+ target?: string | undefined;
5
+ origin?: string | undefined;
6
+ json?: boolean | undefined;
7
+ extensions?: RuntimeExtension[] | undefined;
8
+ }
9
+ /** Returns the process exit code: 1 when a requested route does not exist. */
10
+ export declare function runExplainCommand(command: 'explain' | 'manifest', route: string | undefined, options: Options, print: (value: unknown) => unknown): Promise<number>;
11
+ export {};
@@ -0,0 +1,95 @@
1
+ import type { CapabilityName, CapabilityTarget } from './capabilities.ts';
2
+ import type { RuntimeExtension } from './extensions.ts';
3
+ import type { CompiledRoute, LoadedDocument, PolicyChain, PolicyInventory, RouteState } from './types.ts';
4
+ import type { HandlerName } from './readiness.ts';
5
+ import type { ParameterSchema, ParameterLocation } from './match.ts';
6
+ import type { RequestBodyPolicy } from './http-policy.ts';
7
+ export interface ExplainedHandler {
8
+ kind: HandlerName | 'none';
9
+ [detail: string]: unknown;
10
+ }
11
+ export interface ExplainedParameter {
12
+ name: string;
13
+ in: ParameterLocation;
14
+ required: boolean;
15
+ schema: ParameterSchema;
16
+ }
17
+ export interface ExtensionProvider {
18
+ registered: boolean;
19
+ version?: string;
20
+ targets?: string[];
21
+ revisionMatch?: boolean;
22
+ requirementValid?: boolean | null;
23
+ }
24
+ export interface ExplainedExtensionRequirement {
25
+ requirement: Record<string, unknown>;
26
+ provider?: ExtensionProvider;
27
+ }
28
+ export interface ExplainedCache {
29
+ /** What a response from this route carries: the policy strategy, the header source or `none`. */
30
+ outcome: string;
31
+ cacheControl?: string;
32
+ forcedNoStore: boolean;
33
+ reason?: string;
34
+ }
35
+ export interface TargetSupport {
36
+ compatible: boolean;
37
+ issues: {
38
+ capability: CapabilityName;
39
+ support: string;
40
+ reason: string;
41
+ }[];
42
+ }
43
+ export interface RouteExplanation {
44
+ matched: true;
45
+ path: string;
46
+ description?: string;
47
+ generated?: string;
48
+ state: RouteState;
49
+ enabled: boolean;
50
+ expires?: string;
51
+ methods: string[];
52
+ conditional: boolean;
53
+ handler: ExplainedHandler;
54
+ middleware: {
55
+ source: string;
56
+ export: string;
57
+ }[];
58
+ inputs: {
59
+ parameters: ExplainedParameter[];
60
+ body?: RequestBodyPolicy;
61
+ };
62
+ policies: {
63
+ names: string[];
64
+ inventory: PolicyInventory;
65
+ extensions: Record<string, ExplainedExtensionRequirement>;
66
+ };
67
+ cache: ExplainedCache;
68
+ bindings: {
69
+ env: Record<string, {
70
+ env: string;
71
+ } | {
72
+ literal: true;
73
+ }>;
74
+ secrets: Record<string, {
75
+ secret: string;
76
+ }>;
77
+ };
78
+ egress: {
79
+ proxy?: string;
80
+ signals?: string[];
81
+ };
82
+ responseHeaders: [string, string][];
83
+ capabilities: CapabilityName[];
84
+ targets: Record<CapabilityTarget, TargetSupport>;
85
+ note: string;
86
+ }
87
+ export interface ExplainOptions {
88
+ extensions?: RuntimeExtension[] | undefined;
89
+ projectSha256?: string | undefined;
90
+ now?: number | undefined;
91
+ }
92
+ export declare function routeState(route: CompiledRoute, now: number): RouteState;
93
+ /** Describe one compiled route. `chain` is the policy chain compiled for it, when the project declares policies. */
94
+ export declare function explainCompiledRoute(loaded: LoadedDocument, route: CompiledRoute, chain: PolicyChain | undefined, options?: ExplainOptions): RouteExplanation;
95
+ export declare function nearestRoutes(target: string, patterns: Iterable<string>, limit?: number): string[];
@@ -0,0 +1,122 @@
1
+ import type { HandlerResult } from './http-response.ts';
2
+ import type { ProjectDocument, RouteConfig, TargetName } from './types.ts';
3
+ export type { HandlerResult } from './http-response.ts';
4
+ export interface ExtensionDeclaration {
5
+ version: '1';
6
+ config: Record<string, unknown>;
7
+ }
8
+ export type ExtensionPolicies = Record<string, Record<string, unknown> | false>;
9
+ export interface ExtensionActivation {
10
+ origin: string;
11
+ target: TargetName;
12
+ projectSha256: string;
13
+ mounts: readonly string[];
14
+ }
15
+ export interface ExtensionRequest {
16
+ method: string;
17
+ target: string;
18
+ path: string;
19
+ query: URLSearchParams;
20
+ headers: Headers;
21
+ headerCounts: Record<string, number>;
22
+ body: Uint8Array;
23
+ origin: string;
24
+ route: string;
25
+ mount: string | null;
26
+ client: string | null;
27
+ }
28
+ export interface ExtensionInstance {
29
+ handle(request: ExtensionRequest): HandlerResult | Promise<HandlerResult>;
30
+ authorize?(requirement: Readonly<Record<string, unknown>>, request: ExtensionRequest): HandlerResult | undefined | Promise<HandlerResult | undefined>;
31
+ close?(): void | Promise<void>;
32
+ }
33
+ /** Trusted operator code only. YAML declares names/configuration, never modules. */
34
+ /**
35
+ * Content-hashed assets under `<mount><prefix>/` may be cached publicly. The
36
+ * extension owns the hashed filename; the runtime only relaxes its no-store floor
37
+ * for a GET/HEAD 200/304 that carries a strong ETag, sets no cookie and does not
38
+ * vary on credentials. Everything else under the mount stays no-store.
39
+ */
40
+ export interface ExtensionImmutableAssets {
41
+ prefix: string;
42
+ }
43
+ export interface RuntimeExtension {
44
+ name: string;
45
+ version: '1';
46
+ projectSha256: string;
47
+ targets: TargetName[];
48
+ schema: object;
49
+ policySchema?: object;
50
+ credentialHeaders?: string[];
51
+ immutableAssets?: ExtensionImmutableAssets;
52
+ activate(config: Readonly<Record<string, unknown>>, context: ExtensionActivation): ExtensionInstance | Promise<ExtensionInstance>;
53
+ }
54
+ /** `urlcode init --with <name>` contract: what core hands `@jimhoyd/urlcode-<name>`'s `scaffold` export. Nothing is written by `scaffold`. */
55
+ export interface ScaffoldRequest {
56
+ /** Absolute site directory core creates; `files` paths in the result are relative to it. */
57
+ directory: string;
58
+ /** Absolute route project directory (holds urlcode.yaml), `<directory>/app`. */
59
+ project: string;
60
+ /** Absolute path of the combined host module core writes, `<directory>/host.mjs`. */
61
+ hostFile: string;
62
+ /** Every extension name being scaffolded together, in `--with` order, including this one. */
63
+ names: readonly string[];
64
+ }
65
+ export interface ScaffoldFile {
66
+ path: string;
67
+ content: string | Uint8Array;
68
+ mode?: number;
69
+ }
70
+ export interface ScaffoldResult {
71
+ /** Must equal the requested name. */
72
+ name: string;
73
+ /** Fragments merged into the project's top-level `extensions` and `routes`; duplicate keys are refused. */
74
+ extensions: Record<string, unknown>;
75
+ routes: Record<string, unknown>;
76
+ /** Host module lines: imports, then setup statements, then entries of the `extensions` array, then `close` statements. */
77
+ hostImports: string[];
78
+ hostSetup: string[];
79
+ hostEntries: string[];
80
+ hostClose?: string[];
81
+ /** Files written relative to `directory` with their modes; never inside the project, never overwriting. */
82
+ files: ScaffoldFile[];
83
+ /** Markdown appended to README.md under a heading core adds; the numbered steps merged in `--with` order. */
84
+ readme: string;
85
+ nextSteps: string[];
86
+ /** Environment variables the host reads, with one-line descriptions. */
87
+ env?: Record<string, string>;
88
+ }
89
+ export interface ActiveExtension {
90
+ instance: ExtensionInstance;
91
+ policies: Map<string, Readonly<Record<string, unknown>>>;
92
+ assetPrefixes: readonly string[];
93
+ }
94
+ /** What the runtime knows about the request when it applies the privacy floor. */
95
+ export interface ExtensionAssetContext {
96
+ method: string;
97
+ path: string;
98
+ prefixes: readonly string[];
99
+ }
100
+ export interface ExtensionRegistry {
101
+ entries: Map<string, ActiveExtension>;
102
+ credentialHeaders: string[];
103
+ close(): Promise<void>;
104
+ }
105
+ export declare const immutableCacheControl = "public, max-age=31536000, immutable";
106
+ /** Inspection alone grants nothing; operators must explicitly pin the returned revision. */
107
+ export declare function inspectExtensionRevision(project: string): Promise<string>;
108
+ export declare function effectiveExtensionPolicies(document: ProjectDocument, route: Pick<RouteConfig, 'policies'>): Record<string, Record<string, unknown>>;
109
+ export declare function hasExtensionPolicy(document: ProjectDocument, route: Pick<RouteConfig, 'policies'>): boolean;
110
+ export declare function prepareExtensions(document: ProjectDocument, routes: Record<string, RouteConfig>, registrations: RuntimeExtension[] | undefined, context: Omit<ExtensionActivation, 'mounts'>): {
111
+ activate(): Promise<ExtensionRegistry>;
112
+ };
113
+ /**
114
+ * The runtime decides; the extension cannot opt in from a response alone. The
115
+ * declared prefix, the GET/HEAD method, a 200/304 status, one strong ETag, no
116
+ * Set-Cookie and no Vary on Cookie/Authorization are all required. A stricter
117
+ * Cache-Control the extension set (no-store, no-cache, private or a shorter
118
+ * max-age) is preserved.
119
+ */
120
+ export declare function immutableAssetResponse(result: HandlerResult, asset: ExtensionAssetContext | undefined): boolean;
121
+ /** Mandatory privacy floor after trusted response hooks, with bounded output. */
122
+ export declare function extensionResponse(result: HandlerResult, asset?: ExtensionAssetContext): HandlerResult;
@@ -17,5 +17,10 @@ export interface FunctionSources {
17
17
  /** Absolute source path to module name. */
18
18
  names: Map<string, string>;
19
19
  }
20
+ /** Snapshot budgets: what one set of guest modules may cost. Deliberate bounds
21
+ * of the sandbox contract (docs/FUNCTION-SECURITY.md), not tuning knobs. */
22
+ export declare const MODULE_LIMIT = 128;
23
+ export declare const MODULE_BYTE_LIMIT = 1048576;
24
+ export declare const TOTAL_BYTE_LIMIT = 4194304;
20
25
  export declare function routeFunctions<D>(route: FunctionRoute<D>): D[];
21
26
  export declare function collectFunctionSources(routes: FunctionRoute[], root: string): Promise<FunctionSources>;
@@ -9,3 +9,36 @@ export { startLinkApi } from './link-api.ts';
9
9
  export type { LinkApi, LinkApiOptions } from './link-api.ts';
10
10
  export type { LinkEvent, LinkObserverOptions, LinkObserverStats } from './link-events.ts';
11
11
  export { events as observabilityEvents, validateObservers, createObserverSink, createMetrics, renderPrometheus } from './observability.ts';
12
+ export { getCapabilities, routeCapabilities, analyzeProjectCapabilities, analyzeCompiledCapabilities, assertTargetCompatibility, normalizeCapabilityTarget } from './capabilities.ts';
13
+ export { capabilityDetails } from './capabilities.ts';
14
+ export type { CapabilityTarget, CapabilityName, CapabilityKind, CapabilityDetail, CapabilitySupport, CapabilityDecision, CapabilityRequirement, CapabilityCatalog, CompatibilityReport } from './capabilities.ts';
15
+ export { importRoutes, exportRoutes } from './interchange.ts';
16
+ export type { InterchangeFormat, ConversionDiagnostic, ConversionCounts, ConversionReport, ImportRoutesOptions, ExportRoutesOptions } from './interchange.ts';
17
+ export { listRecipes, searchRecipes, showRecipe, addRecipe } from './recipes.ts';
18
+ export type { RecipeSummary, Recipe, RecipeAddReport, RecipeSearchResult } from './recipes.ts';
19
+ export { listExamples, searchExamples } from './examples.ts';
20
+ export type { ExampleSummary, ExampleSearchResult, RouteIndex, RouteIndexEntry } from './examples.ts';
21
+ export type { CatalogMetadata, TargetVerdict, Complexity } from './catalog.ts';
22
+ export { buildTypeScriptProject } from './typescript-authoring.ts';
23
+ export type { TypeScriptBuildReport } from './typescript-authoring.ts';
24
+ export { importBulkProject } from './bulk.ts';
25
+ export type { BulkFormat, BulkFilePlan, BulkImportReport } from './bulk.ts';
26
+ export { inspectProject, validateProject, explainRoute, explainProject, previewImport, previewExport, getCapability, getSchemaFragment, schemaPathNames, inspectExtensions, describeExtensions, buildContext, renderContext, estimateTokens, documentationTokens } from './tooling.ts';
27
+ export type { InspectOptions, RouteExplanation, RouteMiss, ExplainedHandler, ExplainedCache, ExplainedExtensionRequirement, ExtensionProvider, TargetSupport, CapabilityEntry, CapabilityUsage, SchemaFragment, ExtensionInspection, ContextOptions, ProjectContext, ContextSection } from './tooling.ts';
28
+ export { buildManifest, renderManifest, MANIFEST_SCHEMA_VERSION } from './manifest.ts';
29
+ export type { Manifest, ManifestRoute, ManifestModule, RecipeProvenance } from './manifest.ts';
30
+ export { serveMcp } from './mcp.ts';
31
+ export type { McpOptions } from './mcp.ts';
32
+ export { providerConformanceCases, runProviderConformance, verifyProviderDeployment } from './provider-verification.ts';
33
+ export type { VerificationTarget, ProviderProbe, ProviderAnswer, ProviderTransport, ProviderVerificationOptions, ProviderFinding, ProviderVerificationReport } from './provider-verification.ts';
34
+ export { normalizeMatch, assertDisjointMatches, matchesRoute } from './conditions.ts';
35
+ export type { RouteMatch, ConditionRequest } from './conditions.ts';
36
+ export { buildCloudflare } from './build-cloudflare.ts';
37
+ export type { BuildOptions as CloudflareBuildOptions, BuildReport as CloudflareBuildReport } from './build-cloudflare.ts';
38
+ export { runProjectTests } from './project-tests.ts';
39
+ export type { ProjectTestOptions, ProjectTestResult } from './project-tests.ts';
40
+ export { scaffoldProject } from './scaffold.ts';
41
+ export type { ScaffoldReport, Unresolved as ScaffoldUnresolved } from './scaffold.ts';
42
+ export { initProject, addRedirect } from './authoring.ts';
43
+ export { initProjectWith } from './init-with.ts';
44
+ export type { ScaffoldRequest, ScaffoldResult, ScaffoldFile } from './extensions.ts';
@@ -0,0 +1,30 @@
1
+ import type { ScaffoldRequest, ScaffoldResult } from './extensions.ts';
2
+ /** Directory names inside the generated site. The route project lives under `app/`; everything else is operator-owned. */
3
+ export declare const PROJECT_DIRECTORY = "app", HOST_FILE = "host.mjs", ROUTES_FILE = "routes/extensions.yaml";
4
+ export interface InitWithOptions {
5
+ cwd?: string | undefined;
6
+ }
7
+ export interface InitWithResult {
8
+ directory: string;
9
+ project: string;
10
+ hostFile: string;
11
+ extensions: string[];
12
+ projectSha256: string;
13
+ nextSteps: string[];
14
+ }
15
+ export declare function parseWithNames(value: string): string[];
16
+ export declare const packageName: (name: string) => string;
17
+ /**
18
+ * Resolves the extension package from the invoking directory (Node's package resolution with the default
19
+ * conditions), imports it, and calls its `scaffold` export. Nothing is bundled; core never imports these packages
20
+ * at build time. Refuses a missing package or a package without `scaffold` before anything is written.
21
+ */
22
+ export declare function loadScaffold(name: string, request: ScaffoldRequest, cwd: string): Promise<ScaffoldResult>;
23
+ export declare function renderHost(names: readonly string[], results: readonly ScaffoldResult[]): string;
24
+ export declare function renderReadme(directory: string, names: readonly string[], results: readonly ScaffoldResult[], starter: string, env: Record<string, string>, projectSha256: string): string;
25
+ /**
26
+ * `urlcode init <directory> --with a,b`: the starter under `app/`, every extension's fragments merged into one
27
+ * `urlcode.yaml`, one `host.mjs`, one `README.md` and the extensions' own files. All packages are resolved and
28
+ * their scaffolds computed before anything is written, so a refusal leaves no directory behind.
29
+ */
30
+ export declare function initProjectWith(destination: string, names: readonly string[], { cwd }?: InitWithOptions): Promise<InitWithResult>;
@@ -0,0 +1,16 @@
1
+ import type { ConversionReport } from './interchange.ts';
2
+ interface InterchangeCliOptions {
3
+ project: string;
4
+ target?: string | undefined;
5
+ format?: string | undefined;
6
+ out?: string | undefined;
7
+ report?: string | undefined;
8
+ dryRun?: boolean | undefined;
9
+ acceptProviderDifferences?: boolean | undefined;
10
+ }
11
+ export declare function readConversionInput(file: string): Promise<string>;
12
+ export declare function runInterchange(command: 'import' | 'export', args: string[], options: InterchangeCliOptions): Promise<{
13
+ report: ConversionReport;
14
+ text: string;
15
+ }>;
16
+ export {};
@@ -0,0 +1,42 @@
1
+ import type { ProjectDocument } from './types.ts';
2
+ export type InterchangeFormat = 'csv' | 'json' | 'yaml' | 'netlify' | 'cloudflare' | 'vercel' | 'netlify-toml';
3
+ export interface ConversionDiagnostic {
4
+ severity: 'error' | 'warning';
5
+ code: string;
6
+ source: string;
7
+ row?: number;
8
+ path?: string;
9
+ message: string;
10
+ }
11
+ export interface ConversionCounts {
12
+ convertedRoutes: number;
13
+ nativeEquivalentRoutes: number;
14
+ runtimeRequiredRoutes: number;
15
+ unsupportedRows: number;
16
+ providerDifferenceRoutes: number;
17
+ fullyScanned: boolean;
18
+ }
19
+ export interface ConversionReport {
20
+ counts: ConversionCounts;
21
+ ok: boolean;
22
+ lossless: boolean;
23
+ routeCount: number;
24
+ diagnostics: ConversionDiagnostic[];
25
+ document?: ProjectDocument;
26
+ output?: string;
27
+ }
28
+ export interface ImportRoutesOptions {
29
+ format: InterchangeFormat;
30
+ text: string;
31
+ source?: string;
32
+ acceptProviderDifferences?: boolean;
33
+ }
34
+ export interface ExportRoutesOptions {
35
+ format: InterchangeFormat;
36
+ document: ProjectDocument;
37
+ source?: string;
38
+ acceptProviderDifferences?: boolean;
39
+ }
40
+ /** Pure conversion: does not read projects, resolve bindings, execute guests or write files. */
41
+ export declare function importRoutes(options: ImportRoutesOptions): Promise<ConversionReport>;
42
+ export declare function exportRoutes(options: ExportRoutesOptions): Promise<ConversionReport>;
@@ -1,5 +1,5 @@
1
1
  /** The parsed command-line values the links commands read; every flag is a string or absent. */
2
- export interface LinkCommandValues {
2
+ interface LinkCommandValues {
3
3
  project?: string | undefined;
4
4
  store?: string | undefined;
5
5
  collection?: string | undefined;
@@ -34,3 +34,4 @@ export interface LinkBinding extends LinkPoolOptions {
34
34
  export declare function linkPoolOptions(values: LinkCommandValues): LinkPoolOptions;
35
35
  export declare function parseLinkBinding(value: string | undefined, options?: LinkPoolOptions): LinkBinding | undefined;
36
36
  export declare function runLinkCommand(action: string | undefined, values: LinkCommandValues, print: Print): Promise<void>;
37
+ export {};
@@ -1,4 +1,3 @@
1
- export type ManagementAction = 'get' | 'list' | 'create' | 'update' | 'delete';
2
1
  /** A credential from the operator's management policy file, once it authenticated a request. */
3
2
  export interface ManagementPrincipal {
4
3
  id: string;
@@ -0,0 +1,81 @@
1
+ import type { CapabilityName, CapabilityTarget } from './capabilities.ts';
2
+ import type { InspectOptions } from './tooling.ts';
3
+ import type { RouteExplanation } from './explain.ts';
4
+ export declare const MANIFEST_SCHEMA_VERSION = 1;
5
+ export interface ManifestRoute {
6
+ path: string;
7
+ methods: string[];
8
+ handler: RouteExplanation['handler'];
9
+ enabled: boolean;
10
+ expires?: string;
11
+ generated?: string;
12
+ description?: string;
13
+ middleware: {
14
+ source: string;
15
+ export: string;
16
+ }[];
17
+ parameters: RouteExplanation['inputs']['parameters'];
18
+ body?: RouteExplanation['inputs']['body'];
19
+ policies: string[];
20
+ extensions: Record<string, Record<string, unknown>>;
21
+ cache: RouteExplanation['cache'];
22
+ bindings: {
23
+ env: string[];
24
+ secrets: string[];
25
+ };
26
+ egress: RouteExplanation['egress'];
27
+ capabilities: CapabilityName[];
28
+ targets: Record<CapabilityTarget, boolean>;
29
+ }
30
+ export interface ManifestModule {
31
+ source: string;
32
+ export: string;
33
+ routes: string[];
34
+ }
35
+ export interface RecipeProvenance {
36
+ id: string;
37
+ description?: string;
38
+ version?: string;
39
+ source?: string;
40
+ }
41
+ export interface Manifest {
42
+ schemaVersion: typeof MANIFEST_SCHEMA_VERSION;
43
+ urlcode: string;
44
+ entry: string;
45
+ files: string[];
46
+ revision: string;
47
+ configVersion: string;
48
+ routeCount: number;
49
+ routes: ManifestRoute[];
50
+ capabilities: CapabilityName[];
51
+ extensions: Record<string, {
52
+ version: string;
53
+ configKeys: string[];
54
+ mounts: string[];
55
+ protectedRoutes: string[];
56
+ }>;
57
+ recipes: RecipeProvenance[];
58
+ external: {
59
+ env: string[];
60
+ secrets: string[];
61
+ egress: {
62
+ proxy: string[];
63
+ signals: string[];
64
+ };
65
+ extensions: string[];
66
+ linkStores: string[];
67
+ dynamicLinks: boolean;
68
+ };
69
+ functions: ManifestModule[];
70
+ middleware: ManifestModule[];
71
+ targets: Record<CapabilityTarget, {
72
+ compatible: boolean;
73
+ issues: number;
74
+ }>;
75
+ }
76
+ /** Build the semantic manifest for a project from its compiled IR. Deterministic for a given project. */
77
+ export declare function buildManifest(project: string, options?: InspectOptions): Promise<Manifest>;
78
+ /** The manifest as `build` writes it: two-space JSON with a trailing newline. */
79
+ export declare function renderManifest(manifest: Manifest): string;
80
+ export declare const manifestFileName = "manifest.json";
81
+ export declare function manifestPath(out: string): string;
@@ -37,6 +37,7 @@ export interface MatchableRoute {
37
37
  pattern: string;
38
38
  parts: string[];
39
39
  prefix?: string;
40
+ extension?: string;
40
41
  parameters: CompiledParameter[];
41
42
  env: Record<string, string>;
42
43
  secrets: Record<string, string>;
@@ -0,0 +1,92 @@
1
+ export declare const authoringDefinitions: ({
2
+ name: string;
3
+ description: string;
4
+ properties: {
5
+ path: {
6
+ type: string;
7
+ maxLength: number;
8
+ };
9
+ handler: {
10
+ anyOf: ({
11
+ type: string;
12
+ maxLength: number;
13
+ } | {
14
+ type: string;
15
+ maxLength?: never;
16
+ })[];
17
+ };
18
+ middleware: {
19
+ type: string;
20
+ maxItems: number;
21
+ items: {
22
+ anyOf: ({
23
+ type: string;
24
+ maxLength: number;
25
+ } | {
26
+ type: string;
27
+ maxLength?: never;
28
+ })[];
29
+ };
30
+ };
31
+ file: {
32
+ type: string;
33
+ maxLength: number;
34
+ };
35
+ name?: never;
36
+ destination?: never;
37
+ dryRun?: never;
38
+ };
39
+ required: string[];
40
+ } | {
41
+ name: string;
42
+ description: string;
43
+ properties: {
44
+ name: {
45
+ type: string;
46
+ maxLength: number;
47
+ };
48
+ destination: {
49
+ type: string;
50
+ maxLength: number;
51
+ };
52
+ dryRun: {
53
+ type: string;
54
+ };
55
+ path?: never;
56
+ handler?: never;
57
+ middleware?: never;
58
+ file?: never;
59
+ };
60
+ required: string[];
61
+ } | {
62
+ name: string;
63
+ description: string;
64
+ properties: {
65
+ dryRun: {
66
+ type: string;
67
+ };
68
+ path?: never;
69
+ handler?: never;
70
+ middleware?: never;
71
+ file?: never;
72
+ name?: never;
73
+ destination?: never;
74
+ };
75
+ required: never[];
76
+ } | {
77
+ name: string;
78
+ description: string;
79
+ properties: {
80
+ path?: never;
81
+ handler?: never;
82
+ middleware?: never;
83
+ file?: never;
84
+ name?: never;
85
+ destination?: never;
86
+ dryRun?: never;
87
+ };
88
+ required: never[];
89
+ })[];
90
+ /** A project-relative path an authoring tool may create or replace: no absolute, `..`, hidden (`.env*`, `.git`), credential or operator names, and no symlink anywhere on the walk. */
91
+ export declare function confinedPath(root: string, path: unknown): Promise<string>;
92
+ export declare function callAuthoringTool(root: string, name: string, args: Record<string, unknown>, origin?: string): Promise<unknown>;
@@ -0,0 +1,12 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ /** `allowAuthoring` and `hostFile` are set only by the `--allow-authoring` and `--host-file` command-line flags; tool arguments and the environment never enable them. */
3
+ export interface McpOptions {
4
+ project: string;
5
+ input?: Readable;
6
+ output?: Writable;
7
+ origin?: string;
8
+ allowAuthoring?: boolean;
9
+ hostFile?: string;
10
+ }
11
+ /** Operator selects the only project root. Read tools have no path, credential, write or execution authority; authoring tools write inside that root only. */
12
+ export declare function serveMcp(options: McpOptions): Promise<void>;
@@ -1,4 +1,5 @@
1
1
  export declare const events: Readonly<{
2
+ signal: readonly string[];
2
3
  request: readonly string[];
3
4
  reload: readonly string[];
4
5
  watch: readonly string[];
@@ -70,6 +71,7 @@ export interface MetricsSnapshot {
70
71
  agents: Counters;
71
72
  cache: Counters;
72
73
  };
74
+ signals: Counters;
73
75
  linkRequests: Counters;
74
76
  linkObserver: {
75
77
  failed: number;
@@ -0,0 +1,8 @@
1
+ import type { RuntimeOptions } from './runtime.ts';
2
+ /** Explicitly loaded operator code. Never discovered in application directories. */
3
+ export interface OperatorHost {
4
+ extensions?: RuntimeOptions['extensions'];
5
+ plugins?: RuntimeOptions['plugins'];
6
+ close?(): void | Promise<void>;
7
+ }
8
+ export declare function loadOperatorHost(file: string | undefined, project: string): Promise<OperatorHost>;
@@ -13,6 +13,8 @@ export interface Plugin {
13
13
  name: string;
14
14
  version: string;
15
15
  targets: TargetName[];
16
+ /** Operator-owned header names withheld from every guest Request and input context. */
17
+ credentialHeaders?: string[];
16
18
  onActivate?(runtime: PluginRuntime): void | Promise<void>;
17
19
  onRequest?(request: PolicyRequest): HandlerResult | undefined | void | Promise<HandlerResult | undefined | void>;
18
20
  onResponse?(request: PolicyRequest, result: HandlerResult): HandlerResult | undefined | void | Promise<HandlerResult | undefined | void>;
@@ -70,8 +70,6 @@ export interface AgentsDescription {
70
70
  };
71
71
  }
72
72
  export declare const bundledLists: readonly string[];
73
- export declare const MAX_PATTERN_BYTES = 256;
74
- export declare const MAX_REPEAT = 64;
75
73
  export declare function validatePattern(pattern: unknown): string | undefined;
76
74
  export declare function isBundled(reference: string): boolean;
77
75
  export declare function isListFile(reference: unknown): reference is string;
@@ -31,6 +31,8 @@ export interface CompressionDescription {
31
31
  level: number | null;
32
32
  precompressed: number;
33
33
  }
34
+ /** The media types compressed when `types` is not declared; exported so the deployment verifier reads the same table. */
35
+ export declare const DEFAULT_TYPES: string[];
34
36
  export declare const zstdAvailable: boolean;
35
37
  export declare function targets(): Record<TargetName, PolicySupport>;
36
38
  export declare function compile(config: CompressionConfig, { route, shared }: PolicyContext): Promise<CompressionState>;
@@ -21,7 +21,6 @@ export interface SecurityDescription {
21
21
  }
22
22
  export declare const name = "security";
23
23
  export declare const phases: readonly string[];
24
- export declare const oshpRevision = "OSHP 2024 best practices";
25
24
  export declare const profiles: Readonly<Record<string, readonly (readonly [string, string])[]>>;
26
25
  export declare const reservedHeaders: Readonly<Set<string>>;
27
26
  export declare function targets(): Record<string, 'native' | 'compiled'>;