walkerOS v3.4.0
Changes
Add target option to bundle():
cdn | cdn-skeleton | runner | simulate | push. Replaces
buildOverrides.skipWrapper (deprecated) to stop dev schemas leaking into
production CDN bundles. Stage 2 entry generators gain platform option and
inject env.window/env.document for browser targets, fixing window.elbLayer
in deployed walker.js.
Clients now send User-Agent, X-WalkerOS-Client, and
X-WalkerOS-Client-Version on every request to the walkerOS app. When the app
returns 426 Upgrade Required, the CLI prints the required version + upgrade
instruction and exits with code 2; the MCP surfaces the same info in tool
errors. Set WALKEROS_CLIENT_TYPE=runner to have the CLI binary identify as a
long-lived runner instead of an interactive CLI (used by the runtime image so
runners are distinguishable from interactive sessions).
<CodeBox> and <LiveCode> now run with Monaco configured to target: ES2022,
module: ESNext, moduleDetection: 'force', and a registered ambient
declarations file exposing walkerOS runtime globals (elb, getMappingEvent,
getMappingValue). Mapping snippets can be plain object literals or top-level
await calls — no import / export boilerplate required — while keeping full
IntelliSense via the existing @walkeros/core type registration.
<LiveCode> now renders its result panel as JSON (it's always vendor output,
regardless of the input language) and its config panel as JSON (it's always
data). Only the input panel respects the language prop.
Add CodeView (Shiki-backed read-only code display) with matching Box frame,
plus a CodeStatic atom as the underlying highlighter. Also suppress the Monaco
loader's {type: 'cancelation'} unhandled rejections globally via a single
window-level listener, fixing the dev-console noise that fired on every unmount
of a <CodeBox> consumer.
Add TransformerSchemas and StoreSchemas namespaces with ConfigSchema /
configJsonSchema exports. Mirrors the existing DestinationSchemas /
SourceSchemas pattern so every component type has a documented Config schema
available via @walkeros/core/dev.
Reconcile pre-existing drift between TS Config interfaces and their Zod schemas:
DestinationSchemas.ConfigSchemanow includesbefore,next,cache,
disabled,mock,include(matchingDestination.Config) and drops
phantomonError/onLogfields that were never wired in the TS type or
consumed at runtime.SourceSchemas.ConfigSchemanow includesdisabledand drops a phantom
onErrorfield.MappingSchemas.ConfigSchemanow includesinclude, matching
Mapping.Config(the baseSource.Configextends).CollectorSchemas.ConfigSchemanow includesloggerand drops phantom
verbose/onError/onLogfields not present inCollector.Config.CollectorSchemas.InitConfigSchemanow includestransformers,stores,
hooks, matchingCollector.InitConfig.
Add a compile-time drift guard at
packages/core/src/schemas/__tests__/config-drift.test-d.ts. Any future
divergence between a Config TS interface and its Zod schema failstsc --noEmit
(already wired into the project'stypecheckscript and CI). Keys-only check;
value types may still differ for recursive or generic-slot fields where Zod
cannot express TS-side precision.
Add FullStory web destination with trackEvent, setIdentity, setProperties
(user/page), consent start/shutdown, and clean teardown via @fullstory/browser
SDK v2.
Add Heap web destination (product analytics, identity, consent)
Add Hotjar web destination (session replay, heatmaps, surveys)
Add Matomo web destination (self-hosted/cloud privacy-first analytics) via _paq
command queue with support for page views, custom events, ecommerce, goals, site
search, content tracking, and custom dimensions
Harden the Monaco / CodeBox integration. Fix moduleDetection (Force), add
<LiveCode> configLanguage prop, guard ScriptTarget.ES2022 fallback, warn
on loader.init() failures in dev, drop dead code. No API change for existing
callers.
Add Optimizely Feature Experimentation web destination with conversion tracking
via trackEvent(), revenue/value event tags, user context management with
attribute targeting, and consent-based client lifecycle.
Add Microsoft Advertising (Bing UET CAPI) server destination
Add Criteo Events API server destination
Add server-side Customer.io destination with Track, Identify, Page View,
Transactional Messaging (sendEmail/sendPush), and Customer Lifecycle management
(destroy/suppress/merge) via customerio-node SDK. Auto-fallback to
trackAnonymous() for anonymous visitors, state-diffed identify to avoid
redundant calls.
Add @walkeros/server-destination-file: local filesystem sink for walkerOS
server flows. Appends events to a file as JSONL (default), TSV, or CSV with
per-event filename resolution via the standard Mapping.Value DSL (tenant
sharding via key, daily rotation via $code: in fn). Opens one
WriteStream per resolved filename and keeps it open until destroy(). No
third-party SDK — uses node:fs built-ins.
Add server-side HubSpot CRM destination with custom event tracking via
events.send API, contact upsert via CRM API with state-based dedup, optional
batch mode (up to 500 events/flush), defaultProperties for attribution, and
graceful shutdown with queue flush.
Add server-side Apache Kafka destination via kafkajs. Supports JSON
serialization, configurable compression (gzip, snappy, lz4, zstd), per-rule
topic and message key overrides, SASL/SSL authentication (Confluent Cloud, AWS
MSK, SCRAM, OAuthBearer), and graceful producer shutdown via destroy().
Add server-side Klaviyo marketing automation destination with event tracking via
EventsApi.createEvent() and profile management via
ProfilesApi.createOrUpdateProfile(). Supports revenue tracking with
value/valueCurrency, ecommerce metric name mapping, and identify state diffing
to avoid redundant upserts.
Add server-side mParticle CDP destination. Events are packaged into batches and
POSTed to the regional mParticle pod via the HTTP Events API using Basic auth
(apiKey / apiSecret). Supports user identities, user attributes, consent state,
pod selection, and environment targeting.
Add Reddit Conversions API server destination
Add server-side Redis Streams destination via ioredis. Supports XADD append with
auto-generated entry IDs, JSON and flat serialization modes, approximate and
exact MAXLEN trimming, per-rule stream key overrides, env-injected client
pattern for testing, and graceful shutdown via client.quit().
Add server-side RudderStack CDP destination with full Segment Spec support
(Track, Identify, Group, Page, Screen, Alias) via @rudderstack/rudder-sdk-node
SDK. Includes graceful shutdown via flush(), identity resolution per-call, alias
support for identity merging, and state diffing for identify/group.
Add Snapchat Conversions API server destination.
Add @walkeros/server-destination-sqlite: server destination that persists
walkerOS events to SQLite. One destination, two drivers behind a single
interface: better-sqlite3 for local files and :memory:, @libsql/client for
remote Turso / libSQL / sqld. Driver is auto-selected from the connection URL.
Both SDKs are optional peer dependencies. Auto-creates a canonical events table
on init (opt-out via schema: 'manual'), caches a prepared INSERT, closes the
connection on destroy(). Per-rule mapping.settings.table override supported.
Add X (Twitter) Conversions API server destination
Migrate every step example in every walkerOS package to the standardized
[callable, ...args][] shape introduced in @walkeros/core. Every step
example's out is now an array of effect tuples whose first element is the
callable's public SDK name ('gtag', 'analytics.track', 'fbq',
'dataLayer.push', 'sendServer', 'fetch', 'trackClient.track',
'amplitude.track', 'fs.writeFile', 'producer.send', 'client.xadd',
'client.send', 'dataset.table.insert', etc.). Source examples use 'elb' as
the callable; transformer examples use the reserved 'return' keyword; store
examples use store-operation callables ('get', 'set'). Tests capture real
calls on each component's spy and assert against example.out directly — the
hardcoded PACKAGE_CALLS registry in the app is no longer consulted (emptied;
plan #3 removes it structurally).
Introduce the standardized StepExample.out shape: [callable, ...args][]
where each tuple is a function call (first element is the callable name) or a
['return', value] tuple for transformer-style returns. Every effect is
self-describing; docs and tools can render it uniformly without a per-package
registry.
Ship the shared formatOut renderer from @walkeros/core for docs + app. Also
exports StepEffect and StepOut types. Migrate
@walkeros/web-destination-gtag to the new shape as the canary — its multi-tool
outputs (GA4 + Ads + GTM) now flatten into a single array of gtag(...) and
dataLayer.push(...) tuples in observed execution order. Remaining destination
packages ship the old shape until the bulk migration (separate plan).
Published Packages
- @walkeros/cli
- @walkeros/core
- @walkeros/destination-demo
- @walkeros/explorer
- @walkeros/mcp
- @walkeros/server-destination-amplitude
- @walkeros/server-destination-api
- @walkeros/server-destination-aws
- @walkeros/server-destination-bing
- @walkeros/server-destination-criteo
- @walkeros/server-destination-customerio
- @walkeros/server-destination-datamanager
- @walkeros/server-destination-file
- @walkeros/server-destination-gcp
- @walkeros/server-destination-hubspot
- @walkeros/server-destination-kafka
- @walkeros/server-destination-klaviyo
- @walkeros/server-destination-linkedin
- @walkeros/server-destination-meta
- @walkeros/server-destination-mixpanel
- @walkeros/server-destination-mparticle
- @walkeros/server-destination-pinterest
- @walkeros/server-destination-posthog
- @walkeros/server-destination-reddit
- @walkeros/server-destination-redis
- @walkeros/server-destination-rudderstack
- @walkeros/server-destination-segment
- @walkeros/server-destination-slack
- @walkeros/server-destination-snapchat
- @walkeros/server-destination-sqlite
- @walkeros/server-destination-tiktok
- @walkeros/server-destination-twitter
- @walkeros/server-source-aws
- @walkeros/server-source-express
- @walkeros/server-source-fetch
- @walkeros/server-source-gcp
- @walkeros/server-store-fs
- @walkeros/server-store-gcs
- @walkeros/server-store-s3
- @walkeros/server-transformer-file
- @walkeros/server-transformer-fingerprint
- @walkeros/source-demo
- @walkeros/store-memory
- @walkeros/transformer-demo
- @walkeros/transformer-validator
- @walkeros/web-destination-amplitude
- @walkeros/web-destination-api
- @walkeros/web-destination-clarity
- @walkeros/web-destination-fullstory
- @walkeros/web-destination-gtag
- @walkeros/web-destination-heap
- @walkeros/web-destination-hotjar
- @walkeros/web-destination-linkedin
- @walkeros/web-destination-matomo
- @walkeros/web-destination-meta
- @walkeros/web-destination-mixpanel
- @walkeros/web-destination-optimizely
- @walkeros/web-destination-pinterest
- @walkeros/web-destination-piwikpro
- @walkeros/web-destination-plausible
- @walkeros/web-destination-posthog
- @walkeros/web-destination-segment
- @walkeros/web-destination-snowplow
- @walkeros/web-destination-tiktok
- @walkeros/web-source-browser
- @walkeros/web-source-cmp-cookiefirst
- @walkeros/web-source-cmp-cookiepro
- @walkeros/web-source-cmp-usercentrics
- @walkeros/web-source-datalayer
- @walkeros/web-source-session