@pulse-compute/cli 1.0.0-beta.2 → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/API.md +1 -1
  2. package/CHANGELOG.md +6 -0
  3. package/README.md +3 -3
  4. package/cli-spec.json +1 -1
  5. package/docs/README.md +1 -1
  6. package/docs/architecture/current-contracts.md +14 -2
  7. package/docs/concepts/compilation-and-lowering.md +1 -1
  8. package/docs/concepts/contracts-and-providers.md +2 -2
  9. package/docs/concepts/package-owned-lowering.md +1 -1
  10. package/docs/concepts/targets-and-hosts.md +2 -2
  11. package/docs/contributing/adding-core-provider.md +1 -1
  12. package/docs/contributing/adding-first-party-lowerer.md +1 -1
  13. package/docs/contributing/package-lowerer-contract.md +2 -2
  14. package/docs/maintainers/documentation-deployment.md +4 -4
  15. package/docs/maintainers/documentation-versioning.md +1 -1
  16. package/docs/maintainers/maintenance-policy.json +1 -1
  17. package/docs/maintainers/maintenance-policy.md +1 -1
  18. package/docs/maintainers/npm-publishing.md +34 -6
  19. package/docs/maintainers/plugin-readiness.json +1 -1
  20. package/docs/maintainers/plugin-readiness.md +1 -1
  21. package/docs/maintainers/release-acceptance.md +3 -3
  22. package/docs/maintainers/release-manifest.md +3 -3
  23. package/docs/maintainers/testing.md +1 -1
  24. package/docs/packages/README.md +3 -3
  25. package/docs/packages/assets.md +1 -1
  26. package/docs/packages/crypto.md +1 -1
  27. package/docs/packages/entities.md +1 -1
  28. package/docs/packages/grip.md +1 -1
  29. package/docs/packages/implementation-packages.md +1 -1
  30. package/docs/packages/jwt.md +1 -1
  31. package/docs/packages/provider-fastly.md +1 -1
  32. package/docs/packages/pulse.md +1 -1
  33. package/docs/packages/runtime.md +1 -1
  34. package/docs/packages/s3.md +1 -1
  35. package/docs/preview-scope.md +1 -1
  36. package/docs/reference/cli-spec.json +1 -1
  37. package/docs/reference/cli.md +1 -1
  38. package/docs/reference/compatibility-matrix.md +1 -1
  39. package/docs/reference/diagnostics.md +5 -5
  40. package/docs/reference/documentation-versions.json +11 -3
  41. package/docs/reference/project-config.md +1 -1
  42. package/docs/reference/project-config.schema.json +2 -2
  43. package/docs/reference/release-manifest.json +24 -24
  44. package/documentation-site.json +1 -1
  45. package/documentation-versions.json +11 -3
  46. package/examples/01-hello-json/README.md +1 -1
  47. package/examples/01-hello-json/package.json +2 -2
  48. package/examples/02-request-schema/README.md +1 -1
  49. package/examples/02-request-schema/package.json +2 -2
  50. package/examples/03-fetch-composition/README.md +1 -1
  51. package/examples/03-fetch-composition/package.json +2 -2
  52. package/examples/05-fastly-capabilities/README.md +1 -1
  53. package/examples/05-fastly-capabilities/package.json +4 -4
  54. package/examples/07-opaque-proxy/README.md +1 -1
  55. package/examples/07-opaque-proxy/package.json +3 -3
  56. package/examples/09-router-lowering/README.md +1 -1
  57. package/examples/09-router-lowering/package.json +3 -3
  58. package/examples/10-entities-tools/package.json +3 -3
  59. package/examples/11-events/README.md +1 -1
  60. package/examples/11-events/package.json +2 -2
  61. package/examples/12-mcp-proxy/README.md +1 -1
  62. package/examples/12-mcp-proxy/package.json +2 -2
  63. package/examples/13-jwt-es256/README.md +1 -1
  64. package/examples/13-jwt-es256/package.json +3 -3
  65. package/package.json +7 -7
  66. package/project-config.schema.json +2 -2
  67. package/release-manifest.json +24 -24
  68. package/src/documentation.js +1 -1
  69. package/src/project-config-schema.js +1 -1
  70. package/src/project-execution.js +42 -24
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": "pulse.release-catalog.v1",
3
- "releaseVersion": "1.0.0-beta.2",
3
+ "releaseVersion": "1.0.0-beta.3",
4
4
  "channel": "beta",
5
- "releasedAt": "2026-09-13",
5
+ "releasedAt": "2026-09-14",
6
6
  "license": "Apache-2.0",
7
7
  "display": {
8
8
  "productName": "Pulse",
9
9
  "candidateLabel": "Beta",
10
- "candidateName": "Pulse 1.0.0-beta.2 — Beta",
10
+ "candidateName": "Pulse 1.0.0-beta.3 — Beta",
11
11
  "activationStage": "documentation-release"
12
12
  },
13
13
  "legal": {
@@ -29,7 +29,7 @@
29
29
  "documentation": {
30
30
  "origin": "https://pulsecompute.io",
31
31
  "basePath": "/",
32
- "version": "v1.0.0-beta.2",
32
+ "version": "v1.0.0-beta.3",
33
33
  "latestAlias": "latest",
34
34
  "source": "docs/README.md"
35
35
  },
@@ -97,7 +97,7 @@
97
97
  },
98
98
  "publication": {
99
99
  "registry": "https://registry.npmjs.org",
100
- "distTag": "beta",
100
+ "distTag": "latest",
101
101
  "access": "public",
102
102
  "authentication": "npm-trusted-publishing-oidc",
103
103
  "provenance": "automatic",
@@ -153,7 +153,7 @@
153
153
  {
154
154
  "dir": "packages/runtime",
155
155
  "name": "@pulse-compute/runtime",
156
- "version": "1.0.0-beta.2",
156
+ "version": "1.0.0-beta.3",
157
157
  "documentation": "docs/packages/runtime.md",
158
158
  "role": "public-runtime",
159
159
  "tier": "canonical-application",
@@ -167,7 +167,7 @@
167
167
  {
168
168
  "dir": "packages/pulse",
169
169
  "name": "@pulse-compute/pulse",
170
- "version": "1.0.0-beta.2",
170
+ "version": "1.0.0-beta.3",
171
171
  "documentation": "docs/packages/pulse.md",
172
172
  "role": "public-api",
173
173
  "tier": "canonical-application",
@@ -182,7 +182,7 @@
182
182
  {
183
183
  "dir": "wasm/packages/cli",
184
184
  "name": "@pulse-compute/cli",
185
- "version": "1.0.0-beta.2",
185
+ "version": "1.0.0-beta.3",
186
186
  "documentation": "docs/packages/cli.md",
187
187
  "role": "public-cli",
188
188
  "tier": "canonical-application",
@@ -207,7 +207,7 @@
207
207
  {
208
208
  "dir": "packages/provider-fastly",
209
209
  "name": "@pulse-compute/provider-fastly",
210
- "version": "1.0.0-beta.2",
210
+ "version": "1.0.0-beta.3",
211
211
  "documentation": "docs/packages/provider-fastly.md",
212
212
  "role": "public-provider",
213
213
  "tier": "supported-extension",
@@ -227,7 +227,7 @@
227
227
  {
228
228
  "dir": "packages/grip",
229
229
  "name": "@pulse-compute/grip",
230
- "version": "1.0.0-beta.2",
230
+ "version": "1.0.0-beta.3",
231
231
  "documentation": "docs/packages/grip.md",
232
232
  "role": "public-extension",
233
233
  "tier": "supported-extension",
@@ -241,7 +241,7 @@
241
241
  {
242
242
  "dir": "packages/assets",
243
243
  "name": "@pulse-compute/assets",
244
- "version": "1.0.0-beta.2",
244
+ "version": "1.0.0-beta.3",
245
245
  "documentation": "docs/packages/assets.md",
246
246
  "role": "public-extension",
247
247
  "tier": "supported-extension",
@@ -255,7 +255,7 @@
255
255
  {
256
256
  "dir": "packages/crypto",
257
257
  "name": "@pulse-compute/crypto",
258
- "version": "1.0.0-beta.2",
258
+ "version": "1.0.0-beta.3",
259
259
  "documentation": "docs/packages/crypto.md",
260
260
  "role": "public-extension",
261
261
  "tier": "supported-extension",
@@ -269,7 +269,7 @@
269
269
  {
270
270
  "dir": "packages/jwt",
271
271
  "name": "@pulse-compute/jwt",
272
- "version": "1.0.0-beta.2",
272
+ "version": "1.0.0-beta.3",
273
273
  "documentation": "docs/packages/jwt.md",
274
274
  "role": "public-extension",
275
275
  "tier": "supported-extension",
@@ -283,7 +283,7 @@
283
283
  {
284
284
  "dir": "packages/entities",
285
285
  "name": "@pulse-compute/entities",
286
- "version": "1.0.0-beta.2",
286
+ "version": "1.0.0-beta.3",
287
287
  "documentation": "docs/packages/entities.md",
288
288
  "role": "public-extension",
289
289
  "tier": "supported-extension",
@@ -297,7 +297,7 @@
297
297
  {
298
298
  "dir": "packages/s3",
299
299
  "name": "@pulse-compute/s3",
300
- "version": "1.0.0-beta.2",
300
+ "version": "1.0.0-beta.3",
301
301
  "documentation": "docs/packages/s3.md",
302
302
  "role": "public-extension",
303
303
  "tier": "supported-extension",
@@ -311,7 +311,7 @@
311
311
  {
312
312
  "dir": "wasm/packages/build-support",
313
313
  "name": "@pulse-compute/wasm-build-support",
314
- "version": "1.0.0-beta.2",
314
+ "version": "1.0.0-beta.3",
315
315
  "documentation": "docs/packages/implementation-packages.md",
316
316
  "role": "implementation",
317
317
  "tier": "implementation",
@@ -325,7 +325,7 @@
325
325
  {
326
326
  "dir": "wasm/packages/compiler",
327
327
  "name": "@pulse-compute/wasm-compiler",
328
- "version": "1.0.0-beta.2",
328
+ "version": "1.0.0-beta.3",
329
329
  "documentation": "docs/packages/implementation-packages.md",
330
330
  "role": "implementation",
331
331
  "tier": "implementation",
@@ -340,7 +340,7 @@
340
340
  {
341
341
  "dir": "wasm/packages/wasm-guest-link",
342
342
  "name": "@pulse-compute/wasm-guest-link",
343
- "version": "1.0.0-beta.2",
343
+ "version": "1.0.0-beta.3",
344
344
  "documentation": "docs/packages/implementation-packages.md",
345
345
  "role": "implementation",
346
346
  "tier": "implementation",
@@ -354,7 +354,7 @@
354
354
  {
355
355
  "dir": "wasm/packages/contracts",
356
356
  "name": "@pulse-compute/wasm-contracts",
357
- "version": "1.0.0-beta.2",
357
+ "version": "1.0.0-beta.3",
358
358
  "documentation": "docs/packages/implementation-packages.md",
359
359
  "role": "implementation",
360
360
  "tier": "implementation",
@@ -368,7 +368,7 @@
368
368
  {
369
369
  "dir": "wasm/packages/host-runtime",
370
370
  "name": "@pulse-compute/wasm-host-runtime",
371
- "version": "1.0.0-beta.2",
371
+ "version": "1.0.0-beta.3",
372
372
  "documentation": "docs/packages/implementation-packages.md",
373
373
  "role": "implementation",
374
374
  "tier": "implementation",
@@ -382,7 +382,7 @@
382
382
  {
383
383
  "dir": "wasm/packages/library-kit",
384
384
  "name": "@pulse-compute/wasm-library-kit",
385
- "version": "1.0.0-beta.2",
385
+ "version": "1.0.0-beta.3",
386
386
  "documentation": "docs/packages/implementation-packages.md",
387
387
  "role": "implementation",
388
388
  "tier": "implementation",
@@ -396,7 +396,7 @@
396
396
  {
397
397
  "dir": "packages/provider-node",
398
398
  "name": "@pulse-compute/provider-node",
399
- "version": "1.0.0-beta.2",
399
+ "version": "1.0.0-beta.3",
400
400
  "documentation": "docs/packages/implementation-packages.md",
401
401
  "role": "implementation",
402
402
  "tier": "implementation",
@@ -411,7 +411,7 @@
411
411
  {
412
412
  "dir": "wasm/packages/runtime-core-as",
413
413
  "name": "@pulse-compute/wasm-runtime-core-as",
414
- "version": "1.0.0-beta.2",
414
+ "version": "1.0.0-beta.3",
415
415
  "documentation": "docs/packages/implementation-packages.md",
416
416
  "role": "implementation",
417
417
  "tier": "implementation",
@@ -425,7 +425,7 @@
425
425
  {
426
426
  "dir": "wasm/packages/schema-json",
427
427
  "name": "@pulse-compute/wasm-schema-json",
428
- "version": "1.0.0-beta.2",
428
+ "version": "1.0.0-beta.3",
429
429
  "documentation": "docs/packages/implementation-packages.md",
430
430
  "role": "implementation",
431
431
  "tier": "implementation",
@@ -3,7 +3,7 @@
3
3
  // Generated from release/pulse-release-manifest.json by wasm/scripts/sync-reference-docs.cjs.
4
4
  const DOCUMENTATION_ORIGIN = "https://pulsecompute.io";
5
5
  const DOCUMENTATION_BASE_PATH = "";
6
- const DOCUMENTATION_VERSION = "v1.0.0-beta.2";
6
+ const DOCUMENTATION_VERSION = "v1.0.0-beta.3";
7
7
  const DOCUMENTATION_LATEST_ALIAS = "latest";
8
8
 
9
9
  function trimSlashes(value) { return String(value || '').replace(/^\/+|\/+$/g, ''); }
@@ -36,7 +36,7 @@ function field(value) {
36
36
 
37
37
  const CONFIG_SECTIONS = Object.freeze([
38
38
  Object.freeze({ id: 'project', title: 'Project and provider selection', description: 'Select the canonical entry, provider, and build output.' }),
39
- Object.freeze({ id: 'crypto', title: 'Cryptographic requirements', description: 'Declare exact algorithms for the global or selected profile and resolve one target realization without fallback. This surface is part of the synchronized 1.0.0-beta.2 package set.' }),
39
+ Object.freeze({ id: 'crypto', title: 'Cryptographic requirements', description: 'Declare exact algorithms for the global or selected profile and resolve one target realization without fallback. This surface is part of the synchronized 1.0.0-beta.3 package set.' }),
40
40
  Object.freeze({ id: 'schemas', title: 'JSON schema policy', description: 'Configure bounded schema-body policy. Conventional projects declare registry identity only through pulse.schema.' }),
41
41
  Object.freeze({ id: 'dev', title: 'Local development', description: 'Configure the foreground local server and local-only provider inputs.' }),
42
42
  ...providerConfigSections
@@ -21,9 +21,6 @@ const {
21
21
  compileCanonicalNativePlan,
22
22
  writeCanonicalNativeModule
23
23
  } = require('@pulse-compute/wasm-compiler/canonical-native-compiler');
24
- const {
25
- executeCanonicalNativeModule
26
- } = require('@pulse-compute/wasm-host-runtime/runtime/canonical-native-host');
27
24
  const { PulseProjectError, projectJson, relative } = require('./project-config.js');
28
25
  const { describeDiagnostic, decorateDiagnostic, httpStatusForDiagnostic } = require('./diagnostics.js');
29
26
  const {
@@ -494,13 +491,23 @@ function providerExecutionOptions(project, values = {}) {
494
491
  return driver.executionOptions ? driver.executionOptions(project.providerConfig, resolved) : resolved;
495
492
  }
496
493
 
497
- function requiresExactNativeCrypto(compiled) {
498
- return Boolean(
499
- compiled
500
- && compiled.cryptoRealizationPlan
501
- && Array.isArray(compiled.cryptoRealizationPlan.algorithms)
502
- && compiled.cryptoRealizationPlan.algorithms.some((entry) => entry.kind === 'guest-linked')
503
- );
494
+ function requiresExactNativeExecution(compiled) {
495
+ const algorithms = compiled.cryptoRealizationPlan && compiled.cryptoRealizationPlan.algorithms || [];
496
+ const operations = compiled.metadata && compiled.metadata.providerOperations || [];
497
+ return algorithms.some((entry) => entry.kind === 'guest-linked' || entry.kind === 'guest-source')
498
+ || operations.some((entry) => ['kv.getVersioned', 'kv.insertIfAbsent', 'kv.compareAndSwap'].includes(entry.capability));
499
+ }
500
+
501
+ function prepareNativeExecution(project, compiled, native) {
502
+ const driver = providerDriver(project);
503
+ if (typeof driver.prepareNativeExecution !== 'function') {
504
+ throw new TypeError(`Provider ${driver.id} cannot execute this Native artifact locally.`);
505
+ }
506
+ const execute = driver.prepareNativeExecution(providerTargetInvocation(
507
+ project, 'execute-native', native.plan, providerLoweringPlan(project, compiled.metadata), { native }
508
+ ));
509
+ if (typeof execute !== 'function') throw new TypeError('Provider Native execution preparation must return a function.');
510
+ return execute;
504
511
  }
505
512
 
506
513
  function providerLoweringPlan(project, metadata) {
@@ -1525,11 +1532,12 @@ async function runProjectTests(project, options = {}) {
1525
1532
  assertImplementedTarget(project, 'test');
1526
1533
  const executeCanonicalProgram = driver.execute;
1527
1534
  if (!compiled) compiled = compileProject(project);
1528
- const exactNativeCrypto = requiresExactNativeCrypto(compiled);
1529
- const program = exactNativeCrypto ? null : loadCanonicalModule(compiled);
1530
- const native = hasEventCase || exactNativeCrypto
1535
+ const exactNativeExecution = requiresExactNativeExecution(compiled);
1536
+ const program = exactNativeExecution ? null : loadCanonicalModule(compiled);
1537
+ const native = hasEventCase || exactNativeExecution
1531
1538
  ? compileNativeProjectInMemory(project, { ...options, compiled }).native
1532
1539
  : null;
1540
+ const executeNative = exactNativeExecution ? prepareNativeExecution(project, compiled, native) : null;
1533
1541
  const cases = [];
1534
1542
  let failed = 0;
1535
1543
  for (const testCase of selected) {
@@ -1567,8 +1575,8 @@ async function runProjectTests(project, options = {}) {
1567
1575
  continuationTtlMs: testCase.continuationTtlMs,
1568
1576
  executionId: `test:${testCase.name}`
1569
1577
  });
1570
- const execution = exactNativeCrypto
1571
- ? await executeCanonicalNativeModule(native, executionOptions)
1578
+ const execution = exactNativeExecution
1579
+ ? await executeNative(executionOptions)
1572
1580
  : await executeCanonicalProgram(program, executionOptions);
1573
1581
  if (testCase.expect.error) throw new assert.AssertionError({ message: `${testCase.name}: expected ${testCase.expect.error.name || 'an error'} but execution completed` });
1574
1582
  assertExpectation(testCase, Object.freeze({
@@ -1581,6 +1589,7 @@ async function runProjectTests(project, options = {}) {
1581
1589
  durationMs: Number(process.hrtime.bigint() - started) / 1e6,
1582
1590
  response: Object.freeze({ status: execution.response.status, bodyClass: execution.response.bodyClass, kind: execution.response.kind }),
1583
1591
  effects: execution.effectCount,
1592
+ ...(execution.evidence ? { executionEvidence: execution.evidence } : {}),
1584
1593
  continuations: execution.continuations.map((entry) => Object.freeze({ id: entry.id, state: entry.state, effectIds: entry.effectIds })),
1585
1594
  resolutionOrder: execution.resolutionOrder
1586
1595
  }));
@@ -2611,6 +2620,12 @@ async function startJavascriptDevServer(project, options = {}) {
2611
2620
  config: project.dev.config,
2612
2621
  secrets: project.dev.secrets,
2613
2622
  kv: project.dev.kv,
2623
+ bindings: project.providerConfig.bindings,
2624
+ s3FetchImplementation: javascript.createFixtureFetch(
2625
+ project.dev.fetches,
2626
+ project.dev.networkFetch ? globalThis.fetch : undefined,
2627
+ { rawResponse: true }
2628
+ ),
2614
2629
  fetchImplementation: javascript.createFixtureFetch(
2615
2630
  project.dev.fetches,
2616
2631
  project.dev.networkFetch ? globalThis.fetch : undefined
@@ -2680,7 +2695,8 @@ async function startDevServer(project, options = {}) {
2680
2695
  let compiled;
2681
2696
  let program;
2682
2697
  let native;
2683
- let exactNativeCrypto = false;
2698
+ let executeNative;
2699
+ let exactNativeExecution = false;
2684
2700
  let packageArtifacts = Object.freeze([]);
2685
2701
  let compileError;
2686
2702
  let reloadTimer;
@@ -2705,15 +2721,17 @@ async function startDevServer(project, options = {}) {
2705
2721
  function reload(reason) {
2706
2722
  try {
2707
2723
  const nextCompiled = compileProject(project);
2708
- const nextExactNativeCrypto = requiresExactNativeCrypto(nextCompiled);
2709
- const nextProgram = nextExactNativeCrypto ? null : loadCanonicalModule(nextCompiled);
2710
- const nextNative = nextExactNativeCrypto
2724
+ const nextExactNativeExecution = requiresExactNativeExecution(nextCompiled);
2725
+ const nextProgram = nextExactNativeExecution ? null : loadCanonicalModule(nextCompiled);
2726
+ const nextNative = nextExactNativeExecution
2711
2727
  ? compileNativeProjectInMemory(project, { ...options, compiled: nextCompiled }).native
2712
2728
  : null;
2729
+ const nextExecuteNative = nextExactNativeExecution ? prepareNativeExecution(project, nextCompiled, nextNative) : null;
2713
2730
  compiled = nextCompiled;
2714
2731
  program = nextProgram;
2715
2732
  native = nextNative;
2716
- exactNativeCrypto = nextExactNativeCrypto;
2733
+ executeNative = nextExecuteNative;
2734
+ exactNativeExecution = nextExactNativeExecution;
2717
2735
  packageArtifacts = packageRealizationArtifactsForCompiled(nextCompiled);
2718
2736
  compileError = undefined;
2719
2737
  syncWatchFiles(compiled.watchFiles);
@@ -2726,8 +2744,8 @@ async function startDevServer(project, options = {}) {
2726
2744
  watchFiles: Object.freeze(compiled.watchFiles.map((file) => relative(file, project.root)))
2727
2745
  }));
2728
2746
  } catch (error) {
2729
- if (!program) compileError = error;
2730
- events(Object.freeze({ event: 'compile-error', retainedLastGoodProgram: Boolean(program), error: errorSummary(error, project.dev.secrets) }));
2747
+ if (!program && !executeNative) compileError = error;
2748
+ events(Object.freeze({ event: 'compile-error', retainedLastGoodProgram: Boolean(program || executeNative), error: errorSummary(error, project.dev.secrets) }));
2731
2749
  }
2732
2750
  }
2733
2751
  function scheduleReload() {
@@ -2758,8 +2776,8 @@ async function startDevServer(project, options = {}) {
2758
2776
  liveFetch: project.dev.networkFetch,
2759
2777
  executionId: `dev:${++handled}`
2760
2778
  });
2761
- const execution = exactNativeCrypto
2762
- ? await executeCanonicalNativeModule(native, executionOptions)
2779
+ const execution = exactNativeExecution
2780
+ ? await executeNative(executionOptions)
2763
2781
  : await executeCanonicalProgram(program, executionOptions);
2764
2782
  writeNodeHttpResponse(res, execution.response);
2765
2783
  events(Object.freeze({ event: 'request', method: req.method || 'GET', path: url.pathname, status: execution.response.status, effects: execution.effectCount }));