1.0.0-beta.10 · latest
Project configuration reference
Source e69e4b6f1381 · Published v1.0.0-beta.10
A conventional project uses .pulse/config.ts. Start with the property map, then select a property for its type, default, constraints, and diagnostics.
Property map
Section titled “Property map”pulse holds project-wide settings. Every other top-level key names a profile, such as local or production. Below, <profile> means that profile name and <name> means a logical binding name you choose. At least one profile is required; each profile must set host and target. Optional objects can have required members when configured.
Project and profiles
Section titled “Project and profiles”| Object | Properties — select for details |
|---|---|
<profile> | host, nativeOptimization, outDir, reporting, crypto, schemas, dev, target, <fragment>, provider, node, fastly |
<profile>.dev | host, port, watch, maxBodyBytes, networkFetch, config, secrets, kv, fetches |
<profile>.schemas | contentTypePolicy, maxBytes |
pulse | binaryResources, entry, crypto, schema, tests, defaultProfile, strict, reporting |
pulse.binaryResources | manifest, bindings, budgets |
pulse.binaryResources.budgets | files, fileBytes, totalBytes, serializedBytes, bindings |
Node options
Section titled “Node options”| Object | Properties — select for details |
|---|---|
<profile>.node | bodyTransform, generatedOutput, bodyForwarding, maxDurationMs, bindings |
<profile>.node.bindings | packages, s3 |
<profile>.node.bindings.packages.<name> | package, contractId, artifact, operations, secret, keyId, keyVersion, trustDomain, origin |
<profile>.node.bindings.s3.<name> | endpoint, bucket, region, accessKeyIdSecret, secretAccessKeySecret, sessionTokenSecret, maxTextBytes, timeoutMs |
<profile>.node.bodyForwarding | maxBytes |
Fastly options
Section titled “Fastly options”| Object | Properties — select for details |
|---|---|
<profile>.fastly | bodyForwarding, maxDurationMs, local, bindings, build |
<profile>.fastly.bindings | logEndpoint, s3, configStore, secretStore, kv, backends, dynamicBackends, grip |
<profile>.fastly.bindings.grip | fanoutBackend, publishEndpoint, publishUrl, publishBackend, authentication, directHold |
<profile>.fastly.bindings.grip.authentication | scheme, secretRef |
<profile>.fastly.bindings.s3.<name> | endpoint, bucket, region, accessKeyIdSecret, secretAccessKeySecret, sessionTokenSecret, maxTextBytes, timeoutMs, backend |
<profile>.fastly.bodyForwarding | requestMaxBytes, responseMaxBytes |
<profile>.fastly.build | maxWasmBytes, name, description, authors |
<profile>.fastly.local | networkFetch |
Provider options belong under the selected provider namespace. For example, a Fastly KV binding is production.fastly.bindings.kv, while local test data belongs in production.dev.kv.
Conventional .pulse/config.ts
Section titled “Conventional .pulse/config.ts”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.
import { defineConfig } from '@pulse-compute/pulse'
export default defineConfig((scope) => ({ pulse: { entry: 'src/index.ts', tests: 'tests/pulse.harness.ts', defaultProfile: 'local', strict: true, }, local: { host: 'node', target: 'native', apiBase: scope.config('API_BASE'), apiToken: scope.secret('API_TOKEN'), },}))Project pointers are workspace-relative. Profile selection is explicit and deterministic:
--profilePULSE_PROFILEpulse.defaultProfile
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.
Command-line output, listener host, port, and watch options override the corresponding selected-profile value for that command. Harness case inputs replace development inputs for that case. Neither changes deployed resource bindings.
Project and provider selection
Section titled “Project and provider selection”Select the canonical entry, provider, and build output.
pulse.binaryResources
Section titled “pulse.binaryResources”Explicit canonical serialized manifest, logical bindings and mandatory nonnegative safe-integer budgets: files, fileBytes, totalBytes, serializedBytes and bindings. Build-time data hoisting; no runtime loading or read-byte quota.
- Type: PulseBinaryResources
- Required/default: Optional; default absent.
- Scope: all targets
- Security and safety: All manifest records are integrity-checked before selection; views are immutable and execution-owned. HTTP Assets limits are unchanged.
- Related diagnostics:
PULSE_BINARY_RESOURCE_INVALID
pulse.entry
Section titled “pulse.entry”Project-relative TypeScript handler entry.
- Type: string
- Required/default: Optional; default
src/index.ts. - Scope: all project commands
- Precedence:
pulse.entryin.pulse/config.ts. - Security and safety: Must resolve to an existing file.
- Related diagnostics:
PULSE_ENTRY_NOT_FOUND
<profile>.host
Section titled “<profile>.host”Selects the provider for this profile. Built-in host IDs include node, fastly, and compile-only none; a scoped provider package name selects that exact package.
- Type: string
- Required/default: Required when the containing object is configured.
- Allowed values or constraints:
node,fastly,none, another bare host id, or an exact scoped package name - Scope: compile/build/dev/test
- Precedence: Required in every profile; there is no implicit host selection.
- Security and safety: Package loading is explicit and limited to the selected package
./toolchainexport; there is no scanning or fallback discovery. - Related diagnostics:
PULSE_PROVIDER_PACKAGE_NOT_FOUND,PULSE_PROVIDER_TOOLCHAIN_LOAD_FAILED,PULSE_PROVIDER_TOOLCHAIN_INVALID,PULSE_PROVIDER_UNSUPPORTED,PULSE_PROVIDER_COMPILE_ONLY,PULSE_TEST_PROVIDER_REQUIRED,PULSE_DEV_PROVIDER_UNSUPPORTED
<profile>.nativeOptimization
Section titled “<profile>.nativeOptimization”Native compiler recipe. native-bounded-size is O3/shrink2/no convergence; native-shrink0 restores O3/shrink0/no convergence. experimental-native-size enables convergence; experimental-native-bounded-size retains the bounded compatibility identity.
- Type: 'native-bounded-size' | 'native-shrink0' | 'experimental-native-size' | 'experimental-native-bounded-size'
- Required/default: Optional; default
native-bounded-sizefor Native compilation. - Allowed values or constraints: native-bounded-size, native-shrink0, experimental-native-size, experimental-native-bounded-size
- Scope: Native profile
- Precedence: An explicit compile/build recipe flag overrides the selected profile; otherwise use the bounded Native default.
- Related diagnostics:
PULSE_ARGUMENT_UNEXPECTED
<profile>.outDir
Section titled “<profile>.outDir”Project-relative artifact output directory.
- Type: string
- Required/default: Optional; default
dist. - Scope: compile/build
- Precedence:
--outoverrides this field for the current command. - 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.
- Related diagnostics:
PULSE_BUILD_OUT_UNSAFE
<profile>.reporting
Section titled “<profile>.reporting”Overrides the global logging threshold for the selected profile.
- Type: 'off' | 'error' | 'warn' | 'info' | 'debug'
- Required/default: Optional; default inherit
pulse.reporting. - Allowed values or constraints:
off,error,warn,info,debug - Scope: compile/build/dev/test
- Precedence: Selected-profile
reporting, thenpulse.reporting, theninfo. - Security and safety: Known request-owned secret values are redacted before provider emission.
- Related diagnostics:
PULSE_REPORTING_LEVEL_UNSUPPORTED(family fallback; reference root)
pulse.schema
Section titled “pulse.schema”Workspace-relative module that default-exports a defineSchemaRegistry registry. Schema identities are declared there; schemas configures decoding policy.
- Type: string | null
- Required/default: Optional; default
null. - Allowed values or constraints: A workspace-relative module path; absolute paths and workspace escapes are rejected.
pulse.tests
Section titled “pulse.tests”Workspace-relative test harness module used by pulse test.
- Type: string | null
- Required/default: Optional; default
null. - Allowed values or constraints: A workspace-relative module path; absolute paths and workspace escapes are rejected.
pulse.defaultProfile
Section titled “pulse.defaultProfile”Profile selected when neither --profile nor PULSE_PROFILE is supplied. It must name an existing top-level profile.
- Type: string | null
- Required/default: Optional; default
null(no default profile). - Precedence:
--profile, thenPULSE_PROFILE, then this field. No first-profile or implicit local fallback.
pulse.strict
Section titled “pulse.strict”Requires schema-bound request JSON when true. Setting false permits schema-less JSON where supported; it does not change target eligibility.
- Type: boolean
- Required/default: Optional; default
true.
pulse.reporting
Section titled “pulse.reporting”Global logging threshold, inherited by profiles that omit reporting.
- Type: 'off' | 'error' | 'warn' | 'info' | 'debug'
- Required/default: Optional; default
info. - Precedence: Selected-profile
reportingoverrides this value.
<profile>.target
Section titled “<profile>.target”Selects the execution target explicitly. Native requires provable supported source; JavaScript retains ordinary static imports and awaited calls.
- Type: string
- Required/default: Required when the containing object is configured.
- Allowed values or constraints:
native,javascript
<profile>.<fragment>
Section titled “<profile>.<fragment>”Additional profile properties are application or provider fragments. They may contain null, finite numbers, strings, booleans, arrays, objects, and symbolic scope.config(name) or scope.secret(name) references. Functions, undefined values, and asynchronous configuration are rejected.
- Type: static value
- Required/default: Optional; default omitted.
- Security and safety: References name bindings; they do not read ambient values during planning. One logical name cannot be both config and secret in the same project.
<profile>.provider
Section titled “<profile>.provider”Compatibility provider-options fragment. Prefer the selected provider namespace (node or fastly). If that namespace contains an object, it takes precedence over this fragment. Provider selection still comes from host.
- Type: object
- Required/default: Optional; default omitted.
Cryptographic requirements
Section titled “Cryptographic requirements”Declare algorithms globally or replace the complete declaration for one profile.
pulse.crypto
Section titled “pulse.crypto”Declares the complete global algorithm set. Array entries are canonical algorithm names; object entries may pin one exact known realization.
- Type: readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>
- Required/default: Optional; default implicit no-crypto declaration.
- Allowed values or constraints:
HS256,ES256,RS256,SHA-256,HMAC-SHA256; exact pinsruntime-builtin,guest-source:pulse-hmac-as,guest-linked:pulse-es256-rustcrypto-p256, andguest-linked:pulse-rs256-bearssl-i31 - Scope: global crypto requirement default
- Precedence: Used only when the selected profile omits
crypto. - Security and safety: Keys and verification bytes are not configuration values. Target selection is deterministic and never probes or falls back.
- 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)
<profile>.crypto
Section titled “<profile>.crypto”Replaces the complete global crypto declaration for the selected profile. Arrays and objects never merge with pulse.crypto.
- Type: readonly PulseCryptoAlgorithm[] | Readonly<Partial<Record<PulseCryptoAlgorithm, { readonly realization?: PulseCryptoRealization }>>>
- Required/default: Optional; default inherit
pulse.cryptowhen absent. - Allowed values or constraints:
[]and{}explicitly select no crypto; otherwiseHS256,ES256,RS256,SHA-256,HMAC-SHA256 - Scope: selected profile
- Precedence: Selected-profile declaration replaces
pulse.crypto; absence inherits it. - Security and safety: Every declared algorithm must resolve for the selected target before lowering. A failed exact realization cannot select another backend.
- 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)
JSON schema policy
Section titled “JSON schema policy”Configure bounded schema-body policy. Conventional projects declare registry identity only through pulse.schema.
<profile>.schemas
Section titled “<profile>.schemas”Sets schema body limits and content-type policy. Schema identities come from the module selected by pulse.schema.
- Type: PulseSchemaConfig
- Required/default: Optional; default
{}. - Scope: compile/dev/test/build
- Security and safety: Structured bodies are bounded before decoding.
- Related diagnostics:
PULSE_SCHEMA_COMPILE_FAILED
<profile>.schemas.contentTypePolicy
Section titled “<profile>.schemas.contentTypePolicy”Controls whether a JSON content type is mandatory.
- Type: 'accept-json-or-missing' | 'require-json'
- Required/default: Optional; default
accept-json-or-missing. - Allowed values or constraints:
accept-json-or-missing,require-json - Scope: request and fetched-body schema decode
- Related diagnostics:
PULSE_SCHEMA_CONTENT_TYPE_POLICY_INVALID(family fallback; reference root),PULSE_SCHEMA_DECODE
<profile>.schemas.maxBytes
Section titled “<profile>.schemas.maxBytes”Maximum UTF-8 bytes for schema decoding and encoding. Request transport and dev.maxBodyBytes may impose separate limits.
- Type: positive safe integer
- Required/default: Optional; default
65_536. - Scope: structured schema text
- Security and safety: Raise deliberately; this is a memory and request-amplification boundary.
- Related diagnostics:
PULSE_SCHEMA_BODY_LIMIT_INVALID(family fallback; reference root),PULSE_BODY_TOO_LARGE
Local development
Section titled “Local development”Configure the foreground local server and local-only provider inputs.
<profile>.dev
Section titled “<profile>.dev”Development listener and local fixture inputs.
- Type: object
- Required/default: Optional; default
{}. - Scope: pulse dev and local conformance
<profile>.dev.host
Section titled “<profile>.dev.host”Listener host.
- Type: string
- Required/default: Optional; default
127.0.0.1. - Scope: pulse dev
- Precedence:
--hostoverrides this field. - Security and safety: Binding a non-loopback address exposes the local development server.
- Related diagnostics:
PULSE_DEV_HOST_INVALID(family fallback; reference root)
<profile>.dev.port
Section titled “<profile>.dev.port”Listener port.
- Type: integer
- Required/default: Optional; default
8787. - Allowed values or constraints:
0–65535;0requests an ephemeral port - Scope: pulse dev
- Precedence:
--portoverrides this field. - Related diagnostics:
PULSE_DEV_PORT_INVALID(family fallback; reference root)
<profile>.dev.watch
Section titled “<profile>.dev.watch”Watches the entry and schema dependency graph.
- Type: boolean
- Required/default: Optional; default
true. - Scope: pulse dev
- Precedence:
--watchor--no-watchoverrides this field. - Security and safety: Configuration-file changes still require a restart.
<profile>.dev.maxBodyBytes
Section titled “<profile>.dev.maxBodyBytes”Maximum request body accepted by the local development server.
- Type: positive safe integer
- Required/default: Optional; default
65_536. - Scope: incoming local requests
- Security and safety: Raise deliberately; this is a memory and request-amplification boundary.
- Related diagnostics:
PULSE_DEV_BODY_LIMIT_INVALID(family fallback; reference root),PULSE_REQUEST_BODY_TOO_LARGE
<profile>.dev.networkFetch
Section titled “<profile>.dev.networkFetch”Allows unmatched local fetches to use the network.
- Type: boolean
- Required/default: Optional; default selected provider default.
- Scope: local fetch realization
- Precedence: This explicit field overrides the selected provider local default.
- Security and safety: Keep disabled for deterministic or untrusted test inputs.
- Related diagnostics:
PULSE_FETCH_IMPLEMENTATION_UNAVAILABLE,PULSE_FETCH_NETWORK
<profile>.dev.config
Section titled “<profile>.dev.config”Local configuration-store values.
- Type: Readonly<Record<string, string>>
- Required/default: Optional; default
{}. - Scope: local config capability
- Security and safety: Development input only; it does not configure deployed provider stores.
<profile>.dev.secrets
Section titled “<profile>.dev.secrets”Local secret-store values.
- Type: Readonly<Record<string, string>>
- Required/default: Optional; default
{}. - Scope: local secret capability
- Security and safety: Raw values are omitted from project JSON, diagnostics, and runtime error details; do not commit real production secrets.
<profile>.dev.kv
Section titled “<profile>.dev.kv”Local KV stores keyed by configured logical store name.
- Type: Readonly<Record<string, Readonly<Record<string, unknown>>>>
- Required/default: Optional; default
{}. - Scope: local KV capability
- Security and safety: Development input only; it is not deployed.
<profile>.dev.fetches
Section titled “<profile>.dev.fetches”Deterministic fetch fixtures resolved before optional live network fetch.
- Type: Readonly<Record<string, unknown>>
- Required/default: Optional; default
{}. - Scope: local fetch capability
- Security and safety: Prefer fixtures for deterministic tests and offline development.
Node provider options
Section titled “Node provider options”Provider-owned Node profile configuration.
<profile>.node.bindings.packages
Section titled “<profile>.node.bindings.packages”Explicit package, contractId, artifact, operations, secret reference, keyId, keyVersion, trustDomain and HTTPS origin. Captures exact HTTP bytes up to 65536 body bytes; incompatible with bodyForwarding/bodyTransform. See the package runtime binding contract.
- Type: Readonly<Record<string, PackageRuntimeBinding>>
- Required/default: Optional; default omitted.
- Scope: Trusted package Wasm on Node
<profile>.node.bodyTransform
Section titled “<profile>.node.bodyTransform”Opt-in finite request text chunks. Requires generatedOutput and maxDurationMs; incompatible with bodyForwarding. Input 65536 bytes, output 262144 bytes, at most 4 times delivered input bytes. Strict UTF-8, one reader/writer, EOF required before output.close().
- Type: boolean
- Required/default: Optional; default omitted.
- Scope: Experimental Node UTF-8 transforms
<profile>.node.generatedOutput
Section titled “<profile>.node.generatedOutput”Opt-in finite UTF-8 output. Requires node.maxDurationMs. Each write is at most 16384 bytes; at most 64 writes and 1048576 bytes total. Use STR-03B for exact-candidate installed qualification.
- Type: boolean
- Required/default: Optional; default omitted.
- Scope: Experimental Node generated output
<profile>.node.bodyForwarding
Section titled “<profile>.node.bodyForwarding”Opt-in single-use incoming POST forwarding. maxBytes is a positive safe integer limiting each transfer direction; requires node.maxDurationMs. Pulse emits chunks up to 16384 bytes and retains at most 65536 bytes per pump. Native uses exact Wasm execution and excludes structured request reads in the same application.
- Type: { maxBytes: number }
- Required/default: Optional; default omitted.
- Scope: Node incoming forwarding
<profile>.node.maxDurationMs
Section titled “<profile>.node.maxDurationMs”One provider-owned monotonic budget shared by request effects and continuations; expiry does not prove rollback of dispatched writes.
- Type: integer
- Required/default: Optional; default omitted.
- Allowed values or constraints: 1–30000
- Scope: HTTP request execution
<profile>.node.bindings.s3
Section titled “<profile>.node.bindings.s3”Maps literal logical names to fixed HTTPS endpoint, bucket, region, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–2097152, default 32768) and timeoutMs (1–30000, default 10000).
- Type: Readonly<Record<string, S3Binding>>
- Required/default: Optional; default
{}. - Scope: Node Native and JavaScript S3
- Security and safety: Only named credential references are configuration. Runtime keys cannot override authority.
<profile>.node
Section titled “<profile>.node”Node provider options for a profile whose host is node.
- Type: object
- Required/default: Optional; default
{}(member defaults apply).
<profile>.node.bindings
Section titled “<profile>.node.bindings”Named S3 and remote package bindings.
- Type: object
- Required/default: Optional; default
{}(member defaults apply).
<profile>.node.bodyForwarding.maxBytes
Section titled “<profile>.node.bodyForwarding.maxBytes”Maximum bytes forwarded per transfer direction. The containing bodyForwarding object also requires node.maxDurationMs.
- Type: positive safe integer
- Required/default: Required when the containing object is configured.
Fastly provider options
Section titled “Fastly provider options”Options nested under <profile>.fastly; bindings and build metadata have separate objects.
<profile>.fastly.bindings.logEndpoint
Section titled “<profile>.fastly.bindings.logEndpoint”One case-sensitive named production log stream, 1–255 UTF-8 bytes, excluding stdout, stderr, fst_managed_ names and control characters. Records above 65536 UTF-8 bytes are dropped. One lookup and at most one write per record; errors and zero/short writes are dropped without retry or stdout fallback. Host acceptance does not prove downstream delivery.
- Type: string
- Required/default: Optional; default omitted (stdout).
- Scope: Fastly production logging
- Related diagnostics:
PULSE_FASTLY_LOG_ENDPOINT_INVALID
<profile>.fastly.bodyForwarding
Section titled “<profile>.fastly.bodyForwarding”Opt in to one terminal opaque POST with inline req.body() and a static backend. Requires maxDurationMs and both byte limits. Final close hands queued delivery to Fastly; it is not a client receipt.
- Type: object
- Required/default: Optional; default omitted.
- Scope: experimental Fastly Native forwarding
- Related diagnostics:
PULSE_FASTLY_BODY_FORWARDING_INVALID(family fallback; reference root)
<profile>.fastly.bodyForwarding.requestMaxBytes
Section titled “<profile>.fastly.bodyForwarding.requestMaxBytes”Independent actual-byte bound, including EOF verification; no unbounded default. Fixed 16 KiB raw scratch is reused across the sequential upload and response pumps.
- Type: integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: 1–1048576
- Scope: experimental Fastly Native forwarding
<profile>.fastly.bodyForwarding.responseMaxBytes
Section titled “<profile>.fastly.bodyForwarding.responseMaxBytes”Independent actual-byte bound, including EOF verification; no unbounded default. Fixed 16 KiB raw scratch is reused across the sequential upload and response pumps.
- Type: integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: 1–1048576
- Scope: experimental Fastly Native forwarding
<profile>.fastly.build.maxWasmBytes
Section titled “<profile>.fastly.build.maxWasmBytes”Inclusive byte budget checked for newly compiled and reused artifacts. Raising it does not increase runtime memory or change Fastly service limits. The fastly() facade accepts maxWasmBytes.
- Type: integer
- Required/default: Optional; default 4194304 (4 MiB).
- Allowed values or constraints: positive safe integer
- Scope: Native final Wasm artifact
<profile>.fastly.maxDurationMs
Section titled “<profile>.fastly.maxDurationMs”One provider-owned monotonic budget through buffered response handoff; expiry attempts 504 before headers commit and never asserts rollback of dispatched writes. No CPU preemption or post-handoff delivery guarantee.
- Type: integer
- Required/default: Optional; default omitted.
- Allowed values or constraints: 1–30000
- Scope: HTTP request execution
<profile>.fastly.bindings.s3
Section titled “<profile>.fastly.bindings.s3”Maps logical names to fixed HTTPS endpoint, bucket, region, named static backend, accessKeyIdSecret, secretAccessKeySecret, optional sessionTokenSecret, maxTextBytes (1–2097152, default 32768) and timeoutMs (1–30000, default 10000).
- Type: Readonly<Record<string, S3Binding & { backend: string }>>
- Required/default: Optional; default
{}. - Scope: Fastly Native S3
- Security and safety: Credentials resolve through the configured Secret Store at execution. Dynamic backend authority and guest endpoint overrides are forbidden.
<profile>.fastly.bindings.configStore
Section titled “<profile>.fastly.bindings.configStore”Fastly Config Store resource name.
- Type: string
- Required/default: Optional; default
pulse_config. - Scope: Fastly config capability
<profile>.fastly.bindings.secretStore
Section titled “<profile>.fastly.bindings.secretStore”Fastly Secret Store resource name.
- Type: string
- Required/default: Optional; default
pulse_secrets. - Scope: Fastly secret capability
- Security and safety: The name is build metadata; secret values are never embedded by this option.
<profile>.fastly.bindings.kv
Section titled “<profile>.fastly.bindings.kv”Maps logical ctx.kv names to Fastly KV Store resource names.
- Type: Readonly<Record<string, string>>
- Required/default: Optional; default
{}. - Scope: Fastly KV capability
- Related diagnostics:
PULSE_FASTLY_KV_BINDINGS_INVALID
<profile>.fastly.bindings.backends
Section titled “<profile>.fastly.bindings.backends”Maps static absolute origin URLs to named Fastly backends.
- Type: Readonly<Record<string, string>>
- Required/default: Optional; default
{}. - Scope: Fastly fetch capability
- Security and safety: Prefer explicit backends over dynamic origin authority.
- Related diagnostics:
PULSE_FASTLY_BACKEND_BINDINGS_INVALID,PULSE_FASTLY_BACKEND_REQUIRED
<profile>.fastly.bindings.dynamicBackends
Section titled “<profile>.fastly.bindings.dynamicBackends”Allows undeclared outbound origins to use dynamic backends.
- Type: boolean
- Required/default: Optional; default
false. - Scope: Fastly fetch capability
- Security and safety: Opt in deliberately because it broadens outbound authority.
- Related diagnostics:
PULSE_FASTLY_BACKEND_REQUIRED
<profile>.fastly.bindings.grip
Section titled “<profile>.fastly.bindings.grip”Provider-owned bindings used by package-owned GRIP compatibility and canonical broadcast effects.
- Type: object
- Required/default: Optional; default omitted.
- Scope: Fastly GRIP capability
<profile>.fastly.bindings.grip.fanoutBackend
Section titled “<profile>.fastly.bindings.grip.fanoutBackend”Named Fastly Fanout backend.
- Type: string
- Required/default: Optional; default omitted.
- Scope: GRIP hold
- Related diagnostics:
PULSE_FASTLY_GRIP_FANOUT_BACKEND_REQUIRED
<profile>.fastly.bindings.grip.publishEndpoint
Section titled “<profile>.fastly.bindings.grip.publishEndpoint”Provider-owned absolute publish/control endpoint; distinct from public gateway and ingress URLs.
- Type: string
- Required/default: Optional; default omitted.
- Scope: GRIP broadcast
- Related diagnostics:
PULSE_FASTLY_GRIP_PUBLISH_BINDING_REQUIRED
<profile>.fastly.bindings.grip.publishUrl
Section titled “<profile>.fastly.bindings.grip.publishUrl”Absolute publish endpoint URL.
- Type: string
- Required/default: Optional; default omitted.
- Scope: GRIP publish
- Related diagnostics:
PULSE_FASTLY_GRIP_PUBLISH_BINDING_REQUIRED
<profile>.fastly.bindings.grip.publishBackend
Section titled “<profile>.fastly.bindings.grip.publishBackend”Named backend for the provider publish endpoint.
- Type: string
- Required/default: Optional; default omitted.
- Scope: GRIP broadcast/publish
- Related diagnostics:
PULSE_FASTLY_GRIP_PUBLISH_BINDING_REQUIRED
<profile>.fastly.bindings.grip.authentication
Section titled “<profile>.fastly.bindings.grip.authentication”Authentication metadata containing references only; no credential value is accepted here.
- Type: object
- Required/default: Optional; default omitted.
- Scope: GRIP broadcast authentication
- Security and safety: Store the value in Fastly Secret Store and configure only secretRef.
<profile>.fastly.bindings.grip.authentication.scheme
Section titled “<profile>.fastly.bindings.grip.authentication.scheme”Provider authentication scheme.
- Type: 'bearer'
- Required/default: Optional; default
bearer. - Scope: GRIP broadcast authentication
- Related diagnostics:
PULSE_FASTLY_NATIVE_GRIP_AUTH_SCHEME_UNSUPPORTED(family fallback; reference root)
<profile>.fastly.bindings.grip.authentication.secretRef
Section titled “<profile>.fastly.bindings.grip.authentication.secretRef”Named Fastly Secret Store key used for the bearer token.
- Type: string
- Required/default: Optional; default omitted.
- Scope: GRIP broadcast authentication
- Security and safety: The secret value is resolved only at request execution and is redacted from traces.
- Related diagnostics:
PULSE_FASTLY_NATIVE_GRIP_SECRET_REFERENCE_MISSING(family fallback; reference root)
<profile>.fastly.bindings.grip.directHold
Section titled “<profile>.fastly.bindings.grip.directHold”Enables the direct host-owned hold response realization.
- Type: boolean
- Required/default: Optional; default
true. - Scope: GRIP hold
<profile>.fastly.build.name
Section titled “<profile>.fastly.build.name”Generated Fastly package name.
- Type: string
- Required/default: Optional; default
pulse-app. - Scope: Fastly package metadata
<profile>.fastly.build.description
Section titled “<profile>.fastly.build.description”Generated Fastly package description.
- Type: string
- Required/default: Optional; default
Pulse application. - Scope: Fastly package metadata
<profile>.fastly.build.authors
Section titled “<profile>.fastly.build.authors”Generated Fastly package authors.
- Type: readonly string[]
- Required/default: Optional; default
[]. - Scope: Fastly package metadata
<profile>.fastly.local
Section titled “<profile>.fastly.local”Local-only behavior; it does not alter the deployed target.
- Type: object
- Required/default: Optional; default
{}. - Scope: local Fastly conformance
<profile>.fastly.local.networkFetch
Section titled “<profile>.fastly.local.networkFetch”Allows unmatched local Fastly fetches to use the network.
- Type: boolean
- Required/default: Optional; default
false. - Scope: local Fastly fetch realization
- Precedence:
dev.networkFetchoverrides this value when explicitly set. - Security and safety: Keep disabled for deterministic tests and offline development.
<profile>.fastly
Section titled “<profile>.fastly”Fastly provider options for a profile whose host is fastly.
- Type: object
- Required/default: Optional; default
{}(member defaults apply).
<profile>.fastly.bindings
Section titled “<profile>.fastly.bindings”Deployment resource names, static backends, and capability bindings.
- Type: object
- Required/default: Optional; default
{}(member defaults apply).
<profile>.fastly.build
Section titled “<profile>.fastly.build”Fastly package metadata and final Wasm artifact budget.
- Type: object
- Required/default: Optional; default
{}(member defaults apply).
Binary resource fields
Section titled “Binary resource fields”Required members when pulse.binaryResources is configured; no implicit resource budgets.
pulse.binaryResources.manifest
Section titled “pulse.binaryResources.manifest”Canonical serialized embedded manifest supplied explicitly at build time. This is manifest content, not a filesystem path.
- Type: string
- Required/default: Required when the containing object is configured.
pulse.binaryResources.bindings
Section titled “pulse.binaryResources.bindings”Maps logical binary-resource binding names to file paths within the manifest.
- Type: Readonly<Record<string, string>>
- Required/default: Required when the containing object is configured.
pulse.binaryResources.budgets
Section titled “pulse.binaryResources.budgets”Explicit upper bounds for resource admission. All five limits must be supplied.
- Type: object
- Required/default: Required when the containing object is configured.
pulse.binaryResources.budgets.files
Section titled “pulse.binaryResources.budgets.files”Maximum number of resource files.
- Type: non-negative safe integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: An integer from 0 through Number.MAX_SAFE_INTEGER.
pulse.binaryResources.budgets.fileBytes
Section titled “pulse.binaryResources.budgets.fileBytes”Maximum bytes in one resource file.
- Type: non-negative safe integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: An integer from 0 through Number.MAX_SAFE_INTEGER.
pulse.binaryResources.budgets.totalBytes
Section titled “pulse.binaryResources.budgets.totalBytes”Maximum total bytes across resource files.
- Type: non-negative safe integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: An integer from 0 through Number.MAX_SAFE_INTEGER.
pulse.binaryResources.budgets.serializedBytes
Section titled “pulse.binaryResources.budgets.serializedBytes”Maximum bytes in the serialized resource payload.
- Type: non-negative safe integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: An integer from 0 through Number.MAX_SAFE_INTEGER.
pulse.binaryResources.budgets.bindings
Section titled “pulse.binaryResources.budgets.bindings”Maximum number of logical bindings.
- Type: non-negative safe integer
- Required/default: Required when the containing object is configured.
- Allowed values or constraints: An integer from 0 through Number.MAX_SAFE_INTEGER.
S3 binding fields
Section titled “S3 binding fields”Each logical S3 binding has this shape. Fastly additionally requires a static backend.
<profile>.node.bindings.s3.<name>.endpoint
Section titled “<profile>.node.bindings.s3.<name>.endpoint”Fixed HTTPS origin without a path, query, or fragment.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.bucket
Section titled “<profile>.node.bindings.s3.<name>.bucket”Fixed bucket name; portable lowercase DNS subset, 3–63 characters, without consecutive hyphens.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.region
Section titled “<profile>.node.bindings.s3.<name>.region”Explicit signing region; 1–64 lowercase letters, digits, or hyphens.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.accessKeyIdSecret
Section titled “<profile>.node.bindings.s3.<name>.accessKeyIdSecret”Name of the secret containing the access key ID.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.secretAccessKeySecret
Section titled “<profile>.node.bindings.s3.<name>.secretAccessKeySecret”Name of the secret containing the secret access key.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.sessionTokenSecret
Section titled “<profile>.node.bindings.s3.<name>.sessionTokenSecret”Optional name of the secret containing the session token.
- Type: string
- Required/default: Optional; default omitted.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.maxTextBytes
Section titled “<profile>.node.bindings.s3.<name>.maxTextBytes”Maximum buffered text body bytes.
- Type: integer
- Required/default: Optional; default
32_768. - Allowed values or constraints: 1–2,097,152
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.node.bindings.s3.<name>.timeoutMs
Section titled “<profile>.node.bindings.s3.<name>.timeoutMs”Request timeout in milliseconds.
- Type: integer
- Required/default: Optional; default
10_000. - Allowed values or constraints: 1–30,000
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.endpoint
Section titled “<profile>.fastly.bindings.s3.<name>.endpoint”Fixed HTTPS origin without a path, query, or fragment.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.bucket
Section titled “<profile>.fastly.bindings.s3.<name>.bucket”Fixed bucket name; portable lowercase DNS subset, 3–63 characters, without consecutive hyphens.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.region
Section titled “<profile>.fastly.bindings.s3.<name>.region”Explicit signing region; 1–64 lowercase letters, digits, or hyphens.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.accessKeyIdSecret
Section titled “<profile>.fastly.bindings.s3.<name>.accessKeyIdSecret”Name of the secret containing the access key ID.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.secretAccessKeySecret
Section titled “<profile>.fastly.bindings.s3.<name>.secretAccessKeySecret”Name of the secret containing the secret access key.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.sessionTokenSecret
Section titled “<profile>.fastly.bindings.s3.<name>.sessionTokenSecret”Optional name of the secret containing the session token.
- Type: string
- Required/default: Optional; default omitted.
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.maxTextBytes
Section titled “<profile>.fastly.bindings.s3.<name>.maxTextBytes”Maximum buffered text body bytes.
- Type: integer
- Required/default: Optional; default
32_768. - Allowed values or constraints: 1–2,097,152
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.timeoutMs
Section titled “<profile>.fastly.bindings.s3.<name>.timeoutMs”Request timeout in milliseconds.
- Type: integer
- Required/default: Optional; default
10_000. - Allowed values or constraints: 1–30,000
- Security and safety: Credentials resolve from named secrets at execution; request data cannot override binding authority.
<profile>.fastly.bindings.s3.<name>.backend
Section titled “<profile>.fastly.bindings.s3.<name>.backend”Named static Fastly backend for this S3 endpoint; dynamic backends are not permitted.
- Type: string
- Required/default: Required when the containing object is configured.
Node package binding fields
Section titled “Node package binding fields”Each named remote package binding requires all fields below. At most 32 bindings may be configured.
<profile>.node.bindings.packages.<name>.package
Section titled “<profile>.node.bindings.packages.<name>.package”Package identity.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.contractId
Section titled “<profile>.node.bindings.packages.<name>.contractId”Package operation contract identity.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.artifact
Section titled “<profile>.node.bindings.packages.<name>.artifact”Opaque deployed artifact identifier; not an automatic filesystem path.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.operations
Section titled “<profile>.node.bindings.packages.<name>.operations”Nonempty, unique allowlist of 1–16 operation names.
- Type: readonly string[]
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.secret
Section titled “<profile>.node.bindings.packages.<name>.secret”Name of the authentication secret, not the secret value.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.keyId
Section titled “<profile>.node.bindings.packages.<name>.keyId”Authentication key identity.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.keyVersion
Section titled “<profile>.node.bindings.packages.<name>.keyVersion”Authentication key version.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.trustDomain
Section titled “<profile>.node.bindings.packages.<name>.trustDomain”Expected trust domain.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
<profile>.node.bindings.packages.<name>.origin
Section titled “<profile>.node.bindings.packages.<name>.origin”Fixed HTTPS origin without a path, query, or fragment.
- Type: string
- Required/default: Required when the containing object is configured.
- Security and safety: These values bind the remote package authority; handlers cannot substitute an endpoint or credential.
Programmatic helper option
Section titled “Programmatic helper option”This retained helper spelling is separate from the conventional configuration object.
fastly().maxWasmBytes
Section titled “fastly().maxWasmBytes”Programmatic fastly({ maxWasmBytes }) helper option. In .pulse/config.ts, write <profile>.fastly.build.maxWasmBytes instead.
- Type: integer
- Required/default: Optional; default 4194304 (4 MiB).
- Allowed values or constraints: positive safe integer
- Scope: fastly() facade
Fastly profile example
Section titled “Fastly profile example”local: { host: 'fastly', target: 'native', fastly: { bindings: { configStore: 'pulse_config', secretStore: 'pulse_secrets', kv: { sessions: 'sessions' }, backends: { 'https://api.example.com': 'api_backend' }, dynamicBackends: false, grip: { fanoutBackend: 'fanout', publishUrl: 'https://publisher.example.com/publish', publishBackend: 'publisher', directHold: true, }, }, build: { name: 'pulse-app', authors: ['Team'] }, local: { networkFetch: false }, },}Deployment resource names configure provider bindings; local dev.config, dev.secrets, dev.kv, and dev.fetches values never create or populate deployed resources.
Safety invariants
Section titled “Safety invariants”- Output directories must remain real descendants of the project root.
- Structured request and schema bodies are bounded before decoding.
- Live local network fetch is explicit for Fastly and can be disabled for Node.
- Raw secret values are redacted from public JSON, diagnostics, and runtime error detail.
- Provider SDK objects and provider-specific namespaces never enter canonical handler scope.
noneis compile-only; it cannot executepulse devorpulse test.