unstale

npm / spectrum-ts

spectrum-ts

What changed in spectrum-ts 12, from its official release notes, upgrade guides and advisories. Sources checked 2026-11-10.

4 breaking2 security19 new APIs and options4 behavior and defaults16 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.2.12 on npm

spectrum-ts 1245 changes

Breaking changes 4

  • Outbound iMessage and WhatsApp Business polls without titles are rejected before sending because those providers require a title.

    12.11.0release notes

  • Spectrum no longer registers SIGINT/SIGTERM handlers or calls process.exit() automatically, allowing host applications to finish graceful shutdown. Standalone scripts that relied on automatic handling should call await app.stop() in their own signal handler.

    12.10.0release notes

  • Webhook signature verification rejects empty secrets with a clear configuration error.

    12.8.0release notes

  • The function is now async, so callers need to await it; verification uses Web Crypto instead of Node-only crypto APIs.

    12.8.0release notes

Security 2

  • An OIDC preflight check verifies npm trusted publishing for every publishable package before any version bump, tag, or GitHub release is created.

    12.10.1release notes

  • Unsupported native iMessage rows use a small marker instead of leaking raw Advanced iMessage data through custom content, while preserving useful message metadata.

    12.7.0release notes

New APIs and options 19

  • iMessage exposes optional verified sender device identity metadata on inbound messages, space.getMessage(), and multipart message parts.

    12.16.0release notes

  • WhatsApp Business supports typing indicators through this API.

    12.16.0release notes

  • WhatsApp Business supports starting typing indicators anchored to the inbound message for streams and webhooks.

    12.16.0release notes

  • Supports provider-supplied diagnostic metadata, giving provider authors better visibility into stuck stream work without changing delivery behavior.

    12.15.0release notes

  • iMessage exposes subscription-scoped heartbeat observations for live messages, polls, and groups streams without changing existing message payloads.

    12.14.0release notes

  • Provider authors receive signal in lifecycle.createClient to use for startup I/O and cleaning up partial resources.

    12.13.0release notes

  • Spectrum() accepts a startup-only signal so apps can cancel slow initialization, including project lookup, cloud token requests, and Telegram webhook registration.

    12.13.0release notes

  • Spectrum throws SpectrumStartupCleanupError when cleanup fails, with the original startup failure as the cause.

    12.13.0release notes

  • Adds built-in chat background presets via preset names such as skyDusk; names are type-checked and invalid names fail at runtime before anything is sent.

    12.12.0release notes

  • iMessage delivers native poll creation and option-add events as poll messages, including pollMessageGuid, change, and per-option optionIdentifier values for reliable tracking.

    12.11.0release notes

  • A manual release option allows intentional token-based recovery publishes to skip the OIDC preflight check.

    12.10.1release notes

  • asApp() can accept a known layout directly, avoiding a refetch of link metadata when a provider already has the card text.

    12.9.0release notes

  • iMessage native metadata now includes mini app details such as app name, bundle/team IDs, session ID, live state, URL, and decoded card layout.

    12.9.0release notes

  • A portable entrypoint for verifying and parsing native Spectrum webhook deliveries is available across runtimes including Cloudflare Workers, Deno Deploy, Convex, Node, and Bun.

    12.8.0release notes

  • New metadata types are exported so TypeScript users can safely consume the fields after narrowing with imessage.is().

    12.7.0release notes

  • Inbound messages, space.getMessage(), and native outbound send results expose curated native metadata, including delivery state, formatting, mentions, attachments, reactions, stickers, and system fields.

    12.7.0release notes

  • Provider authors can merge streams whose source list can change while the app is running.

    12.6.0release notes

  • iMessage delivers inbound read receipts as read messages, with the reader in message.sender and the original outbound message in message.content.target.

    12.5.0release notes

  • Exports readSchema from @spectrum-ts/core/authoring for callers that build or validate read content directly.

    12.5.0release notes

Behavior and default changes 4

  • For app-created spaces, pass the message to typing("start", message) as the typing indicator anchor.

    12.16.0release notes

  • Remote iMessage streams log diagnostics when event mapping or downstream delivery stays pending for 30 seconds, separating mapping from emit and excluding sensitive content.

    12.15.0release notes

  • iMessage inbound mini app cards now come through as Spectrum app content, so they can be handled like other app-style messages instead of falling back to unsupported content.

    12.9.0release notes

  • Read receipt targets are fully built Message objects, exposing the original content and outbound affordances such as edit() and unsend().

    12.5.0release notes

Fixes and other changes 16

  • A cached sender device identity is retained when a later server fetch omits it, preventing metadata refreshes from erasing verified identity data.

    12.16.0release notes

  • Typing indicators quietly skip partial targets or messages Meta cannot use as typing anchors instead of throwing.

    12.16.0release notes

  • Refreshes delivery/read state from the server even when a sent message is cached, while preserving cached content like mini app card sessions.

    12.15.0release notes

  • Return undefined when the refreshed parent does not contain a child, avoiding stale cached fallbacks.

    12.15.0release notes

  • Cleanup for iMessage, WhatsApp Business, Slack, and Fusor cancels active token refreshes, awaits retired lines, and surfaces cleanup errors clearly.

    12.13.0release notes

  • When startup fails after providers create clients, Spectrum rolls those clients back before rejecting instead of leaving partial resources running.

    12.13.0release notes

  • Vote events are correlated with native option identifiers instead of option titles, avoiding missed or mismatched vote events for native polls.

    12.11.0release notes

  • Webhook deserialization preserves incoming poll and poll_option content, giving webhook users the same poll shape as stream users.

    12.11.0release notes

  • The --provenance and --dry-run options are now passed through to npm publish correctly.

    12.10.1release notes

  • Release failures now show real OIDC diagnostics instead of vague E404 errors.

    12.10.1release notes

  • Streamed iMessage sends return the final nativeText after edits instead of retaining stale first-send metadata.

    12.7.0release notes

  • iMessage and WhatsApp Business cloud clients pick up newly provisioned or removed lines on token renewal.

    12.6.0release notes

  • An empty cloud token payload represents no lines provisioned, rather than leaving stale lines active.

    12.6.0release notes

  • Closing message streams cleans up line observers so old streams are not called during later line updates.

    12.6.0release notes

  • If the Cloud profile check fails, contact sharing stays disabled and retries later without interrupting inbound message streaming.

    12.4.0release notes

  • Contact sharing now re-checks the project profile sync setting, so turning profile sync on or off in Cloud no longer requires a client restart.

    12.4.0release notes