@pulse-compute/wasm-guest-link 0.0.0 → 1.0.0-beta.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.
package/README.md CHANGED
@@ -1,5 +1,96 @@
1
1
  # @pulse-compute/wasm-guest-link
2
2
 
3
- > Bootstrap placeholder — no runtime or API.
3
+ <!-- pulse-package-status:start -->
4
+ > **Support tier:** Implementation/transitive surface<br>
5
+ > **Audience:** Pulse compiler, release, and first-party guest-unit maintainers.<br>
6
+ > **Install directly:** No for application projects; it is an internal synchronized compiler dependency.<br>
7
+ > **Supported entry points:** `None for application authors.`<br>
8
+ > **Stability:** Internal first-party prebuilt guest-link interface synchronized with the compiler; no application-author or third-party guest compatibility guarantee.<br>
9
+ > **Canonical documentation:** [Package guide](https://pulsecompute.io/v1.0.0-beta.1/packages/implementation-packages/)
10
+ >
11
+ > This release-status block is generated from the synchronized `Pulse 1.0.0-beta.1` package policy.
12
+ <!-- pulse-package-status:end -->
4
13
 
5
- This inert 0.0.0 package reserves the npm name for future Pulse releases.
14
+ Internal Pulse implementation package for connecting validated first-party core
15
+ Wasm guest units into one final audited Native artifact.
16
+
17
+ The package owns:
18
+
19
+ - `pulse.guest-unit.v1` / `pulse.guest-unit-plan.v1` validation plus the
20
+ closed ES256-only v2 contracts;
21
+ - package-prebuilt hash, source-provenance, and binary verification;
22
+ - content-addressed `.pulse/guests/` materialization;
23
+ - the direct pinned Binaryen toolchain;
24
+ - static core-Wasm composition and post-link optimization;
25
+ - `pulse.guest-link-report.v1` and `pulse.final-wasm-audit.v1`;
26
+ - normalized, redacted guest-link diagnostics.
27
+
28
+ The original implementation continues to accept the A4-bound
29
+ `pulse.guest-memory.borrowed-span.v1` contract: one fixed 32-page
30
+ link-stage-owned memory, synchronous read-only borrowed spans of at most 4096
31
+ bytes, no allocation or retention, MVP features, and no fallback.
32
+
33
+ G2 adds a separate closed `pulse.guest-unit.v2` /
34
+ `pulse.guest-unit-plan.v2` path for the reviewed
35
+ `pulse.crypto.es256.rustcrypto-p256.v1` package prebuilt. That path preserves
36
+ the same single fixed memory while reserving the frozen 16,640-byte private
37
+ invocation frame. It accepts no other v2 unit, owner, ABI, artifact, source
38
+ tree, frame capacity, or toolchain identity. Both default Native and
39
+ `experimental-native-size` realization plans perform post-link optimization
40
+ and audit the layout before and after optimization.
41
+
42
+ It does not own package semantics, provider packaging, source builds, local
43
+ overrides, dynamic loading, or third-party guest registration. Package
44
+ manifests contain normalized metadata only; they cannot supply executables,
45
+ shell commands, or argument vectors. Every binary claim is independently
46
+ verified before composition.
47
+
48
+ The exported package root is an internal compiler integration surface. It is
49
+ not an application-author API.
50
+
51
+ The ES256 unit is linked and exercised as a G2 Node Native integration proof,
52
+ but it is not selected by application lowering and is not executable through
53
+ the crypto or JWT public surfaces. G3 owns that activation.
54
+
55
+ ## Release boundary
56
+
57
+ The package is synchronized with the compiler as an implementation dependency.
58
+ It accepts only trusted first-party `package-prebuilt` units selected through
59
+ the compiler's closed package-lowering path. It does not expose project
60
+ configuration, CLI guest commands, source-build adapters, local overrides,
61
+ runtime loading, self-registration, or a third-party guest API.
62
+
63
+ Selected-unit failures are terminal. No error path retries another owner,
64
+ realization, execution mode, or provider path.
65
+
66
+ ## JWT/crypto proof relationship
67
+
68
+ The sealed guest-link pipeline is evidence that the accepted borrowed-memory
69
+ contract can produce one audited final core module. It is not load-bearing for
70
+ HS256. The synchronized JWT/crypto packages select
71
+ `guest-source:pulse-hmac-as` for Native targets and emits zero linked guest
72
+ units; JavaScript selects the Web Crypto runtime builtin.
73
+
74
+ The historical guest pipeline result is recorded in
75
+ `wasm/.test-results/guest-link-b4/phase-b-seal.json`. Its relationship to the
76
+ current four-target JWT proof is audited by
77
+ `wasm/.test-results/jwt-e4/jwt-phase-e-seal.json`. Neither result creates a
78
+ third-party guest ABI or authorizes publication, deployment, or activation.
79
+
80
+ ## Validation
81
+
82
+ The Phase B seal replays the valid production pipeline, the complete negative
83
+ diagnostic matrix, content-addressed reuse and deletion/recreation, Node
84
+ execution, and `fastly compute serve` over the exact production core artifact.
85
+ It cross-checks the core identity against the sealed A3 evidence without
86
+ rebuilding the package-prebuilt Rust source:
87
+
88
+ ```bash
89
+ PULSE_FASTLY_BIN=/path/to/fastly \
90
+ PULSE_VICEROY_BIN=/path/to/viceroy \
91
+ node ../../scripts/run-wasm-tests.cjs --task guest-link-b-seal --no-report
92
+ ```
93
+
94
+ The seal writes `wasm/.test-results/guest-link-b4/phase-b-seal.json`, including
95
+ artifact-size and focused validation wall-clock measurements. It performs no
96
+ remote deployment.
package/package.json CHANGED
@@ -1,16 +1,38 @@
1
1
  {
2
2
  "name": "@pulse-compute/wasm-guest-link",
3
- "version": "0.0.0",
4
- "description": "Inert bootstrap placeholder for @pulse-compute/wasm-guest-link.",
3
+ "version": "1.0.0-beta.1",
5
4
  "license": "Apache-2.0",
5
+ "description": "Internal first-party guest-unit validation, materialization, core Wasm composition, optimization, and final audit for Pulse.",
6
+ "type": "commonjs",
7
+ "engines": {
8
+ "node": "^22.14.0 || ^24.0.0"
9
+ },
10
+ "main": "./src/index.js",
11
+ "exports": {
12
+ ".": "./src/index.js",
13
+ "./stage": "./src/stage.js",
14
+ "./toolchain": "./src/toolchain.js"
15
+ },
16
+ "dependencies": {
17
+ "@pulse-compute/wasm-contracts": "1.0.0-beta.1",
18
+ "binaryen": "129.0.0-nightly.20260428"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
6
23
  "files": [
24
+ "src",
7
25
  "README.md",
8
26
  "LICENSE",
9
27
  "NOTICE"
10
28
  ],
11
- "publishConfig": {
12
- "access": "public",
13
- "registry": "https://registry.npmjs.org/",
14
- "tag": "bootstrap"
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/pulse-compute/pulse.git",
32
+ "directory": "wasm/packages/wasm-guest-link"
33
+ },
34
+ "homepage": "https://pulsecompute.io/v1.0.0-beta.1/packages/implementation-packages/",
35
+ "bugs": {
36
+ "url": "https://github.com/pulse-compute/pulse/issues"
15
37
  }
16
- }
38
+ }
@@ -0,0 +1,159 @@
1
+ 'use strict';
2
+
3
+ const versions = Object.freeze({
4
+ guestUnit: 'pulse.guest-unit.v1',
5
+ guestUnitV2: 'pulse.guest-unit.v2',
6
+ guestUnitPlan: 'pulse.guest-unit-plan.v1',
7
+ guestUnitPlanV2: 'pulse.guest-unit-plan.v2',
8
+ guestLinkReport: 'pulse.guest-link-report.v1',
9
+ guestLinkReportV2: 'pulse.guest-link-report.v2',
10
+ finalWasmAudit: 'pulse.final-wasm-audit.v1',
11
+ finalWasmAuditV2: 'pulse.final-wasm-audit.v2',
12
+ memoryAbi: 'pulse.guest-memory.borrowed-span.v1',
13
+ memoryAbiV2: 'pulse.guest-memory.invocation-frame.v2'
14
+ });
15
+
16
+ const binaryenVersion = '129.0.0-nightly.20260428';
17
+
18
+ const diagnosticCodes = Object.freeze({
19
+ invalid: 'PULSE_GUEST_UNIT_INVALID',
20
+ hashMismatch: 'PULSE_GUEST_UNIT_HASH_MISMATCH',
21
+ ownerMismatch: 'PULSE_GUEST_UNIT_OWNER_MISMATCH',
22
+ abiMismatch: 'PULSE_GUEST_UNIT_ABI_MISMATCH',
23
+ importMismatch: 'PULSE_GUEST_UNIT_IMPORT_MISMATCH',
24
+ exportMismatch: 'PULSE_GUEST_UNIT_EXPORT_MISMATCH',
25
+ memoryMismatch: 'PULSE_GUEST_UNIT_MEMORY_MISMATCH',
26
+ startMismatch: 'PULSE_GUEST_UNIT_START_MISMATCH',
27
+ featureMismatch: 'PULSE_GUEST_UNIT_FEATURE_MISMATCH',
28
+ materializationFailed: 'PULSE_GUEST_UNIT_MATERIALIZATION_FAILED',
29
+ linkFailed: 'PULSE_GUEST_LINK_FAILED',
30
+ optimizationFailed: 'PULSE_GUEST_OPTIMIZATION_FAILED',
31
+ finalAuditFailed: 'PULSE_GUEST_FINAL_AUDIT_FAILED'
32
+ });
33
+
34
+ const memoryAbi = Object.freeze({
35
+ identity: versions.memoryAbi,
36
+ pointerWidthBits: 32,
37
+ pageBytes: 65536,
38
+ minimumPages: 32,
39
+ maximumPages: 32,
40
+ bytes: 32 * 65536,
41
+ maximumBorrowedBytes: 4096,
42
+ invalidRangeStatus: 0x8000_0000,
43
+ importModule: 'env',
44
+ importName: 'memory',
45
+ layout: Object.freeze({
46
+ rustStack: Object.freeze({ start: 0, endExclusive: 65536 }),
47
+ rustStatic: Object.freeze({ start: 131072, endExclusive: 262144 }),
48
+ primaryStatic: Object.freeze({ start: 262144, endExclusive: 524288 }),
49
+ borrowedInput: Object.freeze({ start: 524288, endExclusive: 32 * 65536 })
50
+ })
51
+ });
52
+
53
+ const es256FrameV2 = Object.freeze({
54
+ identity: 'pulse.crypto.es256.invocation-frame.v2',
55
+ memoryIdentity: versions.memoryAbiV2,
56
+ pointerWidthBits: 32,
57
+ byteOrder: 'little-endian',
58
+ magic: 0x3253_4550,
59
+ version: 2,
60
+ headerBytes: 64,
61
+ capacityBytes: 16640,
62
+ alignmentBytes: 16,
63
+ signingInputBytesMaximum: 16340,
64
+ publicKeyBytes: 64,
65
+ signatureBytes: 64,
66
+ export: 'pulse_crypto_es256_verify',
67
+ parameters: Object.freeze(['i32', 'i32']),
68
+ results: Object.freeze(['i32'])
69
+ });
70
+
71
+ const memoryAbiV2 = Object.freeze({
72
+ identity: versions.memoryAbiV2,
73
+ pointerWidthBits: 32,
74
+ pageBytes: 65536,
75
+ minimumPages: 32,
76
+ maximumPages: 32,
77
+ bytes: 32 * 65536,
78
+ importModule: 'env',
79
+ importName: 'memory',
80
+ layout: Object.freeze({
81
+ rustStack: Object.freeze({ start: 0, endExclusive: 65536 }),
82
+ stackStaticGuard: Object.freeze({ start: 65536, endExclusive: 131072 }),
83
+ rustStatic: Object.freeze({ start: 131072, endExclusive: 262144 }),
84
+ primaryStatic: Object.freeze({ start: 262144, endExclusive: 524288 }),
85
+ invocationFrame: Object.freeze({
86
+ start: 524288,
87
+ endExclusive: 524288 + es256FrameV2.capacityBytes
88
+ }),
89
+ unallocated: Object.freeze({
90
+ start: 524288 + es256FrameV2.capacityBytes,
91
+ endExclusive: 32 * 65536
92
+ })
93
+ }),
94
+ frame: es256FrameV2
95
+ });
96
+
97
+ const es256GuestUnit = Object.freeze({
98
+ version: versions.guestUnitV2,
99
+ id: 'pulse.crypto.es256.rustcrypto-p256.v1',
100
+ module: 'pulse_crypto_es256',
101
+ owner: '@pulse-compute/crypto',
102
+ packageVersion: '1.0.0-beta.1',
103
+ abi: 'pulse.crypto.es256.verify.v1',
104
+ artifact: Object.freeze({
105
+ file: 'prebuilt/es256-verifier.wasm',
106
+ bytes: 21009,
107
+ sha256: 'ee5ab1639cbe1be5a9510c01ab15a3569c0394818a9db98f3e0114ae829fff50'
108
+ }),
109
+ source: Object.freeze({
110
+ directory: 'source',
111
+ treeSha256: '76c8cf985b2ed384d069f7ba0d7ff1c8513679ea7aec513e1a07a3eeaa3b7208'
112
+ }),
113
+ toolchain: Object.freeze({
114
+ rustc: '1.97.1 (8bab26f4f 2026-07-14)',
115
+ cargo: '1.97.1 (c980f4866 2026-06-30)',
116
+ binaryen: binaryenVersion
117
+ }),
118
+ provenance: Object.freeze({
119
+ cargoLockSha256: '7aa8c6d72751653717a371147e71a546d8f21dfcd1cf698919563e79e2946cb4',
120
+ reconstructionCommandIdentity: 'pulse.crypto.es256.rustcrypto-build.v1',
121
+ buildScript: 'build.cjs',
122
+ buildScriptSha256: 'dadcc8ef1f252b59192408af42da4820c4858b2bc5594dd85792fd02e9b87ae2',
123
+ optimizationPosture: 'native-size',
124
+ binaryenWasmOptSha256: '1304eb38ad315a0d70d8427757f641c110d972468c126af645ef800b09c26e56',
125
+ g0SourceDecision: '../../../../wasm/.test-results/jwt-g0/es256-source-decision.json',
126
+ g0SourceDecisionSha256: '58db9e3587ace112a8864c7916f603d8773dce653deafb7d743c0dc1f4d62d63'
127
+ })
128
+ });
129
+
130
+ const optimizationPostures = Object.freeze({
131
+ 'native-default': Object.freeze([
132
+ '--mvp-features',
133
+ '--optimize-level',
134
+ '2',
135
+ '--shrink-level',
136
+ '0',
137
+ '--strip-debug'
138
+ ]),
139
+ 'native-size': Object.freeze([
140
+ '--mvp-features',
141
+ '--optimize-level',
142
+ '3',
143
+ '--shrink-level',
144
+ '2',
145
+ '--converge',
146
+ '--strip-debug'
147
+ ])
148
+ });
149
+
150
+ module.exports = Object.freeze({
151
+ versions,
152
+ binaryenVersion,
153
+ diagnosticCodes,
154
+ memoryAbi,
155
+ memoryAbiV2,
156
+ es256FrameV2,
157
+ es256GuestUnit,
158
+ optimizationPostures
159
+ });