{
  "name": "@voltro/cli",
  "version": "0.52.0",
  "description": "The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.",
  "keywords": [
    "voltro",
    "typescript",
    "framework"
  ],
  "license": "SEE LICENSE IN LICENSE",
  "homepage": "https://voltro.dev",
  "bugs": {
    "email": "support@voltro.dev"
  },
  "author": {
    "name": "Voltro UG",
    "url": "https://voltro.dev"
  },
  "type": "module",
  "bin": {
    "voltro": "./bin/voltro.mjs"
  },
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.js",
      "default": "./dist/index.js"
    },
    "./inspectState": {
      "types": "./dist/inspectState.d.ts",
      "import": "./dist/inspectState.js",
      "default": "./dist/inspectState.js"
    },
    "./devActivity": {
      "types": "./dist/devActivity.d.ts",
      "import": "./dist/devActivity.js",
      "default": "./dist/devActivity.js"
    },
    "./startup": {
      "types": "./dist/startup.d.ts",
      "import": "./dist/startup.js",
      "default": "./dist/startup.js"
    },
    "./serveEntry": {
      "types": "./dist/serveEntry.d.ts",
      "import": "./dist/serveEntry.js",
      "default": "./dist/serveEntry.js"
    },
    "./startEntry": {
      "types": "./dist/startEntry.d.ts",
      "import": "./dist/startEntry.js",
      "default": "./dist/startEntry.js"
    },
    "./package.json": "./package.json"
  },
  "main": "./dist/index.js",
  "module": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "voltro": {
    "codemods": [
      {
        "version": "0.10.0",
        "id": "0.10.0/01_render-mode-client-to-spa",
        "title": "renderMode is a closed set — `'client'` becomes `'spa'`",
        "kind": "transform"
      },
      {
        "version": "0.10.0",
        "id": "0.10.0/02_router-state-carries-its-path",
        "title": "`renderRouterStateScript` now requires the `path` it rendered",
        "kind": "manual"
      },
      {
        "version": "0.10.0",
        "id": "0.10.0/03_workflow-caller-context-resolved",
        "title": "workflow `buildContext` receives a RESOLVED caller context",
        "kind": "manual"
      },
      {
        "version": "0.10.0",
        "id": "0.10.0/04_seed-run-status-skipped",
        "title": "seed run status gained `skipped`",
        "kind": "manual"
      },
      {
        "version": "0.10.0",
        "id": "0.10.0/05_subscription-idle-state",
        "title": "`useSubscription` gained an idle state for `skip`",
        "kind": "manual"
      },
      {
        "version": "0.11.0",
        "id": "0.11.0/01_step-options-type-params",
        "title": "`StepOptions` takes the context type first",
        "kind": "manual"
      },
      {
        "version": "0.12.0",
        "id": "0.12.0/01_outbound-http-ssrf-guard",
        "title": "Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)",
        "kind": "manual"
      },
      {
        "version": "0.12.0",
        "id": "0.12.0/02_api-key-revoke-tenant-scope",
        "title": "apiKeyService.revoke/rotate now require the caller's tenantId",
        "kind": "manual"
      },
      {
        "version": "0.12.0",
        "id": "0.12.0/03_api-key-on-behalf-of",
        "title": "API keys: createdBy is provenance, onBehalfOf is ownership",
        "kind": "manual"
      },
      {
        "version": "0.12.0",
        "id": "0.12.0/04_inspect-fail-closed",
        "title": "The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)",
        "kind": "manual"
      },
      {
        "version": "0.13.0",
        "id": "0.13.0/01_bearer-gates-fail-closed",
        "title": "checkBearer is fail-closed; scimPlugin refuses an empty token",
        "kind": "manual"
      },
      {
        "version": "0.13.0",
        "id": "0.13.0/02_storage-grants-owner-only",
        "title": "storage.share / revoke / listGrants require ownership",
        "kind": "manual"
      },
      {
        "version": "0.13.0",
        "id": "0.13.0/03_apply-plan-convergence-proof",
        "title": "applyPlan requires a `replan` convergence proof",
        "kind": "manual"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/01_resolve-scopes-store",
        "title": "auth.resolveScopes receives the app DataStore",
        "kind": "manual"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/02_reactive-by-default",
        "title": "Reactivity is the default; .reactive() is removed",
        "kind": "transform"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/03_pages-suffix",
        "title": "Pages are declared with a .page.tsx suffix",
        "kind": "transform"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/04_file-taxonomy",
        "title": "Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)",
        "kind": "transform"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/05_typed-tracking",
        "title": "Tracking catalogues are typed against the component props",
        "kind": "manual"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/06_voltro-test-skips-e2e",
        "title": "`voltro test` leaves `e2e/` to `voltro e2e`",
        "kind": "manual"
      },
      {
        "version": "0.14.0",
        "id": "0.14.0/07_dev-remote-file-migrations",
        "title": "voltro dev refuses unattended file migrations against a remote database",
        "kind": "manual"
      },
      {
        "version": "0.15.0",
        "id": "0.15.0/01_undo-mistaken-taxonomy-renames",
        "title": "Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)",
        "kind": "transform"
      },
      {
        "version": "0.15.0",
        "id": "0.15.0/02_error-tag-in-protocol",
        "title": "`errorTag` is imported from @voltro/protocol",
        "kind": "transform"
      },
      {
        "version": "0.17.0",
        "id": "0.17.0/01_pages-are-directories",
        "title": "A directory is a route segment; its route is page.tsx",
        "kind": "transform"
      },
      {
        "version": "0.18.0",
        "id": "0.18.0/01_where-like-removed",
        "title": "the `'like'` where-operator is removed — pick `contains` or `startsWith`",
        "kind": "manual"
      },
      {
        "version": "0.19.0",
        "id": "0.19.0/01_server-only-gates-the-boot",
        "title": "`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn",
        "kind": "manual"
      },
      {
        "version": "0.19.0",
        "id": "0.19.0/02_audit-redact-input-default",
        "title": "`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)",
        "kind": "manual"
      },
      {
        "version": "0.20.0",
        "id": "0.20.0/01_write-recorder-port",
        "title": "`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`",
        "kind": "manual"
      },
      {
        "version": "0.21.0",
        "id": "0.21.0/01_maxlength-now-migrates",
        "title": "`text().maxLength(n)` now migrates EXISTING columns — plan before you apply",
        "kind": "manual"
      },
      {
        "version": "0.22.0",
        "id": "0.22.0/01_rename-index-op",
        "title": "`MigrationOperation` gained a `rename-index` kind",
        "kind": "manual"
      },
      {
        "version": "0.22.0",
        "id": "0.22.0/02_plugin-tables-voltro-prefixed",
        "title": "plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)",
        "kind": "manual"
      },
      {
        "version": "0.22.0",
        "id": "0.22.0/03_cache-scope-gained-tenant",
        "title": "`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch",
        "kind": "manual"
      },
      {
        "version": "0.22.0",
        "id": "0.22.0/04_inspect-write-credential",
        "title": "Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN",
        "kind": "manual"
      },
      {
        "version": "0.23.0",
        "id": "0.23.0/01_versioning-is-opt-out",
        "title": "versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value",
        "kind": "manual"
      },
      {
        "version": "0.24.0",
        "id": "0.24.0/01_agent-tables-voltro-prefixed",
        "title": "the two agent tables are `_voltro_`-prefixed (the rows move themselves)",
        "kind": "manual"
      },
      {
        "version": "0.25.0",
        "id": "0.25.0/01_events-emit-to-publish",
        "title": "`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`",
        "kind": "manual"
      },
      {
        "version": "0.25.0",
        "id": "0.25.0/02_outgoing-event-to-define-event",
        "title": "`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`",
        "kind": "transform"
      },
      {
        "version": "0.25.0",
        "id": "0.25.0/03_broadcast-channel-to-namespace",
        "title": "`broadcast({ channel })` → `broadcast({ namespace })`",
        "kind": "transform"
      },
      {
        "version": "0.26.0",
        "id": "0.26.0/01_event-webhook-retry-removed",
        "title": "`defineEvent({ webhook: { retry } })` is gone — it never did anything",
        "kind": "manual"
      },
      {
        "version": "0.26.0",
        "id": "0.26.0/02_step-retry-enforced",
        "title": "workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry",
        "kind": "manual"
      },
      {
        "version": "0.28.0",
        "id": "0.28.0/01_notifications-resolve-subject-id-async",
        "title": "`makeSubjectId` returns a Promise; `resolveSubjectId` may be async",
        "kind": "manual"
      },
      {
        "version": "0.28.0",
        "id": "0.28.0/02_plugin-ref-change-event",
        "title": "`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape",
        "kind": "manual"
      },
      {
        "version": "0.28.0",
        "id": "0.28.0/03_atlassian-credentials-context",
        "title": "`credentialsResolver` receives `{ subject, store }` instead of a bare Subject",
        "kind": "manual"
      },
      {
        "version": "0.28.0",
        "id": "0.28.0/04_audit-redacts-subject-metadata",
        "title": "`auditPlugin` redacts `subject.metadata` by default",
        "kind": "manual"
      },
      {
        "version": "0.29.0",
        "id": "0.29.0/01_loader-data-absence",
        "title": "`useLoaderData()` throws at a level that declares no `loader`",
        "kind": "manual"
      },
      {
        "version": "0.3.0",
        "id": "0.3.0/01_prod-serve-requires-build",
        "title": "Production `voltro serve` requires a precompiled bundle (build before serve)",
        "kind": "manual"
      },
      {
        "version": "0.30.0",
        "id": "0.30.0/01_locale-cookie-rename",
        "title": "the language-preference cookie is `voltro:locale` (was `voltro:lang`)",
        "kind": "transform"
      },
      {
        "version": "0.30.0",
        "id": "0.30.0/02_audit-purge-query-recheck",
        "title": "re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB",
        "kind": "manual"
      },
      {
        "version": "0.30.0",
        "id": "0.30.0/03_webhook-emit-durable-deferral",
        "title": "a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out",
        "kind": "manual"
      },
      {
        "version": "0.30.0",
        "id": "0.30.0/04_workflow-run-handle-nullable-execution",
        "title": "`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped",
        "kind": "manual"
      },
      {
        "version": "0.31.0",
        "id": "0.31.0/01_rerun-credential-scan",
        "title": "re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in",
        "kind": "manual"
      },
      {
        "version": "0.32.0",
        "id": "0.32.0/01_audit-redacts-outcome",
        "title": "`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it",
        "kind": "manual"
      },
      {
        "version": "0.33.0",
        "id": "0.33.0/01_opentelemetry-optional-peer",
        "title": "`@effect/opentelemetry` is now an optional peer — install it if you use tracing",
        "kind": "manual"
      },
      {
        "version": "0.33.0",
        "id": "0.33.0/02_coordinated-handle-gained-wake",
        "title": "`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/01_serve-does-mount-inspect",
        "title": "Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/02_keyed-writes-are-tenant-scoped",
        "title": "Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/03_procedure-access-decision",
        "title": "Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/04_workos-oauth-state-pkce",
        "title": "WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/05_analytics-mirror-versioned-writes",
        "title": "Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/06_origin-guard-and-trusted-proxies",
        "title": "Cross-site protection, trusted proxies and security headers are ON by default on the api listener",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/07_incoming-webhook-declares-verification",
        "title": "An incoming webhook with no signature scheme now refuses to boot",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/08_init-initialises-the-workspace",
        "title": "`voltro init` initialises the workspace root; scaffolding is `create-project` only",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/09_workflow-messages-queries-removed",
        "title": "`workflow({ messages: { queries } })` is removed — it never had a send path",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/10_testing-mail-is-a-service",
        "title": "`ctx.email` / `MockEmail` removed — assert mail through the mail plugin",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/11_ai-flows-per-step-human-signal",
        "title": "`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/12_session-cookie-carries-identity",
        "title": "The session cookie carries identity only — authority resolves per request",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/13_billing-provider-dunning",
        "title": "Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/14_search-memory-backend-refuses-production",
        "title": "`plugin-search` on the in-memory backend now refuses to boot in production",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/15_mysql-mssql-tls-honoured",
        "title": "mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/16_declare-node-env-for-migration-commands",
        "title": "`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/17_isr-postgres-refuses-without-a-database",
        "title": "The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/18_serve-refuses-pending-file-migrations",
        "title": "`voltro serve` refuses to boot with pending file-based migrations",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/19_connection-override-carries-a-credential",
        "title": "Soft re-auth presents a credential — it no longer hands the server a Subject",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/20_user-store-auth-feature-methods",
        "title": "UserStore gained the email-verification, invitation and impersonation methods",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/20_workflow-authority-resolves-at-resume",
        "title": "A resumed workflow re-resolves its caller's authority instead of restoring it",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/21_admin-gates-on-declared-access",
        "title": "The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/22_write-rejections-carry-the-typed-error",
        "title": "A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/23_saml-signature-and-replay-defaults",
        "title": "SAML: response-signature requirement relaxed + surfaced; replay protection ON by default",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/24_webhook-signing-renders-headers",
        "title": "Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/25_presence-has-no-table",
        "title": "Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster",
        "kind": "manual"
      },
      {
        "version": "0.34.0",
        "id": "0.34.0/26_route-http-is-async",
        "title": "`routeHttp` returns a Promise",
        "kind": "manual"
      },
      {
        "version": "0.35.0",
        "id": "0.35.0/01_event-access-decision",
        "title": "Every declared event decides who may listen (`guards:` or `openAccess:`)",
        "kind": "manual"
      },
      {
        "version": "0.35.0",
        "id": "0.35.0/02_plugin-procedures-carry-access-decisions",
        "title": "First-party plugin procedures carry access decisions; twelve now require a scope",
        "kind": "manual"
      },
      {
        "version": "0.35.0",
        "id": "0.35.0/03_analytics-mirror-max-version",
        "title": "Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)",
        "kind": "manual"
      },
      {
        "version": "0.35.0",
        "id": "0.35.0/04_flow-run-step-skipped",
        "title": "A flow run step can now be 'skipped' — handle it where you render a run timeline",
        "kind": "manual"
      },
      {
        "version": "0.35.0",
        "id": "0.35.0/05_declared-schema-drops-runtime-flags",
        "title": "The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`",
        "kind": "manual"
      },
      {
        "version": "0.35.1",
        "id": "0.35.1/01_unauthorized-replaces-session-expired",
        "title": "A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`",
        "kind": "transform"
      },
      {
        "version": "0.37.0",
        "id": "0.37.0/01_procedure-input-rejects-undeclared-fields",
        "title": "a procedure input rejects a field it does not declare (it used to drop it)",
        "kind": "manual"
      },
      {
        "version": "0.38.0",
        "id": "0.38.0/01_impersonation-key-in-protocol",
        "title": "`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol",
        "kind": "transform"
      },
      {
        "version": "0.38.0",
        "id": "0.38.0/02_startup-failure-refuses-boot",
        "title": "a `*.startup.ts` that fails refuses the boot (it used to warn and continue)",
        "kind": "manual"
      },
      {
        "version": "0.39.0",
        "id": "0.39.0/01_empty-input-schema-rejects-every-field",
        "title": "a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none",
        "kind": "manual"
      },
      {
        "version": "0.4.0",
        "id": "0.4.0/01_rbac-forbidden-to-scopeerror",
        "title": "@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)",
        "kind": "transform"
      },
      {
        "version": "0.4.0",
        "id": "0.4.0/02_rbac-web-to-client-permissions",
        "title": "@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client",
        "kind": "transform"
      },
      {
        "version": "0.40.0",
        "id": "0.40.0/01_cold-start-failure-is-its-own-state",
        "title": "a failed cold start is `failed: true`, not `loading: true`",
        "kind": "manual"
      },
      {
        "version": "0.40.0",
        "id": "0.40.0/02_rejected-credential-widens-guard-results",
        "title": "a rejected credential answers `Unauthenticated`, widening three guard results",
        "kind": "manual"
      },
      {
        "version": "0.41.0",
        "id": "0.41.0/01_middleware-defines-where-it-runs",
        "title": "`middleware.ts` exports `defineMiddleware(...)` and can say where it runs",
        "kind": "transform"
      },
      {
        "version": "0.43.0",
        "id": "0.43.0/01_dangling-reference-to-rows-refused",
        "title": "`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)",
        "kind": "transform"
      },
      {
        "version": "0.44.0",
        "id": "0.44.0/01_import-outcome",
        "title": "`runImport` returns an ImportOutcome — read `.manifest` for the bundle",
        "kind": "manual"
      },
      {
        "version": "0.45.0",
        "id": "0.45.0/01_typed-source-table-name",
        "title": "`source:` is typechecked against the app’s tables, from the next `voltro dev`",
        "kind": "manual"
      },
      {
        "version": "0.46.0",
        "id": "0.46.0/01_typed-aggregate-source",
        "title": "an aggregate’s `incremental.source` is typechecked against the app’s tables",
        "kind": "manual"
      },
      {
        "version": "0.49.0",
        "id": "0.49.0/01_data-imports-to-transfers",
        "title": "`voltro data imports` → `voltro data transfers`",
        "kind": "manual"
      },
      {
        "version": "0.49.0",
        "id": "0.49.0/02_import-run-symbols",
        "title": "`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names",
        "kind": "transform"
      },
      {
        "version": "0.5.0",
        "id": "0.5.0/01_one-terminal-exactly-one",
        "title": ".one() now fails on MORE than one row; NoRowFound is a declarable typed error",
        "kind": "manual"
      },
      {
        "version": "0.5.0",
        "id": "0.5.0/02_typed-store-rows",
        "title": "store.query() now returns the row type — casts on row fields may stop compiling",
        "kind": "manual"
      },
      {
        "version": "0.50.0",
        "id": "0.50.0/01_transfer-runs-endpoint",
        "title": "`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`",
        "kind": "manual"
      },
      {
        "version": "0.50.0",
        "id": "0.50.0/02_reissue-data-imports-rename",
        "title": "RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)",
        "kind": "manual"
      },
      {
        "version": "0.50.0",
        "id": "0.50.0/03_interrupted-replace-tables-nullable",
        "title": "`InterruptedReplace.tables` is `number | null`",
        "kind": "manual"
      },
      {
        "version": "0.51.0",
        "id": "0.51.0/01_computed-source-keeps-its-names",
        "title": "A COMPUTED `source:` can keep its typed names — do not widen the whole registry",
        "kind": "manual"
      },
      {
        "version": "0.51.0",
        "id": "0.51.0/02_restore-refuses-without-marker",
        "title": "`voltro data restore` refuses when it cannot write the in-progress marker",
        "kind": "manual"
      },
      {
        "version": "0.51.0",
        "id": "0.51.0/03_restore-assets-returns-counts",
        "title": "`restoreAssetsFromCas` returns `{ count, objects }`, not a number",
        "kind": "manual"
      },
      {
        "version": "0.51.0",
        "id": "0.51.0/04_i18n-timezone-prop",
        "title": "`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member",
        "kind": "transform"
      },
      {
        "version": "0.52.0",
        "id": "0.52.0/01_plugin-versioning-to-row-history",
        "title": "@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)",
        "kind": "transform"
      },
      {
        "version": "0.52.0",
        "id": "0.52.0/02_http-interceptor-fail-closed",
        "title": "A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored",
        "kind": "manual"
      },
      {
        "version": "0.6.0",
        "id": "0.6.0/01_no-dev-session-secret",
        "title": "The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required",
        "kind": "manual"
      },
      {
        "version": "0.6.0",
        "id": "0.6.0/02_subscription-state-union",
        "title": "SubscriptionState is a discriminated union — `loading` now narrows `data`",
        "kind": "manual"
      },
      {
        "version": "0.6.0",
        "id": "0.6.0/03_billing-on-stripe-sdk",
        "title": "Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s",
        "kind": "manual"
      },
      {
        "version": "0.6.0",
        "id": "0.6.0/04_relation-key-validation",
        "title": "relation key options are validated at boot; `one` now fails on more than one match",
        "kind": "manual"
      },
      {
        "version": "0.6.0",
        "id": "0.6.0/05_atlassian-avatar-mode",
        "title": "atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`",
        "kind": "transform"
      },
      {
        "version": "0.6.0",
        "id": "0.6.0/06_ui-strings-connect-account",
        "title": "UiStrings gained a required `connectAccount` section",
        "kind": "manual"
      },
      {
        "version": "0.7.0",
        "id": "0.7.0/01_row-filter-load-failure",
        "title": "A row filter that fails to load now errors instead of returning zero rows",
        "kind": "manual"
      },
      {
        "version": "0.7.0",
        "id": "0.7.0/02_testing-invoke-effect-handlers",
        "title": "@voltro/testing: invoke() runs Effect handlers; executor types widened",
        "kind": "manual"
      },
      {
        "version": "0.8.0",
        "id": "0.8.0/01_optional-password-hash",
        "title": "`UserRecord.passwordHash` is optional — password-less identities are now first-class",
        "kind": "manual"
      },
      {
        "version": "0.8.0",
        "id": "0.8.0/02_ssr-streams-and-loaderdata",
        "title": "`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`",
        "kind": "manual"
      },
      {
        "version": "0.9.0",
        "id": "0.9.0/01_ssr-layout-shell-for-spa",
        "title": "A `renderMode:'spa'` page under a layout now server-renders that layout",
        "kind": "manual"
      }
    ]
  },
  "engines": {
    "node": ">=24.0.0"
  },
  "dependencies": {
    "@effect/platform-node": "^0.108.0",
    "@effect/sql": "^0.52.0",
    "@effect/workflow": "^0.19.0",
    "@voltro/ai": "0.52.0",
    "@voltro/cache": "0.52.0",
    "@voltro/client": "0.52.0",
    "@voltro/data-transfer": "0.52.0",
    "@voltro/database": "0.52.0",
    "@voltro/env": "0.52.0",
    "@voltro/kv": "0.52.0",
    "@voltro/logger": "0.52.0",
    "@voltro/plugin-auth": "0.52.0",
    "@voltro/plugin-broadcast": "0.52.0",
    "@voltro/plugin-mail": "0.52.0",
    "@voltro/plugin-storage": "0.52.0",
    "@voltro/plugin-webhooks": "0.52.0",
    "@voltro/protocol": "0.52.0",
    "@voltro/runtime": "0.52.0",
    "@voltro/serverless": "0.52.0",
    "@voltro/workflow": "0.52.0",
    "chokidar": "^5.0.0",
    "ioredis": "^5.11.1",
    "tinyglobby": "^0.2.17",
    "ts-morph": "^28.0.0"
  },
  "optionalDependencies": {
    "@tailwindcss/vite": "^4.3.3",
    "@vercel/nft": "^1.10.2",
    "@vitejs/plugin-react": "^6.0.5",
    "esbuild": "^0.28.2",
    "tsx": "^4.23.12",
    "vite": "^8.2.1"
  },
  "peerDependencies": {
    "@effect/platform": "^0.97.0",
    "@effect/rpc": "^0.76.0",
    "effect": "^3.22.0"
  },
  "publishConfig": {
    "access": "public"
  }
}
