{"_id":"@voltro/cli","_rev":"261-1298b85cf607d44cc5f889e3ae372166","name":"@voltro/cli","dist-tags":{"latest":"0.83.0","incoming":"0.83.0"},"versions":{"0.1.0":{"name":"@voltro/cli","version":"0.1.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"e6bea38a1b11b0f539905d97624605f10cda5266","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.0.tgz","fileCount":626,"integrity":"sha512-Qp/4Dq3mXipKlF3HKu8YNeqY5SiC7XrsgzArwICpJXHyHw3DN/Oyrq1hnWxCOq7Jh77KIJzX6/AVp5AHQPmuQA==","signatures":[{"sig":"MEUCIAHE0hHZMWb1D0HzIBwD06/IRzilPfOdZq+fxF8UDA5BAiEApip9+/Yp7Vf4U2IyXj/3j7BzWPEYB0uRgMLOmmn3XKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4395027},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"e3377376d35de43174aac0a35acef06f5df9c38f","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.0","@voltro/kv":"0.1.0","@effect/sql":"^0.51.1","@voltro/env":"0.1.0","@voltro/cache":"0.1.0","@voltro/logger":"0.1.0","@voltro/runtime":"0.1.0","@effect/workflow":"^0.18.2","@voltro/database":"0.1.0","@voltro/protocol":"0.1.0","@voltro/workflow":"0.1.0","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.0","@voltro/sql-mysql":"0.1.0","@voltro/sql-turso":"0.1.0","@voltro/serverless":"0.1.0","@voltro/sql-sqlite":"0.1.0","@voltro/plugin-auth":"0.1.0","@voltro/plugin-mail":"0.1.0","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.0","@voltro/plugin-storage":"0.1.0","@voltro/plugin-webhooks":"0.1.0","@voltro/plugin-broadcast":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.0_1784088805449_0.10249413378858274","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@voltro/cli","version":"0.1.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"65e49f3abd9c2408cfb668e5ccfd86436796dd76","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.1.tgz","fileCount":626,"integrity":"sha512-fUCdHHd9wWQKbH9Sy7V1icexgE01ZHjKWMsFqqTMFxyJo4h8DtALdWrxDPdO4oHHWSOxIOhS0qcWLyLJznwSkQ==","signatures":[{"sig":"MEYCIQDqXGJPwmn8NLA+FnGXWqZ2ikaW7aj5OASXs5x1bhFgtgIhAKMbkY7b5VP50V1u52VHws3Va9Tl53B/rCD+MR+h+KnO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4395359},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"5d41c05d281cee1772e4e92e304ba554214d1491","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.1","@voltro/kv":"0.1.1","@effect/sql":"^0.51.1","@voltro/env":"0.1.1","@voltro/cache":"0.1.1","@voltro/logger":"0.1.1","@voltro/runtime":"0.1.1","@effect/workflow":"^0.18.2","@voltro/database":"0.1.1","@voltro/protocol":"0.1.1","@voltro/workflow":"0.1.1","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.1","@voltro/sql-mysql":"0.1.1","@voltro/sql-turso":"0.1.1","@voltro/serverless":"0.1.1","@voltro/sql-sqlite":"0.1.1","@voltro/plugin-auth":"0.1.1","@voltro/plugin-mail":"0.1.1","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.1","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.1","@voltro/plugin-storage":"0.1.1","@voltro/plugin-webhooks":"0.1.1","@voltro/plugin-broadcast":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.1_1784096595294_0.6268360152305008","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@voltro/cli","version":"0.1.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"31e8c9177d5a9a7d67f974af0911b75136a88adf","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.2.tgz","fileCount":626,"integrity":"sha512-BJAFjVAjJbUsZqVH9gixwLTtW3epwKX92yyCAy1N6VlbaFVmsb5YFekow6ME/LL+a61SmhDHKJjPumDANGrmWg==","signatures":[{"sig":"MEQCIAP1qaTQnI5BoAKSeNWCRJcquw7X4+cydFxR6DJXDrgiAiBCEoKyJsygUury3KAkCGK4v2WlWOX132ycEMZAJCVrpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4396786},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"071c60e1b8ba73510f9e0e175208cc3dbaddd067","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.2","@voltro/kv":"0.1.2","@effect/sql":"^0.51.1","@voltro/env":"0.1.2","@voltro/cache":"0.1.2","@voltro/logger":"0.1.2","@voltro/runtime":"0.1.2","@effect/workflow":"^0.18.2","@voltro/database":"0.1.2","@voltro/protocol":"0.1.2","@voltro/workflow":"0.1.2","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.2","@voltro/sql-mysql":"0.1.2","@voltro/sql-turso":"0.1.2","@voltro/serverless":"0.1.2","@voltro/sql-sqlite":"0.1.2","@voltro/plugin-auth":"0.1.2","@voltro/plugin-mail":"0.1.2","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.2","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.2","@voltro/plugin-storage":"0.1.2","@voltro/plugin-webhooks":"0.1.2","@voltro/plugin-broadcast":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.2_1784111340880_0.07459201660270076","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@voltro/cli","version":"0.1.3","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.3","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"b877e4b8edb5baffd14061d4121e3e6c8c598b0e","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.3.tgz","fileCount":626,"integrity":"sha512-VjNM3NIeJx9xCTtmPPrAR+WtETa1gXQ6uQaUh0WmsaXkwkjyPMV6CkWnrW/XxKu0QI5cgVmc/IbdcxLdsIEcNg==","signatures":[{"sig":"MEYCIQD2uCynQuwrw3hbZQPs1+zudXpVLpiHBvVNLRnVL5f+ngIhALNGAWGpkxK34OXFHy8e2aR/dj2TKZVE7ah06ZZ2lI0A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4396786},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"28917410638ad63456a57b66d0170fd8ca91e90f","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.3","@voltro/kv":"0.1.3","@effect/sql":"^0.51.1","@voltro/env":"0.1.3","@voltro/cache":"0.1.3","@voltro/logger":"0.1.3","@voltro/runtime":"0.1.3","@effect/workflow":"^0.18.2","@voltro/database":"0.1.3","@voltro/protocol":"0.1.3","@voltro/workflow":"0.1.3","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.3","@voltro/sql-mysql":"0.1.3","@voltro/sql-turso":"0.1.3","@voltro/serverless":"0.1.3","@voltro/sql-sqlite":"0.1.3","@voltro/plugin-auth":"0.1.3","@voltro/plugin-mail":"0.1.3","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.3","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.3","@voltro/plugin-storage":"0.1.3","@voltro/plugin-webhooks":"0.1.3","@voltro/plugin-broadcast":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.3_1784179716322_0.3640119036577494","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@voltro/cli","version":"0.1.4","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.4","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"526d0299d1efb3774dd1ad0b5e5d69892428edfe","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.4.tgz","fileCount":626,"integrity":"sha512-+q3FWvuFHwaUXXjHkB3VWFcAixWhggEdTfJ1sKMBWjZ5/k3SwUdahsdHTF8s+kXiDFOSKLZIDDqsRha1RH9hSg==","signatures":[{"sig":"MEQCIDTcNoC9rB6PFHIdcdARDCLaT91vZE9Z40OZGi2u++4/AiB3zHhPpIWBcn2Vwmfnv71pW9WBczCtYQLO7LRzzbTy9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4397825},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"6ca6f48fee49cbc612d0514f5ccc705369265558","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.4","@voltro/kv":"0.1.4","@effect/sql":"^0.51.1","@voltro/env":"0.1.4","@voltro/cache":"0.1.4","@voltro/logger":"0.1.4","@voltro/runtime":"0.1.4","@effect/workflow":"^0.18.2","@voltro/database":"0.1.4","@voltro/protocol":"0.1.4","@voltro/workflow":"0.1.4","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.4","@voltro/sql-mysql":"0.1.4","@voltro/sql-turso":"0.1.4","@voltro/serverless":"0.1.4","@voltro/sql-sqlite":"0.1.4","@voltro/plugin-auth":"0.1.4","@voltro/plugin-mail":"0.1.4","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.4","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.4","@voltro/plugin-storage":"0.1.4","@voltro/plugin-webhooks":"0.1.4","@voltro/plugin-broadcast":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.4_1784210243615_0.5470320503798307","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@voltro/cli","version":"0.1.5","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.5","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"d2076483d7da79278bff157bfe12afa56bb637a0","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.5.tgz","fileCount":630,"integrity":"sha512-3PB0L65Fzlpjql/vzgGhybmdscUh8B9ZM8FgmwoIi4jA1JVmG9U3BEZ1Nb83IZ5wTMsXs1C+3hlrZAwujDfRZA==","signatures":[{"sig":"MEUCID4co7yvODR0dBdcDddmkXwb24hzE7dtjAqY3e5hRTh6AiEAumNL6Drzxkyxn/v6iH6un1S/KKSmjBg3pKuiYgY9xi0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4419821},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"4eb118e258a91b75d6c10f7faad93dba787a5473","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.5","@voltro/kv":"0.1.5","@effect/sql":"^0.51.1","@voltro/env":"0.1.5","@voltro/cache":"0.1.5","@voltro/logger":"0.1.5","@voltro/runtime":"0.1.5","@effect/workflow":"^0.18.2","@voltro/database":"0.1.5","@voltro/protocol":"0.1.5","@voltro/workflow":"0.1.5","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.5","@voltro/sql-mysql":"0.1.5","@voltro/sql-turso":"0.1.5","@voltro/serverless":"0.1.5","@voltro/sql-sqlite":"0.1.5","@voltro/plugin-auth":"0.1.5","@voltro/plugin-mail":"0.1.5","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.5","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.5","@voltro/plugin-storage":"0.1.5","@voltro/plugin-webhooks":"0.1.5","@voltro/plugin-broadcast":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.5_1784262592154_0.8590331898237493","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@voltro/cli","version":"0.1.6","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.1.6","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"a6b5ff2d0632f88250a638eb7976b9d109385501","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.1.6.tgz","fileCount":630,"integrity":"sha512-oTJF78OTLrBnKIPHhhbxF7MGeLK/IPwGmeBfxpDW624n/wc1wOebcs0QxWhCmnYrlA4A8CMJ9FuFO5++U9UZtw==","signatures":[{"sig":"MEUCICs0q6C6Jp5QgMHEm0KYIqaG/qDZAv8mg/gRLR8MvId7AiEAnMSEAzxbSNiGMD7rziWLl+ZTCFd5K7YRF4PkohxIG60=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4424085},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"93d0076415ea02259c0231eb2effce20f6e0d6c2","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"pg":"^8.22.0","tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.1.6","@voltro/kv":"0.1.6","@effect/sql":"^0.51.1","@voltro/env":"0.1.6","@voltro/cache":"0.1.6","@voltro/logger":"0.1.6","@voltro/runtime":"0.1.6","@effect/workflow":"^0.18.2","@voltro/database":"0.1.6","@voltro/protocol":"0.1.6","@voltro/workflow":"0.1.6","@tailwindcss/vite":"^4.3.2","@voltro/sql-mssql":"0.1.6","@voltro/sql-mysql":"0.1.6","@voltro/sql-turso":"0.1.6","@voltro/serverless":"0.1.6","@voltro/sql-sqlite":"0.1.6","@voltro/plugin-auth":"0.1.6","@voltro/plugin-mail":"0.1.6","@vitejs/plugin-react":"^6.0.3","@voltro/sql-postgres":"0.1.6","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.1.6","@voltro/plugin-storage":"0.1.6","@voltro/plugin-webhooks":"0.1.6","@voltro/plugin-broadcast":"0.1.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.6_1784277862214_0.39389431709017564","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@voltro/cli","version":"0.2.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.2.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"0fd260435a30ee9e0b5f512991852aca741972cf","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.2.0.tgz","fileCount":630,"integrity":"sha512-6X6KhdR81/SSzPhR96yTgxw6H+HQtXddTaPCkabbeugvGRhy2je/GBRRk3BxViLwBohJMKwxhRBW4KUDyWGNYQ==","signatures":[{"sig":"MEQCIAMqjjDoi6sXFDNtaIxt3QRpi1mF3q1+SwG2bKmstQryAiApRif5u9VZH7BYANjNiOJpw6UnREtBos46YRF22TxCKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4263662},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"7de1d10609d6c3d2f6e3d48063670010e266b303","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.2.0","@voltro/kv":"0.2.0","@effect/sql":"^0.51.1","@voltro/env":"0.2.0","@voltro/cache":"0.2.0","@voltro/logger":"0.2.0","@voltro/runtime":"0.2.0","@effect/workflow":"^0.18.2","@voltro/database":"0.2.0","@voltro/protocol":"0.2.0","@voltro/workflow":"0.2.0","@tailwindcss/vite":"^4.3.2","@voltro/serverless":"0.2.0","@voltro/plugin-auth":"0.2.0","@voltro/plugin-mail":"0.2.0","@vitejs/plugin-react":"^6.0.3","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.2.0","@voltro/plugin-storage":"0.2.0","@voltro/plugin-webhooks":"0.2.0","@voltro/plugin-broadcast":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.0_1784294654287_0.9198339649612364","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@voltro/cli","version":"0.2.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.2.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"e2efb8720f2da622fcee5efb827c00e0e5244fd4","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.2.1.tgz","fileCount":630,"integrity":"sha512-chl7TW7APjBaMee07bt5LVWhS/pN807j0Ipibtso7yh97eC++KlQ0rFx7B0MgFtqiKsPpUcrAlr/pO679WYDhg==","signatures":[{"sig":"MEYCIQDY8EQKX3+F7H86+zycLEjO7ISfckI5PSdLW02OST3TxwIhAMAqJmVL6CTiEt1Clh6cYgPODTULo0e5lmB2BoRSymxF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4265065},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"206c6a29f1f329057ca252433a9fb65ecba66d18","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.2.1","@voltro/kv":"0.2.1","@effect/sql":"^0.51.1","@voltro/env":"0.2.1","@voltro/cache":"0.2.1","@voltro/logger":"0.2.1","@voltro/runtime":"0.2.1","@effect/workflow":"^0.18.2","@voltro/database":"0.2.1","@voltro/protocol":"0.2.1","@voltro/workflow":"0.2.1","@tailwindcss/vite":"^4.3.2","@voltro/serverless":"0.2.1","@voltro/plugin-auth":"0.2.1","@voltro/plugin-mail":"0.2.1","@vitejs/plugin-react":"^6.0.3","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.2.1","@voltro/plugin-storage":"0.2.1","@voltro/plugin-webhooks":"0.2.1","@voltro/plugin-broadcast":"0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.1_1784303723353_0.6076387605210809","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@voltro/cli","version":"0.2.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.2.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"0ff955d219c68d152b7053acf4f63e002b71e85f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.2.2.tgz","fileCount":633,"integrity":"sha512-Qv/pS1mNuQC6Hjx7fRtfD7mwtsRtkM9mST2ybCwlta9/z92xBXDeRRE7wOm8LIROg+4Osj/9dp44/oa0xdscRA==","signatures":[{"sig":"MEQCIA8NflZfutfM2YHKE3DjwMI1i5dcq8ZaYLHLKVk6G6BBAiBBY0DP7SAUAXy1p3WztKeLlsUlX5TLx5k7dPBO/QXPfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4277065},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"e514dc54ca76932544bebb23387842b11d382221","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","ioredis":"^5.11.1","chokidar":"^5.0.0","@voltro/ai":"0.2.2","@voltro/kv":"0.2.2","@effect/sql":"^0.51.1","@voltro/env":"0.2.2","@voltro/cache":"0.2.2","@voltro/logger":"0.2.2","@voltro/runtime":"0.2.2","@effect/workflow":"^0.18.2","@voltro/database":"0.2.2","@voltro/protocol":"0.2.2","@voltro/workflow":"0.2.2","@tailwindcss/vite":"^4.3.2","@voltro/serverless":"0.2.2","@voltro/plugin-auth":"0.2.2","@voltro/plugin-mail":"0.2.2","@vitejs/plugin-react":"^6.0.3","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.2.2","@voltro/plugin-storage":"0.2.2","@voltro/plugin-webhooks":"0.2.2","@voltro/plugin-broadcast":"0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.2_1784317916753_0.6634277310922057","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@voltro/cli","version":"0.3.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.3.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"fbd8411242a1fd2cc5460caf4b9660daaacd7e2a","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.3.0.tgz","fileCount":633,"integrity":"sha512-TmNfNk/1hfyTcQtVokVxzZf0DVUxiwSV+HP2jmhbK97E8eSzXD9JHfWJDHsA8dKcSZ3hOchliAskNhcmuPe85g==","signatures":[{"sig":"MEUCIBgnkr980zJOHSMt6YXSNZbehIZPpFSZMB1sU8phKlsyAiEApAt9njWFrdFEpFZ1BR2jZ71g8lgY5h9OmhnakpdukTk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4324945},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"1bc1dc36c871849a49f738279aed760bd6fc82dd","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.3.0","@voltro/kv":"0.3.0","@effect/sql":"^0.51.1","@voltro/env":"0.3.0","@voltro/cache":"0.3.0","@voltro/logger":"0.3.0","@voltro/runtime":"0.3.0","@effect/workflow":"^0.18.2","@voltro/database":"0.3.0","@voltro/protocol":"0.3.0","@voltro/workflow":"0.3.0","@voltro/serverless":"0.3.0","@voltro/plugin-auth":"0.3.0","@voltro/plugin-mail":"0.3.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.3.0","@voltro/plugin-storage":"0.3.0","@voltro/plugin-webhooks":"0.3.0","@voltro/plugin-broadcast":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.3.0_1784372081161_0.4122746831694224","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@voltro/cli","version":"0.4.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.4.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"00906418d7216f539878fea147fbb06cbce82b2a","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.4.0.tgz","fileCount":633,"integrity":"sha512-Bo8ZxRCjlAvJvQt57DvSPReLwFAE+L9RI4MTVKqDSjYTUKNA26UobZVAA+RyWXgzo1pCDXsIxItQvkW0VVdRwA==","signatures":[{"sig":"MEYCIQDgz4HJE15f1M+oT6r9+CEztcubfHLugE38rsOnp79mbAIhAKmhapB1RKngp25AnFurn7DWZAFBcLbuFc5VOn49O0bN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4425481},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"4b9b162b37993c78154b6724d4c614890c0251bd","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.4.0","@voltro/kv":"0.4.0","@effect/sql":"^0.51.1","@voltro/env":"0.4.0","@voltro/cache":"0.4.0","@voltro/logger":"0.4.0","@voltro/runtime":"0.4.0","@effect/workflow":"^0.18.2","@voltro/database":"0.4.0","@voltro/protocol":"0.4.0","@voltro/workflow":"0.4.0","@voltro/serverless":"0.4.0","@voltro/plugin-auth":"0.4.0","@voltro/plugin-mail":"0.4.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.4.0","@voltro/plugin-storage":"0.4.0","@voltro/plugin-webhooks":"0.4.0","@voltro/plugin-broadcast":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.4.0_1784401048079_0.26412884613809284","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@voltro/cli","version":"0.5.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.5.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"4753f0607cc49798a07274450af71fb6de48f017","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.5.0.tgz","fileCount":633,"integrity":"sha512-DCMpeJ4suG/JE3qnQZeUOg9zGfrmF2yhZC6JW9ZPp4gMovKOlv9y3OtK95zpY68asmLiAuk7YhpcD14zxXwPog==","signatures":[{"sig":"MEQCIHsPLmE2lnyLsnMVE6qRsFq+zRt8zhCvqqS3srS7k3P6AiAbfXfc6ITeDp4xFQKKcxqD7ObStsLQWVIEMTVo0+KoYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4479697},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"fbb0dee03eb288cfe0e8b338dc5cbb4255512db4","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.5.0","@voltro/kv":"0.5.0","@effect/sql":"^0.51.1","@voltro/env":"0.5.0","@voltro/cache":"0.5.0","@voltro/logger":"0.5.0","@voltro/runtime":"0.5.0","@effect/workflow":"^0.18.2","@voltro/database":"0.5.0","@voltro/protocol":"0.5.0","@voltro/workflow":"0.5.0","@voltro/serverless":"0.5.0","@voltro/plugin-auth":"0.5.0","@voltro/plugin-mail":"0.5.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.5.0","@voltro/plugin-storage":"0.5.0","@voltro/plugin-webhooks":"0.5.0","@voltro/plugin-broadcast":"0.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.5.0_1784408917477_0.7276099639166442","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@voltro/cli","version":"0.6.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.6.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"387d10252cff4e640ae3dee6d71ec85ec7f8256a","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.6.0.tgz","fileCount":632,"integrity":"sha512-eV3ksKW45BD++rdiybS712IVeuLNA9UUBDKBnsMQya3bKR8+fBg919QmRmiSerOMSI8C8XCPrJm3FQt5CuuJuw==","signatures":[{"sig":"MEUCIQDq8sedexAqZysXYbw0YAG2GCKxF/QBWrefGKuu3Xy4MQIgMIw32YJEJTPU3Dw/dyISHCD7ZyDPaPoONBvvgR0Z23U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4636191},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"db79478403071013a0850f92796aaec7bee953be","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.6.0","@voltro/kv":"0.6.0","@effect/sql":"^0.51.1","@voltro/env":"0.6.0","@voltro/cache":"0.6.0","@voltro/logger":"0.6.0","@voltro/runtime":"0.6.0","@effect/workflow":"^0.18.2","@voltro/database":"0.6.0","@voltro/protocol":"0.6.0","@voltro/workflow":"0.6.0","@voltro/serverless":"0.6.0","@voltro/plugin-auth":"0.6.0","@voltro/plugin-mail":"0.6.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.6.0","@voltro/plugin-storage":"0.6.0","@voltro/plugin-webhooks":"0.6.0","@voltro/plugin-broadcast":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.6.0_1784482058230_0.5582941028620507","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@voltro/cli","version":"0.7.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.7.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"5664db464dc22f6b75c5a394644dbbb5ab4cc530","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.7.0.tgz","fileCount":636,"integrity":"sha512-kQYHHbqKFdgzdV0RIEWugF3jWrlIVyW/do+SqRELdo8BRcKT0Ce3oO/99eIQO3K6pkfbC2zv51TMeVhufVtqdQ==","signatures":[{"sig":"MEUCIQCQrEioaQcUvkPC4PCEACoIdPm4xdtamHzXMhl75xQhcAIgSeSbIvvC1mUyaH+pBiEpMQzHBBbDuAvmFg3LHlC3zgA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4685917},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"bdce67f0e868a36a1beec40e425f8908358fa1ce","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.7.0","@voltro/kv":"0.7.0","@effect/sql":"^0.51.1","@voltro/env":"0.7.0","@voltro/cache":"0.7.0","@voltro/logger":"0.7.0","@voltro/runtime":"0.7.0","@effect/workflow":"^0.18.2","@voltro/database":"0.7.0","@voltro/protocol":"0.7.0","@voltro/workflow":"0.7.0","@voltro/serverless":"0.7.0","@voltro/plugin-auth":"0.7.0","@voltro/plugin-mail":"0.7.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.7.0","@voltro/plugin-storage":"0.7.0","@voltro/plugin-webhooks":"0.7.0","@voltro/plugin-broadcast":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.7.0_1784528499356_0.5690494730891003","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@voltro/cli","version":"0.8.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.8.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"c26c69b08958b02c6ae9d79537a50840dda2811b","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.8.0.tgz","fileCount":636,"integrity":"sha512-bB8oqkJIKLXB/4mEr8hPfkARogEh/+VE3LevJpkSKvAN1VOCkVvaN9BOC/8luoEhdlaTYt46DQwHAHUQEnAhVw==","signatures":[{"sig":"MEQCIF7IvNXNnsutJ89UuAYU/xmi9mGc/a5o16L5U/G1DlsJAiBxHxrtMYm+z7GlRwVutV+olJ2OddMIqOM+cRoDN5Z68w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4745140},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"8d269f0f66ed69913d1afa6b815893e5a60b8e12","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.8.0","@voltro/kv":"0.8.0","@effect/sql":"^0.51.1","@voltro/env":"0.8.0","@voltro/cache":"0.8.0","@voltro/logger":"0.8.0","@voltro/runtime":"0.8.0","@effect/workflow":"^0.18.2","@voltro/database":"0.8.0","@voltro/protocol":"0.8.0","@voltro/workflow":"0.8.0","@voltro/serverless":"0.8.0","@voltro/plugin-auth":"0.8.0","@voltro/plugin-mail":"0.8.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.8.0","@voltro/plugin-storage":"0.8.0","@voltro/plugin-webhooks":"0.8.0","@voltro/plugin-broadcast":"0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.8.0_1784557511842_0.16492750913935517","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@voltro/cli","version":"0.9.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.9.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"107cfd3dd33e6a80ef38e26e3b4c15179bbe05f6","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.9.0.tgz","fileCount":636,"integrity":"sha512-MOYrd/77t1nRT0pVaBME7UjhQHzQQxRsAml+PpRhOKigTlMjCXuWNf1HzQgvfsE3hMJPsILXFtco9hR+/i+01w==","signatures":[{"sig":"MEUCIFiF4zaN2DpeaTQT8eJj/eZsgKwuaqNgIjVeM1prG0ZFAiEAyQ6F6jXSNZnrE/YmVhrr3qEjEY+2dFz5O3bpoXNPwEM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4767833},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"c760a94253bd89adffa44c71024a506534ec4270","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.9.0","@voltro/kv":"0.9.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.9.0","@voltro/cache":"0.9.0","@voltro/logger":"0.9.0","@voltro/runtime":"0.9.0","@effect/workflow":"^0.18.2","@voltro/database":"0.9.0","@voltro/protocol":"0.9.0","@voltro/workflow":"0.9.0","@voltro/serverless":"0.9.0","@voltro/plugin-auth":"0.9.0","@voltro/plugin-mail":"0.9.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.9.0","@voltro/plugin-storage":"0.9.0","@voltro/plugin-webhooks":"0.9.0","@voltro/plugin-broadcast":"0.9.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.9.0_1784645142615_0.1387494025722189","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@voltro/cli","version":"0.10.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.10.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"a367b2f8d7552023380e872e7db81317f39cedf9","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.10.0.tgz","fileCount":636,"integrity":"sha512-3yk7s+e3/jArpGzeXF4EjEK8LicFPTf5K8iVAz/pHUSmnXvfxloToPMld5yobmxaZmAEXvD7WAckFYt0tw0NPQ==","signatures":[{"sig":"MEQCIDqe8BE/MGpOuzRNMRVSxfLu1HpdBlxWkUczZ2JdefkuAiBb1F+5o4JNhM33Qv9Sy8LbzU379rtc055wKe/hH3a8bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4845530},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"de3d79027cb0dc65fe22a3c31d826cc80db0f8a1","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.10.0","@voltro/kv":"0.10.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.10.0","@voltro/cache":"0.10.0","@voltro/logger":"0.10.0","@voltro/runtime":"0.10.0","@effect/workflow":"^0.18.2","@voltro/database":"0.10.0","@voltro/protocol":"0.10.0","@voltro/workflow":"0.10.0","@voltro/serverless":"0.10.0","@voltro/plugin-auth":"0.10.0","@voltro/plugin-mail":"0.10.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.10.0","@voltro/plugin-storage":"0.10.0","@voltro/plugin-webhooks":"0.10.0","@voltro/plugin-broadcast":"0.10.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.10.0_1784728619061_0.16733069321290084","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@voltro/cli","version":"0.11.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.11.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"916b1a36354d0cfdc5c986786e28488270808166","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.11.0.tgz","fileCount":636,"integrity":"sha512-CjH8rCQYUmnJe2cu8Px2FTy+e6v4cmmSRC9DbirOBywDBdH2efyjWo4RVswU49NCeSo8+dD1a1zLGc8vydZdng==","signatures":[{"sig":"MEUCIQD6j8TY/cfDoJXZ240eWcjnNHAgc1/etoAQkMiLeOs7cwIgOdUXPr2zqXVbRd7fTAWI9UQ/Ne/ZwmMrVUwDKqvdzuc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4862446},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"fa988251bdac229395d7a1403cda70f9cba3b7f3","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.11.0","@voltro/kv":"0.11.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.11.0","@voltro/cache":"0.11.0","@voltro/logger":"0.11.0","@voltro/runtime":"0.11.0","@effect/workflow":"^0.18.2","@voltro/database":"0.11.0","@voltro/protocol":"0.11.0","@voltro/workflow":"0.11.0","@voltro/serverless":"0.11.0","@voltro/plugin-auth":"0.11.0","@voltro/plugin-mail":"0.11.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.11.0","@voltro/plugin-storage":"0.11.0","@voltro/plugin-webhooks":"0.11.0","@voltro/plugin-broadcast":"0.11.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.11.0_1784753072944_0.42923950500356867","host":"s3://npm-registry-packages-npm-production"}},"0.11.1":{"name":"@voltro/cli","version":"0.11.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.11.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"53441ebc564d21f0f197d894060dd4104303d447","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.11.1.tgz","fileCount":637,"integrity":"sha512-gbLemPdkWzRosPh58felimEOEoMxejpPFQpcWonRh6UPWqzc4278+77Wx1ve3jAbrec+t53J4zIk/C+5a6REDg==","signatures":[{"sig":"MEUCIQDIPmEzdusDZi2zG2g6H2giB3ljQ92jcjz/Q9A1xq0dVwIgPUwaV5hg9uiVVMDUuFNr/LgyQiCVj8KWFHt1v0eaQVo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4938363},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"463e6f8eca7a5f414ee31199421f25e5457fe4d8","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.11.1","@voltro/kv":"0.11.1","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.11.1","@voltro/cache":"0.11.1","@voltro/logger":"0.11.1","@voltro/runtime":"0.11.1","@effect/workflow":"^0.18.2","@voltro/database":"0.11.1","@voltro/protocol":"0.11.1","@voltro/workflow":"0.11.1","@voltro/serverless":"0.11.1","@voltro/plugin-auth":"0.11.1","@voltro/plugin-mail":"0.11.1","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.11.1","@voltro/plugin-storage":"0.11.1","@voltro/plugin-webhooks":"0.11.1","@voltro/plugin-broadcast":"0.11.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.11.1_1784861016559_0.7078073193852279","host":"s3://npm-registry-packages-npm-production"}},"0.11.2":{"name":"@voltro/cli","version":"0.11.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.11.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"59481b0999936a354d2a4532dd3cd91ee1ddfc8f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.11.2.tgz","fileCount":637,"integrity":"sha512-D/LkBxmkrkEjG1eKZEYLG5xcB4hKMc3D/LLLsnT7j0RRLE3s6hSOcQcDAEDwLWvu1WSi4hgzmhHXYiO2NnHjQA==","signatures":[{"sig":"MEQCIDqHxlAdVCj2h/he43DoNk8WBXNVuGsrjWGn9aZ4qzFLAiB57DQ1GKwCEXgwG0beGrSbY7AslT6+mf/y+KHL9l8OWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4954961},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"a530fee420826594c905db82d759101ccc46a0e3","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.11.2","@voltro/kv":"0.11.2","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.11.2","@voltro/cache":"0.11.2","@voltro/logger":"0.11.2","@voltro/runtime":"0.11.2","@effect/workflow":"^0.18.2","@voltro/database":"0.11.2","@voltro/protocol":"0.11.2","@voltro/workflow":"0.11.2","@voltro/serverless":"0.11.2","@voltro/plugin-auth":"0.11.2","@voltro/plugin-mail":"0.11.2","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.11.2","@voltro/plugin-storage":"0.11.2","@voltro/plugin-webhooks":"0.11.2","@voltro/plugin-broadcast":"0.11.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.11.2_1784880492455_0.8172831992451519","host":"s3://npm-registry-packages-npm-production"}},"0.11.3":{"name":"@voltro/cli","version":"0.11.3","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.11.3","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"1f0c8646f98f3f2b40668d2dac1cdc3c419dfd83","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.11.3.tgz","fileCount":637,"integrity":"sha512-kuHpWYDo9BRq6tC2t8cPN+loHlBwy3vvkxexeCW/C5VZuwwgfPVYfJKsIdW2ecmctfX18ehD9WgFYyrRXZECqQ==","signatures":[{"sig":"MEQCIFZnteMTZTJsSFOSReh2phxxcCdIdSQhZ6IH/I2/X7eOAiAN5/RgCXKiizYTLh9Azm/m6JbPLIeFu+R1lJBycvUV1A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4970566},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"0ee7f02e958872923791ff418ee01ee5de9c2de1","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.11.3","@voltro/kv":"0.11.3","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.11.3","@voltro/cache":"0.11.3","@voltro/logger":"0.11.3","@voltro/runtime":"0.11.3","@effect/workflow":"^0.18.2","@voltro/database":"0.11.3","@voltro/protocol":"0.11.3","@voltro/workflow":"0.11.3","@voltro/serverless":"0.11.3","@voltro/plugin-auth":"0.11.3","@voltro/plugin-mail":"0.11.3","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.11.3","@voltro/plugin-storage":"0.11.3","@voltro/plugin-webhooks":"0.11.3","@voltro/plugin-broadcast":"0.11.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.11.3_1784900943520_0.2780365676274925","host":"s3://npm-registry-packages-npm-production"}},"0.11.4":{"name":"@voltro/cli","version":"0.11.4","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.11.4","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"569a8d5fe108ca2677c6ec7f4ca42e816803f6c9","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.11.4.tgz","fileCount":637,"integrity":"sha512-f3vPbjzwr04HqnWeD71AWp/0YNG14G2dzRZdG1CcQoirCTdTqi64SzDopoc7UccKeyfyyg4L+4tOwozlAnelhA==","signatures":[{"sig":"MEUCIQCYmiEcU16wy0EgcjvxWZKKZ4KD9Mx3KvcbjxdwGKcUdwIgEYrvipy7BI886aPkv69KoTyNkV8Ke59fE7LWtB2W0No=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5025738},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"04298b1ab3dd98632f43b87369b31d019243afc8","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.11.4","@voltro/kv":"0.11.4","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.11.4","@voltro/cache":"0.11.4","@voltro/logger":"0.11.4","@voltro/runtime":"0.11.4","@effect/workflow":"^0.18.2","@voltro/database":"0.11.4","@voltro/protocol":"0.11.4","@voltro/workflow":"0.11.4","@voltro/serverless":"0.11.4","@voltro/plugin-auth":"0.11.4","@voltro/plugin-mail":"0.11.4","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.11.4","@voltro/plugin-storage":"0.11.4","@voltro/plugin-webhooks":"0.11.4","@voltro/plugin-broadcast":"0.11.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.11.4_1784967150004_0.26723576428138673","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@voltro/cli","version":"0.12.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.12.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"f0addf927b6aee20c61440d67724b56c44ce2609","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.12.0.tgz","fileCount":647,"integrity":"sha512-OBffTQChtJN/eDLKR6ltabt6vsl7Z8dOn1MCnUF2omRs8Q60E1+Lt0vJi+nrL7LzokdnBTe0KbrB7AARy6Lf9w==","signatures":[{"sig":"MEYCIQCbYi9ZJeck8DQJsUcGicaSi9LWGM5tiQPKf06USXDvXgIhAIJVo/wW2lyOVwaOr7PPlhmliE/ANhumxtA6O8udETwN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5164396},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"b0bf4b666da8198198dc86db4e5219f27731678d","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.12.0","@voltro/kv":"0.12.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.12.0","@voltro/cache":"0.12.0","@voltro/logger":"0.12.0","@voltro/runtime":"0.12.0","@effect/workflow":"^0.18.2","@voltro/database":"0.12.0","@voltro/protocol":"0.12.0","@voltro/workflow":"0.12.0","@voltro/serverless":"0.12.0","@voltro/plugin-auth":"0.12.0","@voltro/plugin-mail":"0.12.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.12.0","@voltro/plugin-storage":"0.12.0","@voltro/plugin-webhooks":"0.12.0","@voltro/plugin-broadcast":"0.12.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.12.0_1784988271399_0.9444132692360765","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@voltro/cli","version":"0.13.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.13.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"7e12d5169959ae68615b8f284d9bc1d9c0249924","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.13.0.tgz","fileCount":656,"integrity":"sha512-viA0JrICFawnXwy53XJ7/P0DcK9K95pLgACWwGysCCs1B4AOjNZFYhyzxu71ml+EIjlvE7O2M4cyismSk0G5gQ==","signatures":[{"sig":"MEQCIGIt/8wwEHjU+qf22pqwiBCL1fSsFstY1xYrsbmK/+zbAiB3eopa1j+r7ZaAWxNPvMJf2m60YoCTbA56Wkj0Gpc+uA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5215920},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"5477dde3cb727da69a2830bfd46e41b3ff7051c9","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.13.0","@voltro/kv":"0.13.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.13.0","@voltro/cache":"0.13.0","@voltro/logger":"0.13.0","@voltro/runtime":"0.13.0","@effect/workflow":"^0.18.2","@voltro/database":"0.13.0","@voltro/protocol":"0.13.0","@voltro/workflow":"0.13.0","@voltro/serverless":"0.13.0","@voltro/plugin-auth":"0.13.0","@voltro/plugin-mail":"0.13.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.13.0","@voltro/plugin-storage":"0.13.0","@voltro/plugin-webhooks":"0.13.0","@voltro/plugin-broadcast":"0.13.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.13.0_1785008122743_0.5574902761005871","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@voltro/cli","version":"0.14.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.14.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"4ffcbc9ba9371ab7b18ddb86f58f17e1323417e1","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.14.0.tgz","fileCount":657,"integrity":"sha512-HKdpsQlpoUWWez308aFK9y4NAhH72ODUklhxmKl/VzvbsLCbip8GOBWUHoTPOAL4ceecIHu1pBTLN/+YsaRbcQ==","signatures":[{"sig":"MEUCIQCMOtXj72iEoWED4D92IS6ysQJjFUJU1A5fmdkqh0O8xwIgHjK4LPU1p/8AXDR1Mu8BcXFI0iSLnojH32K3ppOd/KM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5347391},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"f0719a5223e53b257ee0dae8a56d6900325f33e7","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.14.0","@voltro/kv":"0.14.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.14.0","@voltro/cache":"0.14.0","@voltro/logger":"0.14.0","@voltro/runtime":"0.14.0","@effect/workflow":"^0.18.2","@voltro/database":"0.14.0","@voltro/protocol":"0.14.0","@voltro/workflow":"0.14.0","@voltro/serverless":"0.14.0","@voltro/plugin-auth":"0.14.0","@voltro/plugin-mail":"0.14.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.14.0","@voltro/plugin-storage":"0.14.0","@voltro/plugin-webhooks":"0.14.0","@voltro/plugin-broadcast":"0.14.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.14.0_1785096205768_0.9551969071445279","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@voltro/cli","version":"0.15.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.15.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"1e078124403d12b3c693661c832da3e80655e1fd","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.15.0.tgz","fileCount":657,"integrity":"sha512-1QNNEqVbdq1Y5VE0Qgx8APar0DioTTNbmrNtRzY16MOqnVr4d2oFb9E9IW9dkiUd368uDe+pnSTR3LZW3t3rMw==","signatures":[{"sig":"MEUCIDf89xazTlv5leLPfGKIS41UaaRTudtD54pV8w57FYE8AiEApVUkvS8ZK30kGQwHae3/Afp/XhUtaUqLjHIfSMJbcsk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5413942},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"383d2eee0a8f6afd64f2abeb3bc0d36ac54b96f3","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.15.0","@voltro/kv":"0.15.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.15.0","@voltro/cache":"0.15.0","@voltro/logger":"0.15.0","@voltro/runtime":"0.15.0","@effect/workflow":"^0.18.2","@voltro/database":"0.15.0","@voltro/protocol":"0.15.0","@voltro/workflow":"0.15.0","@voltro/serverless":"0.15.0","@voltro/plugin-auth":"0.15.0","@voltro/plugin-mail":"0.15.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.15.0","@voltro/plugin-storage":"0.15.0","@voltro/plugin-webhooks":"0.15.0","@voltro/plugin-broadcast":"0.15.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.15.0_1785139727098_0.3618300120416311","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@voltro/cli","version":"0.16.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.16.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"311c09e5eff69d1c4a0544e0a2e48dfd36c405b2","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.16.0.tgz","fileCount":657,"integrity":"sha512-p9sHGIbKBBKmnE/yuzCQI9skLatnxylwmpzLEz39whZSeRhcYZgWHYcMN7Nhd/L2E1SkOEKyAYZA/tE2icmw2A==","signatures":[{"sig":"MEUCIQCZYSVwIL9mkm/dz4OSqBq7YgeLwPZ3fR7BrpR7DfRSJAIgHjnvsm/NX+W6rRBTzJmYxuKhLhO9r3K7aTggxKSnMWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5397365},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"71b2adacb76d5a0a0ef4f6b4e542d460fa1df45d","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.16.0","@voltro/kv":"0.16.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.16.0","@voltro/cache":"0.16.0","@voltro/logger":"0.16.0","@voltro/runtime":"0.16.0","@effect/workflow":"^0.18.2","@voltro/database":"0.16.0","@voltro/protocol":"0.16.0","@voltro/workflow":"0.16.0","@voltro/serverless":"0.16.0","@voltro/plugin-auth":"0.16.0","@voltro/plugin-mail":"0.16.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.16.0","@voltro/plugin-storage":"0.16.0","@voltro/plugin-webhooks":"0.16.0","@voltro/plugin-broadcast":"0.16.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.16.0_1785152252975_0.47554879278233186","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@voltro/cli","version":"0.17.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.17.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"3aca32be61586745421ec8c670cc266c2aef8a7a","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.17.0.tgz","fileCount":657,"integrity":"sha512-KjrW2M4q+i/F8V7R6JGQ9WXyjcSv5dvg7b+gjVRAh5gsSIZ/mlNtIv6WeCEeg+BUY9TiWuFx6tKEO7fWwI5H/w==","signatures":[{"sig":"MEUCIHczet3PcJ4O0gsrQLRzRRVwMsOAdxkzAwnNTw5/WilsAiEAp21IfKg3XlC/GbBwitwHPP/jx3W7qYkj1Plm+7x3ryI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5391609},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"46701acb86f42fa0bc5eb41617dce6a13778a7dc","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.17.0","@voltro/kv":"0.17.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.17.0","@voltro/cache":"0.17.0","@voltro/logger":"0.17.0","@voltro/runtime":"0.17.0","@effect/workflow":"^0.18.2","@voltro/database":"0.17.0","@voltro/protocol":"0.17.0","@voltro/workflow":"0.17.0","@voltro/serverless":"0.17.0","@voltro/plugin-auth":"0.17.0","@voltro/plugin-mail":"0.17.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.17.0","@voltro/plugin-storage":"0.17.0","@voltro/plugin-webhooks":"0.17.0","@voltro/plugin-broadcast":"0.17.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.17.0_1785167813698_0.20126147004876338","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@voltro/cli","version":"0.18.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.18.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"811f4eae390efab9514f0559fd622f9bf8dca553","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.18.0.tgz","fileCount":657,"integrity":"sha512-RKaWkPfh0yNBB1b3f4Ssf4NGn6o5oZ54hjPv+e0zsX3gp4RmBkWpyfSRdrOLuaP/oN8ZpJmCHcoYEtScwcIL6g==","signatures":[{"sig":"MEQCIDEElubHwnTy1Xa47lt7s0aR2RQmbLbEhNVAAQPuAuceAiBLESFv0KDXxMnsgG9FY9ddIj2ipTI0wxL8W3EdmfF2Rg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5477845},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"33a34284c71c851a61826eb72aa66cda5b0c26f4","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.18.0","@voltro/kv":"0.18.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.18.0","@voltro/cache":"0.18.0","@voltro/logger":"0.18.0","@voltro/runtime":"0.18.0","@effect/workflow":"^0.18.2","@voltro/database":"0.18.0","@voltro/protocol":"0.18.0","@voltro/workflow":"0.18.0","@voltro/serverless":"0.18.0","@voltro/plugin-auth":"0.18.0","@voltro/plugin-mail":"0.18.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.18.0","@voltro/plugin-storage":"0.18.0","@voltro/plugin-webhooks":"0.18.0","@voltro/plugin-broadcast":"0.18.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.18.0_1785257882987_0.12545960983000515","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@voltro/cli","version":"0.19.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.19.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"5e6ebcbcabc3270ce829a47dd96d7b214dca0fe6","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.19.0.tgz","fileCount":657,"integrity":"sha512-m5/UGVNgpEx0WWwPGLpSkKIFvdl6XsF2WL6bousbaJIDYZxmrf0Egdn6jfa09n7avwAcUcf1NrCYzYXzzX2wQA==","signatures":[{"sig":"MEYCIQDz4wbDrCF3lm3clUolPa9gd7g8mbih/E5XWqKaxeMoTwIhAI5DXE5J7/mlLubFHB9DzZ/ac9A59e1w3gXaESorb0LR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5519270},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"ecab78a68ff55f6b3ab97e1973f045b390f4d3af","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.19.0","@voltro/kv":"0.19.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.19.0","@voltro/cache":"0.19.0","@voltro/logger":"0.19.0","@voltro/runtime":"0.19.0","@effect/workflow":"^0.18.2","@voltro/database":"0.19.0","@voltro/protocol":"0.19.0","@voltro/workflow":"0.19.0","@voltro/serverless":"0.19.0","@voltro/plugin-auth":"0.19.0","@voltro/plugin-mail":"0.19.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.19.0","@voltro/plugin-storage":"0.19.0","@voltro/plugin-webhooks":"0.19.0","@voltro/plugin-broadcast":"0.19.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.19.0_1785314701955_0.8300884248722908","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@voltro/cli","version":"0.20.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.20.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"2312f95498a9a863cd2d99f8e94e7ce1b7dd674f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.20.0.tgz","fileCount":657,"integrity":"sha512-LW9vnu1ChwUiCbAicBLK8J8b5R2Sv/cMwhFThrM9m1X200JJ7F1NBZCeWH+wPEukSDqDA752qY1JHuC1pX1+dA==","signatures":[{"sig":"MEQCIGXD9WuJlbkcP1PvkiZNC0aBH40xNufhjDe34gruD/zQAiALK+/HlvT7d9QCH6ybMygjRLobX/TYtY7Vx9LKiHnwpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5530082},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"05f46dd6f6e1ec102c8fb313125573f0cbc8ff23","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.20.0","@voltro/kv":"0.20.0","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.20.0","@voltro/cache":"0.20.0","@voltro/logger":"0.20.0","@voltro/runtime":"0.20.0","@effect/workflow":"^0.18.2","@voltro/database":"0.20.0","@voltro/protocol":"0.20.0","@voltro/workflow":"0.20.0","@voltro/serverless":"0.20.0","@voltro/plugin-auth":"0.20.0","@voltro/plugin-mail":"0.20.0","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.20.0","@voltro/plugin-storage":"0.20.0","@voltro/plugin-webhooks":"0.20.0","@voltro/plugin-broadcast":"0.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.20.0_1785350826360_0.5799218324471029","host":"s3://npm-registry-packages-npm-production"}},"0.20.1":{"name":"@voltro/cli","version":"0.20.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.20.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"d600cdc44dbb356f42d385e64d713d5f47f6c812","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.20.1.tgz","fileCount":657,"integrity":"sha512-jOh9KpTmjw3bQKkN1aZs5vJ5yeN6NwkI9BrpI8Ap63Pe3XEsSRVRc1f7BUynnA8yxkHTERPemnx0KPd6VYwoJw==","signatures":[{"sig":"MEUCIAwSiFTMyRLrbwPHLuas1o9qV+MJv5jsGGoZRf85xd6mAiEA38o7xCBm/vrHq3fjbiQQWsp7m4TW709VVRFY5OJN5bA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5565236},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"7825e91c1f6a8d095fccc31b37ae7c7a51e9a1e0","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.20.1","@voltro/kv":"0.20.1","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.20.1","@voltro/cache":"0.20.1","@voltro/logger":"0.20.1","@voltro/runtime":"0.20.1","@effect/workflow":"^0.18.2","@voltro/database":"0.20.1","@voltro/protocol":"0.20.1","@voltro/workflow":"0.20.1","@voltro/serverless":"0.20.1","@voltro/plugin-auth":"0.20.1","@voltro/plugin-mail":"0.20.1","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.20.1","@voltro/plugin-storage":"0.20.1","@voltro/plugin-webhooks":"0.20.1","@voltro/plugin-broadcast":"0.20.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.20.1_1785397294378_0.5320186920580325","host":"s3://npm-registry-packages-npm-production"}},"0.20.2":{"name":"@voltro/cli","version":"0.20.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.20.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"44e497afa60a619867372653af2bb41c1685bc10","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.20.2.tgz","fileCount":657,"integrity":"sha512-LkCKw1Cvn8aKr5MMXwu+kD21sgftHergCEh9gtuIG+QiJjkd0yHFIhjDYLnRzc4TiZJqS4siIl+Ul0lei89UqA==","signatures":[{"sig":"MEYCIQDCAC762yagm2ZN0BQ8uYTI+Z/fsHW5H5eXn+v8yCFKWQIhANbnLEQ/cPpIP8ppgaDrII8F77/4Xokv76xgahx0x14z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5551730},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"c7a3d962ea5a6bfa65ea94f8efc63bb4609bb211","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.20.2","@voltro/kv":"0.20.2","tinyglobby":"^0.2.17","@effect/sql":"^0.51.1","@voltro/env":"0.20.2","@voltro/cache":"0.20.2","@voltro/logger":"0.20.2","@voltro/runtime":"0.20.2","@effect/workflow":"^0.18.2","@voltro/database":"0.20.2","@voltro/protocol":"0.20.2","@voltro/workflow":"0.20.2","@voltro/serverless":"0.20.2","@voltro/plugin-auth":"0.20.2","@voltro/plugin-mail":"0.20.2","@effect/platform-node":"^0.107.0","@voltro/data-transfer":"0.20.2","@voltro/plugin-storage":"0.20.2","@voltro/plugin-webhooks":"0.20.2","@voltro/plugin-broadcast":"0.20.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.21.4","@effect/rpc":"^0.75.1","@effect/platform":"^0.96.2"},"optionalDependencies":{"tsx":"^4.23.0","vite":"^8.1.4","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.2","@vitejs/plugin-react":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.20.2_1785418025834_0.036424780473047313","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@voltro/cli","version":"0.21.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.21.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"2c9c60d7d8fe7cd76fa4aa4f5563bae55d66cf62","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.21.0.tgz","fileCount":657,"integrity":"sha512-1/XuHkMi3tu19XG4jRHVuhFi+X40AN7r6YC+dh0A8Nt8Fp7EX0f0X5F9+jZ076g+AHNwbYkqDqbM/igtT6BCPw==","signatures":[{"sig":"MEUCIQD4WyoO4wpqlymksZ1k0o2CiFYkx3Z/0/bd2r2S9a+WZQIgfwlEACAsbq/FOLH4mheBEygh3qUWyWq/BN+YuTnw1nY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5619360},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"f5409b0b8d65d69e56f55546a0b6be1068893ded","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.21.0","@voltro/kv":"0.21.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.21.0","@voltro/cache":"0.21.0","@voltro/logger":"0.21.0","@voltro/runtime":"0.21.0","@effect/workflow":"^0.19.0","@voltro/database":"0.21.0","@voltro/protocol":"0.21.0","@voltro/workflow":"0.21.0","@voltro/serverless":"0.21.0","@voltro/plugin-auth":"0.21.0","@voltro/plugin-mail":"0.21.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.21.0","@voltro/plugin-storage":"0.21.0","@voltro/plugin-webhooks":"0.21.0","@voltro/plugin-broadcast":"0.21.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.21.0_1785517156131_0.12903080982732829","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@voltro/cli","version":"0.22.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.22.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"0d692e31e76e407fb6c463e393c27df3823fb97f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.22.0.tgz","fileCount":657,"integrity":"sha512-2VDHb7C3o7c5n5le7Sg51SQNfRAqBCAptDGl5qZgFRxtr3IdvH1BHuQjN0MjjtMC72vMBhJ6/8sexIKRDT+5mw==","signatures":[{"sig":"MEQCIE/vWus5N11qqkqcUHhU1RlUCkgjW9UFFB1wZfecMxKWAiAJTrcYQsm3ME11w+OKBzxR3ffSWzDfU9Zgo1vsyojPgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5706447},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"254038da602f9bcc625fd612efa7489a57159c72","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.22.0","@voltro/kv":"0.22.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.22.0","@voltro/cache":"0.22.0","@voltro/logger":"0.22.0","@voltro/runtime":"0.22.0","@effect/workflow":"^0.19.0","@voltro/database":"0.22.0","@voltro/protocol":"0.22.0","@voltro/workflow":"0.22.0","@voltro/serverless":"0.22.0","@voltro/plugin-auth":"0.22.0","@voltro/plugin-mail":"0.22.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.22.0","@voltro/plugin-storage":"0.22.0","@voltro/plugin-webhooks":"0.22.0","@voltro/plugin-broadcast":"0.22.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.22.0_1785604477704_0.27005997526487246","host":"s3://npm-registry-packages-npm-production"}},"0.22.1":{"name":"@voltro/cli","version":"0.22.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.22.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"1955613f1778639672878ddffa761d519fe84c50","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.22.1.tgz","fileCount":657,"integrity":"sha512-As3Z1Ocn9zUqYdLpKtut7aixWUAmAEHVwVNttTZ1V7lCKIZLQIaZ4C8em1Dq2TqMFeWDfNBAzXmyFkP1P3IsQw==","signatures":[{"sig":"MEUCICkvbSLusrQlBNY0KQ3wazKkAy3y6b1+ack4f/q0sAKBAiEAkAyfmxgF4/tN8iiogPWQigPY24w0bmxU/jd+0VN+uI8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5683210},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"29e72409cb842df81906be4549a7782dc8c674ce","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.22.1","@voltro/kv":"0.22.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.22.1","@voltro/cache":"0.22.1","@voltro/logger":"0.22.1","@voltro/runtime":"0.22.1","@effect/workflow":"^0.19.0","@voltro/database":"0.22.1","@voltro/protocol":"0.22.1","@voltro/workflow":"0.22.1","@voltro/serverless":"0.22.1","@voltro/plugin-auth":"0.22.1","@voltro/plugin-mail":"0.22.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.22.1","@voltro/plugin-storage":"0.22.1","@voltro/plugin-webhooks":"0.22.1","@voltro/plugin-broadcast":"0.22.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.22.1_1785612354272_0.2359200414234015","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@voltro/cli","version":"0.23.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.23.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"eeed4753b88380b224266afbe90af05cf19e4d23","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.23.0.tgz","fileCount":657,"integrity":"sha512-JFwyTXzX3IeJoNa+y/his2kDHtKImR5EHCzfh3/fpcuJOLB1ZtqZxk1qnFDAtqTR1TpHa09q3G4SsvGcPn5tMA==","signatures":[{"sig":"MEUCIHxg0oYyy0qaSofw1X/ZwKMvK5JEQrpqvo6GFHJanXTuAiEAw2c8668NkMOBSKUQFJIF1ZKgZowLRlPqagoETVQEy+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5801080},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"31b632876ba1b6d78944a466841d4674ecc07f39","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.23.0","@voltro/kv":"0.23.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.23.0","@voltro/cache":"0.23.0","@voltro/logger":"0.23.0","@voltro/runtime":"0.23.0","@effect/workflow":"^0.19.0","@voltro/database":"0.23.0","@voltro/protocol":"0.23.0","@voltro/workflow":"0.23.0","@voltro/serverless":"0.23.0","@voltro/plugin-auth":"0.23.0","@voltro/plugin-mail":"0.23.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.23.0","@voltro/plugin-storage":"0.23.0","@voltro/plugin-webhooks":"0.23.0","@voltro/plugin-broadcast":"0.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.23.0_1785684178014_0.31974661658412606","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@voltro/cli","version":"0.24.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.24.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"3758f75887f36766f49169954d7a5d3bd1a4c772","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.24.0.tgz","fileCount":663,"integrity":"sha512-VCGqI+jRwOPssiHmod3FAvC2XZx7LTCveV+eJe97dj8/hXaI70vo1X5aiKdF8S0ztCpNB7mnyW8pDeGCVwFuvg==","signatures":[{"sig":"MEUCIESvq7GinTzsDDg2695bp0AUxaczb4jCAWEbRX8M5zX2AiEA1iD/2GlOpxwFcxwMrEw/F3jr0JFZa4iBVcumcX4yDG0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5847423},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"d2aaea2e4f2d24a43ed567b06bd7bb0a01f004ea","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.24.0","@voltro/kv":"0.24.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.24.0","@voltro/cache":"0.24.0","@voltro/logger":"0.24.0","@voltro/runtime":"0.24.0","@effect/workflow":"^0.19.0","@voltro/database":"0.24.0","@voltro/protocol":"0.24.0","@voltro/workflow":"0.24.0","@voltro/serverless":"0.24.0","@voltro/plugin-auth":"0.24.0","@voltro/plugin-mail":"0.24.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.24.0","@voltro/plugin-storage":"0.24.0","@voltro/plugin-webhooks":"0.24.0","@voltro/plugin-broadcast":"0.24.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.24.0_1785704154602_0.8851413584055312","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@voltro/cli","version":"0.25.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.25.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"dd47111f23a6c870f7f76bd881fe8ee4c099c75e","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.25.0.tgz","fileCount":664,"integrity":"sha512-Uvt9xPSFggEZ/EycOhOm6mcQhCDgKmSqGoqeJRdqB1VYyOl5Flz7pqT5ESmkQ9L012pN9K5qon8YC+Xoz3Ridg==","signatures":[{"sig":"MEUCIDkniXw1UdgiXrxaKDSRe27uKH70BDF78ddAMYRwIzn2AiEAkYSABNU0KAKyDrFW4l9aNoqdwNINgiHC0aYNeiG6TNc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5988410},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"e9b1a53db965c1b60b2a1f7cf8e1cf59edddbd55","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.25.0","@voltro/kv":"0.25.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.25.0","@voltro/cache":"0.25.0","@voltro/logger":"0.25.0","@voltro/runtime":"0.25.0","@effect/workflow":"^0.19.0","@voltro/database":"0.25.0","@voltro/protocol":"0.25.0","@voltro/workflow":"0.25.0","@voltro/serverless":"0.25.0","@voltro/plugin-auth":"0.25.0","@voltro/plugin-mail":"0.25.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.25.0","@voltro/plugin-storage":"0.25.0","@voltro/plugin-webhooks":"0.25.0","@voltro/plugin-broadcast":"0.25.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.25.0_1785806283236_0.7013619487537808","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"@voltro/cli","version":"0.26.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.26.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"afe074785ef9014f2c147ee1e87db4cf79791f52","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.26.0.tgz","fileCount":664,"integrity":"sha512-KFDq5hg0SJ+pc1cycKvinYrn3EmPM4Ttbkf8yuVZKzVxTFCasT5WBO1/aPasGzMKX67ybduXcHmwt4d4LF/DCQ==","signatures":[{"sig":"MEQCICSrhsmShYtBTpTs8BHSxGsG7pw4047K+jwg+H8EOP9oAiBurWzNqwu2VkC+dfrph1WgUzAAetM5ohZ9pMvgYnL3HQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6068660},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"271be504e8dc037a90977f6c065b2b961bd57fef","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.26.0","@voltro/kv":"0.26.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.26.0","@voltro/cache":"0.26.0","@voltro/logger":"0.26.0","@voltro/runtime":"0.26.0","@effect/workflow":"^0.19.0","@voltro/database":"0.26.0","@voltro/protocol":"0.26.0","@voltro/workflow":"0.26.0","@voltro/serverless":"0.26.0","@voltro/plugin-auth":"0.26.0","@voltro/plugin-mail":"0.26.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.26.0","@voltro/plugin-storage":"0.26.0","@voltro/plugin-webhooks":"0.26.0","@voltro/plugin-broadcast":"0.26.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.26.0_1785908182975_0.2880675286140386","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"@voltro/cli","version":"0.27.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.27.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"6a61f6d90fa2ec84dd691eb9545324ce0a794353","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.27.0.tgz","fileCount":664,"integrity":"sha512-mixGMO2h1oVoKfMj1mEfpFfQOoNAJ5fm/kZek/ruUnlk606B64QWFSNqgsT6dxeuzEkbLTsBiFdVdB8/LWcfWw==","signatures":[{"sig":"MEQCIDypD4hbW8zo3X4UX0VfNW6UZJ+rek8XJiKME2kJ7jRlAiBypwwl1MFHce6IAYnIwalHWsTkx59jESuscglYlSCLsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6101255},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"06a60e6a9c22a857f5e3191c02de94f7bd3154ec","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.27.0","@voltro/kv":"0.27.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.27.0","@voltro/cache":"0.27.0","@voltro/logger":"0.27.0","@voltro/runtime":"0.27.0","@effect/workflow":"^0.19.0","@voltro/database":"0.27.0","@voltro/protocol":"0.27.0","@voltro/workflow":"0.27.0","@voltro/serverless":"0.27.0","@voltro/plugin-auth":"0.27.0","@voltro/plugin-mail":"0.27.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.27.0","@voltro/plugin-storage":"0.27.0","@voltro/plugin-webhooks":"0.27.0","@voltro/plugin-broadcast":"0.27.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.27.0_1785967537551_0.5885891778144687","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"@voltro/cli","version":"0.28.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.28.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"4ce23e0a861cb075aface6998192172d8209c86f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.28.0.tgz","fileCount":664,"integrity":"sha512-00E5YPyKmdXUHuA2JpE3Dsxm9cmfCHKurdNnu+1fWsi9M2IqZT7mxd10o4w0MvAitCT1QJV6KDcN77FQy0qtMQ==","signatures":[{"sig":"MEUCIHnqmOMecP+UTx5bYSiKDXR9FYH6Eja+3vDDNAZf8gfMAiEAqMKr8HLqVzvdznGAQEA85EJgGQVsiyJogQvU936UE/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6158664},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"4f274a019aab36b4cb8475165a982f864e1c7baf","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.28.0","@voltro/kv":"0.28.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.28.0","@voltro/cache":"0.28.0","@voltro/logger":"0.28.0","@voltro/runtime":"0.28.0","@effect/workflow":"^0.19.0","@voltro/database":"0.28.0","@voltro/protocol":"0.28.0","@voltro/workflow":"0.28.0","@voltro/serverless":"0.28.0","@voltro/plugin-auth":"0.28.0","@voltro/plugin-mail":"0.28.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.28.0","@voltro/plugin-storage":"0.28.0","@voltro/plugin-webhooks":"0.28.0","@voltro/plugin-broadcast":"0.28.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.28.0_1786066114742_0.6995129732816929","host":"s3://npm-registry-packages-npm-production"}},"0.29.0":{"name":"@voltro/cli","version":"0.29.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.29.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"c275a1c3f30c30e9d2cc9449a55ede489c07c1b5","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.29.0.tgz","fileCount":860,"integrity":"sha512-2IHRexJoGzs2FEa3UdHlxDtyx5/WCvMn0j2PTEuAquNfDrdUwJER5YeipbAkKdGp2e5Mv435BQ110tAxRUyWYw==","signatures":[{"sig":"MEQCIFVor2hYJYQYEWHpRYZXplnG7W5eLEgn1ibEXUyNiVg3AiBrgLk0Nug8itPBXZ1jceqUY809zYV2PQxCp3xiDKyFfw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6727709},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"c09d3004e2943e7866e9130823f9b0706469af24","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.29.0","@voltro/kv":"0.29.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.29.0","@voltro/cache":"0.29.0","@voltro/logger":"0.29.0","@voltro/runtime":"0.29.0","@effect/workflow":"^0.19.0","@voltro/database":"0.29.0","@voltro/protocol":"0.29.0","@voltro/workflow":"0.29.0","@voltro/serverless":"0.29.0","@voltro/plugin-auth":"0.29.0","@voltro/plugin-mail":"0.29.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.29.0","@voltro/plugin-storage":"0.29.0","@voltro/plugin-webhooks":"0.29.0","@voltro/plugin-broadcast":"0.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.29.0_1786116344908_0.2992406241091996","host":"s3://npm-registry-packages-npm-production"}},"0.30.0":{"name":"@voltro/cli","version":"0.30.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.30.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"4aea3715e644d5de6b9bc95986292a1abbdd3aa6","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.30.0.tgz","fileCount":905,"integrity":"sha512-Olw2lLxBxt78dmD8ZVNziY2pa5e7sx4PPnjOeT1b1KNVo+u6+1tA3sWXOgs7eVyzx7XNic8hRPOPeHHhUL3ChA==","signatures":[{"sig":"MEQCIBHIm8DjoDPgXoLysYyA/m4pt3eg2WQanhAZoTSox62tAiAbw2wCRcBJH2Qy8DG54QbxeJiht2YZmxtjQP4AtCT4DQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6994354},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"bec2a34c1cc6872272c1b4e6cd8fcba9bce91f54","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.30.0","@voltro/kv":"0.30.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.30.0","@voltro/cache":"0.30.0","@voltro/logger":"0.30.0","@voltro/runtime":"0.30.0","@effect/workflow":"^0.19.0","@voltro/database":"0.30.0","@voltro/protocol":"0.30.0","@voltro/workflow":"0.30.0","@voltro/serverless":"0.30.0","@voltro/plugin-auth":"0.30.0","@voltro/plugin-mail":"0.30.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.30.0","@voltro/plugin-storage":"0.30.0","@voltro/plugin-webhooks":"0.30.0","@voltro/plugin-broadcast":"0.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.30.0_1786216284523_0.30080621355538817","host":"s3://npm-registry-packages-npm-production"}},"0.30.1":{"name":"@voltro/cli","version":"0.30.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.30.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"f200b01709bbe7f8b75f193e955db033bec71974","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.30.1.tgz","fileCount":905,"integrity":"sha512-n/bNV9y+x75CjkNJJ2BIPx67AIGiJyq85wvgSSr80/1ewBe75BBQG4YtY4iyDWUksjB/L/z2nMcsiEi/E+DlGg==","signatures":[{"sig":"MEQCIQDLDhF90Jsog3nEBrDB0bQxZCgwP5pbEANDhGXZZOAmKAIfCLK+pTsaYquqxXxFPQ6gmMv1UuM9nV4/L9AJBxbHHg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6985778},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"06d026af794ead9dc7d443b6a7f034ddbdab66af","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.30.1","@voltro/kv":"0.30.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.30.1","@voltro/cache":"0.30.1","@voltro/logger":"0.30.1","@voltro/runtime":"0.30.1","@effect/workflow":"^0.19.0","@voltro/database":"0.30.1","@voltro/protocol":"0.30.1","@voltro/workflow":"0.30.1","@voltro/serverless":"0.30.1","@voltro/plugin-auth":"0.30.1","@voltro/plugin-mail":"0.30.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.30.1","@voltro/plugin-storage":"0.30.1","@voltro/plugin-webhooks":"0.30.1","@voltro/plugin-broadcast":"0.30.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.30.1_1786265460862_0.39454784151903444","host":"s3://npm-registry-packages-npm-production"}},"0.30.2":{"name":"@voltro/cli","version":"0.30.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.30.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"cfd1d0873b3e16e9461dbf0d47f451d22c448234","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.30.2.tgz","fileCount":905,"integrity":"sha512-71seFyxBbVRCLNVO7UsqLhCwECskeXaVcTHMhXKHHv53x3aQUELmcRrRtJhkoETH81vC817CSs+Ip9Jh1n8B/A==","signatures":[{"sig":"MEUCICa4pqDouLC6htinQn1kLh/LYITcV6jfoOIDfDDccDaPAiEAkd+l7mkbcmJRlRd2+BcFCRHG1O6yelNqE3561vtrsG4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6995936},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"c084935b3100c304b79d5f7982640a8f60e14682","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.30.2","@voltro/kv":"0.30.2","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.30.2","@voltro/cache":"0.30.2","@voltro/logger":"0.30.2","@voltro/runtime":"0.30.2","@effect/workflow":"^0.19.0","@voltro/database":"0.30.2","@voltro/protocol":"0.30.2","@voltro/workflow":"0.30.2","@voltro/serverless":"0.30.2","@voltro/plugin-auth":"0.30.2","@voltro/plugin-mail":"0.30.2","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.30.2","@voltro/plugin-storage":"0.30.2","@voltro/plugin-webhooks":"0.30.2","@voltro/plugin-broadcast":"0.30.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.30.2_1786297245060_0.8629774577166818","host":"s3://npm-registry-packages-npm-production"}},"0.31.0":{"name":"@voltro/cli","version":"0.31.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.31.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"cb23bcf84c0a1e204f2e59b6f2418894dbfb598a","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.31.0.tgz","fileCount":949,"integrity":"sha512-2akbLW3Y8AtTq+I808gYE6Z/8f3EqjXBWu+WqZf+8jsBxG04jif/PIkjjQLnNmtWkBiKjfTDaYk+5i1Q08Cc3Q==","signatures":[{"sig":"MEYCIQDPIkViZaSF01lWCQ+Xaua+j05PWdyDObKLAp5dKMnxFgIhAJ2dncoJ6usyvx7u4Q4XHobixJYV69IrfBXEeDV2bafC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7422725},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"21bab1fe70acebad5f9e3d5a1f5cdd460c8ecf7d","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.31.0","@voltro/kv":"0.31.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.31.0","@voltro/cache":"0.31.0","@voltro/logger":"0.31.0","@voltro/runtime":"0.31.0","@effect/workflow":"^0.19.0","@voltro/database":"0.31.0","@voltro/protocol":"0.31.0","@voltro/workflow":"0.31.0","@voltro/serverless":"0.31.0","@voltro/plugin-auth":"0.31.0","@voltro/plugin-mail":"0.31.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.31.0","@voltro/plugin-storage":"0.31.0","@voltro/plugin-webhooks":"0.31.0","@voltro/plugin-broadcast":"0.31.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.31.0_1786345094155_0.5239107917839383","host":"s3://npm-registry-packages-npm-production"}},"0.32.0":{"name":"@voltro/cli","version":"0.32.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.32.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"b2e9eded3d729b7b97dcf16e2b6b81ee888a56e1","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.32.0.tgz","fileCount":949,"integrity":"sha512-7K6m4KCBY4E+0IEWUwqF2EMLTLanqbYiS6yHyrDq8DcTTF83x2Lh+uUPoCTA9FZzx6dnxwzspMcEL24tffHqEA==","signatures":[{"sig":"MEUCIHeTDIaHgv0SIH4EqbvETrEsMGPwTP4FdJRcbjkhOINyAiEAydwO8WyB0RAa44LfDPHw4vGH3RjHyWHPUgkBayB1tfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7464847},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"}},"gitHead":"8ef910f1e13ce14eeff63fb4cd9db55742fb27d6","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.32.0","@voltro/kv":"0.32.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.32.0","@voltro/cache":"0.32.0","@voltro/logger":"0.32.0","@voltro/runtime":"0.32.0","@effect/workflow":"^0.19.0","@voltro/database":"0.32.0","@voltro/protocol":"0.32.0","@voltro/workflow":"0.32.0","@voltro/serverless":"0.32.0","@voltro/plugin-auth":"0.32.0","@voltro/plugin-mail":"0.32.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.32.0","@voltro/plugin-storage":"0.32.0","@voltro/plugin-webhooks":"0.32.0","@voltro/plugin-broadcast":"0.32.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.32.0_1786361793568_0.025791533910742848","host":"s3://npm-registry-packages-npm-production"}},"0.33.0":{"name":"@voltro/cli","version":"0.33.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.33.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"48bd1b7d5e8ca9887d6323257c845c79bcd817bc","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.33.0.tgz","fileCount":949,"integrity":"sha512-ZTGjDGKssJQz0Sk446eZJTYRrdgIOEarJau2fYJg40YPg5P7mcInv12UsxWflrwDlKbnQQn/pIKfyxLGWVfadQ==","signatures":[{"sig":"MEYCIQC3+M7aVcKw10BzNWeVM4CRbL4mNyGTQleJlbVRe2TGrwIhAMZEXHJzhEV/dqO4M+S/Cd2M4moM3f7c0U1lIJcDtz9m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7523934},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"8bc556b92c7815014036357462d1bc8045c733dd","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.33.0","@voltro/kv":"0.33.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.33.0","@voltro/cache":"0.33.0","@voltro/logger":"0.33.0","@voltro/runtime":"0.33.0","@effect/workflow":"^0.19.0","@voltro/database":"0.33.0","@voltro/protocol":"0.33.0","@voltro/workflow":"0.33.0","@voltro/serverless":"0.33.0","@voltro/plugin-auth":"0.33.0","@voltro/plugin-mail":"0.33.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.33.0","@voltro/plugin-storage":"0.33.0","@voltro/plugin-webhooks":"0.33.0","@voltro/plugin-broadcast":"0.33.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.33.0_1786420774840_0.7677608961555014","host":"s3://npm-registry-packages-npm-production"}},"0.34.0":{"name":"@voltro/cli","version":"0.34.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.34.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"bbab9dd4879ebea9fe36b1d997ab6cd0a4889048","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.34.0.tgz","fileCount":1037,"integrity":"sha512-CisjJKapoyub6zI3wfTDbAdqeS8duBAeKS0pDLsCc227PIP66XlEzWu3GdjLCmoBo7IOS6iwn3jVudWG8qjoSg==","signatures":[{"sig":"MEUCIFpjXnXDZ9siJ2z7SaONor4P9LkIaMrB0oTTWM7+jBXzAiEAzdG4Zapr0BYvTIv3HS4pGtCqdolsR8MRe8jcBdd+Z1g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9018283},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"fb14bdfa50ef539adc053bfb1c9d6f921614ed21","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.34.0","@voltro/kv":"0.34.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.34.0","@voltro/cache":"0.34.0","@voltro/logger":"0.34.0","@voltro/runtime":"0.34.0","@effect/workflow":"^0.19.0","@voltro/database":"0.34.0","@voltro/protocol":"0.34.0","@voltro/workflow":"0.34.0","@voltro/serverless":"0.34.0","@voltro/plugin-auth":"0.34.0","@voltro/plugin-mail":"0.34.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.34.0","@voltro/plugin-storage":"0.34.0","@voltro/plugin-webhooks":"0.34.0","@voltro/plugin-broadcast":"0.34.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.34.0_1786547148371_0.23910607139865414","host":"s3://npm-registry-packages-npm-production"}},"0.35.0":{"name":"@voltro/cli","version":"0.35.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.35.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"694684f338a27735f79769e3c76d699f5ed17257","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.35.0.tgz","fileCount":1038,"integrity":"sha512-sYJiqgQVxuFljMuZ0Wjm6W7A700O7nepJdSwhBnZUvzAkGY+sx1IBlUjbhFS4ogZDtCzfkTkCevG+x0g5gaUKg==","signatures":[{"sig":"MEUCIGONmR4BT/wwZfu7lNeEHJxx5ORuKsnL0hbIbS5LXAlkAiEA7ZRY5j8QIpP/3K3AQWp194t26MJg7J+pRlxnsXV+6qI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8819234},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"6d7c19864066204cb6ded6f5ec9e4758ff7157b6","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.35.0","@voltro/kv":"0.35.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.35.0","@voltro/cache":"0.35.0","@voltro/logger":"0.35.0","@voltro/runtime":"0.35.0","@effect/workflow":"^0.19.0","@voltro/database":"0.35.0","@voltro/protocol":"0.35.0","@voltro/workflow":"0.35.0","@voltro/serverless":"0.35.0","@voltro/plugin-auth":"0.35.0","@voltro/plugin-mail":"0.35.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.35.0","@voltro/plugin-storage":"0.35.0","@voltro/plugin-webhooks":"0.35.0","@voltro/plugin-broadcast":"0.35.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.35.0_1786610557199_0.16277880750285245","host":"s3://npm-registry-packages-npm-production"}},"0.36.0":{"name":"@voltro/cli","version":"0.36.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.36.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"a957878195b5db96f7c794aca3ff34d1cb23454e","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.36.0.tgz","fileCount":1038,"integrity":"sha512-2ibziXZRFubQXEL880/ijx/YrU/eRSloSnb8x3Ur9wm3TzESpDC+X+nasZm9w/1EOxCha+CF48MfxMLzLzwIfw==","signatures":[{"sig":"MEYCIQDsDZvtccCjul5Ihw/4PougurKFepbRfbitx4mbxr7wfQIhAJ8J68kR4OtVH6D9qiVie0Re9nANB1/DwSQLY9zgHC3t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8795738},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"aa7f2c75ce211122646ac2733cf7febfd66ba1e1","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.36.0","@voltro/kv":"0.36.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.36.0","@voltro/cache":"0.36.0","@voltro/logger":"0.36.0","@voltro/runtime":"0.36.0","@effect/workflow":"^0.19.0","@voltro/database":"0.36.0","@voltro/protocol":"0.36.0","@voltro/workflow":"0.36.0","@voltro/serverless":"0.36.0","@voltro/plugin-auth":"0.36.0","@voltro/plugin-mail":"0.36.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.36.0","@voltro/plugin-storage":"0.36.0","@voltro/plugin-webhooks":"0.36.0","@voltro/plugin-broadcast":"0.36.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.36.0_1786623292578_0.6185383781896046","host":"s3://npm-registry-packages-npm-production"}},"0.37.0":{"name":"@voltro/cli","version":"0.37.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.37.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"30ffae5442587cace59fc77518cf5ba0f1848ff2","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.37.0.tgz","fileCount":1040,"integrity":"sha512-KiuzQikxiUBAQPEVgLV4snewcJyejJzF0DFrWENZS96aeHdmukItEzlZaTIhY6T8yPdV4vZSTNGgNu3LC82iyw==","signatures":[{"sig":"MEYCIQCNqXUx3rJFhSA3FhZBZx/SaOW56XL8cdB3Je5Kg/cZlwIhAJVVtY+L2u0Hz2Yzbk00G6uhfztBas2YBL0zh1TVNymC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8817553},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"e88771701c854d532c8c9c25587132be794b0053","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.16.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.37.0","@voltro/kv":"0.37.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.37.0","@voltro/cache":"0.37.0","@voltro/logger":"0.37.0","@voltro/runtime":"0.37.0","@effect/workflow":"^0.19.0","@voltro/database":"0.37.0","@voltro/protocol":"0.37.0","@voltro/workflow":"0.37.0","@voltro/serverless":"0.37.0","@voltro/plugin-auth":"0.37.0","@voltro/plugin-mail":"0.37.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.37.0","@voltro/plugin-storage":"0.37.0","@voltro/plugin-webhooks":"0.37.0","@voltro/plugin-broadcast":"0.37.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.37.0_1786654820993_0.2312934409419234","host":"s3://npm-registry-packages-npm-production"}},"0.38.0":{"name":"@voltro/cli","version":"0.38.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.38.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"35cab44d64b0f33812d636ccf7aaca6d3e5ee8fb","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.38.0.tgz","fileCount":1041,"integrity":"sha512-CxoteKrzVtW+/E51OVM5IC4Po7ifu1TEIe97FQYutQi2zwv42dxhu5IUAcsmXCa2WCJuMb83ZrWaXpGw6RNsOg==","signatures":[{"sig":"MEUCIEIaXHbxdG9/MSubyNz18LZ5ti6xrwb2cN36nBLNuTOSAiEAhlqE9BzsQ/8LGMQ7/JrqppUuOSkzH1Y2Hiln0jC6xSY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8848809},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"4bd683cff5ec031631d3b6097f49019e294855ba","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.38.0","@voltro/kv":"0.38.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.38.0","@voltro/cache":"0.38.0","@voltro/logger":"0.38.0","@voltro/runtime":"0.38.0","@effect/workflow":"^0.19.0","@voltro/database":"0.38.0","@voltro/protocol":"0.38.0","@voltro/workflow":"0.38.0","@voltro/serverless":"0.38.0","@voltro/plugin-auth":"0.38.0","@voltro/plugin-mail":"0.38.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.38.0","@voltro/plugin-storage":"0.38.0","@voltro/plugin-webhooks":"0.38.0","@voltro/plugin-broadcast":"0.38.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.1","vite":"^8.1.5","esbuild":"^0.28.0","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.4"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.38.0_1786685904038_0.20884879677199875","host":"s3://npm-registry-packages-npm-production"}},"0.39.0":{"name":"@voltro/cli","version":"0.39.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.39.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"3cdf2044d00db9950221f489faab7af4f5b77b0f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.39.0.tgz","fileCount":1041,"integrity":"sha512-gL+Kr+NorN+O7QsEd2cqGdLSjr1gobKK7GylZPRyvwJ9nfXuAbjy4c66ltf1Nt8LAu/6xs5SqrXXgUfdpEepnA==","signatures":[{"sig":"MEQCIEcbIAHMYtCwsj29f902oRboOAk/+/ohyLqVX80llB9gAiArTFBu71mmiD5DhWZDvEcdENfjz2cLeye4fgYGIv/xVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8942420},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"f58112033d2d78c2e02f8f11f71494b6ee86e747","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.39.0","@voltro/kv":"0.39.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.39.0","@voltro/cache":"0.39.0","@voltro/logger":"0.39.0","@voltro/runtime":"0.39.0","@effect/workflow":"^0.19.0","@voltro/database":"0.39.0","@voltro/protocol":"0.39.0","@voltro/workflow":"0.39.0","@voltro/serverless":"0.39.0","@voltro/plugin-auth":"0.39.0","@voltro/plugin-mail":"0.39.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.39.0","@voltro/plugin-storage":"0.39.0","@voltro/plugin-webhooks":"0.39.0","@voltro/plugin-broadcast":"0.39.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.39.0_1786876336276_0.38733796095117534","host":"s3://npm-registry-packages-npm-production"}},"0.39.1":{"name":"@voltro/cli","version":"0.39.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.39.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"362237468902c4a06afd8e63d66412ca93370f13","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.39.1.tgz","fileCount":1041,"integrity":"sha512-Q9IucAxJSQp/su94UJbRRpm8GFmk7MN/SKnPSFGlycGpe1pr25TTNh6hPVVXNV1EoWtzNYxRof7ZKfOGROlA3g==","signatures":[{"sig":"MEYCIQCe9ozv4hxbcU8Qjy8sCXDVkADzb8PjRQJ7UlsylSJDKQIhAJgSpH8ZFZ7jbZJOcaNpCcO08Ii2+brM4Xu27MY+XNQO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8922082},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"e0d29c1e43198409d211a186adc36b52f2fb2d88","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.39.1","@voltro/kv":"0.39.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.39.1","@voltro/cache":"0.39.1","@voltro/logger":"0.39.1","@voltro/runtime":"0.39.1","@effect/workflow":"^0.19.0","@voltro/database":"0.39.1","@voltro/protocol":"0.39.1","@voltro/workflow":"0.39.1","@voltro/serverless":"0.39.1","@voltro/plugin-auth":"0.39.1","@voltro/plugin-mail":"0.39.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.39.1","@voltro/plugin-storage":"0.39.1","@voltro/plugin-webhooks":"0.39.1","@voltro/plugin-broadcast":"0.39.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.39.1_1786888101555_0.6802082167993331","host":"s3://npm-registry-packages-npm-production"}},"0.40.0":{"name":"@voltro/cli","version":"0.40.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.40.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"1a6538332ca68952993c2f7ca9e8ec1c4b64f147","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.40.0.tgz","fileCount":1041,"integrity":"sha512-chymmzy8nkIM6IYZUCbJSFrsZsn63FKytzKpTMqjnVK9KcppSyEH/dl9yXxCKVdOIlT+UxMJ5kslezl9IVAkZQ==","signatures":[{"sig":"MEUCIQDKWidjAwChQuTEjceLS4k4RrhJacGXQ6oUaebS1yyBqwIgOTcr1l1l6AOvnDPYlPZgJbaGCBNgJ9a8+ovUBm0d6n4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8968299},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"ab5f2d96bf13bc1a58e784eb05a03b69a7ef6640","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.40.0","@voltro/kv":"0.40.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.40.0","@voltro/cache":"0.40.0","@voltro/logger":"0.40.0","@voltro/runtime":"0.40.0","@effect/workflow":"^0.19.0","@voltro/database":"0.40.0","@voltro/protocol":"0.40.0","@voltro/workflow":"0.40.0","@voltro/serverless":"0.40.0","@voltro/plugin-auth":"0.40.0","@voltro/plugin-mail":"0.40.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.40.0","@voltro/plugin-storage":"0.40.0","@voltro/plugin-webhooks":"0.40.0","@voltro/plugin-broadcast":"0.40.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.40.0_1786908020719_0.7646500175695872","host":"s3://npm-registry-packages-npm-production"}},"0.41.0":{"name":"@voltro/cli","version":"0.41.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.41.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"6965459a01f47b5162c203458bbbb873b0e0e92d","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.41.0.tgz","fileCount":1041,"integrity":"sha512-ydC+KbvGS/oUwKYDcEAX5WSh3uP77DyNDMwYTJTeRVksGkm/Aq4ZJlR5r1HmNsCJW6BKhXv40advVG5qmyAcjg==","signatures":[{"sig":"MEUCIAmczpmk0Qd2AVtdieb9hB12ju8ZYKL+dm42AK0FKMHYAiEAm6ZK0Uhvlc09LYhoRNrHcTB81fyqS91ILx98BG4o27M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9002652},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"cb2e9729b92456032eedb302c7182e299a5e5a15","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.41.0","@voltro/kv":"0.41.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.41.0","@voltro/cache":"0.41.0","@voltro/logger":"0.41.0","@voltro/runtime":"0.41.0","@effect/workflow":"^0.19.0","@voltro/database":"0.41.0","@voltro/protocol":"0.41.0","@voltro/workflow":"0.41.0","@voltro/serverless":"0.41.0","@voltro/plugin-auth":"0.41.0","@voltro/plugin-mail":"0.41.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.41.0","@voltro/plugin-storage":"0.41.0","@voltro/plugin-webhooks":"0.41.0","@voltro/plugin-broadcast":"0.41.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.41.0_1786963073408_0.2998867462339929","host":"s3://npm-registry-packages-npm-production"}},"0.42.0":{"name":"@voltro/cli","version":"0.42.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.42.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"cfe1d85e0369daef64dea7ebfbff13848292ce46","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.42.0.tgz","fileCount":1041,"integrity":"sha512-x9DmP8cd8m4QgaMek7n5Uvbm3vv5k7ln2ACEa0IY5D6d8MdiWNCaKgvWDzLCfcDZBadxRNU5E98zThAb38a5Lw==","signatures":[{"sig":"MEQCIBNlbDk1c6wcX3Cejh3xmE89vEo/O++dMRWDK7s72tCeAiA2Ze4KmTS9lTr7SkjcI04nzUlj/980DIt9mFrVUSd1HQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9036078},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"7fbecbb5f73b32ad9d5604bac0387bdba3d19d1c","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.42.0","@voltro/kv":"0.42.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.42.0","@voltro/cache":"0.42.0","@voltro/logger":"0.42.0","@voltro/runtime":"0.42.0","@effect/workflow":"^0.19.0","@voltro/database":"0.42.0","@voltro/protocol":"0.42.0","@voltro/workflow":"0.42.0","@voltro/serverless":"0.42.0","@voltro/plugin-auth":"0.42.0","@voltro/plugin-mail":"0.42.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.42.0","@voltro/plugin-storage":"0.42.0","@voltro/plugin-webhooks":"0.42.0","@voltro/plugin-broadcast":"0.42.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.42.0_1787008481486_0.6148850622615449","host":"s3://npm-registry-packages-npm-production"}},"0.43.0":{"name":"@voltro/cli","version":"0.43.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.43.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"47903ec22b10306cf98c2187b331c1ce809eaf9c","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.43.0.tgz","fileCount":1041,"integrity":"sha512-FK164zKoeKTqfd8ODhxEPEZkP/vfhjqwhAn+ptU9G37DjiV9hVocdpMER5cnHAlYdKRwgr5Gzems7uveiWWWiA==","signatures":[{"sig":"MEQCIAeE5rUJTBGCJiQE7bGwywsL4/5vvyrpXcI39GD4MNNQAiBS7FvJRJrcJlMukZgKdcoR1RggEBQqxGdHDi2JzVYuEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9048932},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"320881837a87f7ca7768f70a192f2a77524a1348","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.43.0","@voltro/kv":"0.43.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.43.0","@voltro/cache":"0.43.0","@voltro/logger":"0.43.0","@voltro/runtime":"0.43.0","@effect/workflow":"^0.19.0","@voltro/database":"0.43.0","@voltro/protocol":"0.43.0","@voltro/workflow":"0.43.0","@voltro/serverless":"0.43.0","@voltro/plugin-auth":"0.43.0","@voltro/plugin-mail":"0.43.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.43.0","@voltro/plugin-storage":"0.43.0","@voltro/plugin-webhooks":"0.43.0","@voltro/plugin-broadcast":"0.43.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.43.0_1787039721904_0.3033941550827046","host":"s3://npm-registry-packages-npm-production"}},"0.43.1":{"name":"@voltro/cli","version":"0.43.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.43.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"38c16967dede3a6e4eb881a4518fa0ca10ab1cba","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.43.1.tgz","fileCount":1041,"integrity":"sha512-N6ghqAx2P4FOZcMloXWpz0o/0piV1ncXXX/rRkbfjWk40q4hpJwl7WaiPVn4xLmRQX+mK4IC3bRdbIrG2ot9+g==","signatures":[{"sig":"MEUCIAzwboLmYH2CedZHxtXSBK5ypn2D1cuKHW9GhR8dR5cJAiEA8bsMHWzNtyXW0dsNvRd6JfKlqVV4MYtnWvGJmrMk1yQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9053401},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"2908c11945b8fa648e7df2b9da172166c4868c1e","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.43.1","@voltro/kv":"0.43.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.43.1","@voltro/cache":"0.43.1","@voltro/logger":"0.43.1","@voltro/runtime":"0.43.1","@effect/workflow":"^0.19.0","@voltro/database":"0.43.1","@voltro/protocol":"0.43.1","@voltro/workflow":"0.43.1","@voltro/serverless":"0.43.1","@voltro/plugin-auth":"0.43.1","@voltro/plugin-mail":"0.43.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.43.1","@voltro/plugin-storage":"0.43.1","@voltro/plugin-webhooks":"0.43.1","@voltro/plugin-broadcast":"0.43.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.43.1_1787062067314_0.900759296145367","host":"s3://npm-registry-packages-npm-production"}},"0.43.2":{"name":"@voltro/cli","version":"0.43.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.43.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"9c4ae2d78b577919e1bb12f8c3127baddb6e7690","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.43.2.tgz","fileCount":1041,"integrity":"sha512-VaeDGUIvKidvMLP27ba0VvnPv44Jxv+IIez2WWwSrSBvA5lM0N1yw5/wjAqf5BvWNsH/fpMVSBLk/m7fInxSAw==","signatures":[{"sig":"MEQCICIQeWmziE6SA8O/C1v2etDcRCJEgA4YZypoPlZVm44cAiBWS/FardIWocNq+ESHLu4QkaYzPMKs1BuGomD/LD1RTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9082701},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"203009f8770c4c5ff61894dc7e1d78974d38082d","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.43.2","@voltro/kv":"0.43.2","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.43.2","@voltro/cache":"0.43.2","@voltro/logger":"0.43.2","@voltro/runtime":"0.43.2","@effect/workflow":"^0.19.0","@voltro/database":"0.43.2","@voltro/protocol":"0.43.2","@voltro/workflow":"0.43.2","@voltro/serverless":"0.43.2","@voltro/plugin-auth":"0.43.2","@voltro/plugin-mail":"0.43.2","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.43.2","@voltro/plugin-storage":"0.43.2","@voltro/plugin-webhooks":"0.43.2","@voltro/plugin-broadcast":"0.43.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.43.2_1787089567296_0.8840649470961108","host":"s3://npm-registry-packages-npm-production"}},"0.44.0":{"name":"@voltro/cli","version":"0.44.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.44.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"0f5ea15f03cffc63abcab3eb8a091b7ec7194df6","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.44.0.tgz","fileCount":1041,"integrity":"sha512-f16IhIK5LYWfgsQnJA/RAsvDVmseglHT7cEo7Pj5yr2EMv4Jo053UmOn2XlOg0HNoD+tEOCE2Jt6/mlXbaxOlA==","signatures":[{"sig":"MEYCIQCk2zRYQmfv99gv1S1UPVUgaJ9appAks2MYn9wrUUvHIQIhAOhMNx4donTuuZaQL2SbgQIXLCUQfZP3i3UmEQgr/u4a","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9090766},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"4f8bce65eab75aacaec2755a233c3cbaa3a3caf3","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.44.0","@voltro/kv":"0.44.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.44.0","@voltro/cache":"0.44.0","@voltro/logger":"0.44.0","@voltro/runtime":"0.44.0","@effect/workflow":"^0.19.0","@voltro/database":"0.44.0","@voltro/protocol":"0.44.0","@voltro/workflow":"0.44.0","@voltro/serverless":"0.44.0","@voltro/plugin-auth":"0.44.0","@voltro/plugin-mail":"0.44.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.44.0","@voltro/plugin-storage":"0.44.0","@voltro/plugin-webhooks":"0.44.0","@voltro/plugin-broadcast":"0.44.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.44.0_1787121453521_0.30588384572192195","host":"s3://npm-registry-packages-npm-production"}},"0.44.1":{"name":"@voltro/cli","version":"0.44.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.44.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"91273c3c4d534e61fe9d8b030cb06561849ef827","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.44.1.tgz","fileCount":1041,"integrity":"sha512-WI+H96mLQP1pU0X1E0eN11T1k/X6wtDICYjsvwtxialBS7wUI7EiEuR8C1hbcKdIdauT4BDCsPZBjGvJnI8++A==","signatures":[{"sig":"MEUCIE029xMqIKxEIoqpkfVrK4RzuIr5o4qzNPxme+u79rHQAiEAoZasInxAoVN/kvuwCFlDjk57hLH31DDWjWjMSktoK/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9092791},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"ef0ca05421fe17f68fea67e23beb8f14eefc0223","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.44.1","@voltro/kv":"0.44.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.44.1","@voltro/cache":"0.44.1","@voltro/logger":"0.44.1","@voltro/runtime":"0.44.1","@effect/workflow":"^0.19.0","@voltro/database":"0.44.1","@voltro/protocol":"0.44.1","@voltro/workflow":"0.44.1","@voltro/serverless":"0.44.1","@voltro/plugin-auth":"0.44.1","@voltro/plugin-mail":"0.44.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.44.1","@voltro/plugin-storage":"0.44.1","@voltro/plugin-webhooks":"0.44.1","@voltro/plugin-broadcast":"0.44.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.44.1_1787166320481_0.7627571022305453","host":"s3://npm-registry-packages-npm-production"}},"0.45.0":{"name":"@voltro/cli","version":"0.45.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.45.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"c7212aa3a57419d598a196e82ff508691065b1bd","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.45.0.tgz","fileCount":1042,"integrity":"sha512-juJ7lMIYRUHx75Sc43Wd4II9JkR/y7lExhFTUTmaeavewfPp568PMOr2TNAosOffXuSWCJl1LB1AGuojawLelg==","signatures":[{"sig":"MEYCIQCco8IukSDf8SnSumUAeALD7tIDklUF4euNS0nsgfxftwIhAKQFksXcAvP6RwZ0FXDWX2WzCorBs0PTZVO3in6Y6Fjn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9144139},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"9da5743bd3348b3f920c6f4b0cc6f23bdcf03dbc","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.45.0","@voltro/kv":"0.45.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.45.0","@voltro/cache":"0.45.0","@voltro/logger":"0.45.0","@voltro/runtime":"0.45.0","@effect/workflow":"^0.19.0","@voltro/database":"0.45.0","@voltro/protocol":"0.45.0","@voltro/workflow":"0.45.0","@voltro/serverless":"0.45.0","@voltro/plugin-auth":"0.45.0","@voltro/plugin-mail":"0.45.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.45.0","@voltro/plugin-storage":"0.45.0","@voltro/plugin-webhooks":"0.45.0","@voltro/plugin-broadcast":"0.45.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.45.0_1787299554695_0.1793214272169774","host":"s3://npm-registry-packages-npm-production"}},"0.46.0":{"name":"@voltro/cli","version":"0.46.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.46.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"8483d145ba487f895c74a1f38d67f0fe341dc9bc","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.46.0.tgz","fileCount":1044,"integrity":"sha512-zKLdXwzKqI4sR9y6mR5jQvdtyFT54GDZp7/UULkfNEQssb9MOT6XOjZREfQJpnjzhl23GU6vDG3P5ls+QSOKwg==","signatures":[{"sig":"MEQCIDYDXgnMaEG7nV7oWf2koShlt/IblyZRWg46io/xi4/jAiBPbZENmtANm+65Ih/zmMaDapYl4wt7amwEUoxD985JlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9207105},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"7b0745f9e1f81429665d1db5f219b95130885250","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.46.0","@voltro/kv":"0.46.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.46.0","@voltro/cache":"0.46.0","@voltro/logger":"0.46.0","@voltro/runtime":"0.46.0","@effect/workflow":"^0.19.0","@voltro/database":"0.46.0","@voltro/protocol":"0.46.0","@voltro/workflow":"0.46.0","@voltro/serverless":"0.46.0","@voltro/plugin-auth":"0.46.0","@voltro/plugin-mail":"0.46.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.46.0","@voltro/plugin-storage":"0.46.0","@voltro/plugin-webhooks":"0.46.0","@voltro/plugin-broadcast":"0.46.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.46.0_1787380116784_0.4550534983760901","host":"s3://npm-registry-packages-npm-production"}},"0.47.0":{"name":"@voltro/cli","version":"0.47.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.47.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"af2485b926636cae788cccd14722f41d3b34be9b","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.47.0.tgz","fileCount":1044,"integrity":"sha512-rIUcQwpEkrJYSRX9WzOIJigh7oxoEqr55dzm1SrWlfncQJmGAAZQNGJneIfXjdxuP9FXLqKgli4ly6pumwfMAg==","signatures":[{"sig":"MEUCIQCX+4cN+p/VwoV5yQYWNJSXXjxyEnbC6+BcCWFtveVq0QIgK8gSWE+MkDDPEh91V7jhfr4kZh/sbq58tgDB/MrTmEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9191411},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"04894a599fc90363f03244d95aa2a7a8d6133121","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.47.0","@voltro/kv":"0.47.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.47.0","@voltro/cache":"0.47.0","@voltro/logger":"0.47.0","@voltro/runtime":"0.47.0","@effect/workflow":"^0.19.0","@voltro/database":"0.47.0","@voltro/protocol":"0.47.0","@voltro/workflow":"0.47.0","@voltro/serverless":"0.47.0","@voltro/plugin-auth":"0.47.0","@voltro/plugin-mail":"0.47.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.47.0","@voltro/plugin-storage":"0.47.0","@voltro/plugin-webhooks":"0.47.0","@voltro/plugin-broadcast":"0.47.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.47.0_1787396372388_0.8938708123235657","host":"s3://npm-registry-packages-npm-production"}},"0.48.0":{"name":"@voltro/cli","version":"0.48.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.48.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"6aeffd4d198625f2a69f800ac99889a03c2b8be7","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.48.0.tgz","fileCount":1046,"integrity":"sha512-wddhnreHngAz1Ugo5euKHZnU++C7ZSewmOQ6oPjcrQOIraCW5VQN+F41eStVVr5ixFlrKaUZJ06zsGSdO/1+tA==","signatures":[{"sig":"MEUCIDOBOquGuZFTJG16Xd/lRle4L31XTb5Q2pzIBximkkcSAiEAtz57G4uw5KZlDj/SGvwZart92LKVzpktuBXJQMrQ6dg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9225286},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"173260af9c627433af085db5d1843ba8caf4b58c","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.48.0","@voltro/kv":"0.48.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.48.0","@voltro/cache":"0.48.0","@voltro/logger":"0.48.0","@voltro/runtime":"0.48.0","@effect/workflow":"^0.19.0","@voltro/database":"0.48.0","@voltro/protocol":"0.48.0","@voltro/workflow":"0.48.0","@voltro/serverless":"0.48.0","@voltro/plugin-auth":"0.48.0","@voltro/plugin-mail":"0.48.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.48.0","@voltro/plugin-storage":"0.48.0","@voltro/plugin-webhooks":"0.48.0","@voltro/plugin-broadcast":"0.48.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.48.0_1787436829606_0.9635932786129802","host":"s3://npm-registry-packages-npm-production"}},"0.49.0":{"name":"@voltro/cli","version":"0.49.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.49.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"76dca4fae704d913e058f1ef65ad249abb9fd93f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.49.0.tgz","fileCount":1046,"integrity":"sha512-sent3LCwV2qhN+X6G7un7PvqSVNEdDWxSi4dc6++AcmsJ428quOToE/pQtdXao2ym4fMh7sOCEtxg/givkjrSQ==","signatures":[{"sig":"MEUCICY+zu2dEn3jPBSSAcBcn7FkxjuaLFqBn5mgFYYJbuDKAiEAzQezq2TG/s2sMGMDyUSj46HKbuzUSxyp0jGKDjfVIzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9258754},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"b03a13d2a1fd34683919bc5cffb7d701497a2cdc","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.49.0","@voltro/kv":"0.49.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.49.0","@voltro/cache":"0.49.0","@voltro/logger":"0.49.0","@voltro/runtime":"0.49.0","@effect/workflow":"^0.19.0","@voltro/database":"0.49.0","@voltro/protocol":"0.49.0","@voltro/workflow":"0.49.0","@voltro/serverless":"0.49.0","@voltro/plugin-auth":"0.49.0","@voltro/plugin-mail":"0.49.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.49.0","@voltro/plugin-storage":"0.49.0","@voltro/plugin-webhooks":"0.49.0","@voltro/plugin-broadcast":"0.49.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.49.0_1787493611363_0.20090574222000224","host":"s3://npm-registry-packages-npm-production"}},"0.50.0":{"name":"@voltro/cli","version":"0.50.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.50.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"6a25dfc586a83d335a3d8a8b3067ce15ddcce8f4","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.50.0.tgz","fileCount":1046,"integrity":"sha512-ouNE4IhwEUG5T66n4AHoa48lV+25mipY6o55uCjMBGuooxoIfBZMzoB4CDokFyfO5PihEYCasP9tbWy8Yz6Cmg==","signatures":[{"sig":"MEYCIQDc3aKljPG9x8MsjzG7pmHr4zR9uJyGkVZgOExHXEYkIQIhAO3RCvDBOUQwf+2MvG64zDzKBs1mwOHGlQw3qC8QmYSW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9281154},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"127d2ae5d02f316b50ce4e1d1f571879fcc45f08","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.50.0","@voltro/kv":"0.50.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.50.0","@voltro/cache":"0.50.0","@voltro/logger":"0.50.0","@voltro/runtime":"0.50.0","@effect/workflow":"^0.19.0","@voltro/database":"0.50.0","@voltro/protocol":"0.50.0","@voltro/workflow":"0.50.0","@voltro/serverless":"0.50.0","@voltro/plugin-auth":"0.50.0","@voltro/plugin-mail":"0.50.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.50.0","@voltro/plugin-storage":"0.50.0","@voltro/plugin-webhooks":"0.50.0","@voltro/plugin-broadcast":"0.50.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.50.0_1787519907334_0.914070895971262","host":"s3://npm-registry-packages-npm-production"}},"0.50.1":{"name":"@voltro/cli","version":"0.50.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.50.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"ac357780932fe0c3872777e92ef9a1441b18dfec","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.50.1.tgz","fileCount":1046,"integrity":"sha512-1lXr/9AbDr8et8GVTlGNXKrY94jd5IOgoegZrbAK/DjHseP+jXLDlVEvNoq0r7kjDHIcaFSS+SGk5bvsJGWvCQ==","signatures":[{"sig":"MEUCIQDII4ggpqI8YPPLNcUh6tUgIcM4Vl5Ez7aoRcw2ncWshQIgRMWiKshS7212lNU9C117Gy0gfI9dJrUfzN+wASTYDp8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9311732},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"934aa1158151faa200047fc2b36558a87dc2392b","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.50.1","@voltro/kv":"0.50.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.50.1","@voltro/cache":"0.50.1","@voltro/logger":"0.50.1","@voltro/runtime":"0.50.1","@effect/workflow":"^0.19.0","@voltro/database":"0.50.1","@voltro/protocol":"0.50.1","@voltro/workflow":"0.50.1","@voltro/serverless":"0.50.1","@voltro/plugin-auth":"0.50.1","@voltro/plugin-mail":"0.50.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.50.1","@voltro/plugin-storage":"0.50.1","@voltro/plugin-webhooks":"0.50.1","@voltro/plugin-broadcast":"0.50.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.50.1_1787567443677_0.3060566134216436","host":"s3://npm-registry-packages-npm-production"}},"0.51.0":{"name":"@voltro/cli","version":"0.51.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.51.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"20511762ad1dc8c416a97632fd94bfa3283bd95f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.51.0.tgz","fileCount":1046,"integrity":"sha512-vDiEPtywv3ndPll5oElLVmi1Kpqa7HxFGu3kTlWKQCPcCFwCm3JlxOUpuFPpqjJ/BTYAipuCtWNOFk7Hi55EkQ==","signatures":[{"sig":"MEUCIBCUBy2JbtM+s3CJVxhPPMUsHmg3KXY+7yaciz9nLYiXAiEA8tIdGswQD9v+lGRzWMZVfG994BnMmfaVaS2t0Cs6dKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9366065},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"95dfef93a175f698054a09160ef8c7995177b631","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.51.0","@voltro/kv":"0.51.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.51.0","@voltro/cache":"0.51.0","@voltro/logger":"0.51.0","@voltro/runtime":"0.51.0","@effect/workflow":"^0.19.0","@voltro/database":"0.51.0","@voltro/protocol":"0.51.0","@voltro/workflow":"0.51.0","@voltro/serverless":"0.51.0","@voltro/plugin-auth":"0.51.0","@voltro/plugin-mail":"0.51.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.51.0","@voltro/plugin-storage":"0.51.0","@voltro/plugin-webhooks":"0.51.0","@voltro/plugin-broadcast":"0.51.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.51.0_1787599863538_0.9825172181226189","host":"s3://npm-registry-packages-npm-production"}},"0.52.0":{"name":"@voltro/cli","version":"0.52.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.52.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"6c25850d1456b4ada945e7093b3f4dbe3ca52d72","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.52.0.tgz","fileCount":1046,"integrity":"sha512-rb5TohNyWxesR1zYnjMpJ0HxtdInkASX6zLX6zrhZPZp9Qljh2evbAxJjBX/CEDsABmgw+gAxJ5bZA5SvfxGSg==","signatures":[{"sig":"MEUCIAZ3jxtzZ4fBmQZJysIO4AhHEacz5dEjyHTDOj+B+7OIAiEAwDsHiHbUiobTVAZHnqOsB0k2Fmc34Rh3/fATgtI/4a8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9500594},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"c06aff993b4c07ab802c537a60cc7e18a1d6e250","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.52.0","@voltro/kv":"0.52.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.52.0","@voltro/cache":"0.52.0","@voltro/client":"0.52.0","@voltro/logger":"0.52.0","@voltro/runtime":"0.52.0","@effect/workflow":"^0.19.0","@voltro/database":"0.52.0","@voltro/protocol":"0.52.0","@voltro/workflow":"0.52.0","@voltro/serverless":"0.52.0","@voltro/plugin-auth":"0.52.0","@voltro/plugin-mail":"0.52.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.52.0","@voltro/plugin-storage":"0.52.0","@voltro/plugin-webhooks":"0.52.0","@voltro/plugin-broadcast":"0.52.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","esbuild":"^0.28.2","@vercel/nft":"^1.10.2","@tailwindcss/vite":"^4.3.3","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.52.0_1787687691334_0.7408633429602811","host":"s3://npm-registry-packages-npm-production"}},"0.53.0":{"name":"@voltro/cli","version":"0.53.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.53.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"0cf1dbb4b860057ea45cffd1292aee6455b328b8","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.53.0.tgz","fileCount":1059,"integrity":"sha512-66cg02G59XXCFNOh6xjni8wLrsPhteq6Du8toUziETycG1Lo+GTKq5ml38E9y+vq93U7NyUGn03JgTKWQLf7hA==","signatures":[{"sig":"MEUCIQD1rUSfO5LKJ17MKZQLaZL0n/+UuEEu+e9/RsveMWWvmAIgbWHxIbBFojDuSiI8oagJnya8ubHFC77YA3tZEg9s2Vc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9994363},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"03bf0e8839a07c8233a5bd24017735a79d7f65ce","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.53.0","@voltro/kv":"0.53.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.53.0","@voltro/cache":"0.53.0","@voltro/client":"0.53.0","@voltro/logger":"0.53.0","@voltro/content":"0.53.0","@voltro/runtime":"0.53.0","@effect/workflow":"^0.19.0","@voltro/database":"0.53.0","@voltro/protocol":"0.53.0","@voltro/workflow":"0.53.0","@voltro/serverless":"0.53.0","@voltro/plugin-auth":"0.53.0","@voltro/plugin-mail":"0.53.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.53.0","@voltro/plugin-storage":"0.53.0","@voltro/plugin-webhooks":"0.53.0","@voltro/plugin-broadcast":"0.53.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.53.0_1787786539112_0.03169284242065373","host":"s3://npm-registry-packages-npm-production"}},"0.54.0":{"name":"@voltro/cli","version":"0.54.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.54.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"293d1761b1e5a8f50de895ae4178fdb55eb2ab65","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.54.0.tgz","fileCount":1065,"integrity":"sha512-7vdKwd3QEEKSt4P5SzRFQ3MY85klnZei8mLlky4cUk0jIztfRxuC1ioAVNuJR8FISequNcFphQXkV7pyjovHwA==","signatures":[{"sig":"MEQCIG7vBTvdSBlp9sR89xgTBnLvxuRbtQNfBNPiG/Y2F2J3AiAIMipdOY3lzQq/M2SIT4RTY8BEYSskybx7Nrt5dBHdSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10173941},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"73603bc1854047db6a2d224a3a35646a81e710e2","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.54.0","@voltro/kv":"0.54.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.54.0","@voltro/cache":"0.54.0","@voltro/client":"0.54.0","@voltro/logger":"0.54.0","@voltro/content":"0.54.0","@voltro/runtime":"0.54.0","@effect/workflow":"^0.19.0","@voltro/database":"0.54.0","@voltro/protocol":"0.54.0","@voltro/workflow":"0.54.0","@voltro/serverless":"0.54.0","@voltro/plugin-auth":"0.54.0","@voltro/plugin-mail":"0.54.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.54.0","@voltro/plugin-storage":"0.54.0","@voltro/plugin-webhooks":"0.54.0","@voltro/plugin-broadcast":"0.54.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.54.0_1787816809202_0.828584847088643","host":"s3://npm-registry-packages-npm-production"}},"0.55.0":{"name":"@voltro/cli","version":"0.55.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.55.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"8d2ac1153f5df17fb02b0ca59af9482ec907cf47","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.55.0.tgz","fileCount":1065,"integrity":"sha512-qiHt8cfdDWUPEreB8y+nF1VycG/dQ3a9Mr23t78iz+Ai8yJg8WJeLnzIF/f9a26jAExRafUhYeIKXO9y5qNkYA==","signatures":[{"sig":"MEUCIQCnpMiC+1jWfOenqmPe8D0f4tU2vBJAnvflcBFC0+sgbQIgfE3q7S62wsa1Sp6wlcJOxFF/1euEBe/QVAgVoqBdeTw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10219916},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"e2b4fa926667e21442c7e67acc6e261631c4d348","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.55.0","@voltro/kv":"0.55.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.55.0","@voltro/cache":"0.55.0","@voltro/client":"0.55.0","@voltro/logger":"0.55.0","@voltro/content":"0.55.0","@voltro/runtime":"0.55.0","@effect/workflow":"^0.19.0","@voltro/database":"0.55.0","@voltro/protocol":"0.55.0","@voltro/workflow":"0.55.0","@voltro/serverless":"0.55.0","@voltro/plugin-auth":"0.55.0","@voltro/plugin-mail":"0.55.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.55.0","@voltro/plugin-storage":"0.55.0","@voltro/plugin-webhooks":"0.55.0","@voltro/plugin-broadcast":"0.55.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.55.0_1787847197233_0.994219902549438","host":"s3://npm-registry-packages-npm-production"}},"0.56.0":{"name":"@voltro/cli","version":"0.56.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.56.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"4fc307a920a5083cee15adc41c6c4058725399de","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.56.0.tgz","fileCount":1068,"integrity":"sha512-W/jO81Zcp3fZz41MJjvLtdzDV0lr/OXGRQa0IGVcDVN568fin6FBu3MgP4t97gjw+0WvAecb78eH9oUvmd8O7w==","signatures":[{"sig":"MEQCID5jXZcFEMRWewjZDzEu2YD9758nRSQXRVvKQYj+/A8uAiADBunmTGKHdajgo9f4dnkxw6PWRFkLS2mAhUFso67+xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10452015},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"91ca4885463de6812c5e9bf05dc4667ae41d0f26","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.56.0","@voltro/kv":"0.56.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.56.0","@voltro/cache":"0.56.0","@voltro/client":"0.56.0","@voltro/logger":"0.56.0","@voltro/content":"0.56.0","@voltro/runtime":"0.56.0","@effect/workflow":"^0.19.0","@voltro/database":"0.56.0","@voltro/protocol":"0.56.0","@voltro/workflow":"0.56.0","@voltro/serverless":"0.56.0","@voltro/plugin-auth":"0.56.0","@voltro/plugin-mail":"0.56.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.56.0","@voltro/plugin-storage":"0.56.0","@voltro/plugin-webhooks":"0.56.0","@voltro/plugin-broadcast":"0.56.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.56.0_1788012932541_0.31301305004121516","host":"s3://npm-registry-packages-npm-production"}},"0.57.0":{"name":"@voltro/cli","version":"0.57.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.57.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"635e359a1912de26a55a2eca89406a84ff359a25","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.57.0.tgz","fileCount":1069,"integrity":"sha512-fRYsL9si5WlVA34fG8HOGwnHJoHszVF+fKxzY+QxW3O/fLsbHS27x2Cq49GHk/Gvi8LI15s+HskwvbLQ5/8v9w==","signatures":[{"sig":"MEYCIQDJlnfTQ5i1DQLehC5bJ4Ib7lncMe/ZVQD6tYR1Z4TVXwIhAMmBR4f+3LCPL4eTCKMR1+a1vn7OBxKjeD6RXPgVvU50","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10467098},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"82a79a78af1e24398fa862863c774cc862efd19f","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.57.0","@voltro/kv":"0.57.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.57.0","@voltro/cache":"0.57.0","@voltro/client":"0.57.0","@voltro/logger":"0.57.0","@voltro/content":"0.57.0","@voltro/runtime":"0.57.0","@effect/workflow":"^0.19.0","@voltro/database":"0.57.0","@voltro/protocol":"0.57.0","@voltro/workflow":"0.57.0","@voltro/serverless":"0.57.0","@voltro/plugin-auth":"0.57.0","@voltro/plugin-mail":"0.57.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.57.0","@voltro/plugin-storage":"0.57.0","@voltro/plugin-webhooks":"0.57.0","@voltro/plugin-broadcast":"0.57.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.57.0_1788055876962_0.08762648170799392","host":"s3://npm-registry-packages-npm-production"}},"0.58.0":{"name":"@voltro/cli","version":"0.58.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.58.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"f63af932a279a1300a2e72db71ffa1c70b4bff24","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.58.0.tgz","fileCount":1069,"integrity":"sha512-CFAljIXqBvLvSxNZ+uXjC7IjxYilVh6dk6qZ+xWMMs8PwMifcCIrmZnp6XS3S5kzRfiFv4dUaL0u/oYwTloDYg==","signatures":[{"sig":"MEYCIQDKkgEM9A/zrkMOqtXBpEgCRHg/lC4Xum/9z2OHwUllIAIhAKGHA6qG1xe3PT5nBtuSb61LzTNW8YSZSCgTBtGszOH2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10555875},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"1f3159350f155c2d0bd392f8c26684133c9cc563","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.58.0","@voltro/kv":"0.58.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.58.0","@voltro/cache":"0.58.0","@voltro/client":"0.58.0","@voltro/logger":"0.58.0","@voltro/content":"0.58.0","@voltro/runtime":"0.58.0","@effect/workflow":"^0.19.0","@voltro/database":"0.58.0","@voltro/protocol":"0.58.0","@voltro/workflow":"0.58.0","@voltro/serverless":"0.58.0","@voltro/plugin-auth":"0.58.0","@voltro/plugin-mail":"0.58.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.58.0","@voltro/plugin-storage":"0.58.0","@voltro/plugin-webhooks":"0.58.0","@voltro/plugin-broadcast":"0.58.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.58.0_1788093152328_0.9776473698879389","host":"s3://npm-registry-packages-npm-production"}},"0.59.0":{"name":"@voltro/cli","version":"0.59.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.59.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"35c16f693f8ca32afeee33d2af4493183a5016cb","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.59.0.tgz","fileCount":1069,"integrity":"sha512-f717HDvZ7E0Bsspb7vTqUOxPAp2DIylWql9tZaOqGuSw9YB7DaQusO6MQjjtuh9RfN6teyzPxJPl2fyQzX/UKQ==","signatures":[{"sig":"MEUCIQDBT4JzB2I23IjMKhzqF0V5KlwAHZdyr+ItDfACqLxyqAIgNawajMkCGmelDqNbV9ZInnEZfyYaBgsrISIFhkq6D+o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10546312},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"d149a12f758b3f38879c25daf5ac1747673fc01b","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.59.0","@voltro/kv":"0.59.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.59.0","@voltro/cache":"0.59.0","@voltro/client":"0.59.0","@voltro/logger":"0.59.0","@voltro/content":"0.59.0","@voltro/runtime":"0.59.0","@effect/workflow":"^0.19.0","@voltro/database":"0.59.0","@voltro/protocol":"0.59.0","@voltro/workflow":"0.59.0","@voltro/serverless":"0.59.0","@voltro/plugin-auth":"0.59.0","@voltro/plugin-mail":"0.59.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.59.0","@voltro/plugin-storage":"0.59.0","@voltro/plugin-webhooks":"0.59.0","@voltro/plugin-broadcast":"0.59.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.59.0_1788120735147_0.6731787318433935","host":"s3://npm-registry-packages-npm-production"}},"0.60.0":{"name":"@voltro/cli","version":"0.60.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.60.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"e42c3152cc46cc23406356c841b7a08394d8dd70","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.60.0.tgz","fileCount":1069,"integrity":"sha512-aV7kLrynZMdrRDeWUkNZ1mXXHTNwxKcSzAIGi+tfFfEYKhjrHDo3WbTP3IhKjXyWMDXJAxKysB5jZeHE11P+eA==","signatures":[{"sig":"MEUCIQD6FWvTKuSP68QwYXSF5sfxNqWCelgA+PcVJjqe0Piw8AIgaJDkMTh3CxQbjdw+2ysJS/RrOUH5XRQ3uop7pr+t2GM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10562986},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"52b50761a6e6a9d14594982aa44558ca1320b8ab","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.60.0","@voltro/kv":"0.60.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.60.0","@voltro/cache":"0.60.0","@voltro/client":"0.60.0","@voltro/logger":"0.60.0","@voltro/content":"0.60.0","@voltro/runtime":"0.60.0","@effect/workflow":"^0.19.0","@voltro/database":"0.60.0","@voltro/protocol":"0.60.0","@voltro/workflow":"0.60.0","@voltro/serverless":"0.60.0","@voltro/plugin-auth":"0.60.0","@voltro/plugin-mail":"0.60.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.60.0","@voltro/plugin-storage":"0.60.0","@voltro/plugin-webhooks":"0.60.0","@voltro/plugin-broadcast":"0.60.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.60.0_1788166670657_0.2580163141428169","host":"s3://npm-registry-packages-npm-production"}},"0.61.0":{"name":"@voltro/cli","version":"0.61.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.61.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"b2d418ec9cdc23a6e2f3abdd35011e4ef7e76e0c","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.61.0.tgz","fileCount":1069,"integrity":"sha512-vM5kw5siCgoz9rzRs9rOCe2YKhVtV+e8BSpw/iEVUm9LIQQK28oYPPP1nQ1TZYoBUeGXNIb5zPuoIOjKOmLeSA==","signatures":[{"sig":"MEQCICigaB08G68BgaSq0r9yaM4kaAdG9RHAca16J3o3ClyRAiAQvJHUX2amXK4YjA71K05tplPZQV03rQQYMg9bxuRvWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10567054},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"c1530cfb73190230ccaebc83efe6976b5d73bb71","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.61.0","@voltro/kv":"0.61.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.61.0","@voltro/cache":"0.61.0","@voltro/client":"0.61.0","@voltro/logger":"0.61.0","@voltro/content":"0.61.0","@voltro/runtime":"0.61.0","@effect/workflow":"^0.19.0","@voltro/database":"0.61.0","@voltro/protocol":"0.61.0","@voltro/workflow":"0.61.0","@voltro/serverless":"0.61.0","@voltro/plugin-auth":"0.61.0","@voltro/plugin-mail":"0.61.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.61.0","@voltro/plugin-storage":"0.61.0","@voltro/plugin-webhooks":"0.61.0","@voltro/plugin-broadcast":"0.61.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.61.0_1788227487935_0.19109879143604114","host":"s3://npm-registry-packages-npm-production"}},"0.62.0":{"name":"@voltro/cli","version":"0.62.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.62.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"2ebaec5a42ae095a2378297e5bef495a44a31b5b","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.62.0.tgz","fileCount":1069,"integrity":"sha512-pzGu0JqYwK+XZG4bqqddAbV1N6GqWqhEADUxyW0Vci6P3moWGe8TVJPhCvWVj3ONP2mIHEB5SRDbmkSszEzAxw==","signatures":[{"sig":"MEYCIQC3+xAMSI9Ls2fmAPNvMTkb3QLO7FX4q2wdxG8KjIHU/gIhAMa9WpoUABsDg7OXiySvaKq4axDc1GSGxCH08eJwH51A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10573411},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"dbfefd2f5dcf6c1222826b30e3485bd557bdd8a7","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.62.0","@voltro/kv":"0.62.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.62.0","@voltro/cache":"0.62.0","@voltro/client":"0.62.0","@voltro/logger":"0.62.0","@voltro/content":"0.62.0","@voltro/runtime":"0.62.0","@effect/workflow":"^0.19.0","@voltro/database":"0.62.0","@voltro/protocol":"0.62.0","@voltro/workflow":"0.62.0","@voltro/serverless":"0.62.0","@voltro/plugin-auth":"0.62.0","@voltro/plugin-mail":"0.62.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.62.0","@voltro/plugin-storage":"0.62.0","@voltro/plugin-webhooks":"0.62.0","@voltro/plugin-broadcast":"0.62.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.62.0_1788299491070_0.7771191065568843","host":"s3://npm-registry-packages-npm-production"}},"0.62.1":{"name":"@voltro/cli","version":"0.62.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.62.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"f23f31120a8d715fe6f5adcb03208bf7fffeb7ee","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.62.1.tgz","fileCount":1069,"integrity":"sha512-noTiX+g+sOyEqYmAzVlNDjtYikEQOB8ML7KwBUmFQXstnC1AFSrJAwuXtqc4ZY6uL3yZGTqkjI87oBWPKxEtvA==","signatures":[{"sig":"MEUCIE57cArwn48KXarBBAmMzXdYu8/ZAtc8MUdWUeQrcCVKAiEAv/FWdkH3bLHoiYjOmgBiZW05a7Kne2rFUcBinEwP6eI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10575144},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"13c2f101db4729ce9b1a3bc189bb11340b7cc2a5","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.62.1","@voltro/kv":"0.62.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.62.1","@voltro/cache":"0.62.1","@voltro/client":"0.62.1","@voltro/logger":"0.62.1","@voltro/content":"0.62.1","@voltro/runtime":"0.62.1","@effect/workflow":"^0.19.0","@voltro/database":"0.62.1","@voltro/protocol":"0.62.1","@voltro/workflow":"0.62.1","@voltro/serverless":"0.62.1","@voltro/plugin-auth":"0.62.1","@voltro/plugin-mail":"0.62.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.62.1","@voltro/plugin-storage":"0.62.1","@voltro/plugin-webhooks":"0.62.1","@voltro/plugin-broadcast":"0.62.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.62.1_1788383775467_0.18281264644250927","host":"s3://npm-registry-packages-npm-production"}},"0.62.2":{"name":"@voltro/cli","version":"0.62.2","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.62.2","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"ac744743d5ab19d9ae79db48df0d1321b7aacc55","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.62.2.tgz","fileCount":1071,"integrity":"sha512-YmFi/pfPmJwT2Zx6T2GPWB1jCNh3YtostmuoZWQtB+j0FYpFYeLb8LK9yMFIcr9wLnXUmR/YmVuuOxtQgm57qQ==","signatures":[{"sig":"MEUCIHelmtSja/BCh8vIOFGv7bM4Uvm9jsy4tHbYACH6ToOsAiEA+zsGF3XBB/R3+FryBoHR1MC0DTSXXvshF1TbFwsJwKs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10608813},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"76c126e35e35a3cb75552cdede9c0f9c0c57728e","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.62.2","@voltro/kv":"0.62.2","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.62.2","@voltro/cache":"0.62.2","@voltro/client":"0.62.2","@voltro/logger":"0.62.2","@voltro/content":"0.62.2","@voltro/runtime":"0.62.2","@effect/workflow":"^0.19.0","@voltro/database":"0.62.2","@voltro/protocol":"0.62.2","@voltro/workflow":"0.62.2","@voltro/serverless":"0.62.2","@voltro/plugin-auth":"0.62.2","@voltro/plugin-mail":"0.62.2","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.62.2","@voltro/plugin-storage":"0.62.2","@voltro/plugin-webhooks":"0.62.2","@voltro/plugin-broadcast":"0.62.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.62.2_1788423333617_0.0661635578180435","host":"s3://npm-registry-packages-npm-production"}},"0.62.3":{"name":"@voltro/cli","version":"0.62.3","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.62.3","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"086f061ba7563b6dd4b2b05c8658f39717888345","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.62.3.tgz","fileCount":1071,"integrity":"sha512-ecB+3Wm/lPKIzOVwBcQM6agHrCRmsyVQd7WOA22Tg6nksw+eG/+T70Yxi1w1GTY3UNApUGv2GQFo3IvqlqNgVQ==","signatures":[{"sig":"MEUCIFsKTB8Wmg8jsVdUp9dKDPlUenITjje87OyyVaFG7FFIAiEA2axGQGKDJx3tEPydMXeJrV+nyhGMPsV4hvP0+EKGfk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10619301},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"3e30ebeb70aa0be1fb0311609a44265a231c9975","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.17.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.62.3","@voltro/kv":"0.62.3","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.62.3","@voltro/cache":"0.62.3","@voltro/client":"0.62.3","@voltro/logger":"0.62.3","@voltro/content":"0.62.3","@voltro/runtime":"0.62.3","@effect/workflow":"^0.19.0","@voltro/database":"0.62.3","@voltro/protocol":"0.62.3","@voltro/workflow":"0.62.3","@voltro/serverless":"0.62.3","@voltro/plugin-auth":"0.62.3","@voltro/plugin-mail":"0.62.3","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.62.3","@voltro/plugin-storage":"0.62.3","@voltro/plugin-webhooks":"0.62.3","@voltro/plugin-broadcast":"0.62.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.62.3_1788458173111_0.7905597210540536","host":"s3://npm-registry-packages-npm-production"}},"0.63.0":{"name":"@voltro/cli","version":"0.63.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.63.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"a6e11fa04f230b3ba9f10bbc139e78f4a3100e4d","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.63.0.tgz","fileCount":1071,"integrity":"sha512-Q6J7wl3fWCSfb05g01Mae1LI4OaUzJCv+Fr/iNHruVEdGHvI338g2ippLGKqMLIr5SZ1EzcHkTZIQXJFh7td5Q==","signatures":[{"sig":"MEYCIQC4bNdfYfrVhtZMXA4QVwbvalpo7AtzqZLvj8IGWgHG1AIhANZEe06YCF0DvG/i7MH5ZS9xTQB9sE/Ea1G61JzTIN6e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10627988},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"2f18a271d7375410e01ac2232d5bc4a54cb31940","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.63.0","@voltro/kv":"0.63.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.63.0","@voltro/cache":"0.63.0","@voltro/client":"0.63.0","@voltro/logger":"0.63.0","@voltro/content":"0.63.0","@voltro/runtime":"0.63.0","@effect/workflow":"^0.19.0","@voltro/database":"0.63.0","@voltro/protocol":"0.63.0","@voltro/workflow":"0.63.0","@voltro/serverless":"0.63.0","@voltro/plugin-auth":"0.63.0","@voltro/plugin-mail":"0.63.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.63.0","@voltro/plugin-storage":"0.63.0","@voltro/plugin-webhooks":"0.63.0","@voltro/plugin-broadcast":"0.63.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.63.0_1788484339307_0.5769549180225426","host":"s3://npm-registry-packages-npm-production"}},"0.64.0":{"name":"@voltro/cli","version":"0.64.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.64.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"aab8175f3c818115a263f626211506d81f57cfd4","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.64.0.tgz","fileCount":1071,"integrity":"sha512-iyc8bNDDArV63cXTKk6F19k22nS8UDaDaJCCCYTg09WwEPMTkI6cWmq/JwX281BEnOT1o7YygJJNWN2Qu5pOPA==","signatures":[{"sig":"MEQCIEoMfVEXDluNo95NJmZtpc5SzpeQl26Ch/asPW5p0IQJAiA7teKdtuHtijelsK/XIArAd6NOUS1nhLh6IkdWHXGpCg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10796904},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"ba9a7ddc9715a118514b775b3b8e32ab40423126","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.64.0","@voltro/kv":"0.64.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.64.0","@voltro/cache":"0.64.0","@voltro/client":"0.64.0","@voltro/logger":"0.64.0","@voltro/content":"0.64.0","@voltro/runtime":"0.64.0","@effect/workflow":"^0.19.0","@voltro/database":"0.64.0","@voltro/protocol":"0.64.0","@voltro/workflow":"0.64.0","@voltro/serverless":"0.64.0","@voltro/plugin-auth":"0.64.0","@voltro/plugin-mail":"0.64.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.64.0","@voltro/plugin-storage":"0.64.0","@voltro/plugin-webhooks":"0.64.0","@voltro/plugin-broadcast":"0.64.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.64.0_1788529835583_0.806377742029583","host":"s3://npm-registry-packages-npm-production"}},"0.65.0":{"name":"@voltro/cli","version":"0.65.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.65.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"76820097511a383c6fa2f646fdd00c52a8caf01f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.65.0.tgz","fileCount":1071,"integrity":"sha512-sNYtKZARZhiWzpJw6SRvULItUeAdcSWeo/M4xbsC0p1w+9mnaPc7ET9KyJooA8bTmFQjruI4weH/E3Z1RMqFaw==","signatures":[{"sig":"MEUCIQDUgLCIB6RDcrby7TClSjiI6pGarvOely91bYgRKO2jVAIgEM3d6H2HlsSlTBJA+vF5ld7Wtw8LoVLif6C6Jx0yZo0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10804635},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"5bc9ba8630674b3d4ce4b7495ec54d9f49b27d26","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.65.0","@voltro/kv":"0.65.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.65.0","@voltro/cache":"0.65.0","@voltro/client":"0.65.0","@voltro/logger":"0.65.0","@voltro/content":"0.65.0","@voltro/runtime":"0.65.0","@effect/workflow":"^0.19.0","@voltro/database":"0.65.0","@voltro/protocol":"0.65.0","@voltro/workflow":"0.65.0","@voltro/serverless":"0.65.0","@voltro/plugin-auth":"0.65.0","@voltro/plugin-mail":"0.65.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.65.0","@voltro/plugin-storage":"0.65.0","@voltro/plugin-webhooks":"0.65.0","@voltro/plugin-broadcast":"0.65.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.65.0_1788557453551_0.06747528942307768","host":"s3://npm-registry-packages-npm-production"}},"0.66.0":{"name":"@voltro/cli","version":"0.66.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.66.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"7b21ae6a84d723070e09da3fd7e216905d3f40df","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.66.0.tgz","fileCount":1073,"integrity":"sha512-gbSRSJ1PqtRcGiwj9zABGh8zieLStINIWaqcMk6SdWRWMbfzVjGRTYi1iIErX4aFWcDnUp2lRPilwRuJFKXuIg==","signatures":[{"sig":"MEUCIQC0Q4EKHG8h1xH5VZx81bWx/TFPMCQJHv95CBSNg5flNgIgK3H9zFNhi5LexZFBOWhLH9PO7ma4v9mr2VcnpxSokmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10899500},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"4c2c7537648a1451c49c7fccc2389becb5b27fdb","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.66.0","@voltro/kv":"0.66.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.66.0","@voltro/cache":"0.66.0","@voltro/client":"0.66.0","@voltro/logger":"0.66.0","@voltro/content":"0.66.0","@voltro/runtime":"0.66.0","@effect/workflow":"^0.19.0","@voltro/database":"0.66.0","@voltro/protocol":"0.66.0","@voltro/workflow":"0.66.0","@voltro/serverless":"0.66.0","@voltro/plugin-auth":"0.66.0","@voltro/plugin-mail":"0.66.0","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.66.0","@voltro/plugin-storage":"0.66.0","@voltro/plugin-webhooks":"0.66.0","@voltro/plugin-broadcast":"0.66.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.66.0_1788695933648_0.2352447509931197","host":"s3://npm-registry-packages-npm-production"}},"0.66.1":{"name":"@voltro/cli","version":"0.66.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.66.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"944e4efd42d5fb034ad4c1e679b66370d1bf1a80","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.66.1.tgz","fileCount":1073,"integrity":"sha512-Q9DUlZ2G2XcTvMzvDYzKZ1hhKZFlIPDelV5uX08c8VgTtBhXCUOyVXDSgtpc0DFh+5e0L/LER0RoiYtAKkDL8g==","signatures":[{"sig":"MEQCIGbb/LXYBeN2NPbcx7s+yZLYRC/+wor0xSC0IF6aGmBmAiA0QTryoUofVBBk0afwQAQ4IrlaPByIKsIUCuVLCOuEVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10876958},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"8c2fce7d2284145215ab4990414663d498eb22d9","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.66.1","@voltro/kv":"0.66.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.0","@voltro/env":"0.66.1","@voltro/cache":"0.66.1","@voltro/client":"0.66.1","@voltro/logger":"0.66.1","@voltro/content":"0.66.1","@voltro/runtime":"0.66.1","@effect/workflow":"^0.19.0","@voltro/database":"0.66.1","@voltro/protocol":"0.66.1","@voltro/workflow":"0.66.1","@voltro/serverless":"0.66.1","@voltro/plugin-auth":"0.66.1","@voltro/plugin-mail":"0.66.1","@effect/platform-node":"^0.108.0","@voltro/data-transfer":"0.66.1","@voltro/plugin-storage":"0.66.1","@voltro/plugin-webhooks":"0.66.1","@voltro/plugin-broadcast":"0.66.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.0","@effect/rpc":"^0.76.0","@effect/platform":"^0.97.0"},"optionalDependencies":{"tsx":"^4.23.12","vite":"^8.2.1","sharp":"^0.35.3","satori":"0.29.0","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.10.2","subset-font":"^2.5.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.7.13","@vitejs/plugin-react":"^6.0.5"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.66.1_1788722058114_0.8021442504920218","host":"s3://npm-registry-packages-npm-production"}},"0.67.0":{"name":"@voltro/cli","version":"0.67.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.67.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"681ef916a13bb5aaf81cbe888d4874fa76213a11","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.67.0.tgz","fileCount":1114,"integrity":"sha512-/skXYplbks/DRObLRh3YQSEWEQndR2Plm++KW0ZG7yYn28d35fYOQk2CwKDaOAncFXMuTSMeVU/K7zD7wDyvog==","signatures":[{"sig":"MEUCIAM/DQe+EuQLmw/UuvcXAeoIGrx0uSEnRUvhBT2oRbxVAiEA0LB3xcPuEpM8Y2SNtvU8kPjbA1PNY2Ku6DI3H8cePLg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12253124},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"e77a85c1f075e2767aba0ce0214e6976ea2bf89d","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.67.0","@voltro/kv":"0.67.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.67.0","@voltro/cache":"0.67.0","@voltro/client":"0.67.0","@voltro/logger":"0.67.0","@voltro/content":"0.67.0","@voltro/runtime":"0.67.0","@effect/workflow":"^0.19.1","@voltro/database":"0.67.0","@voltro/protocol":"0.67.0","@voltro/workflow":"0.67.0","@voltro/serverless":"0.67.0","@voltro/plugin-auth":"0.67.0","@voltro/plugin-mail":"0.67.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.67.0","@voltro/plugin-storage":"0.67.0","@voltro/plugin-webhooks":"0.67.0","@voltro/plugin-broadcast":"0.67.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.67.0_1788774668287_0.10383160260319646","host":"s3://npm-registry-packages-npm-production"}},"0.68.0":{"name":"@voltro/cli","version":"0.68.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.68.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"5977da4b68692ffa6fbdf4aa4859b6451cfd4ab7","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.68.0.tgz","fileCount":1115,"integrity":"sha512-dwaZPtFWAMUAWeilpZzbPfN4epXHwm5OvFXzkIlvfluILfLGapjmBfaekcx+i8LnakBr0vBq2Lp9yd1DWTGxvw==","signatures":[{"sig":"MEUCIQCr154BfZrTyDnmbOUjkB5wwe+UCNmYNdPdcf8xeP2d/AIgCVtgms5Wa08B9rnq7+vanvPM3ScGkivfZg7D0Ciq3Nw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12374022},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"1424c773bcd815024459e96b54cb8a28562dc925","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.68.0","@voltro/kv":"0.68.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.68.0","@voltro/cache":"0.68.0","@voltro/client":"0.68.0","@voltro/logger":"0.68.0","@voltro/content":"0.68.0","@voltro/runtime":"0.68.0","@effect/workflow":"^0.19.1","@voltro/database":"0.68.0","@voltro/protocol":"0.68.0","@voltro/workflow":"0.68.0","@voltro/serverless":"0.68.0","@voltro/plugin-auth":"0.68.0","@voltro/plugin-mail":"0.68.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.68.0","@voltro/plugin-storage":"0.68.0","@voltro/plugin-webhooks":"0.68.0","@voltro/plugin-broadcast":"0.68.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.68.0_1788997019846_0.9287458311612578","host":"s3://npm-registry-packages-npm-production"}},"0.69.0":{"name":"@voltro/cli","version":"0.69.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.69.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"2879817f0105478a884e27ffdcfc16883fe3b178","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.69.0.tgz","fileCount":1115,"integrity":"sha512-Z3LWSq4VSyRk0SGb0jZWeV01a0g2lwpTN6BQuviUU+8LgnY+5zt3q28p+A4mM0x9GwM87oRCFz5iuSkWlwc4zA==","signatures":[{"sig":"MEUCIB9tOM5Y1ONsCEHZ/ue6yymkCujR8rTHiob4TzL72r7nAiEAnjlQMQQJ13VXGCwJxWVp2q8ZvTZAsNsyQHbJWkzeHRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12427639},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"759902527c6e630c6fd5e7d0dfb4e1d72f473f96","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.69.0","@voltro/kv":"0.69.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.69.0","@voltro/cache":"0.69.0","@voltro/client":"0.69.0","@voltro/logger":"0.69.0","@voltro/content":"0.69.0","@voltro/runtime":"0.69.0","@effect/workflow":"^0.19.1","@voltro/database":"0.69.0","@voltro/protocol":"0.69.0","@voltro/workflow":"0.69.0","@voltro/serverless":"0.69.0","@voltro/plugin-auth":"0.69.0","@voltro/plugin-mail":"0.69.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.69.0","@voltro/plugin-storage":"0.69.0","@voltro/plugin-webhooks":"0.69.0","@voltro/plugin-broadcast":"0.69.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.69.0_1789063256343_0.5631778511590086","host":"s3://npm-registry-packages-npm-production"}},"0.69.1":{"name":"@voltro/cli","version":"0.69.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.69.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"21dfa803d69d9cf5f7ed1345215c879a76a09023","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.69.1.tgz","fileCount":1115,"integrity":"sha512-9VCIprUUmXIKPHJclo8snS8pWm7geA0P2Ekhzf3Teh5U9ho36Vkl5p66/dLPmYmPs3wzDt3jlUs8a03b81i+zA==","signatures":[{"sig":"MEUCIQDo7CGiFAXYSqW9Wae5DwRQmbMbzZrhIqt/y1mkuUHG/wIgZov1j8MYrlj8CKgOH0Q8GpINTeC/rCxQ+Lv9/o+/Tsc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12481224},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — backfill them","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"0146bf846c8d7725a229e27d075ae1faed6a39b8","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.69.1","@voltro/kv":"0.69.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.69.1","@voltro/cache":"0.69.1","@voltro/client":"0.69.1","@voltro/logger":"0.69.1","@voltro/content":"0.69.1","@voltro/runtime":"0.69.1","@effect/workflow":"^0.19.1","@voltro/database":"0.69.1","@voltro/protocol":"0.69.1","@voltro/workflow":"0.69.1","@voltro/serverless":"0.69.1","@voltro/plugin-auth":"0.69.1","@voltro/plugin-mail":"0.69.1","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.69.1","@voltro/plugin-storage":"0.69.1","@voltro/plugin-webhooks":"0.69.1","@voltro/plugin-broadcast":"0.69.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.69.1_1789135287628_0.8142946349963871","host":"s3://npm-registry-packages-npm-production"}},"0.70.0":{"name":"@voltro/cli","version":"0.70.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.70.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"b09adeefbeb1f995f8eddf8bcd3936516a88acb9","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.70.0.tgz","fileCount":1118,"integrity":"sha512-fWEU04QjVnAdLczFd9pfGFwv24h4eN9urqIcMQ/LSrNvm8GJuZGbrNHHbOY+Ej24d7cNNc6fTQKOxEFy/BQeLA==","signatures":[{"sig":"MEQCIHkUUw3rJTP190m6POZnICelLcONH4D2Xqxq69z0u+r5AiBJR+xvcWLhjzhcUJ4PQZNzCjbXGKjPLHfih/1pTwqtPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12544372},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"7489970500b6c06dccd46cb777a11277c06ea53b","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.70.0","@voltro/kv":"0.70.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.70.0","@voltro/cache":"0.70.0","@voltro/client":"0.70.0","@voltro/logger":"0.70.0","@voltro/content":"0.70.0","@voltro/runtime":"0.70.0","@effect/workflow":"^0.19.1","@voltro/database":"0.70.0","@voltro/protocol":"0.70.0","@voltro/workflow":"0.70.0","@voltro/serverless":"0.70.0","@voltro/plugin-auth":"0.70.0","@voltro/plugin-mail":"0.70.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.70.0","@voltro/plugin-storage":"0.70.0","@voltro/plugin-webhooks":"0.70.0","@voltro/plugin-broadcast":"0.70.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.70.0_1789165237943_0.5958773302091713","host":"s3://npm-registry-packages-npm-production"}},"0.71.0":{"name":"@voltro/cli","version":"0.71.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.71.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"e3ce2df069732b883ec0b71746b5b5758a6675ae","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.71.0.tgz","fileCount":1149,"integrity":"sha512-Tt95vehSCojakL6DpsjDiiqjFrTIchOPyi5EKyCyhThQQVMF/N82G0bhKCf1YdLXHp71mZTGt8sYn4+XrRyO5g==","signatures":[{"sig":"MEUCIQCD0CHbP7zwKjPAHL1xLpEprjkKlwgET0B9wJOsDx28ogIgB7EJBtejFUt4kvunPn7Wx1JNvGNibIFSgm8AfvleLMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13446538},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"28f5a0f72991a6403342aa0a7d1f54f7038bcf2d","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.71.0","@voltro/kv":"0.71.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.71.0","@voltro/cache":"0.71.0","@voltro/client":"0.71.0","@voltro/logger":"0.71.0","@voltro/content":"0.71.0","@voltro/runtime":"0.71.0","@effect/workflow":"^0.19.1","@voltro/database":"0.71.0","@voltro/protocol":"0.71.0","@voltro/workflow":"0.71.0","@voltro/api-client":"0.71.0","@voltro/serverless":"0.71.0","@voltro/plugin-auth":"0.71.0","@voltro/plugin-mail":"0.71.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.71.0","@voltro/plugin-openapi":"0.71.0","@voltro/plugin-storage":"0.71.0","@voltro/plugin-webhooks":"0.71.0","@voltro/plugin-broadcast":"0.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.71.0_1789386654754_0.8780431420081283","host":"s3://npm-registry-packages-npm-production"}},"0.71.1":{"name":"@voltro/cli","version":"0.71.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.71.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"85cee1b29973b30ce6383ca572329cfe2d1d5d94","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.71.1.tgz","fileCount":1149,"integrity":"sha512-uOgcyFM9KZSG0j75/Pu+ExnE9NDh+DWE8D09+dtMr0k70fR1CNtVHgceCrw2xKUIPB/a8rGVp0hSkwH98F8xTA==","signatures":[{"sig":"MEUCICAGQg9Aewq717lESjQDEA5lZiGIvQncVYxR9zZ78nkyAiEAgFTy1szeSwYHyg+ZmI9y5Q7oyh/SEVzlsEiLeBxbVsE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2pUVT3b0DmqtisGSROfflYdPomcCEkAwAhWCS5mXwpQIhAKBSZsM6JPxBTQfqADQ0EqqXgFzFEb5mRJKWrzNBFsQp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13268070},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"3f5e511181306d80ca031926aeafe8c6d3120ead","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.71.1","@voltro/kv":"0.71.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.71.1","@voltro/cache":"0.71.1","@voltro/client":"0.71.1","@voltro/logger":"0.71.1","@voltro/content":"0.71.1","@voltro/runtime":"0.71.1","@effect/workflow":"^0.19.1","@voltro/database":"0.71.1","@voltro/protocol":"0.71.1","@voltro/workflow":"0.71.1","@voltro/api-client":"0.71.1","@voltro/serverless":"0.71.1","@voltro/plugin-auth":"0.71.1","@voltro/plugin-mail":"0.71.1","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.71.1","@voltro/plugin-openapi":"0.71.1","@voltro/plugin-storage":"0.71.1","@voltro/plugin-webhooks":"0.71.1","@voltro/plugin-broadcast":"0.71.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.71.1_1789425622760_0.8915509997445339","host":"s3://npm-registry-packages-npm-production"}},"0.72.0":{"name":"@voltro/cli","version":"0.72.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.72.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"532ab0f403990751373980c3f2375abdc2241f27","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.72.0.tgz","fileCount":1149,"integrity":"sha512-Kxwm6PJ+XFNRbsMMgqFLc9As5tqOX2xbG1C0pI+ajugVR4UrnPqzlXoGWtpAYIDZJnPwVo0So3dcpGB7n2FG5A==","signatures":[{"sig":"MEUCIQCjMuHDuVnrZY5gLvQuwrpLAUo49DRrOX/teM6awJHuVQIgKce/rrOaOluXW9shyyDwgHjNmkwkHyk0ypg4KXy4LTA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIECTbZZ5WQnsou3X+GenI1tdLew/iqMTiuNu40OxNaLTAiEAh4X5jXguHRXlZo/5IbCWY2g1xAhl/3jmfaJUURu2KwQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13517374},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"ba4a226e081f61873b1014a20fc21cf4a18ff556","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.72.0","@voltro/kv":"0.72.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.72.0","@voltro/cache":"0.72.0","@voltro/client":"0.72.0","@voltro/logger":"0.72.0","@voltro/content":"0.72.0","@voltro/runtime":"0.72.0","@effect/workflow":"^0.19.1","@voltro/database":"0.72.0","@voltro/protocol":"0.72.0","@voltro/workflow":"0.72.0","@voltro/api-client":"0.72.0","@voltro/serverless":"0.72.0","@voltro/plugin-auth":"0.72.0","@voltro/plugin-mail":"0.72.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.72.0","@voltro/plugin-openapi":"0.72.0","@voltro/plugin-storage":"0.72.0","@voltro/plugin-webhooks":"0.72.0","@voltro/plugin-broadcast":"0.72.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.72.0_1789614975419_0.169113770076613","host":"s3://npm-registry-packages-npm-production"}},"0.73.0":{"name":"@voltro/cli","version":"0.73.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.73.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"30a1f74be1ccb55a78ce35c5760cfd340768823f","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.73.0.tgz","fileCount":1149,"integrity":"sha512-gLVdSBYFmmmN0uCbAL0UJSrI7GAG34fw4pWovi9eGvqp495daNXhoiRhEtAi4MlJK2ISRukKjIm9qYfe+X6ZnA==","signatures":[{"sig":"MEUCIHIkwMB+2tLZDbAosL2uwKxALgj3e2U+VqYziE/b2YE2AiEA78NJciXEWkFU5+m/GTjiXhXIZtvTGcO6a3zoPIAXbSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBzqoo8PbskRUUBUTpvItkcAPXqFOy+4Qozd94igh+ohAiBS9rhFzjyzkdfy/1wpn96y/oXkfWcrNZ1nuxKFCa8Vkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13455372},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"a8b471cc7d96dacfdc99eb3a39efdc196e397864","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.73.0","@voltro/kv":"0.73.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.73.0","@voltro/cache":"0.73.0","@voltro/client":"0.73.0","@voltro/logger":"0.73.0","@voltro/content":"0.73.0","@voltro/runtime":"0.73.0","@effect/workflow":"^0.19.1","@voltro/database":"0.73.0","@voltro/protocol":"0.73.0","@voltro/workflow":"0.73.0","@voltro/api-client":"0.73.0","@voltro/serverless":"0.73.0","@voltro/plugin-auth":"0.73.0","@voltro/plugin-mail":"0.73.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.73.0","@voltro/plugin-openapi":"0.73.0","@voltro/plugin-storage":"0.73.0","@voltro/plugin-webhooks":"0.73.0","@voltro/plugin-broadcast":"0.73.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.73.0_1789680921586_0.3019568203399665","host":"s3://npm-registry-packages-npm-production"}},"0.74.0":{"name":"@voltro/cli","version":"0.74.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.74.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"674eae28dba318e26c6652ff1d9dc178bdb532a7","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.74.0.tgz","fileCount":1153,"integrity":"sha512-Dj/N2vlpNiHMIi4D3k/fFG3CdWPpORRClm8b4C0CtKpfkYTc9FwiBYUNRsoVLJglfLJXLpUKWwmvDLMSV9W8Ow==","signatures":[{"sig":"MEYCIQChZO5e+cugeEjfq1N9s3Pma5rJZNobfY4VBM/P420YOAIhAJT1BbH1O8/oits1dqMH8et/B6GExvlDAr/XqLeSMGG/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDuFA9gF6PeqvFOqIWllRsx7QiYrJLst28tl1E5RQ2WOwIgJZs9ywnQ9au+eUOC13qX1jFBEYGsFjrDqqbtcUql/UA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13487162},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"367c5f25e3514f82d35eea0c3b01e5d6b32bf29e","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.74.0","@voltro/kv":"0.74.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.74.0","@voltro/cache":"0.74.0","@voltro/client":"0.74.0","@voltro/logger":"0.74.0","@voltro/content":"0.74.0","@voltro/runtime":"0.74.0","@effect/workflow":"^0.19.1","@voltro/database":"0.74.0","@voltro/protocol":"0.74.0","@voltro/workflow":"0.74.0","@voltro/api-client":"0.74.0","@voltro/serverless":"0.74.0","@voltro/plugin-auth":"0.74.0","@voltro/plugin-mail":"0.74.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.74.0","@voltro/plugin-openapi":"0.74.0","@voltro/plugin-storage":"0.74.0","@voltro/plugin-webhooks":"0.74.0","@voltro/plugin-broadcast":"0.74.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.74.0_1789788302292_0.9913213389158715","host":"s3://npm-registry-packages-npm-production"}},"0.75.0":{"name":"@voltro/cli","version":"0.75.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.75.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"80c3d69dead4a626231972ac414fef035cdef5a2","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.75.0.tgz","fileCount":1153,"integrity":"sha512-AFC4xW5dFx5sF7c5rfAxRkmCgvPdaimbQjoODzvzmeiDwfaOhffzwZORtoG/DMw+yGhM3ZWBRduW3b9hEpJQqw==","signatures":[{"sig":"MEQCIHd7duhh+bxfRKePthLk84Nm4y8rt3EcsB7QrIvq5CaKAiAb/R8g2rJ+UN+Br19c5wJGrP1KIL5GYFVvL9pNeUjhhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD5AsOIeaLfziCHXdCRYCHomYuY3suozWAPsf+VPAozrgIhAPw7AWGYUGvHLkNKEGWmbbrnShfCZOQx3Z3/rz4pVPFI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13604527},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"6042badbdbf164167c525bbc2f90043a56b74321","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.75.0","@voltro/kv":"0.75.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.75.0","@voltro/cache":"0.75.0","@voltro/client":"0.75.0","@voltro/logger":"0.75.0","@voltro/content":"0.75.0","@voltro/runtime":"0.75.0","@effect/workflow":"^0.19.1","@voltro/database":"0.75.0","@voltro/protocol":"0.75.0","@voltro/workflow":"0.75.0","@voltro/api-client":"0.75.0","@voltro/serverless":"0.75.0","@voltro/plugin-auth":"0.75.0","@voltro/plugin-mail":"0.75.0","@effect/platform-node":"^0.108.1","@voltro/data-transfer":"0.75.0","@voltro/plugin-openapi":"0.75.0","@voltro/plugin-storage":"0.75.0","@voltro/plugin-webhooks":"0.75.0","@voltro/plugin-broadcast":"0.75.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.1","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.1"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.2.2","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.12.6","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.0.2","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.75.0_1789850569936_0.328565994537251","host":"s3://npm-registry-packages-npm-production"}},"0.76.0":{"name":"@voltro/cli","version":"0.76.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.76.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"dca8c6494a6a1fde63744e5335d07c1f31b7d046","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.76.0.tgz","fileCount":1153,"integrity":"sha512-jnLFVN2XtElHzhNUhyGwnh7n3eCcgRuSusasi1PRzkdRh2ajjERX5B0s5vqtldd/rEGwUqbO98Ziudye3kK7+A==","signatures":[{"sig":"MEUCICmeF7vCyecJrqDuxAfYYxjAWTJsdUyrRDKo5RbiZzF/AiEA+dKeCueRbrCGuL7JR9+RUSQP6Km4ZqxgzRA+5syvGnI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGHSCiVhUjUDbjv3rMScv8UuRgIu++pM5ti2scqrCMbzAiA0dAJyvKw2zecvGrm+onwrC/A6EIk5ZMtQXPwlcfkYuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13803120},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"383197b8e70b788d7471a9c8b786cb52958239a1","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.76.0","@voltro/kv":"0.76.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.76.0","@voltro/cache":"0.76.0","@voltro/client":"0.76.0","@voltro/logger":"0.76.0","@voltro/content":"0.76.0","@voltro/runtime":"0.76.0","@effect/workflow":"^0.19.1","@voltro/database":"0.76.0","@voltro/protocol":"0.76.0","@voltro/workflow":"0.76.0","@voltro/api-client":"0.76.0","@voltro/serverless":"0.76.0","@voltro/plugin-auth":"0.76.0","@voltro/plugin-mail":"0.76.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.76.0","@voltro/plugin-openapi":"0.76.0","@voltro/plugin-storage":"0.76.0","@voltro/plugin-webhooks":"0.76.0","@voltro/plugin-broadcast":"0.76.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.76.0_1789978029372_0.30333799892463453","host":"s3://npm-registry-packages-npm-production"}},"0.77.0":{"name":"@voltro/cli","version":"0.77.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.77.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"c43fcf8b6d0fa3f31db5db0c0958d8b68c9a51cd","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.77.0.tgz","fileCount":1154,"integrity":"sha512-tAso7nePIO1JXUS4NqPgvf5hQt54y21PaKpq9vLFXN70nCoFIjKUKc29wwyu960TpxLdIGoOAWNV+QXmpnt1iw==","signatures":[{"sig":"MEQCIH/2MSdUAF2wpifZf33HXic3P9G5uIWqGUezpFiLrdznAiAe8QFIwNOhbgMzc9WhyPsVdu0W7SyzBGBnWXGKmiiQjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDQaHH5W+b3KjDK0x51uCDVkIutzdcdNQhRQkGHX21KQgIhAK3nzLGmJUOW4E98ilxOXAJ0k4nO2qFgy3L/Df6SqSxr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13810466},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"a121036fb2e7a0f83d436e03f6dbf81d1eccadb9","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.77.0","@voltro/kv":"0.77.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.77.0","@voltro/cache":"0.77.0","@voltro/client":"0.77.0","@voltro/logger":"0.77.0","@voltro/content":"0.77.0","@voltro/runtime":"0.77.0","@effect/workflow":"^0.19.1","@voltro/database":"0.77.0","@voltro/protocol":"0.77.0","@voltro/workflow":"0.77.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.77.0","@voltro/serverless":"0.77.0","@voltro/plugin-auth":"0.77.0","@voltro/plugin-mail":"0.77.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.77.0","@voltro/plugin-openapi":"0.77.0","@voltro/plugin-storage":"0.77.0","@voltro/plugin-webhooks":"0.77.0","@voltro/plugin-broadcast":"0.77.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.77.0_1790049349495_0.34042665136719474","host":"s3://npm-registry-packages-npm-production"}},"0.77.1":{"name":"@voltro/cli","version":"0.77.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.77.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"2a2715c642aeee02e7adc1554719c8a930730df2","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.77.1.tgz","fileCount":1154,"integrity":"sha512-gdddHlfiLDTMo11oN92HViT6qYwNE1f3l+emya5Lcixrn0V5YKGHeSWZa7U78So1rKCw0Vt84poE63DHn9bDgA==","signatures":[{"sig":"MEUCIHnyckLugsw2vYP2ydycLWn5b1JEeWtYvHuwaaDldlupAiEAr0owI7iaqsrCT7rPVZMv9kEUiQr2IP70KP7WkBeSJ/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCLWRlPHNOq+3v2b2AntmEh94gmU44zkDIyEGZ9OdcBPwIhAMybEzB+fvtsCpxrzGX6j1iFdP/ZHpdsk25nCwAcKNBD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13798339},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"5906837eda2dae522829a02ccae313bb49f5fedf","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.77.1","@voltro/kv":"0.77.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.77.1","@voltro/cache":"0.77.1","@voltro/client":"0.77.1","@voltro/logger":"0.77.1","@voltro/content":"0.77.1","@voltro/runtime":"0.77.1","@effect/workflow":"^0.19.1","@voltro/database":"0.77.1","@voltro/protocol":"0.77.1","@voltro/workflow":"0.77.1","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.77.1","@voltro/serverless":"0.77.1","@voltro/plugin-auth":"0.77.1","@voltro/plugin-mail":"0.77.1","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.77.1","@voltro/plugin-openapi":"0.77.1","@voltro/plugin-storage":"0.77.1","@voltro/plugin-webhooks":"0.77.1","@voltro/plugin-broadcast":"0.77.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.77.1_1790060891455_0.2728812306441686","host":"s3://npm-registry-packages-npm-production"}},"0.78.0":{"name":"@voltro/cli","version":"0.78.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.78.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"d330fb42af26cc3528289ce2182e0656dab5fb22","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.78.0.tgz","fileCount":1154,"integrity":"sha512-t+MI8uwhieZBH57FrCKIBvZDqJG0gKrHSTe1LDnMbmtjDMwGFboi0RicUgs8q0UoQ25J/6HZYjwFRTPcVag+sQ==","signatures":[{"sig":"MEQCIApp6rx9XHtCSL79X1zAMLa727pnYBWd7Fw51vq89KupAiAzzEPVSFGUwNkIrKQf6cAdkDO1pP21gO9SGxLQg0PQlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIED9Gw0VcLEeivYZ+1MYlC8deLgT4sxlbPVTAHHAItDOAiEAk5w5xk0frrq5/J5Jvc88ivuaLFeD+wXLfVV5szaVfTQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13830402},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"eea3c6f1fcef03b7239ae7e133c246cea4f17f74","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.78.0","@voltro/kv":"0.78.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.78.0","@voltro/cache":"0.78.0","@voltro/client":"0.78.0","@voltro/logger":"0.78.0","@voltro/content":"0.78.0","@voltro/runtime":"0.78.0","@effect/workflow":"^0.19.1","@voltro/database":"0.78.0","@voltro/protocol":"0.78.0","@voltro/workflow":"0.78.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.78.0","@voltro/serverless":"0.78.0","@voltro/plugin-auth":"0.78.0","@voltro/plugin-mail":"0.78.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.78.0","@voltro/plugin-openapi":"0.78.0","@voltro/plugin-storage":"0.78.0","@voltro/plugin-webhooks":"0.78.0","@voltro/plugin-broadcast":"0.78.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.78.0_1790092127199_0.19905284689509628","host":"s3://npm-registry-packages-npm-production"}},"0.79.0":{"name":"@voltro/cli","version":"0.79.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.79.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"8a38364cb920825b1ed50448b90230587c4292cf","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.79.0.tgz","fileCount":1155,"integrity":"sha512-NCCF8MEs5zfmfXe9c8gKWytjujJOsrPmUfVwqGPvWYTamfCYTwuGZApGD8D3OCR95VSNnzd1qACFUY+FooZp7g==","signatures":[{"sig":"MEQCIBWQEJubZ7iipEWzG8KFTqf3CHgVYCEi8EFcAi0K+SG7AiBZv00NbPZKDrzt64IcnsLCDl3i5XA7Xo8LTYB0WtGmDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDv42ohK2yFJAf/sVh1Tg2Gp87neJko/T5iuHvKJAqm0AIhAOGJVMYq7nJLVUtdK/mXVK1aSu9juE3QTe09eohNtvVt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13875279},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.79.0/01_probes-on-the-app-port","kind":"manual","title":"Probes answer on the app port on every command; the dev probe port is gone","version":"0.79.0"},{"id":"0.79.0/03_rejected-credentials-refused-on-the-default-policy","kind":"manual","title":"A rejected credential is refused on the default tenant policy too","version":"0.79.0"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"72134ee7c16cc20aface9e1246d787ecb3cfef21","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.79.0","@voltro/kv":"0.79.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.79.0","@voltro/cache":"0.79.0","@voltro/client":"0.79.0","@voltro/logger":"0.79.0","@voltro/content":"0.79.0","@voltro/runtime":"0.79.0","@effect/workflow":"^0.19.1","@voltro/database":"0.79.0","@voltro/protocol":"0.79.0","@voltro/workflow":"0.79.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.79.0","@voltro/serverless":"0.79.0","@voltro/plugin-auth":"0.79.0","@voltro/plugin-mail":"0.79.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.79.0","@voltro/plugin-openapi":"0.79.0","@voltro/plugin-storage":"0.79.0","@voltro/plugin-webhooks":"0.79.0","@voltro/plugin-broadcast":"0.79.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.79.0_1790168539812_0.7716461527927041","host":"s3://npm-registry-packages-npm-production"}},"0.79.1":{"name":"@voltro/cli","version":"0.79.1","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.79.1","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"7eaa947111a0c09a133e7da804967739eeac15cc","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.79.1.tgz","fileCount":1155,"integrity":"sha512-hLFK1wz8nevs3Rgm8Jwu92tDjRyL5Q06RtFPaMtvCSLtvNS/xS5RKT9RFC5istvqEtcnNvuW9NIHu6q6vEOWCg==","signatures":[{"sig":"MEUCIQDaE7Wv1by6PELLMwD+PB+Z/d6BCkMqTkIG5XpSleBPgQIgWrUWcXN6iTCqty7H7HH5hryp/7y5E3oRNvKQ/R6F7AE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF853yB5nq4FMG6l7ub9u2NBeTudBRI7craZQ/o0sBZXAiA7XBgH5t0qIqPN5/DwsVNMCLGDmxbn50D7vUxbEknZyg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13898580},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.79.0/01_probes-on-the-app-port","kind":"manual","title":"Probes answer on the app port on every command; the dev probe port is gone","version":"0.79.0"},{"id":"0.79.0/03_rejected-credentials-refused-on-the-default-policy","kind":"manual","title":"A rejected credential is refused on the default tenant policy too","version":"0.79.0"},{"id":"0.79.1/01_compose-baseline-probes-need-a-sync","kind":"manual","title":"A compose baseline synced before 0.79.0 still probes the removed dev port — run `voltro baseline sync`","version":"0.79.1"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"1e68bd1e02947739638d7e96dbbc75bc91bd0759","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.79.1","@voltro/kv":"0.79.1","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.79.1","@voltro/cache":"0.79.1","@voltro/client":"0.79.1","@voltro/logger":"0.79.1","@voltro/content":"0.79.1","@voltro/runtime":"0.79.1","@effect/workflow":"^0.19.1","@voltro/database":"0.79.1","@voltro/protocol":"0.79.1","@voltro/workflow":"0.79.1","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.79.1","@voltro/serverless":"0.79.1","@voltro/plugin-auth":"0.79.1","@voltro/plugin-mail":"0.79.1","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.79.1","@voltro/plugin-openapi":"0.79.1","@voltro/plugin-storage":"0.79.1","@voltro/plugin-webhooks":"0.79.1","@voltro/plugin-broadcast":"0.79.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.79.1_1790233444254_0.2842001055213754","host":"s3://npm-registry-packages-npm-production"}},"0.80.0":{"name":"@voltro/cli","version":"0.80.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.80.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"7e125ccda7085fa1e4ef6c3891d45cad3e9cdd3b","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.80.0.tgz","fileCount":1155,"integrity":"sha512-bZWPZtIcJ219fMQYRbRZISLIUdJYQUPhecqWPx5EaHE6cVTTD6qLIiTNpEzJOVitMxZRIgPX7oDiPQyIv58L2w==","signatures":[{"sig":"MEYCIQCVHkg2SuGHqxZ6EpaYR0dqubGqbIunYTs9fgA9Q/3yjgIhAIe2kZVqHNp1qb1TyqUxFBtehSbIy6fh+n3273bCeWTy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCW6T6mshveQqHC5r/ZgSbg0W5BqkIF8wirbq08kGrVawIgHy9sJfWjlhW8Pt3vioF04abO3+RVIG3K9Ut/N7VaxMg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13937106},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.79.0/01_probes-on-the-app-port","kind":"manual","title":"Probes answer on the app port on every command; the dev probe port is gone","version":"0.79.0"},{"id":"0.79.0/03_rejected-credentials-refused-on-the-default-policy","kind":"manual","title":"A rejected credential is refused on the default tenant policy too","version":"0.79.0"},{"id":"0.79.1/01_compose-baseline-probes-need-a-sync","kind":"manual","title":"A compose baseline synced before 0.79.0 still probes the removed dev port — run `voltro baseline sync`","version":"0.79.1"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.80.0/01_db-max-connections-is-the-process-budget","kind":"manual","title":"DB_MAX_CONNECTIONS is now what the whole process holds, not the size of each of its pools","version":"0.80.0"},{"id":"0.80.0/02_loader-query-in-the-browser","kind":"manual","title":"A loader has `ctx.query` in the browser too; `if (query)` no longer means the server","version":"0.80.0"},{"id":"0.80.0/03_jira-service-lists-boards","kind":"manual","title":"`JiraService` has `listBoards`; a hand-written stub of it needs one","version":"0.80.0"},{"id":"0.80.0/04_navigation-indicator-removed","kind":"manual","title":"NavigationIndicator is removed; build a loading cue from useNavigation()","version":"0.80.0"},{"id":"0.80.0/05_inspect-stream-select-returns-effect","kind":"manual","title":"An inspectStream's select returns an Effect of the selection, not a Stream","version":"0.80.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"7a1c8d4209e7113e47e8670d00d6f3e5f81ed43e","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.80.0","@voltro/kv":"0.80.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.80.0","@voltro/cache":"0.80.0","@voltro/client":"0.80.0","@voltro/logger":"0.80.0","@voltro/content":"0.80.0","@voltro/runtime":"0.80.0","@effect/workflow":"^0.19.1","@voltro/database":"0.80.0","@voltro/protocol":"0.80.0","@voltro/workflow":"0.80.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.80.0","@voltro/serverless":"0.80.0","@voltro/plugin-auth":"0.80.0","@voltro/plugin-mail":"0.80.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.80.0","@voltro/plugin-openapi":"0.80.0","@voltro/plugin-storage":"0.80.0","@voltro/plugin-webhooks":"0.80.0","@voltro/plugin-broadcast":"0.80.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.80.0_1790262953736_0.10606170538924453","host":"s3://npm-registry-packages-npm-production"}},"0.81.0":{"name":"@voltro/cli","version":"0.81.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.81.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"81feac6ffbafb0c0e5574ae378e325cbfb79fb0b","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.81.0.tgz","fileCount":1154,"integrity":"sha512-zJb4QAxOQn52pxMsuCdkMrg0ZRlYkzLSixWF3QKCAN9zuxvx607MGZ2ftx5vkoRU8NGpHuCU2f7hmzP5PDjLdQ==","signatures":[{"sig":"MEQCIFQPKoDITV1FnDudLmitUG4qNED50tfter55gKtGnD5BAiBkOXo5VDfwxuM+ZDsmS/uUfNlk6kcvWcjd8n76i6Nb6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHBbBXdTTA7SQUVZjbH8YbcdmCAxSOZYFVktyU0ZrFrBAiEAhYDz2GnTOaFf7744B0Ur1DnnFBcqw0iesvWZWH4Cato=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14037398},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.79.0/01_probes-on-the-app-port","kind":"manual","title":"Probes answer on the app port on every command; the dev probe port is gone","version":"0.79.0"},{"id":"0.79.0/03_rejected-credentials-refused-on-the-default-policy","kind":"manual","title":"A rejected credential is refused on the default tenant policy too","version":"0.79.0"},{"id":"0.79.1/01_compose-baseline-probes-need-a-sync","kind":"manual","title":"A compose baseline synced before 0.79.0 still probes the removed dev port — run `voltro baseline sync`","version":"0.79.1"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.80.0/01_db-max-connections-is-the-process-budget","kind":"manual","title":"DB_MAX_CONNECTIONS is now what the whole process holds, not the size of each of its pools","version":"0.80.0"},{"id":"0.80.0/02_loader-query-in-the-browser","kind":"manual","title":"A loader has `ctx.query` in the browser too; `if (query)` no longer means the server","version":"0.80.0"},{"id":"0.80.0/03_jira-service-lists-boards","kind":"manual","title":"`JiraService` has `listBoards`; a hand-written stub of it needs one","version":"0.80.0"},{"id":"0.80.0/04_navigation-indicator-removed","kind":"manual","title":"NavigationIndicator is removed; build a loading cue from useNavigation()","version":"0.80.0"},{"id":"0.80.0/05_inspect-stream-select-returns-effect","kind":"manual","title":"An inspectStream's select returns an Effect of the selection, not a Stream","version":"0.80.0"},{"id":"0.81.0/01_one-database-per-app","kind":"manual","title":"Each api app owns its database schema; a second app on it refuses to boot","version":"0.81.0"},{"id":"0.81.0/02_store-refuses-undeclared-tables","kind":"manual","title":"Store calls on a table the app does not declare now fail","version":"0.81.0"},{"id":"0.81.0/03_compose-baseline-one-database-per-api-app","kind":"manual","title":"The compose baseline gives each api app its own database","version":"0.81.0"},{"id":"0.81.0/04_reaction-definition-is-a-union","kind":"manual","title":"ReactionDefinition is the union of the table form and the query form","version":"0.81.0"},{"id":"0.81.0/05_idempotency-store-renews-its-lease","kind":"manual","title":"an IdempotencyStore renews the lease of a running claim","version":"0.81.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"7962df65adc3beadaa9290086b09a40ca6496348","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.81.0","@voltro/kv":"0.81.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.81.0","@voltro/cache":"0.81.0","@voltro/client":"0.81.0","@voltro/logger":"0.81.0","@voltro/content":"0.81.0","@voltro/runtime":"0.81.0","@effect/workflow":"^0.19.1","@voltro/database":"0.81.0","@voltro/protocol":"0.81.0","@voltro/workflow":"0.81.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.81.0","@voltro/serverless":"0.81.0","@voltro/plugin-auth":"0.81.0","@voltro/plugin-mail":"0.81.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.81.0","@voltro/plugin-openapi":"0.81.0","@voltro/plugin-storage":"0.81.0","@voltro/plugin-webhooks":"0.81.0","@voltro/plugin-broadcast":"0.81.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.4","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.81.0_1790392268598_0.4923536780323583","host":"s3://npm-registry-packages-npm-production"}},"0.82.0":{"name":"@voltro/cli","version":"0.82.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.82.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"8b418e7c10b0a11c0628c700285b2c535b17a4b7","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.82.0.tgz","fileCount":1818,"integrity":"sha512-/SaVIb38VHU7BDeHaWZr0ssANRQ/sL88VgQMHDP5rHZbNz19WvX1jbb8o9lmMopa0OIHSy9xFmgjO+h5627WSg==","signatures":[{"sig":"MEQCIE19TP/gGU7swYP6Zcx1uPH05uQkdZ4Z4ra1NaHMPpL8AiAVi2jT6lDkRh2Qr6JHhqmuESrtp+n6dKzN2/xeVqJ/5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCjbbTVA12x98DGvsXIRXPg5aRVrALiUEHa0bM1ZlXrngIgMvZawdP6eu+s7luVyaihy7IAa8TuKO+yV4zK6tbzFTU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17518868},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.79.0/01_probes-on-the-app-port","kind":"manual","title":"Probes answer on the app port on every command; the dev probe port is gone","version":"0.79.0"},{"id":"0.79.0/03_rejected-credentials-refused-on-the-default-policy","kind":"manual","title":"A rejected credential is refused on the default tenant policy too","version":"0.79.0"},{"id":"0.79.1/01_compose-baseline-probes-need-a-sync","kind":"manual","title":"A compose baseline synced before 0.79.0 still probes the removed dev port — run `voltro baseline sync`","version":"0.79.1"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.80.0/01_db-max-connections-is-the-process-budget","kind":"manual","title":"DB_MAX_CONNECTIONS is now what the whole process holds, not the size of each of its pools","version":"0.80.0"},{"id":"0.80.0/02_loader-query-in-the-browser","kind":"manual","title":"A loader has `ctx.query` in the browser too; `if (query)` no longer means the server","version":"0.80.0"},{"id":"0.80.0/03_jira-service-lists-boards","kind":"manual","title":"`JiraService` has `listBoards`; a hand-written stub of it needs one","version":"0.80.0"},{"id":"0.80.0/04_navigation-indicator-removed","kind":"manual","title":"NavigationIndicator is removed; build a loading cue from useNavigation()","version":"0.80.0"},{"id":"0.80.0/05_inspect-stream-select-returns-effect","kind":"manual","title":"An inspectStream's select returns an Effect of the selection, not a Stream","version":"0.80.0"},{"id":"0.81.0/01_one-database-per-app","kind":"manual","title":"Each api app owns its database schema; a second app on it refuses to boot","version":"0.81.0"},{"id":"0.81.0/02_store-refuses-undeclared-tables","kind":"manual","title":"Store calls on a table the app does not declare now fail","version":"0.81.0"},{"id":"0.81.0/03_compose-baseline-one-database-per-api-app","kind":"manual","title":"The compose baseline gives each api app its own database","version":"0.81.0"},{"id":"0.81.0/04_reaction-definition-is-a-union","kind":"manual","title":"ReactionDefinition is the union of the table form and the query form","version":"0.81.0"},{"id":"0.81.0/05_idempotency-store-renews-its-lease","kind":"manual","title":"an IdempotencyStore renews the lease of a running claim","version":"0.81.0"},{"id":"0.82.0/01_bootstrap-helpers-take-the-store-charset","kind":"manual","title":"The bookkeeping-table helpers take the store charset","version":"0.82.0"},{"id":"0.82.0/02_encrypt-steps-is-encrypted","kind":"transform","title":"workflow({ encryptSteps }) is workflow({ encrypted }), and covers every copy of the data","version":"0.82.0"},{"id":"0.82.0/03_encrypt-column-reads-the-framework-key","kind":"manual","title":"voltro db encrypt-column reads VOLTRO_FIELD_ENCRYPTION_KEY by default","version":"0.82.0"},{"id":"0.82.0/04_recorder-seals-from-the-workflow","kind":"manual","title":"The run recorder seals step values from the workflow, not from an option","version":"0.82.0"},{"id":"0.82.0/05_rpc-failures-are-the-declared-error","kind":"manual","title":"Subscription and loader failures are the declared error, not a Cause or wrapper","version":"0.82.0"},{"id":"0.82.0/06_production-deploy-step-is-db-deploy","kind":"manual","title":"The production deploy step is `voltro db deploy .`; `db files` waits with after-schema files","version":"0.82.0"},{"id":"0.82.0/07_idle-tick-disarms-only-on-null","kind":"manual","title":"A `disarmWhenIdle` task stops ticking only when its idle tick returns `nextDueInMs: null`","version":"0.82.0"},{"id":"0.82.0/08_resource-guards-report-a-missing-resource","kind":"manual","title":"A resource guard can refuse with NoSuchResource; resolver verdicts can be 'missing'","version":"0.82.0"},{"id":"0.82.0/09_define-executor-checks-the-failure-channel","kind":"manual","title":"defineExecutor checks the failure channel against the procedure's error union","version":"0.82.0"},{"id":"0.82.0/10_cms-writes-run-in-the-caller-transaction","kind":"manual","title":"@voltro/cms write ops run in the caller's transaction","version":"0.82.0"},{"id":"0.82.0/11_cms-drafts-write-revisions","kind":"manual","title":"@voltro/cms stores every saved draft as a revision; register cmsRevisionsTable","version":"0.82.0"},{"id":"0.82.0/12_cms-scope-on-every-write-and-read","kind":"manual","title":"@voltro/cms writes and reads name a site, environment and locale","version":"0.82.0"},{"id":"0.82.0/13_cms-documents-have-locale-variants","kind":"manual","title":"@voltro/cms documents have locale variants; listRevisions takes documentId and scope","version":"0.82.0"},{"id":"0.82.0/14_cms-publish-writes-reference-edges","kind":"manual","title":"@voltro/cms records the references of published content; register cmsReferencesTable","version":"0.82.0"},{"id":"0.82.0/15_cms-rich-text-is-a-document","kind":"manual","title":"@voltro/cms rich text is a RichDocument; RichText options name the image and link types","version":"0.82.0"},{"id":"0.82.0/16_workflow-run-restart-receipts","kind":"manual","title":"Workflow dashboard pages use durable restart commands and read-only receipts","version":"0.82.0"},{"id":"0.82.0/17_aggregate-results-follow-column-types","kind":"manual","title":"MIN/MAX results follow source columns; COUNT returns number","version":"0.82.0"},{"id":"0.82.0/18_inference-elapsed-time-can-be-unknown","kind":"manual","title":"Inference elapsed time is nullable when original timing was not recorded","version":"0.82.0"},{"id":"0.82.0/19_migration-snapshot-objects","kind":"manual","title":"Migration snapshots identify both tables and columns","version":"0.82.0"},{"id":"0.82.0/20_migration-squash-confirmation","kind":"manual","title":"Migration squash requires a complete preview before confirmation","version":"0.82.0"},{"id":"0.82.0/21_billing-lifecycle-at-the-provider","kind":"manual","title":"@voltro/plugin-billing: providers cancel, resume, list and add prices; a failing onEvent is redelivered","version":"0.82.0"},{"id":"0.82.0/22_anonymous-callers-are-the-apps-decision","kind":"transform","title":"auth.anonymous replaces anonymousTenantId, anonymousTenantRequired and anonymousTenantDefault","version":"0.82.0"},{"id":"0.82.0/23_serve-refuses-an-undecided-anonymous-policy","kind":"manual","title":"`voltro serve` refuses to boot until app.config.ts sets `auth.anonymous`","version":"0.82.0"},{"id":"0.82.0/24_cms-experiments-need-a-hypothesis","kind":"manual","title":"`startExperiment` requires `hypothesis`; `guardrailMaxDrop` is new","version":"0.82.0"},{"id":"0.82.0/25_cms-kernel-is-effect-native","kind":"manual","title":"The CMS kernel returns Effects; the Promise exports and the `*Effect` names are gone","version":"0.82.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"6c752e58261688d1a08b95f5aaadb5146f372084","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.82.0","@voltro/kv":"0.82.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.82.0","@voltro/plan":"0.82.0","@voltro/cache":"0.82.0","@voltro/client":"0.82.0","@voltro/logger":"0.82.0","@voltro/content":"0.82.0","@voltro/runtime":"0.82.0","@effect/workflow":"^0.19.1","@voltro/database":"0.82.0","@voltro/protocol":"0.82.0","@voltro/workflow":"0.82.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.82.0","@voltro/serverless":"0.82.0","@voltro/plugin-auth":"0.82.0","@voltro/plugin-mail":"0.82.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.82.0","@voltro/plugin-openapi":"0.82.0","@voltro/plugin-storage":"0.82.0","@voltro/plugin-webhooks":"0.82.0","@voltro/plugin-broadcast":"0.82.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","postject":"1.0.0-alpha.6","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.5","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.82.0_1790866959787_0.5627563391295736","host":"s3://npm-registry-packages-npm-production"}},"0.83.0":{"name":"@voltro/cli","version":"0.83.0","keywords":["voltro","typescript","framework"],"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","_id":"@voltro/cli@0.83.0","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"homepage":"https://voltro.dev","bugs":{"email":"support@voltro.dev"},"bin":{"voltro":"bin/voltro.mjs"},"dist":{"shasum":"e4c83c7c5f1508561851e0cb2b0f1ae68b1251b9","tarball":"https://registry.npmjs.org/@voltro/cli/-/cli-0.83.0.tgz","fileCount":1818,"integrity":"sha512-HNiG1aMLv2YUricDZCaXhp9PYaqJ5nMVGLWb8Uh5FmGJ1uCCrmeT1aFk1ZVy1nxInmJecp/LdPpoDvkxybeN/Q==","signatures":[{"sig":"MEUCIAKqE7MTBvbwUI5XS64Bt7pZTHaFQAezoDU7hJD1kQ3MAiEAvhLJvRX3ByrdXONDrqgBxny+j0W8YTOv89yfkgAlqDs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDAxPx189kGqWVsbe5yjEx2qusl5l+hlnivVU4V8YkA/gIgaAMzHffe9DhOOJdvF9GrbklmLQ1cjzrRhzGxzuzySMg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17375358},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","voltro":{"renames":[{"at":"0.52.0","to":"@voltro/plugin-row-history","from":"@voltro/plugin-versioning"}],"codemods":[{"id":"0.10.0/01_render-mode-client-to-spa","kind":"transform","title":"renderMode is a closed set — `'client'` becomes `'spa'`","version":"0.10.0"},{"id":"0.10.0/02_router-state-carries-its-path","kind":"manual","title":"`renderRouterStateScript` now requires the `path` it rendered","version":"0.10.0"},{"id":"0.10.0/03_workflow-caller-context-resolved","kind":"manual","title":"workflow `buildContext` receives a RESOLVED caller context","version":"0.10.0"},{"id":"0.10.0/04_seed-run-status-skipped","kind":"manual","title":"seed run status gained `skipped`","version":"0.10.0"},{"id":"0.10.0/05_subscription-idle-state","kind":"manual","title":"`useSubscription` gained an idle state for `skip`","version":"0.10.0"},{"id":"0.11.0/01_step-options-type-params","kind":"manual","title":"`StepOptions` takes the context type first","version":"0.11.0"},{"id":"0.12.0/01_outbound-http-ssrf-guard","kind":"manual","title":"Outbound HttpClient blocks internal targets by default (add `http.allowHosts` if you call one)","version":"0.12.0"},{"id":"0.12.0/02_api-key-revoke-tenant-scope","kind":"manual","title":"apiKeyService.revoke/rotate now require the caller's tenantId","version":"0.12.0"},{"id":"0.12.0/03_api-key-on-behalf-of","kind":"manual","title":"API keys: createdBy is provenance, onBehalfOf is ownership","version":"0.12.0"},{"id":"0.12.0/04_inspect-fail-closed","kind":"manual","title":"The inspect surface requires VOLTRO_INSPECT_TOKEN (previously open when unset)","version":"0.12.0"},{"id":"0.13.0/01_bearer-gates-fail-closed","kind":"manual","title":"checkBearer is fail-closed; scimPlugin refuses an empty token","version":"0.13.0"},{"id":"0.13.0/02_storage-grants-owner-only","kind":"manual","title":"storage.share / revoke / listGrants require ownership","version":"0.13.0"},{"id":"0.13.0/03_apply-plan-convergence-proof","kind":"manual","title":"applyPlan requires a `replan` convergence proof","version":"0.13.0"},{"id":"0.14.0/01_resolve-scopes-store","kind":"manual","title":"auth.resolveScopes receives the app DataStore","version":"0.14.0"},{"id":"0.14.0/02_reactive-by-default","kind":"transform","title":"Reactivity is the default; .reactive() is removed","version":"0.14.0"},{"id":"0.14.0/03_pages-suffix","kind":"transform","title":"Pages are declared with a .page.tsx suffix","version":"0.14.0"},{"id":"0.14.0/04_file-taxonomy","kind":"transform","title":"Web files declare their contract (*.component.tsx / *.hook.ts / *.types.ts)","version":"0.14.0"},{"id":"0.14.0/05_typed-tracking","kind":"manual","title":"Tracking catalogues are typed against the component props","version":"0.14.0"},{"id":"0.14.0/06_voltro-test-skips-e2e","kind":"manual","title":"`voltro test` leaves `e2e/` to `voltro e2e`","version":"0.14.0"},{"id":"0.14.0/07_dev-remote-file-migrations","kind":"manual","title":"voltro dev refuses unattended file migrations against a remote database","version":"0.14.0"},{"id":"0.15.0/01_undo-mistaken-taxonomy-renames","kind":"transform","title":"Undo the two file renames 0.14.0 got wrong (framework primitives, side-effect modules)","version":"0.15.0"},{"id":"0.15.0/02_error-tag-in-protocol","kind":"transform","title":"`errorTag` is imported from @voltro/protocol","version":"0.15.0"},{"id":"0.17.0/01_pages-are-directories","kind":"transform","title":"A directory is a route segment; its route is page.tsx","version":"0.17.0"},{"id":"0.18.0/01_where-like-removed","kind":"manual","title":"the `'like'` where-operator is removed — pick `contains` or `startsWith`","version":"0.18.0"},{"id":"0.19.0/01_server-only-gates-the-boot","kind":"manual","title":"`.serverOnly()` now FAILS the boot under `voltro serve` — it used to only warn","version":"0.19.0"},{"id":"0.19.0/02_audit-redact-input-default","kind":"manual","title":"`auditPlugin` now redacts mutation input by default (`redactInput: 'all'`)","version":"0.19.0"},{"id":"0.20.0/01_write-recorder-port","kind":"manual","title":"`WriteRecorder` takes a port (`{ append, maxOf }`) instead of a bare `append`","version":"0.20.0"},{"id":"0.21.0/01_maxlength-now-migrates","kind":"manual","title":"`text().maxLength(n)` now migrates EXISTING columns — plan before you apply","version":"0.21.0"},{"id":"0.22.0/01_rename-index-op","kind":"manual","title":"`MigrationOperation` gained a `rename-index` kind","version":"0.22.0"},{"id":"0.22.0/02_plugin-tables-voltro-prefixed","kind":"manual","title":"plugin-owned tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.22.0"},{"id":"0.22.0/03_cache-scope-gained-tenant","kind":"manual","title":"`cache.scope` gained 'tenant' — an exhaustive switch over it needs a branch","version":"0.22.0"},{"id":"0.22.0/04_inspect-write-credential","kind":"manual","title":"Mutating `/_voltro/inspect/*` endpoints need VOLTRO_INSPECT_WRITE_TOKEN","version":"0.22.0"},{"id":"0.23.0/01_versioning-is-opt-out","kind":"manual","title":"versioningPlugin: `tables: string[]` → opt-out by default, `include` / `exclude` by value","version":"0.23.0"},{"id":"0.24.0/01_agent-tables-voltro-prefixed","kind":"manual","title":"the two agent tables are `_voltro_`-prefixed (the rows move themselves)","version":"0.24.0"},{"id":"0.25.0/01_events-emit-to-publish","kind":"manual","title":"`ctx.events.emit(name, data)` → `ctx.events.publish(descriptor, key, payload)`","version":"0.25.0"},{"id":"0.25.0/02_outgoing-event-to-define-event","kind":"transform","title":"`defineOutgoingEvent` → `defineEvent({ …, webhook: { … } })`","version":"0.25.0"},{"id":"0.25.0/03_broadcast-channel-to-namespace","kind":"transform","title":"`broadcast({ channel })` → `broadcast({ namespace })`","version":"0.25.0"},{"id":"0.26.0/01_event-webhook-retry-removed","kind":"manual","title":"`defineEvent({ webhook: { retry } })` is gone — it never did anything","version":"0.26.0"},{"id":"0.26.0/02_step-retry-enforced","kind":"manual","title":"workflow step `retry:` is now ENFORCED (was metadata) — drop any redundant manual retry","version":"0.26.0"},{"id":"0.28.0/01_notifications-resolve-subject-id-async","kind":"manual","title":"`makeSubjectId` returns a Promise; `resolveSubjectId` may be async","version":"0.28.0"},{"id":"0.28.0/02_plugin-ref-change-event","kind":"manual","title":"`PluginRefChange` is removed — the change channel's `ChangeEvent` is the one shape","version":"0.28.0"},{"id":"0.28.0/03_atlassian-credentials-context","kind":"manual","title":"`credentialsResolver` receives `{ subject, store }` instead of a bare Subject","version":"0.28.0"},{"id":"0.28.0/04_audit-redacts-subject-metadata","kind":"manual","title":"`auditPlugin` redacts `subject.metadata` by default","version":"0.28.0"},{"id":"0.29.0/01_loader-data-absence","kind":"manual","title":"`useLoaderData()` throws at a level that declares no `loader`","version":"0.29.0"},{"id":"0.3.0/01_prod-serve-requires-build","kind":"manual","title":"Production `voltro serve` requires a precompiled bundle (build before serve)","version":"0.3.0"},{"id":"0.30.0/01_locale-cookie-rename","kind":"transform","title":"the language-preference cookie is `voltro:locale` (was `voltro:lang`)","version":"0.30.0"},{"id":"0.30.0/02_audit-purge-query-recheck","kind":"manual","title":"re-run the credential-purge query — the 0.28.0 spelling under-reported on MySQL/MariaDB","version":"0.30.0"},{"id":"0.30.0/03_webhook-emit-durable-deferral","kind":"manual","title":"a deferred `webhooks.emit` rides the transactional outbox; `{ immediate: true }` opts out","version":"0.30.0"},{"id":"0.30.0/04_workflow-run-handle-nullable-execution","kind":"manual","title":"`WorkflowRunHandle.executionId` is `string | null`; `status` gains queued/dropped/skipped","version":"0.30.0"},{"id":"0.31.0/01_rerun-credential-scan","kind":"manual","title":"re-run `voltro db scan-credentials` — on 0.30.0–0.30.2 it skipped the column credentials land in","version":"0.31.0"},{"id":"0.32.0/01_audit-redacts-outcome","kind":"manual","title":"`auditPlugin` now redacts `outcome` by default — opt out if your trail reads it","version":"0.32.0"},{"id":"0.33.0/01_opentelemetry-optional-peer","kind":"manual","title":"`@effect/opentelemetry` is now an optional peer — install it if you use tracing","version":"0.33.0"},{"id":"0.33.0/02_coordinated-handle-gained-wake","kind":"manual","title":"`CoordinatedScheduleHandle` gained `wake()`, `currentIntervalMs()` and `isArmed()` — update hand-written test doubles","version":"0.33.0"},{"id":"0.34.0/01_serve-does-mount-inspect","kind":"manual","title":"Correction: `voltro serve` DOES mount an inspect surface (the 0.12.0 note said it mounts none)","version":"0.34.0"},{"id":"0.34.0/02_keyed-writes-are-tenant-scoped","kind":"manual","title":"Keyed-by-pk writes are tenant-enforced, and `crud` refuses `.serverOnly()` input","version":"0.34.0"},{"id":"0.34.0/03_procedure-access-decision","kind":"manual","title":"Every wire-exposed procedure declares an access decision (`guards:` or `openAccess:`)","version":"0.34.0"},{"id":"0.34.0/04_workos-oauth-state-pkce","kind":"manual","title":"WorkOS hosted login: `workosAuthorizationUrl` → `workosBeginLogin`, with mandatory `state` + PKCE","version":"0.34.0"},{"id":"0.34.0/05_analytics-mirror-versioned-writes","kind":"manual","title":"Analytics CDC-mirror: version-ordered writes, tombstoned deletes, retry + repair","version":"0.34.0"},{"id":"0.34.0/06_origin-guard-and-trusted-proxies","kind":"manual","title":"Cross-site protection, trusted proxies and security headers are ON by default on the api listener","version":"0.34.0"},{"id":"0.34.0/07_incoming-webhook-declares-verification","kind":"manual","title":"An incoming webhook with no signature scheme now refuses to boot","version":"0.34.0"},{"id":"0.34.0/08_init-initialises-the-workspace","kind":"manual","title":"`voltro init` initialises the workspace root; scaffolding is `create-project` only","version":"0.34.0"},{"id":"0.34.0/09_workflow-messages-queries-removed","kind":"manual","title":"`workflow({ messages: { queries } })` is removed — it never had a send path","version":"0.34.0"},{"id":"0.34.0/10_testing-mail-is-a-service","kind":"manual","title":"`ctx.email` / `MockEmail` removed — assert mail through the mail plugin","version":"0.34.0"},{"id":"0.34.0/11_ai-flows-per-step-human-signal","kind":"manual","title":"`HUMAN_RESPONSE_SIGNAL` removed — a human step's signal name is now per-step","version":"0.34.0"},{"id":"0.34.0/12_session-cookie-carries-identity","kind":"manual","title":"The session cookie carries identity only — authority resolves per request","version":"0.34.0"},{"id":"0.34.0/13_billing-provider-dunning","kind":"manual","title":"Billing dunning — `BillingProvider.fetchSubscription` is required, and `plan()` now honours a grace period","version":"0.34.0"},{"id":"0.34.0/14_search-memory-backend-refuses-production","kind":"manual","title":"`plugin-search` on the in-memory backend now refuses to boot in production","version":"0.34.0"},{"id":"0.34.0/15_mysql-mssql-tls-honoured","kind":"manual","title":"mysql/mariadb and mssql connections honour ?ssl= / ?sslmode= — or refuse to boot","version":"0.34.0"},{"id":"0.34.0/16_declare-node-env-for-migration-commands","kind":"manual","title":"`voltro db apply` / `voltro migrate` now treat an unset NODE_ENV as production","version":"0.34.0"},{"id":"0.34.0/17_isr-postgres-refuses-without-a-database","kind":"manual","title":"The postgres ISR cache + CDC invalidator read DB_URL, and no longer fall back silently","version":"0.34.0"},{"id":"0.34.0/18_serve-refuses-pending-file-migrations","kind":"manual","title":"`voltro serve` refuses to boot with pending file-based migrations","version":"0.34.0"},{"id":"0.34.0/19_connection-override-carries-a-credential","kind":"manual","title":"Soft re-auth presents a credential — it no longer hands the server a Subject","version":"0.34.0"},{"id":"0.34.0/20_user-store-auth-feature-methods","kind":"manual","title":"UserStore gained the email-verification, invitation and impersonation methods","version":"0.34.0"},{"id":"0.34.0/20_workflow-authority-resolves-at-resume","kind":"manual","title":"A resumed workflow re-resolves its caller's authority instead of restoring it","version":"0.34.0"},{"id":"0.34.0/21_admin-gates-on-declared-access","kind":"manual","title":"The derived admin gates on the api's DECLARED access — the invented `<table>:create` scopes are gone","version":"0.34.0"},{"id":"0.34.0/22_write-rejections-carry-the-typed-error","kind":"manual","title":"A rejected mutate/run/signal/upload carries the typed error, not a FiberFailure","version":"0.34.0"},{"id":"0.34.0/23_saml-signature-and-replay-defaults","kind":"manual","title":"SAML: response-signature requirement relaxed + surfaced; replay protection ON by default","version":"0.34.0"},{"id":"0.34.0/24_webhook-signing-renders-headers","kind":"manual","title":"Webhook signing: `signPayload`/`verifySignature` → `signRequest`/`verifyRequest`","version":"0.34.0"},{"id":"0.34.0/25_presence-has-no-table","kind":"manual","title":"Presence: `_voltro_presence` is gone, and so is `lastSeen` on the roster","version":"0.34.0"},{"id":"0.34.0/26_route-http-is-async","kind":"manual","title":"`routeHttp` returns a Promise","version":"0.34.0"},{"id":"0.35.0/01_event-access-decision","kind":"manual","title":"Every declared event decides who may listen (`guards:` or `openAccess:`)","version":"0.35.0"},{"id":"0.35.0/02_plugin-procedures-carry-access-decisions","kind":"manual","title":"First-party plugin procedures carry access decisions; twelve now require a scope","version":"0.35.0"},{"id":"0.35.0/03_analytics-mirror-max-version","kind":"manual","title":"Custom analytics mirror sinks answer `maxVersion` (fleet-scope seed read)","version":"0.35.0"},{"id":"0.35.0/04_flow-run-step-skipped","kind":"manual","title":"A flow run step can now be 'skipped' — handle it where you render a run timeline","version":"0.35.0"},{"id":"0.35.0/05_declared-schema-drops-runtime-flags","kind":"manual","title":"The declared schema no longer reads `CDC` / `VOLTRO_UNDO` / `VOLTRO_TRACING_PERSIST`","version":"0.35.0"},{"id":"0.35.1/01_unauthorized-replaces-session-expired","kind":"transform","title":"A 401 is `code: 'unauthorized'`; the vault's own failure is `'credential_unusable'`","version":"0.35.1"},{"id":"0.37.0/01_procedure-input-rejects-undeclared-fields","kind":"manual","title":"a procedure input rejects a field it does not declare (it used to drop it)","version":"0.37.0"},{"id":"0.38.0/01_impersonation-key-in-protocol","kind":"transform","title":"`IMPERSONATION_METADATA_KEY` is imported from @voltro/protocol","version":"0.38.0"},{"id":"0.38.0/02_startup-failure-refuses-boot","kind":"manual","title":"a `*.startup.ts` that fails refuses the boot (it used to warn and continue)","version":"0.38.0"},{"id":"0.39.0/01_empty-input-schema-rejects-every-field","kind":"manual","title":"a procedure declaring `Schema.Struct({})` used to accept every field and now accepts none","version":"0.39.0"},{"id":"0.4.0/01_rbac-forbidden-to-scopeerror","kind":"transform","title":"@voltro/plugin-rbac: `Forbidden` → protocol `ScopeError` (one denial tag)","version":"0.4.0"},{"id":"0.4.0/02_rbac-web-to-client-permissions","kind":"transform","title":"@voltro/plugin-rbac/web removed — the UI gate lives in @voltro/client","version":"0.4.0"},{"id":"0.40.0/01_cold-start-failure-is-its-own-state","kind":"manual","title":"a failed cold start is `failed: true`, not `loading: true`","version":"0.40.0"},{"id":"0.40.0/02_rejected-credential-widens-guard-results","kind":"manual","title":"a rejected credential answers `Unauthenticated`, widening three guard results","version":"0.40.0"},{"id":"0.41.0/01_middleware-defines-where-it-runs","kind":"transform","title":"`middleware.ts` exports `defineMiddleware(...)` and can say where it runs","version":"0.41.0"},{"id":"0.43.0/01_dangling-reference-to-rows-refused","kind":"transform","title":"`DanglingReferenceError` → `RowsRefusedError` (named for the outcome, not a guessed cause)","version":"0.43.0"},{"id":"0.44.0/01_import-outcome","kind":"manual","title":"`runImport` returns an ImportOutcome — read `.manifest` for the bundle","version":"0.44.0"},{"id":"0.45.0/01_typed-source-table-name","kind":"manual","title":"`source:` is typechecked against the app’s tables, from the next `voltro dev`","version":"0.45.0"},{"id":"0.46.0/01_typed-aggregate-source","kind":"manual","title":"an aggregate’s `incremental.source` is typechecked against the app’s tables","version":"0.46.0"},{"id":"0.49.0/01_data-imports-to-transfers","kind":"manual","title":"`voltro data imports` → `voltro data transfers`","version":"0.49.0"},{"id":"0.49.0/02_import-run-symbols","kind":"transform","title":"`ImportRun` / `describeImportRun` / `IMPORT_RUNS_TABLE` → their `…TransferRun` names","version":"0.49.0"},{"id":"0.5.0/01_one-terminal-exactly-one","kind":"manual","title":".one() now fails on MORE than one row; NoRowFound is a declarable typed error","version":"0.5.0"},{"id":"0.5.0/02_typed-store-rows","kind":"manual","title":"store.query() now returns the row type — casts on row fields may stop compiling","version":"0.5.0"},{"id":"0.50.0/01_transfer-runs-endpoint","kind":"manual","title":"`GET /_voltro/admin/imports` → `GET /_voltro/admin/transfers`","version":"0.50.0"},{"id":"0.50.0/02_reissue-data-imports-rename","kind":"manual","title":"RE-CHECK: `voltro data imports` → `voltro data transfers` (0.49.0's note could not see your scripts)","version":"0.50.0"},{"id":"0.50.0/03_interrupted-replace-tables-nullable","kind":"manual","title":"`InterruptedReplace.tables` is `number | null`","version":"0.50.0"},{"id":"0.51.0/01_computed-source-keeps-its-names","kind":"manual","title":"A COMPUTED `source:` can keep its typed names — do not widen the whole registry","version":"0.51.0"},{"id":"0.51.0/02_restore-refuses-without-marker","kind":"manual","title":"`voltro data restore` refuses when it cannot write the in-progress marker","version":"0.51.0"},{"id":"0.51.0/03_restore-assets-returns-counts","kind":"manual","title":"`restoreAssetsFromCas` returns `{ count, objects }`, not a number","version":"0.51.0"},{"id":"0.51.0/04_i18n-timezone-prop","kind":"transform","title":"`<I18nProvider>`: `timeZone` is its own prop, not an `intlConfig` member","version":"0.51.0"},{"id":"0.52.0/01_plugin-versioning-to-row-history","kind":"transform","title":"@voltro/plugin-versioning → @voltro/plugin-row-history (the name now says what it does)","version":"0.52.0"},{"id":"0.52.0/02_http-interceptor-fail-closed","kind":"manual","title":"A throwing `onHttpRequest` interceptor now refuses the request (500) instead of being ignored","version":"0.52.0"},{"id":"0.53.0/01_conflict-columns-take-the-table","kind":"manual","title":"`missingConflictColumns` takes the table and classifies absent vs NULL","version":"0.53.0"},{"id":"0.53.0/02_empty-struct-input-flipped","kind":"manual","title":"`input: Schema.Struct({})` procedures flipped from accept-everything to reject-everything in 0.37.0","version":"0.53.0"},{"id":"0.53.0/03_validation-messages-are-ids","kind":"manual","title":"Form validation messages are ids + catalog now, not effect developer text","version":"0.53.0"},{"id":"0.53.0/04_widget-kind-gained-array","kind":"manual","title":"WidgetKind gained 'array' and 'reference' — total widget registries need two new entries","version":"0.53.0"},{"id":"0.55.0/01_target-relations-declare-columns","kind":"manual","title":"A target's `relations:` names the junction's two columns now, not just the table","version":"0.55.0"},{"id":"0.55.0/02_widget-kind-gained-rich-text","kind":"manual","title":"WidgetKind gained 'rich-text' — total widget registries need one new entry","version":"0.55.0"},{"id":"0.56.0/01_inspect_answers_are_observations","kind":"manual","title":"inspect answers are `Observation`s — the payload is `.data`","version":"0.56.0"},{"id":"0.56.0/02_broadcast_gap_is_one_object","kind":"manual","title":"attachBroadcastBus's onGap now receives a single BroadcastGap object","version":"0.56.0"},{"id":"0.56.0/03_outbox_drain_needs_an_identity","kind":"manual","title":"drainOutbox now requires claimedBy — the fleet-wide exactly-once gate","version":"0.56.0"},{"id":"0.56.0/04_reaction_dedupe_is_one_claim","kind":"manual","title":"runReaction's dedupe is a single atomic claim","version":"0.56.0"},{"id":"0.56.0/05_plugin_bind_context_claims_a_change","kind":"manual","title":"PluginBindContext requires claimChange; change identity moved to @voltro/database","version":"0.56.0"},{"id":"0.56.0/06_serve_is_api_only","kind":"manual","title":"`voltro serve` on a WEB app now refuses — use `voltro start`","version":"0.56.0"},{"id":"0.58.0/01_system_writes_stamp_no_actor","kind":"manual","title":"A `runAsSystem` write stamps no actor id instead of \"system\"","version":"0.58.0"},{"id":"0.58.0/02_workflow_caller_context_carries_a_scope","kind":"manual","title":"ResolvedWorkflowCallerContext carries the run's resolved row-filter scope","version":"0.58.0"},{"id":"0.58.0/03_fleet_view_reports_departed_replicas","kind":"manual","title":"A fleet view separates DEPARTED replicas from stale ones","version":"0.58.0"},{"id":"0.58.0/04_rpc_errors_reach_reporters","kind":"manual","title":"rpc failures are published on the client error bus","version":"0.58.0"},{"id":"0.58.0/05_sentry_traces_on_by_default","kind":"manual","title":"Sentry performance traces are on by default","version":"0.58.0"},{"id":"0.58.0/06_jwt_secret_may_be_a_function","kind":"manual","title":"jwtSecret may be a function, so a build needs no production credential","version":"0.58.0"},{"id":"0.58.0/07_rerank_takes_a_provider_config","kind":"manual","title":"rerank reaches the gateway through a ProviderConfig","version":"0.58.0"},{"id":"0.59.0/01_sourcemaps_moved_to_the_top_level","kind":"transform","title":"`web.sourcemaps` moved to the top level of app.config.ts","version":"0.59.0"},{"id":"0.59.0/02_costsource_gained_unpriced","kind":"manual","title":"`costSource` gained `unpriced`, and AI usage is counted in a unit","version":"0.59.0"},{"id":"0.6.0/01_no-dev-session-secret","kind":"manual","title":"The built-in dev session secret is removed; VOLTRO_SESSION_SECRET is required","version":"0.6.0"},{"id":"0.6.0/02_subscription-state-union","kind":"manual","title":"SubscriptionState is a discriminated union — `loading` now narrows `data`","version":"0.6.0"},{"id":"0.6.0/03_billing-on-stripe-sdk","kind":"manual","title":"Billing moved onto the Stripe SDK; proration + dunning are now Stripe’s","version":"0.6.0"},{"id":"0.6.0/04_relation-key-validation","kind":"manual","title":"relation key options are validated at boot; `one` now fails on more than one match","version":"0.6.0"},{"id":"0.6.0/05_atlassian-avatar-mode","kind":"transform","title":"atlassianPlugin's `avatar` config requires an explicit `mode: 'service' | 'perUser'`","version":"0.6.0"},{"id":"0.6.0/06_ui-strings-connect-account","kind":"manual","title":"UiStrings gained a required `connectAccount` section","version":"0.6.0"},{"id":"0.60.0/01_declared_failures_are_not_incidents","kind":"manual","title":"Sentry no longer reports declared failures by default","version":"0.60.0"},{"id":"0.61.0/01_rpc_errors_have_kinds","kind":"manual","title":"`RpcError` now carries an explicit failure kind","version":"0.61.0"},{"id":"0.61.0/02_sentry_rpc_spans_join_page","kind":"manual","title":"Sentry rpc spans now join the active browser transaction","version":"0.61.0"},{"id":"0.62.0/01_finish_timeout_uses_durable_cancellation","kind":"manual","title":"Finish timeouts use durable, once-only cancellation","version":"0.62.0"},{"id":"0.63.0/01_recovery-presentation","kind":"manual","title":"handle the new `recovering` connection state and choose the intended rpc-error channel","version":"0.63.0"},{"id":"0.64.0/01_workflow-access-decision","kind":"manual","title":"Every declared workflow decides who may start it (`guards:`, `openAccess:` or `internal: true`)","version":"0.64.0"},{"id":"0.64.0/02_agent-access-decision","kind":"manual","title":"Every declared agent decides who may talk to it (`guards:` or `openAccess:` on defineAgent)","version":"0.64.0"},{"id":"0.64.0/03_atlassian-confluence-root-and-named-instances","kind":"manual","title":"@voltro/plugin-atlassian: set `confluenceBaseUrl`; a named instance is reached through `jiraServiceFor(name)`","version":"0.64.0"},{"id":"0.64.0/04_workflow-handle-replayed","kind":"manual","title":"a workflow start handle can be `status: 'replayed'` — the idempotency key was already spent","version":"0.64.0"},{"id":"0.64.0/05_field-encryption-key-framework-owned","kind":"manual","title":"`VOLTRO_FIELD_ENCRYPTION_KEY` is required in production once an `.encrypted()` column is declared — webhook signing secrets are one","version":"0.64.0"},{"id":"0.64.0/06_test-response-headers-arrays","kind":"manual","title":"a test response header can be an ARRAY — narrow where a test assigned it to a string","version":"0.64.0"},{"id":"0.65.0/01_ai-flows-run-is-internal","kind":"manual","title":"`flow.run` is internal — start a flow through the plugin's guarded action, not by tag","version":"0.65.0"},{"id":"0.65.0/02_effect-store-and-guard-unions","kind":"manual","title":"`makeEffectStoreLayer` takes the request store; the guard union gained `{ authenticated: true }`","version":"0.65.0"},{"id":"0.66.0/01_numeric-id-is-a-number","kind":"manual","title":"`id({ scheme: 'numeric' })` rows now carry a `number` id, not a decimal string","version":"0.66.0"},{"id":"0.66.0/02_socket-retry-owner","kind":"manual","title":"Socket retries keep the runtime and headers; configure recovery.retry","version":"0.66.0"},{"id":"0.67.0/01_subscription-reconciliation","kind":"manual","title":"Confirmed optimistic writes require a post-ACK primary snapshot","version":"0.67.0"},{"id":"0.67.0/02_vitest-5","kind":"manual","title":"vitest 5 — bump `vitest` and `@vitest/coverage-v8` to ^5.0.0","version":"0.67.0"},{"id":"0.67.0/03_support-sentry-removed","kind":"manual","title":"`voltro support sentry` was removed with sentry-cli 3","version":"0.67.0"},{"id":"0.68.0/01_dashboard-inspection-evidence","kind":"manual","title":"provide complete evidence sources to custom inspect dashboard pages","version":"0.68.0"},{"id":"0.69.0/01_migration-lock-returns-its-release","kind":"manual","title":"the migration lock is released through the handle it hands you","version":"0.69.0"},{"id":"0.69.0/02_anonymous-uploads-must-be-declared","kind":"manual","title":"storage: an anonymous upload is now a declaration, not a default","version":"0.69.0"},{"id":"0.69.0/03_sdk-peers-are-declared-by-the-app","kind":"manual","title":"`ai`, `@ai-sdk/*` and `stripe` moved to peerDependencies","version":"0.69.0"},{"id":"0.69.0/04_workflow-rpc-types-are-precise","kind":"manual","title":"a workflow no longer widens the whole generated client","version":"0.69.0"},{"id":"0.69.0/05_api-key-store-plants-its-actor","kind":"manual","title":"an issued API key gets its `actors` row","version":"0.69.0"},{"id":"0.69.0/06_typed-store-errors-are-not-rewrapped","kind":"manual","title":"ConstraintViolation and friends arrive typed, not as StoreOperationFailed","version":"0.69.0"},{"id":"0.69.1/01_ensure-actor-receives-the-issue-input","kind":"manual","title":"`ensureActor` receives the issue input — build your own `actors` row from it","version":"0.69.1"},{"id":"0.69.1/02_existing-api-keys-get-their-actors-row","kind":"manual","title":"API keys issued before 0.69.0 have no `actors` row — the boot plants them now","version":"0.69.1"},{"id":"0.7.0/01_row-filter-load-failure","kind":"manual","title":"A row filter that fails to load now errors instead of returning zero rows","version":"0.7.0"},{"id":"0.7.0/02_testing-invoke-effect-handlers","kind":"manual","title":"@voltro/testing: invoke() runs Effect handlers; executor types widened","version":"0.7.0"},{"id":"0.71.0/01_ai-generation-contracts","kind":"manual","title":"AI conversations and generation evidence are explicit","version":"0.71.0"},{"id":"0.71.0/02_bound-ai-budget-reservations","kind":"manual","title":"Bind AI budget reservations and release by identity","version":"0.71.0"},{"id":"0.71.0/03_await-event-publication","kind":"manual","title":"Await event persistence and post-commit delivery","version":"0.71.0"},{"id":"0.71.0/04_bound-storage-url-ingest","kind":"manual","title":"Bound URL ingestion and propagate cancellation","version":"0.71.0"},{"id":"0.71.0/05_outbox-effect-environment","kind":"manual","title":"Run outbox Effects in the app service environment","version":"0.71.0"},{"id":"0.71.0/06_agent-grounding-metadata","kind":"manual","title":"Handle model-step metadata without discarding grounding attribution","version":"0.71.0"},{"id":"0.71.0/07_flow-text-params-and-schemas","kind":"manual","title":"Keep Flow text parameters and validate the complete authored JSON Schema","version":"0.71.0"},{"id":"0.71.0/08_flow-media-inputs-and-artifacts","kind":"manual","title":"Resolve Flow media inputs and retain every artifact with its storage identity","version":"0.71.0"},{"id":"0.71.0/09_flow-review-delivery","kind":"manual","title":"Bind human responses to the displayed review and handle unknown delivery","version":"0.71.0"},{"id":"0.71.0/10_transactional-workflow-starts","kind":"manual","title":"Treat mutation workflow starts as provisional durable queue receipts","version":"0.71.0"},{"id":"0.71.0/11_workflow-context-ownership","kind":"manual","title":"Keep workflow execution ownership with the engine state","version":"0.71.0"},{"id":"0.71.0/12_native-insert-ignore-outcome","kind":"manual","title":"Implement native insert-ignore outcomes in custom store adapters","version":"0.71.0"},{"id":"0.71.0/13_workflow-start-receipts","kind":"manual","title":"Distinguish workflow caller receipts from queue slot IDs","version":"0.71.0"},{"id":"0.71.0/14_workflow-redrive-outcomes","kind":"manual","title":"Distinguish replay refusal from unconfirmed journal resets","version":"0.71.0"},{"id":"0.71.0/15_workflow-recorder-entry-transaction","kind":"manual","title":"Commit workflow entry before executing the body","version":"0.71.0"},{"id":"0.71.0/16_workflow-control-results","kind":"manual","title":"Separate workflow control acknowledgement from execution state","version":"0.71.0"},{"id":"0.71.0/17_json-string-values","kind":"manual","title":"Pass JSON column values rather than pre-serialized SQL input","version":"0.71.0"},{"id":"0.71.0/18_flow-start-receipts","kind":"manual","title":"Separate flow submission receipts from execution status","version":"0.71.0"},{"id":"0.71.0/19_app-context-transaction","kind":"manual","title":"Bind custom AppContext transactions to the full context","version":"0.71.0"},{"id":"0.71.0/20_cadence-tenant-identity","kind":"manual","title":"Pass tenant identity to cadence request IDs","version":"0.71.0"},{"id":"0.71.0/21_workflow-blocking-receipts","kind":"manual","title":"Replace deferred-result rejection handling with receipt observation","version":"0.71.0"},{"id":"0.71.0/22_workflow-waited-handle-status","kind":"manual","title":"Handle observed workflow success separately from accepted work","version":"0.71.0"},{"id":"0.71.0/23_workflow-queued-control","kind":"manual","title":"Implement explicit receipt-addressed queued workflow controls","version":"0.71.0"},{"id":"0.71.0/24_external-schedule-trigger","kind":"manual","title":"External schedule triggers move to their own endpoint, token and run status","version":"0.71.0"},{"id":"0.71.0/25_atomic-workflow-discard","kind":"manual","title":"Provide a transactional store for durable workflow intent discard","version":"0.71.0"},{"id":"0.71.0/26_inspect-workflow-control-receipt","kind":"manual","title":"Preserve workflow Inspect cancel and resume receipts","version":"0.71.0"},{"id":"0.71.0/90_contextual-guards-and-schedules","kind":"manual","title":"Resolve input-selected policy actions and scheduled Effect services","version":"0.71.0"},{"id":"0.72.0/01_migration-context-raw","kind":"transform","title":"File migrations: `ctx.sql` is `ctx.raw(reason)`, and a migration is transactional by default","version":"0.72.0"},{"id":"0.72.0/02_devtools-dock-replaces-anchor","kind":"transform","title":"Devtools overlay: `initialAnchor` (8 positions) is `initialDock` (bottom / top / left / right / window)","version":"0.72.0"},{"id":"0.72.0/03_insert-ignore-outcome-signature","kind":"manual","title":"Correction: insertIgnoreWithOutcome takes { conflictColumns }, and WorkflowPayloadDiagnostic is exported","version":"0.72.0"},{"id":"0.72.0/04_flow-run-context","kind":"transform","title":"AI flows: `MediaRunContext` is `FlowRunContext` (and carries `ownerId`)","version":"0.72.0"},{"id":"0.72.0/05_failure-reports-replace-the-abandon-callback","kind":"manual","title":"A failure report is written where the failure is decided; the abandon callback is gone","version":"0.72.0"},{"id":"0.72.0/06_rejected-credentials-are-refused","kind":"manual","title":"A rejected credential is refused, never resolved as anonymous","version":"0.72.0"},{"id":"0.75.0/01_ai-usage-receipt-conflict","kind":"manual","title":"`recordAiUsage` fails with a typed error on a receipt conflict or a failed write","version":"0.75.0"},{"id":"0.75.0/01_workflow-bulk-control-receipts","kind":"manual","title":"Preserve workflow bulk cancellation receipts","version":"0.75.0"},{"id":"0.75.0/02_storage-put-reports-its-outcome","kind":"manual","title":"`StorageService.put` returns `StoredRef`; object claims on the metadata boundary","version":"0.75.0"},{"id":"0.75.0/03_workflow-controls-decision","kind":"manual","title":"A workflow declares who may drive a run — `controls:`","version":"0.75.0"},{"id":"0.76.0/01_flow-cancellation-receipts","kind":"manual","title":"Use observable flow cancellation receipts instead of assuming interruption","version":"0.76.0"},{"id":"0.76.0/02_budget-refusals","kind":"manual","title":"Handle typed budget refusals and strict headroom checks","version":"0.76.0"},{"id":"0.76.0/03_gateway-lifecycle","kind":"manual","title":"Bind custom WebSocket gateway adapters to connection lifetime","version":"0.76.0"},{"id":"0.76.0/04_dependency-toolchain","kind":"manual","title":"Align react-intl, TypeScript tooling and React Email dependencies","version":"0.76.0"},{"id":"0.76.0/05_storage-upload-scope","kind":"manual","title":"Scope dashboard upload recovery to its destination","version":"0.76.0"},{"id":"0.76.0/06_durable-workflow-retry","kind":"manual","title":"Persist workflow retry intent identities and preserve observations","version":"0.76.0"},{"id":"0.76.0/07_storage-grant-audience","kind":"manual","title":"Bind signed private-file grants to their storage mount","version":"0.76.0"},{"id":"0.77.0/01_flow-cancelling-row-status","kind":"manual","title":"Flow run rows record a cancellation request as cancelling until the engine confirms","version":"0.77.0"},{"id":"0.77.0/02_typescript7-side-by-side","kind":"manual","title":"TypeScript 7 beside typescript-eslint needs the side-by-side alias pair, and two tsconfig options are gone","version":"0.77.0"},{"id":"0.77.0/03_tracing-peer","kind":"manual","title":"`@effect/opentelemetry` is needed by every `voltro dev` and by a `voltro serve` with a trace ring or exporter","version":"0.77.0"},{"id":"0.78.0/01_file-migration-phase","kind":"transform","title":"file migrations declare their phase","version":"0.78.0"},{"id":"0.78.0/02_typescript7-removed-options","kind":"manual","title":"TypeScript 7 removed thirteen tsconfig options and values, not the three the earlier note named","version":"0.78.0"},{"id":"0.79.0/01_probes-on-the-app-port","kind":"manual","title":"Probes answer on the app port on every command; the dev probe port is gone","version":"0.79.0"},{"id":"0.79.0/03_rejected-credentials-refused-on-the-default-policy","kind":"manual","title":"A rejected credential is refused on the default tenant policy too","version":"0.79.0"},{"id":"0.79.1/01_compose-baseline-probes-need-a-sync","kind":"manual","title":"A compose baseline synced before 0.79.0 still probes the removed dev port — run `voltro baseline sync`","version":"0.79.1"},{"id":"0.8.0/01_optional-password-hash","kind":"manual","title":"`UserRecord.passwordHash` is optional — password-less identities are now first-class","version":"0.8.0"},{"id":"0.8.0/02_ssr-streams-and-loaderdata","kind":"manual","title":"`ssr` pages stream; `useLoaderData<T>()` returns `LoaderData<T>`","version":"0.8.0"},{"id":"0.80.0/01_db-max-connections-is-the-process-budget","kind":"manual","title":"DB_MAX_CONNECTIONS is now what the whole process holds, not the size of each of its pools","version":"0.80.0"},{"id":"0.80.0/02_loader-query-in-the-browser","kind":"manual","title":"A loader has `ctx.query` in the browser too; `if (query)` no longer means the server","version":"0.80.0"},{"id":"0.80.0/03_jira-service-lists-boards","kind":"manual","title":"`JiraService` has `listBoards`; a hand-written stub of it needs one","version":"0.80.0"},{"id":"0.80.0/04_navigation-indicator-removed","kind":"manual","title":"NavigationIndicator is removed; build a loading cue from useNavigation()","version":"0.80.0"},{"id":"0.80.0/05_inspect-stream-select-returns-effect","kind":"manual","title":"An inspectStream's select returns an Effect of the selection, not a Stream","version":"0.80.0"},{"id":"0.81.0/01_one-database-per-app","kind":"manual","title":"Each api app owns its database schema; a second app on it refuses to boot","version":"0.81.0"},{"id":"0.81.0/02_store-refuses-undeclared-tables","kind":"manual","title":"Store calls on a table the app does not declare now fail","version":"0.81.0"},{"id":"0.81.0/03_compose-baseline-one-database-per-api-app","kind":"manual","title":"The compose baseline gives each api app its own database","version":"0.81.0"},{"id":"0.81.0/04_reaction-definition-is-a-union","kind":"manual","title":"ReactionDefinition is the union of the table form and the query form","version":"0.81.0"},{"id":"0.81.0/05_idempotency-store-renews-its-lease","kind":"manual","title":"an IdempotencyStore renews the lease of a running claim","version":"0.81.0"},{"id":"0.82.0/01_bootstrap-helpers-take-the-store-charset","kind":"manual","title":"The bookkeeping-table helpers take the store charset","version":"0.82.0"},{"id":"0.82.0/02_encrypt-steps-is-encrypted","kind":"transform","title":"workflow({ encryptSteps }) is workflow({ encrypted }), and covers every copy of the data","version":"0.82.0"},{"id":"0.82.0/03_encrypt-column-reads-the-framework-key","kind":"manual","title":"voltro db encrypt-column reads VOLTRO_FIELD_ENCRYPTION_KEY by default","version":"0.82.0"},{"id":"0.82.0/04_recorder-seals-from-the-workflow","kind":"manual","title":"The run recorder seals step values from the workflow, not from an option","version":"0.82.0"},{"id":"0.82.0/05_rpc-failures-are-the-declared-error","kind":"manual","title":"Subscription and loader failures are the declared error, not a Cause or wrapper","version":"0.82.0"},{"id":"0.82.0/06_production-deploy-step-is-db-deploy","kind":"manual","title":"The production deploy step is `voltro db deploy .`; `db files` waits with after-schema files","version":"0.82.0"},{"id":"0.82.0/07_idle-tick-disarms-only-on-null","kind":"manual","title":"A `disarmWhenIdle` task stops ticking only when its idle tick returns `nextDueInMs: null`","version":"0.82.0"},{"id":"0.82.0/08_resource-guards-report-a-missing-resource","kind":"manual","title":"A resource guard can refuse with NoSuchResource; resolver verdicts can be 'missing'","version":"0.82.0"},{"id":"0.82.0/09_define-executor-checks-the-failure-channel","kind":"manual","title":"defineExecutor checks the failure channel against the procedure's error union","version":"0.82.0"},{"id":"0.82.0/10_cms-writes-run-in-the-caller-transaction","kind":"manual","title":"@voltro/cms write ops run in the caller's transaction","version":"0.82.0"},{"id":"0.82.0/11_cms-drafts-write-revisions","kind":"manual","title":"@voltro/cms stores every saved draft as a revision; register cmsRevisionsTable","version":"0.82.0"},{"id":"0.82.0/12_cms-scope-on-every-write-and-read","kind":"manual","title":"@voltro/cms writes and reads name a site, environment and locale","version":"0.82.0"},{"id":"0.82.0/13_cms-documents-have-locale-variants","kind":"manual","title":"@voltro/cms documents have locale variants; listRevisions takes documentId and scope","version":"0.82.0"},{"id":"0.82.0/14_cms-publish-writes-reference-edges","kind":"manual","title":"@voltro/cms records the references of published content; register cmsReferencesTable","version":"0.82.0"},{"id":"0.82.0/15_cms-rich-text-is-a-document","kind":"manual","title":"@voltro/cms rich text is a RichDocument; RichText options name the image and link types","version":"0.82.0"},{"id":"0.82.0/16_workflow-run-restart-receipts","kind":"manual","title":"Workflow dashboard pages use durable restart commands and read-only receipts","version":"0.82.0"},{"id":"0.82.0/17_aggregate-results-follow-column-types","kind":"manual","title":"MIN/MAX results follow source columns; COUNT returns number","version":"0.82.0"},{"id":"0.82.0/18_inference-elapsed-time-can-be-unknown","kind":"manual","title":"Inference elapsed time is nullable when original timing was not recorded","version":"0.82.0"},{"id":"0.82.0/19_migration-snapshot-objects","kind":"manual","title":"Migration snapshots identify both tables and columns","version":"0.82.0"},{"id":"0.82.0/20_migration-squash-confirmation","kind":"manual","title":"Migration squash requires a complete preview before confirmation","version":"0.82.0"},{"id":"0.82.0/21_billing-lifecycle-at-the-provider","kind":"manual","title":"@voltro/plugin-billing: providers cancel, resume, list and add prices; a failing onEvent is redelivered","version":"0.82.0"},{"id":"0.82.0/22_anonymous-callers-are-the-apps-decision","kind":"transform","title":"auth.anonymous replaces anonymousTenantId, anonymousTenantRequired and anonymousTenantDefault","version":"0.82.0"},{"id":"0.82.0/23_serve-refuses-an-undecided-anonymous-policy","kind":"manual","title":"`voltro serve` refuses to boot until app.config.ts sets `auth.anonymous`","version":"0.82.0"},{"id":"0.82.0/24_cms-experiments-need-a-hypothesis","kind":"manual","title":"`startExperiment` requires `hypothesis`; `guardrailMaxDrop` is new","version":"0.82.0"},{"id":"0.82.0/25_cms-kernel-is-effect-native","kind":"manual","title":"The CMS kernel returns Effects; the Promise exports and the `*Effect` names are gone","version":"0.82.0"},{"id":"0.83.0/01_dashboard-inspection-contracts","kind":"manual","title":"Update custom cluster inspection and workflow start adapters","version":"0.83.0"},{"id":"0.83.0/02_reads-of-removed-anonymous-options","kind":"manual","title":"Code still naming anonymousTenantId, anonymousTenantRequired or anonymousTenantDefault","version":"0.83.0"},{"id":"0.83.0/03_stringified-rpc-failures-in-wrapped-hooks","kind":"manual","title":"String(error) on an rpc failure in files 0.82.0/05 could not see","version":"0.83.0"},{"id":"0.83.0/04_cms-review-status-failure","kind":"manual","title":"Handle ambiguous CMS review history and migrate its sequence","version":"0.83.0"},{"id":"0.83.0/05_mail-postgres-stores-use-the-app-connection","kind":"manual","title":"The mail plugin's 'postgres' stores are tables of the app's schema","version":"0.83.0"},{"id":"0.83.0/06_ratelimit-store-is-a-table-of-the-app-schema","kind":"manual","title":"The rate limiter's shared store is a table of the app's schema","version":"0.83.0"},{"id":"0.83.0/07_aggregate-tables-are-declared-framework-tables","kind":"manual","title":"Aggregate materializations live in declared framework tables","version":"0.83.0"},{"id":"0.83.0/08_analytics-mirror-tables-are-declared","kind":"manual","title":"The analytics mirror's tables are declared, never created by the sink","version":"0.83.0"},{"id":"0.83.0/09_web-process-tables-are-api-framework-tables","kind":"manual","title":"The web process's ISR cache and replica tables are api framework tables","version":"0.83.0"},{"id":"0.9.0/01_ssr-layout-shell-for-spa","kind":"manual","title":"A `renderMode:'spa'` page under a layout now server-renders that layout","version":"0.9.0"}]},"engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./startup":{"types":"./dist/startup.d.ts","import":"./dist/startup.js","default":"./dist/startup.js"},"./contract":{"types":"./dist/contract.d.ts","import":"./dist/contract.js","default":"./dist/contract.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"},"./devActivity":{"types":"./dist/devActivity.d.ts","import":"./dist/devActivity.js","default":"./dist/devActivity.js"},"./devArtifacts":{"types":"./dist/devArtifacts.d.ts","import":"./dist/devArtifacts.js","default":"./dist/devArtifacts.js"},"./inspectState":{"types":"./dist/inspectState.d.ts","import":"./dist/inspectState.js","default":"./dist/inspectState.js"},"./package.json":"./package.json"},"gitHead":"51d1cdd3159ac3cf07bcf43f96e61cf45c3c8c31","_npmUser":{"name":"voltro.dev","email":"dev@voltro.dev"},"_npmVersion":"11.19.0","description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ioredis":"^5.11.1","chokidar":"^5.0.0","ts-morph":"^28.0.0","@voltro/ai":"0.83.0","@voltro/kv":"0.83.0","tinyglobby":"^0.2.17","@effect/sql":"^0.52.1","@voltro/env":"0.83.0","@voltro/plan":"0.83.0","@voltro/cache":"0.83.0","@voltro/client":"0.83.0","@voltro/logger":"0.83.0","@voltro/content":"0.83.0","@voltro/runtime":"0.83.0","@effect/workflow":"^0.19.1","@voltro/database":"0.83.0","@voltro/protocol":"0.83.0","@voltro/workflow":"0.83.0","cjs-module-lexer":"^2.2.0","@voltro/api-client":"0.83.0","@voltro/serverless":"0.83.0","@voltro/plugin-auth":"0.83.0","@voltro/plugin-mail":"0.83.0","@effect/platform-node":"^0.108.2","@voltro/data-transfer":"0.83.0","@voltro/plugin-openapi":"0.83.0","@voltro/plugin-storage":"0.83.0","@voltro/plugin-webhooks":"0.83.0","@voltro/plugin-broadcast":"0.83.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","peerDependencies":{"effect":"^3.22.2","@effect/rpc":"^0.76.2","@effect/platform":"^0.97.2"},"optionalDependencies":{"tsx":"^4.23.13","vite":"^8.3.0","sharp":"^0.35.4","satori":"0.33.4","esbuild":"^0.28.2","fontkit":"^2.0.4","postject":"1.0.0-alpha.6","fontverter":"2.0.0","@vercel/nft":"^1.11.0","subset-font":"^2.7.0","@grpc/grpc-js":"^1.14.5","@resvg/resvg-js":"^2.6.2","@grpc/reflection":"^1.0.4","@tailwindcss/vite":"^4.3.3","grpc-health-check":"^2.1.0","@grpc/proto-loader":"^0.8.1","@vitejs/plugin-react":"^6.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.83.0_1791010122047_0.3433963073499533","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-07-15T04:13:25.258Z","modified":"2026-10-03T06:55:24.282Z","0.1.0":"2026-07-15T04:13:25.642Z","0.1.1":"2026-07-15T06:23:15.463Z","0.1.2":"2026-07-15T10:29:01.079Z","0.1.3":"2026-07-16T05:28:36.485Z","0.1.4":"2026-07-16T13:57:23.907Z","0.1.5":"2026-07-17T04:29:52.375Z","0.1.6":"2026-07-17T08:44:22.375Z","0.2.0":"2026-07-17T13:24:14.478Z","0.2.1":"2026-07-17T15:55:23.593Z","0.2.2":"2026-07-17T19:51:56.913Z","0.3.0":"2026-07-18T10:54:41.328Z","0.4.0":"2026-07-18T18:57:28.272Z","0.5.0":"2026-07-18T21:08:37.663Z","0.6.0":"2026-07-19T17:27:38.408Z","0.7.0":"2026-07-20T06:21:39.527Z","0.8.0":"2026-07-20T14:25:12.055Z","0.9.0":"2026-07-21T14:45:42.818Z","0.10.0":"2026-07-22T13:56:59.213Z","0.11.0":"2026-07-22T20:44:33.098Z","0.11.1":"2026-07-24T02:43:36.754Z","0.11.2":"2026-07-24T08:08:12.617Z","0.11.3":"2026-07-24T13:49:03.686Z","0.11.4":"2026-07-25T08:12:30.203Z","0.12.0":"2026-07-25T14:04:31.582Z","0.13.0":"2026-07-25T19:35:22.933Z","0.14.0":"2026-07-26T20:03:25.946Z","0.15.0":"2026-07-27T08:08:47.297Z","0.16.0":"2026-07-27T11:37:33.167Z","0.17.0":"2026-07-27T15:56:53.888Z","0.18.0":"2026-07-28T16:58:03.214Z","0.19.0":"2026-07-29T08:45:02.172Z","0.20.0":"2026-07-29T18:47:06.576Z","0.20.1":"2026-07-30T07:41:34.584Z","0.20.2":"2026-07-30T13:27:06.030Z","0.21.0":"2026-07-31T16:59:16.320Z","0.22.0":"2026-08-01T17:14:37.902Z","0.22.1":"2026-08-01T19:25:54.466Z","0.23.0":"2026-08-02T15:22:58.169Z","0.24.0":"2026-08-02T20:55:54.781Z","0.25.0":"2026-08-04T01:18:03.416Z","0.26.0":"2026-08-05T05:36:23.237Z","0.27.0":"2026-08-05T22:05:37.837Z","0.28.0":"2026-08-07T01:28:35.019Z","0.29.0":"2026-08-07T15:25:45.153Z","0.30.0":"2026-08-08T19:11:24.731Z","0.30.1":"2026-08-09T08:51:01.054Z","0.30.2":"2026-08-09T17:40:45.231Z","0.31.0":"2026-08-10T06:58:14.378Z","0.32.0":"2026-08-10T11:36:33.791Z","0.33.0":"2026-08-11T03:59:35.078Z","0.34.0":"2026-08-12T15:05:48.587Z","0.35.0":"2026-08-13T08:42:37.442Z","0.36.0":"2026-08-13T12:14:52.828Z","0.37.0":"2026-08-13T21:00:21.240Z","0.38.0":"2026-08-14T05:38:24.271Z","0.39.0":"2026-08-16T10:32:16.495Z","0.39.1":"2026-08-16T13:48:21.771Z","0.40.0":"2026-08-16T19:20:21.063Z","0.41.0":"2026-08-17T10:37:53.645Z","0.42.0":"2026-08-17T23:14:41.718Z","0.43.0":"2026-08-18T07:55:22.138Z","0.43.1":"2026-08-18T14:07:47.570Z","0.43.2":"2026-08-18T21:46:07.631Z","0.44.0":"2026-08-19T06:37:33.808Z","0.44.1":"2026-08-19T19:05:20.723Z","0.45.0":"2026-08-21T08:05:55.052Z","0.46.0":"2026-08-22T06:28:37.006Z","0.47.0":"2026-08-22T10:59:32.619Z","0.48.0":"2026-08-22T22:13:49.822Z","0.49.0":"2026-08-23T14:00:11.620Z","0.50.0":"2026-08-23T21:18:27.587Z","0.50.1":"2026-08-24T10:30:43.914Z","0.51.0":"2026-08-24T19:31:03.823Z","0.52.0":"2026-08-25T19:54:51.579Z","0.53.0":"2026-08-26T23:22:19.339Z","0.54.0":"2026-08-27T07:46:49.463Z","0.55.0":"2026-08-27T16:13:17.509Z","0.56.0":"2026-08-29T14:15:32.847Z","0.57.0":"2026-08-30T02:11:17.228Z","0.58.0":"2026-08-30T12:32:32.569Z","0.59.0":"2026-08-30T20:12:15.400Z","0.60.0":"2026-08-31T08:57:50.905Z","0.61.0":"2026-09-01T01:51:28.218Z","0.62.0":"2026-09-01T21:51:31.339Z","0.62.1":"2026-09-02T21:16:15.756Z","0.62.2":"2026-09-03T08:15:33.867Z","0.62.3":"2026-09-03T17:56:13.413Z","0.63.0":"2026-09-04T01:12:19.563Z","0.64.0":"2026-09-04T13:50:35.841Z","0.65.0":"2026-09-04T21:30:53.809Z","0.66.0":"2026-09-06T11:58:53.859Z","0.66.1":"2026-09-06T19:14:18.386Z","0.67.0":"2026-09-07T09:51:08.546Z","0.68.0":"2026-09-09T23:37:00.099Z","0.69.0":"2026-09-10T18:00:56.629Z","0.69.1":"2026-09-11T14:01:27.882Z","0.70.0":"2026-09-11T22:20:38.188Z","0.71.0":"2026-09-14T11:50:54.984Z","0.71.1":"2026-09-14T22:40:22.995Z","0.72.0":"2026-09-17T03:16:15.679Z","0.73.0":"2026-09-17T21:35:21.793Z","0.74.0":"2026-09-19T03:25:02.502Z","0.75.0":"2026-09-19T20:42:50.113Z","0.76.0":"2026-09-21T08:07:09.736Z","0.77.0":"2026-09-22T03:55:49.693Z","0.77.1":"2026-09-22T07:08:11.692Z","0.78.0":"2026-09-22T15:48:47.430Z","0.79.0":"2026-09-23T13:02:20.068Z","0.79.1":"2026-09-24T07:04:04.552Z","0.80.0":"2026-09-24T15:15:54.114Z","0.81.0":"2026-09-26T03:11:08.793Z","0.82.0":"2026-10-01T15:02:40.001Z","0.83.0":"2026-10-03T06:48:42.241Z"},"bugs":{"email":"support@voltro.dev"},"author":{"url":"https://voltro.dev","name":"Voltro UG"},"license":"SEE LICENSE IN LICENSE","homepage":"https://voltro.dev","keywords":["voltro","typescript","framework"],"description":"The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.","maintainers":[{"name":"voltro.dev","email":"dev@voltro.dev"}],"readme":"","readmeFilename":"README.md"}