@pulse-compute/wasm-contracts 0.0.0 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/README.md +35 -2
  2. package/package.json +124 -6
  3. package/src/assets/contracts.js +296 -0
  4. package/src/config/provider-resolution.js +54 -0
  5. package/src/config/runtime-provider-kv.js +73 -0
  6. package/src/config/symbolic-refs.js +192 -0
  7. package/src/crypto/contracts.js +647 -0
  8. package/src/definitions/config-schema.js +30 -0
  9. package/src/definitions/handler-roles.js +66 -0
  10. package/src/definitions/path-grammar.js +11 -0
  11. package/src/definitions/router-api.js +149 -0
  12. package/src/diagnostics/codes.js +42 -0
  13. package/src/diagnostics/reporter.js +20 -0
  14. package/src/diagnostics.js +139 -0
  15. package/src/dispatch-table.js +23 -0
  16. package/src/entities/catalog.d.ts +7 -0
  17. package/src/entities/catalog.js +87 -0
  18. package/src/entities/contracts.d.ts +95 -0
  19. package/src/entities/contracts.js +122 -0
  20. package/src/entities/json-rpc.d.ts +27 -0
  21. package/src/entities/json-rpc.js +69 -0
  22. package/src/entities/runtime.d.ts +67 -0
  23. package/src/entities/runtime.js +288 -0
  24. package/src/events/contracts.js +456 -0
  25. package/src/execution-plan.js +42 -0
  26. package/src/grip/contracts.js +106 -0
  27. package/src/handler/backend-json-request-body.js +58 -0
  28. package/src/handler/beta-lifecycle-golden.js +97 -0
  29. package/src/handler/canonical-native-plan.js +143 -0
  30. package/src/handler/canonical-native-runtime.js +168 -0
  31. package/src/handler/canonical-runtime.js +13 -0
  32. package/src/handler/context.js +131 -0
  33. package/src/handler/ctx-contract.js +71 -0
  34. package/src/handler/doctor-readiness-aggregator.js +67 -0
  35. package/src/handler/effects.js +446 -0
  36. package/src/handler/io-lifecycle.js +134 -0
  37. package/src/handler/lifecycle-authoring-alignment.js +56 -0
  38. package/src/handler/lifecycle-readiness-aggregate.js +93 -0
  39. package/src/handler/reference-node-lifecycle-golden.js +73 -0
  40. package/src/handler/request-json-body.js +147 -0
  41. package/src/handler/runtime-api.js +471 -0
  42. package/src/handler/schema-decode-result.js +135 -0
  43. package/src/handler/schema-response-codec.js +141 -0
  44. package/src/handler/surface-contract.js +601 -0
  45. package/src/handler/types-contract.js +51 -0
  46. package/src/handler-table.js +28 -0
  47. package/src/host/backend-capabilities.js +24 -0
  48. package/src/host/capabilities.js +273 -0
  49. package/src/host/channel-broadcaster.js +60 -0
  50. package/src/host/json-body.js +80 -0
  51. package/src/host/request-result-headers.js +38 -0
  52. package/src/host/streaming-passthrough.js +90 -0
  53. package/src/host/wasm-host-abi.js +154 -0
  54. package/src/index.js +75 -0
  55. package/src/jwt/contracts.js +427 -0
  56. package/src/library/api-surface.js +99 -0
  57. package/src/library/contracts.js +273 -0
  58. package/src/library/manifest.js +317 -0
  59. package/src/library/second-package-owned-lowering.js +39 -0
  60. package/src/library/sidecars.js +147 -0
  61. package/src/logging.js +89 -0
  62. package/src/package/package-contract.js +975 -0
  63. package/src/package/package-contract.schema.json +303 -0
  64. package/src/package/runtime-pulse-live.js +100 -0
  65. package/src/path-table.js +12 -0
  66. package/src/path.js +275 -0
  67. package/src/project/config-factory.js +48 -0
  68. package/src/project/config-plan.js +409 -0
  69. package/src/project/config-runtime.js +46 -0
  70. package/src/project/javascript-application.js +212 -0
  71. package/src/project/javascript-core-capabilities.js +44 -0
  72. package/src/project/native-optimization.js +9 -0
  73. package/src/project/package-ownership.js +242 -0
  74. package/src/project/package-product-projection.js +171 -0
  75. package/src/project/reachable-graph-identity.js +219 -0
  76. package/src/project/reachable-graph-projections.js +279 -0
  77. package/src/project/reachable-graph-resolver.js +303 -0
  78. package/src/project/reachable-graph-v2.js +430 -0
  79. package/src/project/reachable-graph-v2.schema.json +285 -0
  80. package/src/project/reachable-graph.js +199 -0
  81. package/src/project/reachable-graph.schema.json +222 -0
  82. package/src/project/target-support-evidence.js +559 -0
  83. package/src/provider/canonical-provider.js +239 -0
  84. package/src/provider/final-wasm-policy.js +87 -0
  85. package/src/provider/toolchain.js +771 -0
  86. package/src/route-plan.js +43 -0
  87. package/src/s3/contracts.js +12 -0
  88. package/src/schema-json/compile.js +63 -0
  89. package/src/schema-json/contracts.js +10 -0
  90. package/src/schema-json/generic-parser.js +62 -0
  91. package/src/schema-json/registry.js +359 -0
  92. package/src/schema-json/semantic-trace.js +241 -0
  93. package/src/schema-json/v1.js +65 -0
  94. package/src/schema-json/v2.js +110 -0
  95. package/src/sha256.js +104 -0
  96. package/src/spine.js +381 -0
  97. package/src/stable-id.js +142 -0
package/README.md CHANGED
@@ -1,3 +1,36 @@
1
- # @pulse-compute/wasm-contracts
1
+ # `@pulse-compute/wasm-contracts`
2
2
 
3
- This is an inert namespace-bootstrap package. It contains no executable code.
3
+ <!-- pulse-package-status:start -->
4
+ > **Support tier:** Implementation/transitive surface<br>
5
+ > **Audience:** Pulse compiler, runtime, provider, and package-lowering maintainers.<br>
6
+ > **Install directly:** Provider toolchain authors may install it for the versioned bootstrap contract; application projects receive it transitively.<br>
7
+ > **Supported entry points:** `@pulse-compute/wasm-contracts/provider/toolchain`<br>
8
+ > **Stability:** The provider toolchain contract is versioned and supported for the Beta; other protocol and proof interfaces remain internal.<br>
9
+ > **npm:** [`@pulse-compute/wasm-contracts`](https://www.npmjs.com/package/@pulse-compute/wasm-contracts)<br>
10
+ > **Canonical documentation:** [Package guide](https://pulsecompute.io/v1.0.0-beta.2/packages/implementation-packages/)
11
+ >
12
+ > This release-status block is generated from the synchronized `Pulse 1.0.0-beta.2` package policy.
13
+ <!-- pulse-package-status:end -->
14
+
15
+ This package owns stable data contracts shared by the compiler, runtime, and providers.
16
+
17
+ Public contract categories include:
18
+
19
+ - route/path/dispatch/execution contracts;
20
+ - handler effect and context contracts;
21
+ - host ABI, headers, JSON body, and streaming contracts;
22
+ - package-owned lowerer contracts;
23
+ - schema JSON contracts;
24
+ - provider-neutral config, provider, and KV contracts;
25
+ - the canonical app runtime facade;
26
+ - project capability and Native optimization identity contracts.
27
+
28
+ Canonical Beta imports:
29
+
30
+ ```js
31
+ const runtimeApi = require('@pulse-compute/wasm-contracts/handler/runtime-api')
32
+ const canonicalProvider = require('@pulse-compute/wasm-contracts/provider/canonical-provider')
33
+ ```
34
+
35
+ Fastly primitive realization is owned by `@pulse-compute/provider-fastly`.
36
+ Historical confidence-pass modules are private implementation sources. They are not package exports and must not be used as application or provider API.
package/package.json CHANGED
@@ -1,15 +1,133 @@
1
1
  {
2
2
  "name": "@pulse-compute/wasm-contracts",
3
- "version": "0.0.0",
4
- "description": "Inert namespace bootstrap for Pulse.",
3
+ "version": "1.0.0-beta.2",
5
4
  "license": "Apache-2.0",
5
+ "engines": {
6
+ "node": "^22.14.0 || ^24.0.0"
7
+ },
8
+ "description": "Shared PulseWasm contracts, diagnostics, IDs, config/provider symbolic contracts, route/path grammar, host ABI/payload contracts, library/sidecar contracts, schema-json contracts, host capability registry, artifact contract constants, and provider shape helpers.",
9
+ "type": "commonjs",
10
+ "main": "./src/index.js",
11
+ "exports": {
12
+ ".": "./src/index.js",
13
+ "./compiler-spine": "./src/spine.js",
14
+ "./logging": "./src/logging.js",
15
+ "./handler/surface-contract": "./src/handler/surface-contract.js",
16
+ "./project/config-plan": "./src/project/config-plan.js",
17
+ "./project/config-factory": "./src/project/config-factory.js",
18
+ "./project/package-ownership": "./src/project/package-ownership.js",
19
+ "./diagnostics": "./src/diagnostics.js",
20
+ "./diagnostics/codes": "./src/diagnostics/codes.js",
21
+ "./diagnostics/reporter": "./src/diagnostics/reporter.js",
22
+ "./stable-id": "./src/stable-id.js",
23
+ "./sha256": "./src/sha256.js",
24
+ "./path": "./src/path.js",
25
+ "./route-plan": "./src/route-plan.js",
26
+ "./dispatch-table": "./src/dispatch-table.js",
27
+ "./execution-plan": "./src/execution-plan.js",
28
+ "./path-table": "./src/path-table.js",
29
+ "./handler-table": "./src/handler-table.js",
30
+ "./assets/contracts": "./src/assets/contracts.js",
31
+ "./crypto/contracts": "./src/crypto/contracts.js",
32
+ "./jwt/contracts": "./src/jwt/contracts.js",
33
+ "./events": "./src/events/contracts.js",
34
+ "./entities/contracts": {
35
+ "types": "./src/entities/contracts.d.ts",
36
+ "require": "./src/entities/contracts.js",
37
+ "default": "./src/entities/contracts.js"
38
+ },
39
+ "./entities/runtime": {
40
+ "types": "./src/entities/runtime.d.ts",
41
+ "require": "./src/entities/runtime.js",
42
+ "default": "./src/entities/runtime.js"
43
+ },
44
+ "./entities/json-rpc": {
45
+ "types": "./src/entities/json-rpc.d.ts",
46
+ "require": "./src/entities/json-rpc.js",
47
+ "default": "./src/entities/json-rpc.js"
48
+ },
49
+ "./entities/catalog": {
50
+ "types": "./src/entities/catalog.d.ts",
51
+ "require": "./src/entities/catalog.js",
52
+ "default": "./src/entities/catalog.js"
53
+ },
54
+ "./host/capabilities": "./src/host/capabilities.js",
55
+ "./host/wasm-host-abi": "./src/host/wasm-host-abi.js",
56
+ "./host/request-result-headers": "./src/host/request-result-headers.js",
57
+ "./host/channel-broadcaster": "./src/host/channel-broadcaster.js",
58
+ "./host/json-body": "./src/host/json-body.js",
59
+ "./host/streaming-passthrough": "./src/host/streaming-passthrough.js",
60
+ "./host/backend-capabilities": "./src/host/backend-capabilities.js",
61
+ "./library/contracts": "./src/library/contracts.js",
62
+ "./library/sidecars": "./src/library/sidecars.js",
63
+ "./library/api-surface": "./src/library/api-surface.js",
64
+ "./schema-json/contracts": "./src/schema-json/contracts.js",
65
+ "./schema-json/v1": "./src/schema-json/v1.js",
66
+ "./schema-json/v2": "./src/schema-json/v2.js",
67
+ "./schema-json/compile": "./src/schema-json/compile.js",
68
+ "./schema-json/generic-parser": "./src/schema-json/generic-parser.js",
69
+ "./schema-json/registry": "./src/schema-json/registry.js",
70
+ "./schema-json/semantic-trace": "./src/schema-json/semantic-trace.js",
71
+ "./config/symbolic-refs": "./src/config/symbolic-refs.js",
72
+ "./config/provider-resolution": "./src/config/provider-resolution.js",
73
+ "./config/runtime-provider-kv": "./src/config/runtime-provider-kv.js",
74
+ "./definitions/config-schema": "./src/definitions/config-schema.js",
75
+ "./definitions/handler-roles": "./src/definitions/handler-roles.js",
76
+ "./definitions/router-api": "./src/definitions/router-api.js",
77
+ "./definitions/path-grammar": "./src/definitions/path-grammar.js",
78
+ "./library/manifest": "./src/library/manifest.js",
79
+ "./handler/effects": "./src/handler/effects.js",
80
+ "./handler/context": "./src/handler/context.js",
81
+ "./handler/context-lowering": "./src/handler/context.js",
82
+ "./handler/io-lifecycle": "./src/handler/io-lifecycle.js",
83
+ "./handler/request-json-body": "./src/handler/request-json-body.js",
84
+ "./handler/schema-decode-result": "./src/handler/schema-decode-result.js",
85
+ "./handler/schema-response-codec": "./src/handler/schema-response-codec.js",
86
+ "./handler/backend-json-request-body": "./src/handler/backend-json-request-body.js",
87
+ "./handler/reference-node-lifecycle-golden": "./src/handler/reference-node-lifecycle-golden.js",
88
+ "./handler/beta-lifecycle-golden": "./src/handler/beta-lifecycle-golden.js",
89
+ "./handler/lifecycle-authoring-alignment": "./src/handler/lifecycle-authoring-alignment.js",
90
+ "./handler/doctor-readiness-aggregator": "./src/handler/doctor-readiness-aggregator.js",
91
+ "./grip/contracts": "./src/grip/contracts.js",
92
+ "./library/second-package-owned-lowering": "./src/library/second-package-owned-lowering.js",
93
+ "./handler/runtime-api": "./src/handler/runtime-api.js",
94
+ "./handler/canonical-runtime": "./src/handler/canonical-runtime.js",
95
+ "./handler/canonical-native-plan": "./src/handler/canonical-native-plan.js",
96
+ "./handler/canonical-native-runtime": "./src/handler/canonical-native-runtime.js",
97
+ "./provider/canonical-provider": "./src/provider/canonical-provider.js",
98
+ "./provider/toolchain": "./src/provider/toolchain.js",
99
+ "./provider/final-wasm-policy": "./src/provider/final-wasm-policy.js",
100
+ "./handler/ctx-contract": "./src/handler/ctx-contract.js",
101
+ "./project/config-runtime": "./src/project/config-runtime.js",
102
+ "./project/reachable-graph": "./src/project/reachable-graph.js",
103
+ "./project/reachable-graph.schema.json": "./src/project/reachable-graph.schema.json",
104
+ "./handler/types-contract": "./src/handler/types-contract.js",
105
+ "./package/runtime-pulse-live": "./src/package/runtime-pulse-live.js",
106
+ "./package/package-contract": "./src/package/package-contract.js",
107
+ "./package/package-contract.schema.json": "./src/package/package-contract.schema.json",
108
+ "./project/package-product-projection": "./src/project/package-product-projection.js",
109
+ "./project/javascript-application": "./src/project/javascript-application.js",
110
+ "./project/target-support-evidence": "./src/project/target-support-evidence.js",
111
+ "./project/javascript-core-capabilities": "./src/project/javascript-core-capabilities.js",
112
+ "./project/native-optimization": "./src/project/native-optimization.js",
113
+ "./s3/contracts": "./src/s3/contracts.js"
114
+ },
115
+ "publishConfig": {
116
+ "access": "public"
117
+ },
6
118
  "files": [
119
+ "src",
7
120
  "README.md",
8
121
  "LICENSE",
9
122
  "NOTICE"
10
123
  ],
11
- "publishConfig": {
12
- "access": "public",
13
- "tag": "bootstrap"
124
+ "repository": {
125
+ "type": "git",
126
+ "url": "git+https://github.com/pulse-compute/pulse.git",
127
+ "directory": "wasm/packages/contracts"
128
+ },
129
+ "homepage": "https://pulsecompute.io/v1.0.0-beta.2/packages/implementation-packages/",
130
+ "bugs": {
131
+ "url": "https://github.com/pulse-compute/pulse/issues"
14
132
  }
15
- }
133
+ }
@@ -0,0 +1,296 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ LOWERABLE_LIBRARY_PAYLOAD_MODE_STATUSES
5
+ } = require('../library/manifest.js');
6
+
7
+ const ASSETS_CONTRACT_VERSION = 'pulsewasm.assets-contract.v1';
8
+ const ASSETS_HOST_ABI_VERSION = 'pulsewasm.assets-host-abi.v1';
9
+ const ASSETS_PROVIDER_CONFIG_VERSION = 'pulsewasm.assets-provider-config.v1';
10
+ const ASSETS_LOOKUP_RESULT_VERSION = 'pulsewasm.assets-lookup-result.v1';
11
+ const ASSETS_RESPONSE_POLICY_VERSION = 'pulsewasm.assets-response-policy.v1';
12
+ const ASSETS_LOWERING_PLAN_VERSION = 'pulsewasm.assets-lowering-plan.v1';
13
+ const ASSETS_ARTIFACT_VERSION = 'pulsewasm.assets-artifact.v1';
14
+ const ASSETS_NODE_PROVIDER_RUNTIME_VERSION = 'pulsewasm.assets-node-provider-runtime.v1';
15
+ const ASSETS_NODE_PROVIDER_PROOF_VERSION = 'pulsewasm.assets-node-provider-proof.v1';
16
+ const ASSETS_NODE_COMPILED_WASM_LIFECYCLE_RUNTIME_VERSION = 'pulsewasm.assets-node-compiled-wasm-lifecycle-runtime.v1';
17
+ const ASSETS_NODE_COMPILED_WASM_LIFECYCLE_PROOF_VERSION = 'pulsewasm.node-compiled-wasm-assets-lifecycle-proof.v1';
18
+ const ASSETS_NODE_COMPILED_WASM_LIFECYCLE_PROOF_ARTIFACT = 'node-compiled-wasm-assets-lifecycle-proof.json';
19
+ const ASSETS_FASTLY_PROVIDER_RUNTIME_VERSION = 'pulsewasm.assets-fastly-provider-runtime.v1';
20
+ const ASSETS_FASTLY_PROVIDER_PROOF_VERSION = 'pulsewasm.assets-fastly-provider-proof.v1';
21
+ const ASSETS_FASTLY_PACKAGE_OUT_PARITY_PROOF_VERSION = 'pulsewasm.fastly-assets-package-out-parity-proof.v1';
22
+ const ASSETS_FASTLY_PACKAGE_OUT_PARITY_PROOF_ARTIFACT = 'fastly-assets-package-out-parity-proof.json';
23
+ const ASSETS_PACKAGE_OWNED_LOWERING_PROOF_VERSION = 'pulsewasm.assets-package-owned-lowering-proof.v1';
24
+ const ASSETS_PACKAGE_OWNED_LOWERING_PROOF_ARTIFACT = 'assets-package-owned-lowering-proof.json';
25
+ const ASSETS_PACKAGE_OUT_DISCOVERY_PROOF_VERSION = 'pulsewasm.assets-package-out-discovery-proof.v1';
26
+ const ASSETS_PACKAGE_OUT_DISCOVERY_PROOF_ARTIFACT = 'assets-package-out-discovery-proof.json';
27
+ const ASSETS_COMPILED_WASM_SIDECAR_PLAN_VERSION = 'pulsewasm.assets-compiled-wasm-sidecar-plan.v1';
28
+ const ASSETS_COMPILED_WASM_SIDECAR_PLAN_ARTIFACT = 'assets-compiled-wasm-sidecar-plan.json';
29
+ const ASSETS_SIDECAR_COMPILE_LINK_PROOF_VERSION = 'pulsewasm.assets-sidecar-compile-link-proof.v1';
30
+ const ASSETS_SIDECAR_COMPILE_LINK_PROOF_ARTIFACT = 'assets-sidecar-compile-link-proof.json';
31
+
32
+ const ASSETS_CONTRACT_ID = 'pulse.assets';
33
+
34
+ const ASSETS_ALLOWED_METHODS = Object.freeze(['GET', 'HEAD']);
35
+ const ASSETS_ALLOWED_MODES = Object.freeze(['hosted-origin', 'provider-object-store']);
36
+ const ASSETS_INITIAL_PROVIDER_TARGETS = Object.freeze(['node', 'fastly']);
37
+
38
+ const ASSETS_PAYLOAD_MODE_STATUSES = LOWERABLE_LIBRARY_PAYLOAD_MODE_STATUSES;
39
+
40
+ const ASSETS_SUPPORTED_BODY_KINDS = Object.freeze(['text-response-body']);
41
+ const ASSETS_LOWERING_PLAN_ONLY_BODY_KINDS = Object.freeze(['stream-pass-through-response']);
42
+ const ASSETS_RESERVED_BODY_KINDS = Object.freeze(['binary-buffer']);
43
+ const ASSETS_UNSUPPORTED_BODY_KINDS = Object.freeze(['json-response-body']);
44
+
45
+ const ASSETS_DIAGNOSTIC_CODES = Object.freeze({
46
+ NON_LITERAL_LOOKUP: 'PULSEWASM_ASSETS_NON_LITERAL_LOOKUP',
47
+ UNSUPPORTED_METHOD: 'PULSEWASM_ASSETS_UNSUPPORTED_METHOD',
48
+ ROUTE_METHOD_MISMATCH: 'PULSEWASM_ASSETS_ROUTE_METHOD_MISMATCH',
49
+ RUNTIME_EXECUTION_UNSUPPORTED: 'PULSEWASM_ASSETS_RUNTIME_EXECUTION_UNSUPPORTED',
50
+ RESPOND_REQUIRES_LOOKUP: 'PULSEWASM_ASSETS_RESPOND_REQUIRES_LOOKUP',
51
+ BINARY_BODY_RESERVED: 'PULSEWASM_ASSETS_BINARY_BODY_RESERVED',
52
+ STREAM_PROVIDER_NOT_WIRED: 'PULSEWASM_ASSETS_STREAM_PROVIDER_NOT_WIRED',
53
+ PAYLOAD_MODE_UNSUPPORTED: 'PULSEWASM_ASSETS_PAYLOAD_MODE_UNSUPPORTED',
54
+ NODE_PROVIDER_PLAN_REQUIRED: 'PULSEWASM_ASSETS_NODE_PROVIDER_PLAN_REQUIRED',
55
+ NODE_PROVIDER_ASSET_NOT_FOUND: 'PULSEWASM_ASSETS_NODE_PROVIDER_ASSET_NOT_FOUND',
56
+ NODE_PROVIDER_SMOKE_FAILED: 'PULSEWASM_ASSETS_NODE_PROVIDER_SMOKE_FAILED',
57
+ NODE_COMPILED_LIFECYCLE_SMOKE_FAILED: 'PULSEWASM_ASSETS_NODE_COMPILED_LIFECYCLE_SMOKE_FAILED',
58
+ STORE_CONFIG_REQUIRED: 'PULSEWASM_ASSETS_STORE_CONFIG_REQUIRED',
59
+ STORE_NOT_CONFIGURED: 'PULSEWASM_ASSETS_STORE_NOT_CONFIGURED',
60
+ STORE_CONFIG_INVALID: 'PULSEWASM_ASSETS_STORE_CONFIG_INVALID',
61
+ STORE_ASSET_FILE_NOT_FOUND: 'PULSEWASM_ASSETS_STORE_ASSET_FILE_NOT_FOUND',
62
+ FASTLY_PROVIDER_PLAN_REQUIRED: 'PULSEWASM_ASSETS_FASTLY_PROVIDER_PLAN_REQUIRED',
63
+ FASTLY_PROVIDER_ASSET_NOT_FOUND: 'PULSEWASM_ASSETS_FASTLY_PROVIDER_ASSET_NOT_FOUND',
64
+ FASTLY_PROVIDER_SMOKE_FAILED: 'PULSEWASM_ASSETS_FASTLY_PROVIDER_SMOKE_FAILED',
65
+ FASTLY_PACKAGE_OUT_PARITY_PLAN_REQUIRED: 'PULSEWASM_FASTLY_ASSETS_PACKAGE_OUT_PARITY_PLAN_REQUIRED',
66
+ FASTLY_PACKAGE_OUT_PARITY_SMOKE_FAILED: 'PULSEWASM_FASTLY_ASSETS_PACKAGE_OUT_PARITY_SMOKE_FAILED',
67
+ FASTLY_ASSETS_COMPILED_WASM_PLAN_ONLY: 'PULSEWASM_FASTLY_ASSETS_COMPILED_WASM_PLAN_ONLY',
68
+ DYNAMIC_KEY_UNSUPPORTED: 'PULSEWASM_ASSETS_DYNAMIC_KEY_UNSUPPORTED',
69
+ COMPILED_BINARY_RESERVED: 'PULSEWASM_ASSETS_COMPILED_BINARY_RESERVED',
70
+ COMPILED_STREAM_PLAN_ONLY: 'PULSEWASM_ASSETS_COMPILED_STREAM_PLAN_ONLY',
71
+ HANDLE_ESCAPE_UNSUPPORTED: 'PULSEWASM_ASSETS_HANDLE_ESCAPE_UNSUPPORTED',
72
+ COMPILED_METHOD_UNSUPPORTED: 'PULSEWASM_ASSETS_COMPILED_METHOD_UNSUPPORTED',
73
+ SIDECAR_FILE_MISSING: 'PULSEWASM_ASSETS_SIDECAR_FILE_MISSING',
74
+ SIDECAR_SYMBOL_MISSING: 'PULSEWASM_ASSETS_SIDECAR_SYMBOL_MISSING',
75
+ SIDECAR_HOST_IMPORT_MISSING: 'PULSEWASM_ASSETS_SIDECAR_HOST_IMPORT_MISSING',
76
+ SIDECAR_LINK_SMOKE_FAILED: 'PULSEWASM_ASSETS_SIDECAR_LINK_SMOKE_FAILED',
77
+ SIDECAR_ASC_DEPENDENCY_GATED: 'PULSEWASM_ASSETS_SIDECAR_ASC_DEPENDENCY_GATED'
78
+ });
79
+
80
+ const ASSETS_PAYLOAD_MODE_CLASSIFICATION = Object.freeze({
81
+ textResponseBody: Object.freeze({
82
+ mode: 'text-response-body',
83
+ status: 'implemented-now',
84
+ hostResultKind: 'RESULT_TEXT',
85
+ hostCapabilities: Object.freeze(['result', 'body']),
86
+ owner: '@pulse-compute/wasm-host-runtime',
87
+ notes: 'Text results are already supported by the host result ABI and are sufficient for the first text-only provider proof.'
88
+ }),
89
+ jsonResponseBody: Object.freeze({
90
+ mode: 'json-response-body',
91
+ status: 'unsupported',
92
+ hostResultKind: 'RESULT_JSON',
93
+ hostCapabilities: Object.freeze(['json', 'result']),
94
+ owner: '@pulse-compute/wasm-host-runtime',
95
+ notes: 'Assets do not lower to parsed JSON result builders. JSON files should be served as text/stream payloads with headers, not through the generic JSON helper.'
96
+ }),
97
+ streamPassThroughResponse: Object.freeze({
98
+ mode: 'stream-pass-through-response',
99
+ status: 'lowering-plan-only',
100
+ hostSurfaceStatus: 'implemented-now',
101
+ hostResultKind: 'RESULT_STREAM',
102
+ hostCapabilities: Object.freeze(['headers', 'result', 'body']),
103
+ owner: '@pulse-compute/wasm-host-runtime',
104
+ notes: 'Host-owned response/stream refs and header merge policy exist; assets lowering/provider proof has not consumed them yet.'
105
+ }),
106
+ binaryBodyBufferResponse: Object.freeze({
107
+ mode: 'binary-buffer',
108
+ status: 'reserved-with-diagnostic',
109
+ hostResultKind: 'RESULT_BINARY',
110
+ hostCapabilities: Object.freeze(['result', 'body']),
111
+ owner: '@pulse-compute/wasm-host-runtime',
112
+ diagnosticCode: ASSETS_DIAGNOSTIC_CODES.BINARY_BODY_RESERVED,
113
+ notes: 'First-class byte buffers are intentionally reserved until a concrete binary ABI/provider path exists.'
114
+ }),
115
+ headerPassThrough: Object.freeze({
116
+ mode: 'header-pass-through',
117
+ status: 'implemented-now',
118
+ hostCapabilities: Object.freeze(['headers']),
119
+ owner: '@pulse-compute/wasm-host-runtime',
120
+ notes: 'Request/result header exports and ordered response header merge policy are implemented.'
121
+ }),
122
+ statusResultPassThrough: Object.freeze({
123
+ mode: 'status-result-pass-through',
124
+ status: 'implemented-now',
125
+ hostCapabilities: Object.freeze(['result']),
126
+ owner: '@pulse-compute/wasm-host-runtime',
127
+ notes: 'Status is already part of text, JSON, empty, stream, and response-ref result surfaces.'
128
+ }),
129
+ notFoundPassThrough: Object.freeze({
130
+ mode: '404-pass-through',
131
+ status: 'provider-specific',
132
+ hostCapabilities: Object.freeze(['assets', 'result']),
133
+ owner: '@pulse-compute/provider-node and @pulse-compute/provider-fastly',
134
+ notes: '404/pass-through policy is stable, but concrete behavior depends on the provider proof that consumes the lowering plan.'
135
+ })
136
+ });
137
+
138
+ const ASSETS_LOOKUP_RESULT_SHAPE = Object.freeze({
139
+ version: ASSETS_LOOKUP_RESULT_VERSION,
140
+ kind: 'pulse.assets.lookup-result',
141
+ fields: Object.freeze({
142
+ found: 'boolean',
143
+ store: 'literal store name from assets.lookup',
144
+ key: 'literal normalized asset key from assets.lookup',
145
+ method: 'GET or HEAD',
146
+ status: 'provider status, usually 200 or 404',
147
+ headers: 'ordered response headers or header ref',
148
+ body: 'text body, host stream/response ref, or reserved binary diagnostic'
149
+ })
150
+ });
151
+
152
+ const ASSETS_PROVIDER_CONFIG_SHAPE = Object.freeze({
153
+ version: ASSETS_PROVIDER_CONFIG_VERSION,
154
+ modes: ASSETS_ALLOWED_MODES,
155
+ providerTargets: ASSETS_INITIAL_PROVIDER_TARGETS,
156
+ fields: Object.freeze({
157
+ mode: 'one of ASSETS_ALLOWED_MODES',
158
+ store: 'static lowerable store name',
159
+ origin: 'symbolic hosted-origin ref when mode is hosted-origin',
160
+ bucket: 'symbolic provider object-store bucket ref when mode is provider-object-store',
161
+ credentials: 'symbolic refs only; never compiled into Wasm artifacts',
162
+ cache: 'optional ASSETS_CACHE_POLICY-compatible cache metadata'
163
+ })
164
+ });
165
+
166
+ const ASSETS_KEY_POLICY = Object.freeze({
167
+ store: 'non-empty static string literal selected by a package-owned pulse.assets lookup facade',
168
+ key: 'non-empty static string literal; canonical examples use absolute web paths such as /app.js',
169
+ normalization: 'providers may normalize leading slash/prefix, but lowering records the literal key for diagnostics',
170
+ traversal: 'dot-segment traversal is provider-invalid and must not be silently normalized into another store key',
171
+ dynamicKeys: 'reserved for a later pass; first lowering plan diagnostics require static store/key literals',
172
+ routeMethodAlignment: 'when route metadata is available, an asset lookup method must match the owning route method unless a later explicit override policy is introduced'
173
+ });
174
+
175
+ const ASSETS_CACHE_POLICY = Object.freeze({
176
+ defaultCacheControl: 'provider default unless cacheControl is supplied by lookup/respond options',
177
+ explicitCacheControl: 'preserved as a response header under header merge policy',
178
+ immutable: 'represented through Cache-Control header text, not a separate Wasm ABI feature',
179
+ ttl: 'provider-specific seconds value when supplied by provider config',
180
+ revalidation: 'not implemented by the lowering contract'
181
+ });
182
+
183
+ const ASSETS_RESPONSE_POLICY = Object.freeze({
184
+ version: ASSETS_RESPONSE_POLICY_VERSION,
185
+ allowedMethods: ASSETS_ALLOWED_METHODS,
186
+ headDropsBody: true,
187
+ lookupMiss: Object.freeze({
188
+ status: 404,
189
+ behavior: 'provider-specific pass-through or explicit 404 according to provider proof',
190
+ bodyMode: 'text-response-body or empty result for proof lanes'
191
+ }),
192
+ headers: Object.freeze({
193
+ passThrough: true,
194
+ mergePolicy: 'contracts/host/request-result-headers plus contracts/host/streaming-passthrough response header merge rules'
195
+ }),
196
+ bodyModes: Object.freeze(Object.fromEntries(
197
+ Object.values(ASSETS_PAYLOAD_MODE_CLASSIFICATION).map((entry) => [entry.mode, entry.status])
198
+ )),
199
+ binary: Object.freeze({
200
+ status: ASSETS_PAYLOAD_MODE_CLASSIFICATION.binaryBodyBufferResponse.status,
201
+ diagnosticCode: ASSETS_DIAGNOSTIC_CODES.BINARY_BODY_RESERVED
202
+ }),
203
+ stream: Object.freeze({
204
+ status: ASSETS_PAYLOAD_MODE_CLASSIFICATION.streamPassThroughResponse.status,
205
+ hostSurfaceStatus: ASSETS_PAYLOAD_MODE_CLASSIFICATION.streamPassThroughResponse.hostSurfaceStatus,
206
+ diagnosticCode: ASSETS_DIAGNOSTIC_CODES.STREAM_PROVIDER_NOT_WIRED
207
+ })
208
+ });
209
+
210
+ const ASSETS_PROTOCOL_POLICY = Object.freeze({
211
+ packageIdentityOwnedByManifest: true,
212
+ lowerableFacadeOwnedByPackage: true,
213
+ protocolPayloadRulesOwnedByContracts: true,
214
+ compilerOwnsPackageMappings: false,
215
+ thirdPartyPackagesRequireCoreConstants: false,
216
+ binaryBodyStillReserved: true,
217
+ payloadModesExplicit: true,
218
+ routeMethodAlignmentExplicit: true
219
+ });
220
+
221
+ function clone(value) {
222
+ if (Array.isArray(value)) return value.map(clone);
223
+ if (value && typeof value === 'object') {
224
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, clone(entry)]));
225
+ }
226
+ return value;
227
+ }
228
+
229
+ function assetsPayloadModeClassification() {
230
+ return clone(ASSETS_PAYLOAD_MODE_CLASSIFICATION);
231
+ }
232
+
233
+ function assetsPayloadMode(mode) {
234
+ return Object.values(ASSETS_PAYLOAD_MODE_CLASSIFICATION).find((entry) => entry.mode === mode) || null;
235
+ }
236
+
237
+ function assetsProtocolExtension() {
238
+ return {
239
+ assets: {
240
+ payloadModes: assetsPayloadModeClassification(),
241
+ responsePolicy: clone(ASSETS_RESPONSE_POLICY)
242
+ },
243
+ policy: {
244
+ binaryBodyStillReserved: true,
245
+ payloadModesExplicit: true,
246
+ routeMethodAlignmentExplicit: true
247
+ }
248
+ };
249
+ }
250
+
251
+ module.exports = {
252
+ ASSETS_CONTRACT_VERSION,
253
+ ASSETS_HOST_ABI_VERSION,
254
+ ASSETS_PROVIDER_CONFIG_VERSION,
255
+ ASSETS_LOOKUP_RESULT_VERSION,
256
+ ASSETS_RESPONSE_POLICY_VERSION,
257
+ ASSETS_LOWERING_PLAN_VERSION,
258
+ ASSETS_ARTIFACT_VERSION,
259
+ ASSETS_NODE_PROVIDER_RUNTIME_VERSION,
260
+ ASSETS_NODE_PROVIDER_PROOF_VERSION,
261
+ ASSETS_NODE_COMPILED_WASM_LIFECYCLE_RUNTIME_VERSION,
262
+ ASSETS_NODE_COMPILED_WASM_LIFECYCLE_PROOF_VERSION,
263
+ ASSETS_NODE_COMPILED_WASM_LIFECYCLE_PROOF_ARTIFACT,
264
+ ASSETS_FASTLY_PROVIDER_RUNTIME_VERSION,
265
+ ASSETS_FASTLY_PROVIDER_PROOF_VERSION,
266
+ ASSETS_FASTLY_PACKAGE_OUT_PARITY_PROOF_VERSION,
267
+ ASSETS_FASTLY_PACKAGE_OUT_PARITY_PROOF_ARTIFACT,
268
+ ASSETS_PACKAGE_OWNED_LOWERING_PROOF_VERSION,
269
+ ASSETS_PACKAGE_OWNED_LOWERING_PROOF_ARTIFACT,
270
+ ASSETS_PACKAGE_OUT_DISCOVERY_PROOF_VERSION,
271
+ ASSETS_PACKAGE_OUT_DISCOVERY_PROOF_ARTIFACT,
272
+ ASSETS_COMPILED_WASM_SIDECAR_PLAN_VERSION,
273
+ ASSETS_COMPILED_WASM_SIDECAR_PLAN_ARTIFACT,
274
+ ASSETS_SIDECAR_COMPILE_LINK_PROOF_VERSION,
275
+ ASSETS_SIDECAR_COMPILE_LINK_PROOF_ARTIFACT,
276
+ ASSETS_CONTRACT_ID,
277
+ ASSETS_ALLOWED_METHODS,
278
+ ASSETS_ALLOWED_MODES,
279
+ ASSETS_INITIAL_PROVIDER_TARGETS,
280
+ ASSETS_PAYLOAD_MODE_STATUSES,
281
+ ASSETS_SUPPORTED_BODY_KINDS,
282
+ ASSETS_LOWERING_PLAN_ONLY_BODY_KINDS,
283
+ ASSETS_RESERVED_BODY_KINDS,
284
+ ASSETS_UNSUPPORTED_BODY_KINDS,
285
+ ASSETS_DIAGNOSTIC_CODES,
286
+ ASSETS_PAYLOAD_MODE_CLASSIFICATION,
287
+ ASSETS_LOOKUP_RESULT_SHAPE,
288
+ ASSETS_PROVIDER_CONFIG_SHAPE,
289
+ ASSETS_RESPONSE_POLICY,
290
+ ASSETS_KEY_POLICY,
291
+ ASSETS_CACHE_POLICY,
292
+ ASSETS_PROTOCOL_POLICY,
293
+ assetsPayloadModeClassification,
294
+ assetsPayloadMode,
295
+ assetsProtocolExtension
296
+ };
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ plainObject,
5
+ hasOwn,
6
+ platformFastly,
7
+ collectRefs,
8
+ collectSymbolicRefs,
9
+ isSymbolicRef,
10
+ refKind,
11
+ refKey
12
+ } = require('./symbolic-refs.js');
13
+
14
+ const CONFIG_PROVIDER_RESOLUTION_PHASE = '13D';
15
+ const CONFIG_PROVIDER_CONTRACT_VERSION = 'pulsewasm.config-provider-contract.v1';
16
+ const RUNTIME_PROVIDER_RESOLUTION_VERSION = 'pulsewasm.runtime-provider-resolution.v1';
17
+ const FASTLY_PROVIDER_MAP_VERSION = 'pulsewasm.fastly-provider-map.v1';
18
+ const CONFIG_PROVIDER_SMOKE_VERSION = 'pulsewasm.config-provider-smoke.v1';
19
+
20
+ const CONFIG_PROVIDER_SURFACE = Object.freeze({
21
+ config: 'get(name): string | undefined',
22
+ secret: 'get(name): string | undefined'
23
+ });
24
+ const RUNTIME_CONFIG_PROVIDER_SURFACE = CONFIG_PROVIDER_SURFACE;
25
+
26
+ const CONFIG_PROVIDER_POLICY = Object.freeze({
27
+ runtimeResolved: true,
28
+ secretsCompiledIntoBinary: false,
29
+ fastlyStoresAreProviders: true,
30
+ localProvidersSupported: true,
31
+ envHelperRequired: false
32
+ });
33
+
34
+ module.exports = {
35
+ CONFIG_PROVIDER_RESOLUTION_PHASE,
36
+ CONFIG_PROVIDER_CONTRACT_VERSION,
37
+ RUNTIME_PROVIDER_RESOLUTION_VERSION,
38
+ FASTLY_PROVIDER_MAP_VERSION,
39
+ CONFIG_PROVIDER_SMOKE_VERSION,
40
+ CONTRACT_VERSION: CONFIG_PROVIDER_CONTRACT_VERSION,
41
+ RESOLUTION_VERSION: RUNTIME_PROVIDER_RESOLUTION_VERSION,
42
+ SMOKE_VERSION: CONFIG_PROVIDER_SMOKE_VERSION,
43
+ CONFIG_PROVIDER_SURFACE,
44
+ RUNTIME_CONFIG_PROVIDER_SURFACE,
45
+ CONFIG_PROVIDER_POLICY,
46
+ plainObject,
47
+ hasOwn,
48
+ platformFastly,
49
+ collectRefs,
50
+ collectSymbolicRefs,
51
+ isSymbolicRef,
52
+ refKind,
53
+ refKey
54
+ };
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ CONFIG_AUTHORING_SHAPE_VERSION,
5
+ PLATFORM_STORE_MAP_VERSION
6
+ } = require('./symbolic-refs.js');
7
+
8
+ const RUNTIME_PROVIDER_KV_PHASE = '14B';
9
+ const KV_ADAPTER_INTEGRATION_PHASE = '14C';
10
+ const KV_ADAPTER_PHASE = KV_ADAPTER_INTEGRATION_PHASE;
11
+
12
+ const RUNTIME_PROVIDER_CONTRACT_VERSION = 'pulsewasm.runtime-provider-contract.v1';
13
+ const RUNTIME_PROVIDER_KV_RESOLUTION_VERSION = 'pulsewasm.runtime-provider-kv-resolution.v1';
14
+ const KV_CAPABILITY_CONTRACT_VERSION = 'pulsewasm.kv-capability-contract.v1';
15
+ const KV_PROVIDER_MAP_VERSION = 'pulsewasm.kv-provider-map.v1';
16
+ const RUNTIME_PROVIDER_API_SURFACE_VERSION = 'pulsewasm.runtime-provider-api-surface.v1';
17
+ const RUNTIME_PROVIDER_SMOKE_VERSION = 'pulsewasm.runtime-provider-smoke.v1';
18
+ const KV_ADAPTER_INTEGRATION_VERSION = 'pulsewasm.kv-adapter-integration.v1';
19
+ const KV_PROVIDER_RUNTIME_MAP_VERSION = 'pulsewasm.kv-provider-runtime-map.v1';
20
+
21
+ const RUNTIME_PROVIDER_AUTHORING_SHAPE = 'runtime.provider';
22
+ const RUNTIME_PROVIDER_DEFAULT_POLICY = 'one provider per profile';
23
+ const RUNTIME_PROVIDER_KINDS = Object.freeze(['fastly', 'local', 'node']);
24
+
25
+ const KV_CAPABILITY_POLICY = Object.freeze({
26
+ handlerSurface: 'ctx.kv(name)',
27
+ compiledHandlerLowering: 'reserved',
28
+ hostEffectExecution: 'reserved',
29
+ localAdapterProof: 'phase14C',
30
+ reservedExecution: 'reserved-effect'
31
+ });
32
+
33
+ const KV_HANDLER_SURFACE = KV_CAPABILITY_POLICY.handlerSurface;
34
+ const KV_COMPILED_HANDLER_LOWERING = KV_CAPABILITY_POLICY.compiledHandlerLowering;
35
+ const KV_HOST_EFFECT_EXECUTION = KV_CAPABILITY_POLICY.hostEffectExecution;
36
+ const KV_LOCAL_ADAPTER_PROOF = KV_CAPABILITY_POLICY.localAdapterProof;
37
+ const KV_RESERVED_EXECUTION = KV_CAPABILITY_POLICY.reservedExecution;
38
+
39
+ const RUNTIME_PROVIDER_API_SURFACES = Object.freeze([
40
+ Object.freeze({ name: 'runtime.provider', scope: 'config', status: 'canonical' }),
41
+ Object.freeze({ name: 'ctx.kv(name)', scope: 'handler', status: 'reserved for compiled-handler lowering; available in local adapter proof' })
42
+ ]);
43
+
44
+ function runtimeProviderApiSurfaces() {
45
+ return RUNTIME_PROVIDER_API_SURFACES.map((surface) => ({ ...surface }));
46
+ }
47
+
48
+ module.exports = {
49
+ RUNTIME_PROVIDER_KV_PHASE,
50
+ KV_ADAPTER_PHASE,
51
+ KV_ADAPTER_INTEGRATION_PHASE,
52
+ RUNTIME_PROVIDER_CONTRACT_VERSION,
53
+ RUNTIME_PROVIDER_KV_RESOLUTION_VERSION,
54
+ CONFIG_AUTHORING_SHAPE_VERSION,
55
+ PLATFORM_STORE_MAP_VERSION,
56
+ KV_CAPABILITY_CONTRACT_VERSION,
57
+ KV_PROVIDER_MAP_VERSION,
58
+ RUNTIME_PROVIDER_API_SURFACE_VERSION,
59
+ RUNTIME_PROVIDER_SMOKE_VERSION,
60
+ KV_ADAPTER_INTEGRATION_VERSION,
61
+ KV_PROVIDER_RUNTIME_MAP_VERSION,
62
+ RUNTIME_PROVIDER_AUTHORING_SHAPE,
63
+ RUNTIME_PROVIDER_DEFAULT_POLICY,
64
+ RUNTIME_PROVIDER_KINDS,
65
+ KV_HANDLER_SURFACE,
66
+ KV_COMPILED_HANDLER_LOWERING,
67
+ KV_HOST_EFFECT_EXECUTION,
68
+ KV_LOCAL_ADAPTER_PROOF,
69
+ KV_RESERVED_EXECUTION,
70
+ KV_CAPABILITY_POLICY,
71
+ RUNTIME_PROVIDER_API_SURFACES,
72
+ runtimeProviderApiSurfaces
73
+ };