@pulse-compute/cli 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 (191) hide show
  1. package/API.md +572 -0
  2. package/CHANGELOG.md +71 -0
  3. package/README.md +71 -1
  4. package/bin/pulse.js +15 -0
  5. package/bin/pulsewasm-extract.js +22 -0
  6. package/cli-spec.json +575 -0
  7. package/completions/_pulse +106 -0
  8. package/completions/pulse.bash +31 -0
  9. package/completions/pulse.fish +76 -0
  10. package/docs/README.md +77 -0
  11. package/docs/architecture/current-contracts.md +470 -0
  12. package/docs/architecture/overview.md +93 -0
  13. package/docs/architecture/vision.md +515 -0
  14. package/docs/concepts/bodies.md +186 -0
  15. package/docs/concepts/compilation-and-lowering.md +496 -0
  16. package/docs/concepts/contracts-and-providers.md +158 -0
  17. package/docs/concepts/effects-and-continuations.md +300 -0
  18. package/docs/concepts/entities-and-adapters.md +71 -0
  19. package/docs/concepts/package-owned-lowering.md +175 -0
  20. package/docs/concepts/targets-and-hosts.md +70 -0
  21. package/docs/contributing/README.md +38 -0
  22. package/docs/contributing/adding-core-provider.md +315 -0
  23. package/docs/contributing/adding-first-party-lowerer.md +327 -0
  24. package/docs/contributing/entities-lowering.md +91 -0
  25. package/docs/contributing/package-lowerer-contract.md +383 -0
  26. package/docs/contributing/pulse-aware-packages.md +149 -0
  27. package/docs/examples.md +112 -0
  28. package/docs/fixtures/inspect-fetch-composition.selected.json +181 -0
  29. package/docs/getting-started.md +128 -0
  30. package/docs/guides/compatibility-imports.md +60 -0
  31. package/docs/guides/deploying-fastly.md +188 -0
  32. package/docs/guides/deploying-node.md +143 -0
  33. package/docs/guides/events.md +233 -0
  34. package/docs/guides/fastly-capabilities.md +153 -0
  35. package/docs/guides/fetching-and-composition.md +101 -0
  36. package/docs/guides/grip.md +94 -0
  37. package/docs/guides/json-schemas.md +233 -0
  38. package/docs/guides/migrating-from-express.md +192 -0
  39. package/docs/guides/project-lifecycle.md +143 -0
  40. package/docs/guides/routing.md +202 -0
  41. package/docs/guides/troubleshooting.md +47 -0
  42. package/docs/maintainers/README.md +60 -0
  43. package/docs/maintainers/codex-maintainer.md +71 -0
  44. package/docs/maintainers/documentation-deployment.md +147 -0
  45. package/docs/maintainers/documentation-system.md +58 -0
  46. package/docs/maintainers/documentation-versioning.md +65 -0
  47. package/docs/maintainers/maintainer-charter.md +100 -0
  48. package/docs/maintainers/maintenance-policy.json +809 -0
  49. package/docs/maintainers/maintenance-policy.md +124 -0
  50. package/docs/maintainers/npm-publishing.md +154 -0
  51. package/docs/maintainers/plugin-readiness.json +19 -0
  52. package/docs/maintainers/plugin-readiness.md +31 -0
  53. package/docs/maintainers/public-site.md +158 -0
  54. package/docs/maintainers/release-acceptance.md +293 -0
  55. package/docs/maintainers/release-manifest.md +89 -0
  56. package/docs/maintainers/repository-setup.md +145 -0
  57. package/docs/maintainers/scope-policy.md +105 -0
  58. package/docs/maintainers/support-and-triage.md +74 -0
  59. package/docs/maintainers/testing.md +334 -0
  60. package/docs/packages/README.md +60 -0
  61. package/docs/packages/assets.md +85 -0
  62. package/docs/packages/cli.md +190 -0
  63. package/docs/packages/crypto.md +78 -0
  64. package/docs/packages/entities.md +129 -0
  65. package/docs/packages/grip.md +82 -0
  66. package/docs/packages/implementation-packages.md +122 -0
  67. package/docs/packages/jwt.md +55 -0
  68. package/docs/packages/provider-fastly.md +243 -0
  69. package/docs/packages/pulse.md +159 -0
  70. package/docs/packages/runtime.md +265 -0
  71. package/docs/packages/s3.md +101 -0
  72. package/docs/preview-scope.md +142 -0
  73. package/docs/reference/README.md +33 -0
  74. package/docs/reference/cli-spec.json +575 -0
  75. package/docs/reference/cli.md +457 -0
  76. package/docs/reference/compatibility-matrix.md +169 -0
  77. package/docs/reference/diagnostics.md +1872 -0
  78. package/docs/reference/documentation-versions.json +22 -0
  79. package/docs/reference/environment.md +347 -0
  80. package/docs/reference/handler-authoring.md +264 -0
  81. package/docs/reference/project-config.md +582 -0
  82. package/docs/reference/project-config.schema.json +981 -0
  83. package/docs/reference/release-manifest.json +441 -0
  84. package/docs/reference/shell-completion.md +23 -0
  85. package/documentation-site.json +668 -0
  86. package/documentation-versions.json +22 -0
  87. package/examples/01-hello-json/.pulse/.gitignore +3 -0
  88. package/examples/01-hello-json/.pulse/config.ts +16 -0
  89. package/examples/01-hello-json/README.md +119 -0
  90. package/examples/01-hello-json/package.json +20 -0
  91. package/examples/01-hello-json/src/index.ts +9 -0
  92. package/examples/01-hello-json/tests/pulse.harness.ts +22 -0
  93. package/examples/01-hello-json/tsconfig.json +14 -0
  94. package/examples/02-request-schema/.pulse/.gitignore +3 -0
  95. package/examples/02-request-schema/.pulse/config.ts +17 -0
  96. package/examples/02-request-schema/README.md +145 -0
  97. package/examples/02-request-schema/package.json +20 -0
  98. package/examples/02-request-schema/src/index.ts +18 -0
  99. package/examples/02-request-schema/src/schemas.ts +20 -0
  100. package/examples/02-request-schema/tests/pulse.harness.ts +37 -0
  101. package/examples/02-request-schema/tsconfig.json +14 -0
  102. package/examples/03-fetch-composition/.pulse/.gitignore +3 -0
  103. package/examples/03-fetch-composition/.pulse/config.ts +31 -0
  104. package/examples/03-fetch-composition/README.md +210 -0
  105. package/examples/03-fetch-composition/package.json +20 -0
  106. package/examples/03-fetch-composition/src/index.ts +60 -0
  107. package/examples/03-fetch-composition/tests/pulse.harness.ts +47 -0
  108. package/examples/03-fetch-composition/tsconfig.json +14 -0
  109. package/examples/05-fastly-capabilities/.pulse/.gitignore +3 -0
  110. package/examples/05-fastly-capabilities/.pulse/config.ts +57 -0
  111. package/examples/05-fastly-capabilities/README.md +257 -0
  112. package/examples/05-fastly-capabilities/package.json +22 -0
  113. package/examples/05-fastly-capabilities/src/index.ts +55 -0
  114. package/examples/05-fastly-capabilities/tests/pulse.harness.ts +66 -0
  115. package/examples/05-fastly-capabilities/tsconfig.json +14 -0
  116. package/examples/07-opaque-proxy/.pulse/.gitignore +3 -0
  117. package/examples/07-opaque-proxy/.pulse/config.ts +38 -0
  118. package/examples/07-opaque-proxy/README.md +150 -0
  119. package/examples/07-opaque-proxy/package.json +21 -0
  120. package/examples/07-opaque-proxy/src/index.ts +9 -0
  121. package/examples/07-opaque-proxy/tests/pulse.harness.ts +25 -0
  122. package/examples/07-opaque-proxy/tsconfig.json +14 -0
  123. package/examples/09-router-lowering/.pulse/.gitignore +3 -0
  124. package/examples/09-router-lowering/.pulse/config.ts +22 -0
  125. package/examples/09-router-lowering/README.md +287 -0
  126. package/examples/09-router-lowering/package.json +22 -0
  127. package/examples/09-router-lowering/src/index.ts +65 -0
  128. package/examples/09-router-lowering/tests/pulse.harness.ts +91 -0
  129. package/examples/09-router-lowering/tsconfig.json +14 -0
  130. package/examples/10-entities-tools/.pulse/.gitignore +4 -0
  131. package/examples/10-entities-tools/.pulse/config.ts +23 -0
  132. package/examples/10-entities-tools/README.md +165 -0
  133. package/examples/10-entities-tools/package.json +21 -0
  134. package/examples/10-entities-tools/src/handlers.ts +15 -0
  135. package/examples/10-entities-tools/src/index.ts +31 -0
  136. package/examples/10-entities-tools/src/schemas.ts +18 -0
  137. package/examples/10-entities-tools/tests/pulse.harness.ts +40 -0
  138. package/examples/10-entities-tools/tools-facade.cjs +158 -0
  139. package/examples/10-entities-tools/tsconfig.json +14 -0
  140. package/examples/11-events/.pulse/.gitignore +4 -0
  141. package/examples/11-events/.pulse/config.ts +24 -0
  142. package/examples/11-events/README.md +194 -0
  143. package/examples/11-events/package.json +20 -0
  144. package/examples/11-events/src/index.ts +27 -0
  145. package/examples/11-events/src/schemas.ts +19 -0
  146. package/examples/11-events/tests/pulse.harness.ts +34 -0
  147. package/examples/11-events/tsconfig.json +15 -0
  148. package/examples/12-mcp-proxy/.pulse/.gitignore +3 -0
  149. package/examples/12-mcp-proxy/.pulse/config.ts +25 -0
  150. package/examples/12-mcp-proxy/README.md +149 -0
  151. package/examples/12-mcp-proxy/package.json +20 -0
  152. package/examples/12-mcp-proxy/src/index.ts +17 -0
  153. package/examples/12-mcp-proxy/tests/pulse.harness.ts +29 -0
  154. package/examples/12-mcp-proxy/tsconfig.json +14 -0
  155. package/examples/13-jwt-es256/.pulse/config.ts +19 -0
  156. package/examples/13-jwt-es256/README.md +195 -0
  157. package/examples/13-jwt-es256/package.json +21 -0
  158. package/examples/13-jwt-es256/src/index.ts +21 -0
  159. package/examples/13-jwt-es256/tests/pulse.harness.ts +54 -0
  160. package/examples/13-jwt-es256/tsconfig.json +14 -0
  161. package/examples/README.md +36 -0
  162. package/package.json +66 -6
  163. package/project-config.schema.json +981 -0
  164. package/release-manifest.json +441 -0
  165. package/src/command-spec.js +279 -0
  166. package/src/completion.js +113 -0
  167. package/src/diagnostics.js +350 -0
  168. package/src/documentation.js +45 -0
  169. package/src/index.d.ts +133 -0
  170. package/src/index.js +15 -0
  171. package/src/internal/command-executor.d.ts +29 -0
  172. package/src/internal/command-executor.js +143 -0
  173. package/src/internal/command-plan.d.ts +9 -0
  174. package/src/internal/command-plan.js +73 -0
  175. package/src/internal/command-reporter.d.ts +15 -0
  176. package/src/internal/command-reporter.js +133 -0
  177. package/src/internal/command-request.d.ts +35 -0
  178. package/src/internal/command-request.js +154 -0
  179. package/src/internal/node-http.js +54 -0
  180. package/src/internal/project-context.d.ts +66 -0
  181. package/src/internal/project-context.js +175 -0
  182. package/src/project-config-reference.js +4 -0
  183. package/src/project-config-schema.d.ts +23 -0
  184. package/src/project-config-schema.js +271 -0
  185. package/src/project-config.js +724 -0
  186. package/src/project-execution.js +2946 -0
  187. package/src/provider-drivers.js +3 -0
  188. package/src/target-support.js +3 -0
  189. package/src/typescript-module-loader.js +269 -0
  190. package/src/workflow.js +78 -0
  191. package/src/workspace.js +82 -0
@@ -0,0 +1,582 @@
1
+ # Project configuration reference
2
+
3
+ <!-- Generated by wasm/scripts/sync-reference-docs.cjs. Edit the source catalog, not this file. -->
4
+
5
+ ## Conventional `.pulse/config.ts`
6
+
7
+ Conventional projects use one deferred, synchronous `defineConfig` factory from `@pulse-compute/pulse`. Every top-level key except `pulse` is a flat profile. The scope exposes symbolic `config` and `secret` references; it never resolves ambient values while the project plan is built.
8
+
9
+ ```ts
10
+ import { defineConfig } from '@pulse-compute/pulse'
11
+
12
+ export default defineConfig((scope) => ({
13
+ pulse: {
14
+ entry: 'src/index.ts',
15
+ tests: 'tests/pulse.harness.ts',
16
+ defaultProfile: 'local',
17
+ strict: true,
18
+ },
19
+ local: {
20
+ host: 'node',
21
+ target: 'native',
22
+ apiBase: scope.config('API_BASE'),
23
+ apiToken: scope.secret('API_TOKEN'),
24
+ },
25
+ }))
26
+ ```
27
+
28
+ Project pointers are workspace-relative. Profile selection is explicit and deterministic:
29
+
30
+ 1. `--profile`
31
+ 2. `PULSE_PROFILE`
32
+ 3. `pulse.defaultProfile`
33
+
34
+ Project commands accept one optional positional directory and otherwise start from the current directory. Discovery searches upward only for `.pulse/config.ts`. Public entry, config-file, workspace, provider, and target overrides are not supported.
35
+
36
+ 1. Discovery starts at the positional directory or the current working directory and searches upward for .pulse/config.ts.
37
+ 2. Profile precedence is --profile, PULSE_PROFILE, then pulse.defaultProfile.
38
+ 3. A selected-profile crypto declaration replaces pulse.crypto completely; array and object forms never merge.
39
+ 4. Command-line output, host, port, and watch values override the corresponding active-profile field for that command. Entry, provider, and target remain project-configured.
40
+ 5. Dedicated harness case inputs replace development inputs for that case; they do not configure deployment resources.
41
+ 6. Provider deployment bindings come from the configured provider object; handler source never receives provider SDK objects.
42
+
43
+ ## Project and provider selection
44
+
45
+ Select the canonical entry, provider, and build output.
46
+
47
+ ### `entry`
48
+
49
+ Project-relative TypeScript handler entry.
50
+
51
+ - **Type:** string
52
+ - **Required/default:** Optional; default `./src/index.ts`.
53
+ - **Allowed values or constraints:** —
54
+ - **Scope:** all project commands
55
+ - **Precedence:** `pulse.entry` in `.pulse/config.ts`.
56
+ - **Security and safety:** Must resolve to an existing file.
57
+ - **Related diagnostics:** [`PULSE_ENTRY_NOT_FOUND`](diagnostics.md#pulse-entry-not-found)
58
+
59
+ ### `provider`
60
+
61
+ Selects provider validation, local conformance, and build realization through the provider package toolchain contract.
62
+
63
+ - **Type:** 'node' | 'fastly' | 'none' | scoped package name | provider configuration
64
+ - **Required/default:** Optional; default `node`.
65
+ - **Allowed values or constraints:** `node`, `fastly`, `none`, another bare host id, or an exact scoped package name
66
+ - **Scope:** compile/build/dev/test
67
+ - **Precedence:** Bare host ids resolve to `@pulse-compute/provider-<id>`; scoped package names are loaded exactly from the project.
68
+ - **Security and safety:** Package loading is explicit and limited to the selected package `./toolchain` export; there is no scanning or fallback discovery.
69
+ - **Related diagnostics:** [`PULSE_PROVIDER_PACKAGE_NOT_FOUND`](diagnostics.md#pulse-provider-package-not-found), [`PULSE_PROVIDER_TOOLCHAIN_LOAD_FAILED`](diagnostics.md#pulse-provider-toolchain-load-failed), [`PULSE_PROVIDER_TOOLCHAIN_INVALID`](diagnostics.md#pulse-provider-toolchain-invalid), [`PULSE_PROVIDER_UNSUPPORTED`](diagnostics.md#pulse-provider-unsupported), [`PULSE_PROVIDER_COMPILE_ONLY`](diagnostics.md#pulse-provider-compile-only), [`PULSE_TEST_PROVIDER_REQUIRED`](diagnostics.md#pulse-test-provider-required), [`PULSE_DEV_PROVIDER_UNSUPPORTED`](diagnostics.md#pulse-dev-provider-unsupported)
70
+
71
+ ### `outDir`
72
+
73
+ Project-relative artifact output directory.
74
+
75
+ - **Type:** string
76
+ - **Required/default:** Optional; default `./dist`.
77
+ - **Allowed values or constraints:** —
78
+ - **Scope:** compile/build
79
+ - **Precedence:** `--out` overrides this field for the current command.
80
+ - **Security and safety:** Must remain a real child of the project root; absolute, parent-traversal, and symbolic-link traversal outside the project root is rejected.
81
+ - **Related diagnostics:** [`PULSE_BUILD_OUT_UNSAFE`](diagnostics.md#pulse-build-out-unsafe)
82
+
83
+ ### `reporting`
84
+
85
+ Resolved synchronous logging threshold after the flat profile override is applied.
86
+
87
+ - **Type:** 'off' | 'error' | 'warn' | 'info' | 'debug'
88
+ - **Required/default:** Optional; default `info`.
89
+ - **Allowed values or constraints:** `off`, `error`, `warn`, `info`, `debug`
90
+ - **Scope:** compile/build/dev/test
91
+ - **Precedence:** Selected-profile `reporting`, then `pulse.reporting`, then `info`.
92
+ - **Security and safety:** Known request-owned secret values are redacted before provider emission.
93
+ - **Related diagnostics:** `PULSE_REPORTING_LEVEL_UNSUPPORTED` (family fallback; reference root)
94
+
95
+ ## Cryptographic requirements
96
+
97
+ 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.
98
+
99
+ ### `pulse.crypto`
100
+
101
+ Declares the complete global algorithm set. Array entries are canonical algorithm names; object entries may pin one exact known realization.
102
+
103
+ - **Type:** readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>
104
+ - **Required/default:** Optional; default implicit no-crypto declaration.
105
+ - **Allowed values or constraints:** `HS256`, `ES256`, `SHA-256`, `HMAC-SHA256`; exact pins `runtime-builtin`, `guest-source:pulse-hmac-as`, and `guest-linked:pulse-es256-rustcrypto-p256`
106
+ - **Scope:** global crypto requirement default
107
+ - **Precedence:** Used only when the selected profile omits `crypto`.
108
+ - **Security and safety:** Keys and verification bytes are not configuration values. Target selection is deterministic and never probes or falls back.
109
+ - **Related diagnostics:** `PULSE_CRYPTO_CONFIG_SHAPE_INVALID` (family fallback; reference root), `PULSE_CRYPTO_ALGORITHM_DUPLICATE` (family fallback; reference root), `PULSE_CRYPTO_ALGORITHM_UNKNOWN` (family fallback; reference root), `PULSE_CRYPTO_REALIZATION_UNKNOWN` (family fallback; reference root)
110
+
111
+ ### `<profile>.crypto`
112
+
113
+ Replaces the complete global crypto declaration for the selected profile. Arrays and objects never merge with `pulse.crypto`.
114
+
115
+ - **Type:** readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>
116
+ - **Required/default:** Optional; default inherit `pulse.crypto` when absent.
117
+ - **Allowed values or constraints:** `[]` and `{}` explicitly select no crypto; otherwise `HS256`, `ES256`, `SHA-256`, `HMAC-SHA256`
118
+ - **Scope:** selected profile
119
+ - **Precedence:** Selected-profile declaration replaces `pulse.crypto`; absence inherits it.
120
+ - **Security and safety:** Every declared algorithm must resolve for the selected target before lowering. A failed exact realization cannot select another backend.
121
+ - **Related diagnostics:** `PULSE_CRYPTO_CONFIG_REQUIRED` (family fallback; reference root), `PULSE_CRYPTO_REALIZATION_PIN_INVALID` (family fallback; reference root), `PULSE_CRYPTO_REALIZATION_UNAVAILABLE` (family fallback; reference root)
122
+
123
+ ## JSON schema policy
124
+
125
+ Configure bounded schema-body policy. Conventional projects declare registry identity only through pulse.schema.
126
+
127
+ ### `schemas`
128
+
129
+ Sets schema body limits and content-type policy. Schema identities come from the module selected by pulse.schema.
130
+
131
+ - **Type:** PulseSchemaConfig
132
+ - **Required/default:** Optional; default `{}`.
133
+ - **Allowed values or constraints:** —
134
+ - **Scope:** compile/dev/test/build
135
+ - **Precedence:** Configuration value.
136
+ - **Security and safety:** Structured bodies are bounded before decoding.
137
+ - **Related diagnostics:** [`PULSE_SCHEMA_COMPILE_FAILED`](diagnostics.md#pulse-schema-compile-failed)
138
+
139
+ ### `schemas.contentTypePolicy`
140
+
141
+ Controls whether a JSON content type is mandatory.
142
+
143
+ - **Type:** 'accept-json-or-missing' | 'require-json'
144
+ - **Required/default:** Optional; default `accept-json-or-missing`.
145
+ - **Allowed values or constraints:** `accept-json-or-missing`, `require-json`
146
+ - **Scope:** request and fetched-body schema decode
147
+ - **Precedence:** Configuration value.
148
+ - **Security and safety:** No special handling.
149
+ - **Related diagnostics:** `PULSE_SCHEMA_CONTENT_TYPE_POLICY_INVALID` (family fallback; reference root), [`PULSE_SCHEMA_DECODE`](diagnostics.md#pulse-schema-decode)
150
+
151
+ ### `schemas.maxBytes`
152
+
153
+ Maximum buffered bytes accepted by schema decoding.
154
+
155
+ - **Type:** positive safe integer
156
+ - **Required/default:** Optional; default `65_536`.
157
+ - **Allowed values or constraints:** —
158
+ - **Scope:** structured schema decode
159
+ - **Precedence:** Configuration value.
160
+ - **Security and safety:** Raise deliberately; this is a memory and request-amplification boundary.
161
+ - **Related diagnostics:** `PULSE_SCHEMA_BODY_LIMIT_INVALID` (family fallback; reference root), [`PULSE_BODY_TOO_LARGE`](diagnostics.md#pulse-body-too-large)
162
+
163
+ ## Local development
164
+
165
+ Configure the foreground local server and local-only provider inputs.
166
+
167
+ ### `dev`
168
+
169
+ Development listener and local fixture inputs.
170
+
171
+ - **Type:** object
172
+ - **Required/default:** Optional; default `{}`.
173
+ - **Allowed values or constraints:** —
174
+ - **Scope:** pulse dev and local conformance
175
+ - **Precedence:** Configuration value.
176
+ - **Security and safety:** No special handling.
177
+ - **Related diagnostics:** None specific.
178
+
179
+ ### `dev.host`
180
+
181
+ Listener host.
182
+
183
+ - **Type:** string
184
+ - **Required/default:** Optional; default `127.0.0.1`.
185
+ - **Allowed values or constraints:** —
186
+ - **Scope:** pulse dev
187
+ - **Precedence:** `--host` overrides this field.
188
+ - **Security and safety:** Binding a non-loopback address exposes the local development server.
189
+ - **Related diagnostics:** `PULSE_DEV_HOST_INVALID` (family fallback; reference root)
190
+
191
+ ### `dev.port`
192
+
193
+ Listener port.
194
+
195
+ - **Type:** integer
196
+ - **Required/default:** Optional; default `8787`.
197
+ - **Allowed values or constraints:** `0`–`65535`; `0` requests an ephemeral port
198
+ - **Scope:** pulse dev
199
+ - **Precedence:** `--port` overrides this field.
200
+ - **Security and safety:** No special handling.
201
+ - **Related diagnostics:** `PULSE_DEV_PORT_INVALID` (family fallback; reference root)
202
+
203
+ ### `dev.watch`
204
+
205
+ Watches the entry and schema dependency graph.
206
+
207
+ - **Type:** boolean
208
+ - **Required/default:** Optional; default `true`.
209
+ - **Allowed values or constraints:** —
210
+ - **Scope:** pulse dev
211
+ - **Precedence:** `--watch` or `--no-watch` overrides this field.
212
+ - **Security and safety:** Configuration-file changes still require a restart.
213
+ - **Related diagnostics:** None specific.
214
+
215
+ ### `dev.maxBodyBytes`
216
+
217
+ Maximum request body accepted by the local development server.
218
+
219
+ - **Type:** positive safe integer
220
+ - **Required/default:** Optional; default `65_536`.
221
+ - **Allowed values or constraints:** —
222
+ - **Scope:** incoming local requests
223
+ - **Precedence:** Configuration value.
224
+ - **Security and safety:** Raise deliberately; this is a memory and request-amplification boundary.
225
+ - **Related diagnostics:** `PULSE_DEV_BODY_LIMIT_INVALID` (family fallback; reference root), [`PULSE_REQUEST_BODY_TOO_LARGE`](diagnostics.md#pulse-request-body-too-large)
226
+
227
+ ### `dev.networkFetch`
228
+
229
+ Allows unmatched local fetches to use the network.
230
+
231
+ - **Type:** boolean
232
+ - **Required/default:** Optional; default selected provider default.
233
+ - **Allowed values or constraints:** —
234
+ - **Scope:** local fetch realization
235
+ - **Precedence:** This explicit field overrides the selected provider local default.
236
+ - **Security and safety:** Keep disabled for deterministic or untrusted test inputs.
237
+ - **Related diagnostics:** [`PULSE_FETCH_IMPLEMENTATION_UNAVAILABLE`](diagnostics.md#pulse-fetch-implementation-unavailable), [`PULSE_FETCH_NETWORK`](diagnostics.md#pulse-fetch-network)
238
+
239
+ ### `dev.config`
240
+
241
+ Local configuration-store values.
242
+
243
+ - **Type:** Readonly<Record<string, string>>
244
+ - **Required/default:** Optional; default `{}`.
245
+ - **Allowed values or constraints:** —
246
+ - **Scope:** local config capability
247
+ - **Precedence:** Configuration value.
248
+ - **Security and safety:** Development input only; it does not configure deployed provider stores.
249
+ - **Related diagnostics:** None specific.
250
+
251
+ ### `dev.secrets`
252
+
253
+ Local secret-store values.
254
+
255
+ - **Type:** Readonly<Record<string, string>>
256
+ - **Required/default:** Optional; default `{}`.
257
+ - **Allowed values or constraints:** —
258
+ - **Scope:** local secret capability
259
+ - **Precedence:** Configuration value.
260
+ - **Security and safety:** Raw values are omitted from project JSON, diagnostics, and runtime error details; do not commit real production secrets.
261
+ - **Related diagnostics:** None specific.
262
+
263
+ ### `dev.kv`
264
+
265
+ Local KV stores keyed by configured logical store name.
266
+
267
+ - **Type:** Readonly<Record<string, Readonly<Record<string, unknown>>>>
268
+ - **Required/default:** Optional; default `{}`.
269
+ - **Allowed values or constraints:** —
270
+ - **Scope:** local KV capability
271
+ - **Precedence:** Configuration value.
272
+ - **Security and safety:** Development input only; it is not deployed.
273
+ - **Related diagnostics:** None specific.
274
+
275
+ ### `dev.fetches`
276
+
277
+ Deterministic fetch fixtures resolved before optional live network fetch.
278
+
279
+ - **Type:** Readonly<Record<string, unknown>>
280
+ - **Required/default:** Optional; default `{}`.
281
+ - **Allowed values or constraints:** —
282
+ - **Scope:** local fetch capability
283
+ - **Precedence:** Configuration value.
284
+ - **Security and safety:** Prefer fixtures for deterministic tests and offline development.
285
+ - **Related diagnostics:** None specific.
286
+
287
+ ## Node provider options
288
+
289
+ Provider-owned Node profile configuration.
290
+
291
+ ### `node.bindings.s3`
292
+
293
+ Maps literal logical names to fixed HTTPS endpoint, bucket, region, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–32768, default 32768) and timeoutMs (1–30000, default 10000).
294
+
295
+ - **Type:** Readonly<Record<string, S3Binding>>
296
+ - **Required/default:** Optional; default `{}`.
297
+ - **Allowed values or constraints:** —
298
+ - **Scope:** Node Native and JavaScript S3
299
+ - **Precedence:** Configuration value.
300
+ - **Security and safety:** Only named credential references are configuration. Runtime keys cannot override authority.
301
+ - **Related diagnostics:** None specific.
302
+
303
+ ## Fastly provider options
304
+
305
+ Options passed to fastly(...) from @pulse-compute/provider-fastly.
306
+
307
+ ### `fastly.bindings.s3`
308
+
309
+ Maps logical names to fixed HTTPS endpoint, bucket, region, named static backend, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–32768, default 32768) and timeoutMs (1–30000, default 10000).
310
+
311
+ - **Type:** Readonly<Record<string, S3Binding & { backend: string }>>
312
+ - **Required/default:** Optional; default `{}`.
313
+ - **Allowed values or constraints:** —
314
+ - **Scope:** Fastly Native S3
315
+ - **Precedence:** Configuration value.
316
+ - **Security and safety:** Credentials resolve through the configured Secret Store at execution. Dynamic backend authority and guest endpoint overrides are forbidden.
317
+ - **Related diagnostics:** None specific.
318
+
319
+ ### `fastly.configStore`
320
+
321
+ Fastly Config Store resource name.
322
+
323
+ - **Type:** string
324
+ - **Required/default:** Optional; default `pulse_config`.
325
+ - **Allowed values or constraints:** —
326
+ - **Scope:** Fastly config capability
327
+ - **Precedence:** Configuration value.
328
+ - **Security and safety:** No special handling.
329
+ - **Related diagnostics:** None specific.
330
+
331
+ ### `fastly.secretStore`
332
+
333
+ Fastly Secret Store resource name.
334
+
335
+ - **Type:** string
336
+ - **Required/default:** Optional; default `pulse_secrets`.
337
+ - **Allowed values or constraints:** —
338
+ - **Scope:** Fastly secret capability
339
+ - **Precedence:** Configuration value.
340
+ - **Security and safety:** The name is build metadata; secret values are never embedded by this option.
341
+ - **Related diagnostics:** None specific.
342
+
343
+ ### `fastly.kv`
344
+
345
+ Maps logical ctx.kv names to Fastly KV Store resource names.
346
+
347
+ - **Type:** Readonly<Record<string, string>>
348
+ - **Required/default:** Optional; default `{}`.
349
+ - **Allowed values or constraints:** —
350
+ - **Scope:** Fastly KV capability
351
+ - **Precedence:** Configuration value.
352
+ - **Security and safety:** No special handling.
353
+ - **Related diagnostics:** [`PULSE_FASTLY_KV_BINDINGS_INVALID`](diagnostics.md#pulse-fastly-kv-bindings-invalid)
354
+
355
+ ### `fastly.backends`
356
+
357
+ Maps static absolute origin URLs to named Fastly backends.
358
+
359
+ - **Type:** Readonly<Record<string, string>>
360
+ - **Required/default:** Optional; default `{}`.
361
+ - **Allowed values or constraints:** —
362
+ - **Scope:** Fastly fetch capability
363
+ - **Precedence:** Configuration value.
364
+ - **Security and safety:** Prefer explicit backends over dynamic origin authority.
365
+ - **Related diagnostics:** [`PULSE_FASTLY_BACKEND_BINDINGS_INVALID`](diagnostics.md#pulse-fastly-backend-bindings-invalid), [`PULSE_FASTLY_BACKEND_REQUIRED`](diagnostics.md#pulse-fastly-backend-required)
366
+
367
+ ### `fastly.dynamicBackends`
368
+
369
+ Allows undeclared outbound origins to use dynamic backends.
370
+
371
+ - **Type:** boolean
372
+ - **Required/default:** Optional; default `false`.
373
+ - **Allowed values or constraints:** —
374
+ - **Scope:** Fastly fetch capability
375
+ - **Precedence:** Configuration value.
376
+ - **Security and safety:** Opt in deliberately because it broadens outbound authority.
377
+ - **Related diagnostics:** [`PULSE_FASTLY_BACKEND_REQUIRED`](diagnostics.md#pulse-fastly-backend-required)
378
+
379
+ ### `fastly.grip`
380
+
381
+ Provider-owned bindings used by package-owned GRIP compatibility and canonical broadcast effects.
382
+
383
+ - **Type:** object
384
+ - **Required/default:** Optional; default omitted.
385
+ - **Allowed values or constraints:** —
386
+ - **Scope:** Fastly GRIP capability
387
+ - **Precedence:** Configuration value.
388
+ - **Security and safety:** No special handling.
389
+ - **Related diagnostics:** None specific.
390
+
391
+ ### `fastly.grip.fanoutBackend`
392
+
393
+ Named Fastly Fanout backend.
394
+
395
+ - **Type:** string
396
+ - **Required/default:** Optional; default omitted.
397
+ - **Allowed values or constraints:** —
398
+ - **Scope:** GRIP hold
399
+ - **Precedence:** Configuration value.
400
+ - **Security and safety:** No special handling.
401
+ - **Related diagnostics:** [`PULSE_FASTLY_GRIP_FANOUT_BACKEND_REQUIRED`](diagnostics.md#pulse-fastly-grip-fanout-backend-required)
402
+
403
+ ### `fastly.grip.publishEndpoint`
404
+
405
+ Provider-owned absolute publish/control endpoint; distinct from public gateway and ingress URLs.
406
+
407
+ - **Type:** string
408
+ - **Required/default:** Optional; default omitted.
409
+ - **Allowed values or constraints:** —
410
+ - **Scope:** GRIP broadcast
411
+ - **Precedence:** Configuration value.
412
+ - **Security and safety:** No special handling.
413
+ - **Related diagnostics:** [`PULSE_FASTLY_GRIP_PUBLISH_BINDING_REQUIRED`](diagnostics.md#pulse-fastly-grip-publish-binding-required)
414
+
415
+ ### `fastly.grip.publishUrl`
416
+
417
+ Absolute publish endpoint URL.
418
+
419
+ - **Type:** string
420
+ - **Required/default:** Optional; default omitted.
421
+ - **Allowed values or constraints:** —
422
+ - **Scope:** GRIP publish
423
+ - **Precedence:** Configuration value.
424
+ - **Security and safety:** No special handling.
425
+ - **Related diagnostics:** [`PULSE_FASTLY_GRIP_PUBLISH_BINDING_REQUIRED`](diagnostics.md#pulse-fastly-grip-publish-binding-required)
426
+
427
+ ### `fastly.grip.publishBackend`
428
+
429
+ Named backend for the provider publish endpoint.
430
+
431
+ - **Type:** string
432
+ - **Required/default:** Optional; default omitted.
433
+ - **Allowed values or constraints:** —
434
+ - **Scope:** GRIP broadcast/publish
435
+ - **Precedence:** Configuration value.
436
+ - **Security and safety:** No special handling.
437
+ - **Related diagnostics:** [`PULSE_FASTLY_GRIP_PUBLISH_BINDING_REQUIRED`](diagnostics.md#pulse-fastly-grip-publish-binding-required)
438
+
439
+ ### `fastly.grip.authentication`
440
+
441
+ Authentication metadata containing references only; no credential value is accepted here.
442
+
443
+ - **Type:** object
444
+ - **Required/default:** Optional; default omitted.
445
+ - **Allowed values or constraints:** —
446
+ - **Scope:** GRIP broadcast authentication
447
+ - **Precedence:** Configuration value.
448
+ - **Security and safety:** Store the value in Fastly Secret Store and configure only secretRef.
449
+ - **Related diagnostics:** None specific.
450
+
451
+ ### `fastly.grip.authentication.scheme`
452
+
453
+ Provider authentication scheme.
454
+
455
+ - **Type:** 'bearer'
456
+ - **Required/default:** Optional; default `bearer`.
457
+ - **Allowed values or constraints:** —
458
+ - **Scope:** GRIP broadcast authentication
459
+ - **Precedence:** Configuration value.
460
+ - **Security and safety:** No special handling.
461
+ - **Related diagnostics:** `PULSE_FASTLY_NATIVE_GRIP_AUTH_SCHEME_UNSUPPORTED` (family fallback; reference root)
462
+
463
+ ### `fastly.grip.authentication.secretRef`
464
+
465
+ Named Fastly Secret Store key used for the bearer token.
466
+
467
+ - **Type:** string
468
+ - **Required/default:** Optional; default omitted.
469
+ - **Allowed values or constraints:** —
470
+ - **Scope:** GRIP broadcast authentication
471
+ - **Precedence:** Configuration value.
472
+ - **Security and safety:** The secret value is resolved only at request execution and is redacted from traces.
473
+ - **Related diagnostics:** `PULSE_FASTLY_NATIVE_GRIP_SECRET_REFERENCE_MISSING` (family fallback; reference root)
474
+
475
+ ### `fastly.grip.directHold`
476
+
477
+ Enables the direct host-owned hold response realization.
478
+
479
+ - **Type:** boolean
480
+ - **Required/default:** Optional; default `true`.
481
+ - **Allowed values or constraints:** —
482
+ - **Scope:** GRIP hold
483
+ - **Precedence:** Configuration value.
484
+ - **Security and safety:** No special handling.
485
+ - **Related diagnostics:** None specific.
486
+
487
+ ### `fastly.name`
488
+
489
+ Generated Fastly package name.
490
+
491
+ - **Type:** string
492
+ - **Required/default:** Optional; default `pulse-app`.
493
+ - **Allowed values or constraints:** —
494
+ - **Scope:** Fastly package metadata
495
+ - **Precedence:** Configuration value.
496
+ - **Security and safety:** No special handling.
497
+ - **Related diagnostics:** None specific.
498
+
499
+ ### `fastly.description`
500
+
501
+ Generated Fastly package description.
502
+
503
+ - **Type:** string
504
+ - **Required/default:** Optional; default `Pulse application`.
505
+ - **Allowed values or constraints:** —
506
+ - **Scope:** Fastly package metadata
507
+ - **Precedence:** Configuration value.
508
+ - **Security and safety:** No special handling.
509
+ - **Related diagnostics:** None specific.
510
+
511
+ ### `fastly.authors`
512
+
513
+ Generated Fastly package authors.
514
+
515
+ - **Type:** readonly string[]
516
+ - **Required/default:** Optional; default `[]`.
517
+ - **Allowed values or constraints:** —
518
+ - **Scope:** Fastly package metadata
519
+ - **Precedence:** Configuration value.
520
+ - **Security and safety:** No special handling.
521
+ - **Related diagnostics:** None specific.
522
+
523
+ ### `fastly.local`
524
+
525
+ Local-only behavior; it does not alter the deployed target.
526
+
527
+ - **Type:** object
528
+ - **Required/default:** Optional; default `{}`.
529
+ - **Allowed values or constraints:** —
530
+ - **Scope:** local Fastly conformance
531
+ - **Precedence:** Configuration value.
532
+ - **Security and safety:** No special handling.
533
+ - **Related diagnostics:** None specific.
534
+
535
+ ### `fastly.local.networkFetch`
536
+
537
+ Allows unmatched local Fastly fetches to use the network.
538
+
539
+ - **Type:** boolean
540
+ - **Required/default:** Optional; default `false`.
541
+ - **Allowed values or constraints:** —
542
+ - **Scope:** local Fastly fetch realization
543
+ - **Precedence:** `dev.networkFetch` overrides this value when explicitly set.
544
+ - **Security and safety:** Keep disabled for deterministic tests and offline development.
545
+ - **Related diagnostics:** None specific.
546
+
547
+ ## Fastly profile example
548
+
549
+ ```ts
550
+ local: {
551
+ host: 'fastly',
552
+ target: 'native',
553
+ fastly: {
554
+ bindings: {
555
+ configStore: 'pulse_config',
556
+ secretStore: 'pulse_secrets',
557
+ kv: { sessions: 'sessions' },
558
+ backends: { 'https://api.example.com': 'api_backend' },
559
+ dynamicBackends: false,
560
+ grip: {
561
+ fanoutBackend: 'fanout',
562
+ publishUrl: 'https://publisher.example.com/publish',
563
+ publishBackend: 'publisher',
564
+ directHold: true,
565
+ },
566
+ },
567
+ build: { name: 'pulse-app', authors: ['Team'] },
568
+ local: { networkFetch: false },
569
+ },
570
+ }
571
+ ```
572
+
573
+ Deployment resource names configure provider bindings; local `dev.config`, `dev.secrets`, `dev.kv`, and `dev.fetches` values never create or populate deployed resources.
574
+
575
+ ## Safety invariants
576
+
577
+ - Output directories must remain real descendants of the project root.
578
+ - Structured request and schema bodies are bounded before decoding.
579
+ - Live local network fetch is explicit for Fastly and can be disabled for Node.
580
+ - Raw secret values are redacted from public JSON, diagnostics, and runtime error detail.
581
+ - Provider SDK objects and provider-specific namespaces never enter canonical handler scope.
582
+ - `none` is compile-only; it cannot execute `pulse dev` or `pulse test`.