{"_id":"@devx-retailos/store-config","_rev":"9-1f09525b8555f785389b38503d10745c","name":"@devx-retailos/store-config","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"@devx-retailos/store-config","version":"0.0.1","keywords":["medusa-plugin"],"license":"MIT","_id":"@devx-retailos/store-config@0.0.1","maintainers":[{"name":"brijeshagarwal","email":"brijesh@devxlabs.ai"},{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"}],"dist":{"shasum":"3efbb432da49cf3228ea68b95579f42491e57c3a","tarball":"https://registry.npmjs.org/@devx-retailos/store-config/-/store-config-0.0.1.tgz","fileCount":43,"integrity":"sha512-GKL/+Q43wUqofgMaWfOuUjp8eiMimJ/rjaXapouMKkDMANEMVt64DrrPpfxOFfvy/PNwgdr1T2+FJYOsgYD9NQ==","signatures":[{"sig":"MEUCIGiC4oX7Va4iFRLlL7hfzI+5VlMkoKH4AemJMcdNvIwHAiEAmHijGen7Z7FwG3497VBJyVfnelSAFHmQ2ngmMKqP+oM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":123303},"main":"./.medusa/server/src/modules/store-config/index.js","_from":"file:devx-retailos-store-config-0.0.1.tgz","types":"./.medusa/server/src/modules/store-config/index.d.ts","exports":{".":{"types":"./.medusa/server/src/modules/store-config/index.d.ts","import":"./.medusa/server/src/modules/store-config/index.js","require":"./.medusa/server/src/modules/store-config/index.js"},"./errors":{"types":"./.medusa/server/src/modules/store-config/errors.d.ts","import":"./.medusa/server/src/modules/store-config/errors.js","require":"./.medusa/server/src/modules/store-config/errors.js"},"./permissions":{"types":"./.medusa/server/src/modules/store-config/permissions.d.ts","import":"./.medusa/server/src/modules/store-config/permissions.js","require":"./.medusa/server/src/modules/store-config/permissions.js"},"./package.json":"./package.json","./.medusa/server/src/modules/store-config":"./.medusa/server/src/modules/store-config/index.js","./.medusa/server/src/modules/store-config/*":"./.medusa/server/src/modules/store-config/*"},"scripts":{"test":"vitest run","build":"medusa plugin:build","clean":"rm -rf .medusa dist .turbo *.tsbuildinfo","develop":"medusa plugin:develop","typecheck":"tsc --noEmit","db:generate":"medusa plugin:db:generate"},"_npmUser":{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"},"_resolved":"/tmp/ffb649b1c4fcb9dfc593c90982c539ee/devx-retailos-store-config-0.0.1.tgz","_integrity":"sha512-GKL/+Q43wUqofgMaWfOuUjp8eiMimJ/rjaXapouMKkDMANEMVt64DrrPpfxOFfvy/PNwgdr1T2+FJYOsgYD9NQ==","_npmVersion":"10.8.2","description":"Typed, org/store-scoped configuration and atomic sequence counters for retailOS POS backends.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@devx-retailos/core":"0.0.1","@devx-retailos/rbac":"0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","react":"^18.3.0","typescript":"^5.7.2","@types/react":"^18.3.0","@medusajs/cli":"2.15.5","@medusajs/medusa":"2.15.5","@medusajs/admin-sdk":"2.15.5","@medusajs/framework":"2.15.5","@medusajs/admin-shared":"2.15.5"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@medusajs/medusa":"^2.15.0","@medusajs/framework":"^2.15.0"},"_npmOperationalInternal":{"tmp":"tmp/store-config_0.0.1_1781164531393_0.01693477199963178","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@devx-retailos/store-config","version":"0.0.2","keywords":["medusa-plugin"],"license":"MIT","_id":"@devx-retailos/store-config@0.0.2","maintainers":[{"name":"brijeshagarwal","email":"brijesh@devxlabs.ai"},{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"}],"dist":{"shasum":"edf7dc21aaa2b634e3639eb1b503255213eaed9b","tarball":"https://registry.npmjs.org/@devx-retailos/store-config/-/store-config-0.0.2.tgz","fileCount":44,"integrity":"sha512-kLki2rwVAKBBscUQZ4jhxgtbdlfcZUCke4eobm/pDwkmYK0UXWBxMR3L7192Dr9JomnqFSFbxH5sb85HSUpZtQ==","signatures":[{"sig":"MEUCICWg5Y/5Od1pcGdhRx5LPQrBi515MBCOa8pudFioldVRAiEAyOZIxKVGLFuteRwb3PRgMowN7vw+RQnmFW2qsB6cNUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128768},"main":"./.medusa/server/src/modules/store-config/index.js","_from":"file:devx-retailos-store-config-0.0.2.tgz","types":"./.medusa/server/src/modules/store-config/index.d.ts","exports":{".":{"types":"./.medusa/server/src/modules/store-config/index.d.ts","import":"./.medusa/server/src/modules/store-config/index.js","require":"./.medusa/server/src/modules/store-config/index.js"},"./errors":{"types":"./.medusa/server/src/modules/store-config/errors.d.ts","import":"./.medusa/server/src/modules/store-config/errors.js","require":"./.medusa/server/src/modules/store-config/errors.js"},"./permissions":{"types":"./.medusa/server/src/modules/store-config/permissions.d.ts","import":"./.medusa/server/src/modules/store-config/permissions.js","require":"./.medusa/server/src/modules/store-config/permissions.js"},"./package.json":"./package.json","./.medusa/server/src/modules/store-config":"./.medusa/server/src/modules/store-config/index.js","./.medusa/server/src/modules/store-config/*":"./.medusa/server/src/modules/store-config/*"},"scripts":{"test":"vitest run","build":"medusa plugin:build","clean":"rm -rf .medusa dist .turbo *.tsbuildinfo","develop":"medusa plugin:develop","typecheck":"tsc --noEmit","db:generate":"medusa plugin:db:generate"},"_npmUser":{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"},"_resolved":"/tmp/041de62f1197004de824caa171310c22/devx-retailos-store-config-0.0.2.tgz","_integrity":"sha512-kLki2rwVAKBBscUQZ4jhxgtbdlfcZUCke4eobm/pDwkmYK0UXWBxMR3L7192Dr9JomnqFSFbxH5sb85HSUpZtQ==","_npmVersion":"10.8.2","description":"Typed, org/store-scoped configuration and atomic sequence counters for retailOS POS backends.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@devx-retailos/core":"0.0.2","@devx-retailos/rbac":"0.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","react":"^18.3.0","typescript":"^5.7.2","@types/react":"^18.3.0","@medusajs/cli":"2.15.5","@medusajs/medusa":"2.15.5","@medusajs/admin-sdk":"2.15.5","@medusajs/framework":"2.15.5","@medusajs/admin-shared":"2.15.5"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@medusajs/medusa":"^2.15.0","@medusajs/framework":"^2.15.0"},"_npmOperationalInternal":{"tmp":"tmp/store-config_0.0.2_1781166337079_0.23509936852225244","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@devx-retailos/store-config","version":"0.0.3","keywords":["medusa-plugin"],"license":"MIT","_id":"@devx-retailos/store-config@0.0.3","maintainers":[{"name":"jinangvohera","email":"jinang.vohera@devxlabs.ai"},{"name":"nayan-devx","email":"nayan@devxlabs.ai"},{"name":"kaushal_1717","email":"kaushal.padaliya@devxlabs.ai"},{"name":"brijeshagarwal","email":"brijesh@devxlabs.ai"},{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"}],"dist":{"shasum":"2da6af60f45c9211b550e45463b5d9d5103e1ef5","tarball":"https://registry.npmjs.org/@devx-retailos/store-config/-/store-config-0.0.3.tgz","fileCount":47,"integrity":"sha512-Lrptws9rFEg+sVun6VWXyyllrzoLKJW6YE6fyoz1w53y2mghKQKDQriW5V8QLMdZyu1Esr+YQKkSVmKTjaHPsg==","signatures":[{"sig":"MEQCIC7Qq3AJoNZfViItm6OY4jPw8NAdtjcV7dZIii6YzLuQAiA2+ED2BFAzIDs6MT0k3R/CPJKKcYudZQidmQI7eCXMUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149365},"main":"./.medusa/server/src/modules/store-config/index.js","_from":"file:devx-retailos-store-config-0.0.3.tgz","types":"./.medusa/server/src/modules/store-config/index.d.ts","exports":{".":{"types":"./.medusa/server/src/modules/store-config/index.d.ts","import":"./.medusa/server/src/modules/store-config/index.js","require":"./.medusa/server/src/modules/store-config/index.js"},"./errors":{"types":"./.medusa/server/src/modules/store-config/errors.d.ts","import":"./.medusa/server/src/modules/store-config/errors.js","require":"./.medusa/server/src/modules/store-config/errors.js"},"./permissions":{"types":"./.medusa/server/src/modules/store-config/permissions.d.ts","import":"./.medusa/server/src/modules/store-config/permissions.js","require":"./.medusa/server/src/modules/store-config/permissions.js"},"./package.json":"./package.json","./.medusa/server/src/modules/store-config":"./.medusa/server/src/modules/store-config/index.js","./.medusa/server/src/modules/store-config/*":"./.medusa/server/src/modules/store-config/*"},"scripts":{"test":"vitest run","build":"medusa plugin:build","clean":"rm -rf .medusa dist .turbo *.tsbuildinfo","develop":"medusa plugin:develop","typecheck":"tsc --noEmit","db:generate":"medusa plugin:db:generate"},"_npmUser":{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"},"_resolved":"/tmp/73e16acb9975da6a5fe4780e6afa9502/devx-retailos-store-config-0.0.3.tgz","_integrity":"sha512-Lrptws9rFEg+sVun6VWXyyllrzoLKJW6YE6fyoz1w53y2mghKQKDQriW5V8QLMdZyu1Esr+YQKkSVmKTjaHPsg==","_npmVersion":"10.8.2","description":"Typed, org/store-scoped configuration and atomic sequence counters for retailOS POS backends.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@devx-retailos/core":"0.0.2","@devx-retailos/rbac":"0.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","react":"^18.3.0","typescript":"^5.7.2","@types/react":"^18.3.0","@medusajs/cli":"2.15.5","@medusajs/medusa":"2.15.5","@medusajs/admin-sdk":"2.15.5","@medusajs/framework":"2.15.5","@medusajs/admin-shared":"2.15.5"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@medusajs/medusa":"^2.15.0","@medusajs/framework":"^2.15.0"},"_npmOperationalInternal":{"tmp":"tmp/store-config_0.0.3_1782728474640_0.5853802025507122","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@devx-retailos/store-config","version":"0.0.4","keywords":["medusa-plugin"],"license":"MIT","_id":"@devx-retailos/store-config@0.0.4","maintainers":[{"name":"jinangvohera","email":"jinang.vohera@devxlabs.ai"},{"name":"nayan-devx","email":"nayan@devxlabs.ai"},{"name":"kaushal_1717","email":"kaushal.padaliya@devxlabs.ai"},{"name":"karandevx","email":"karan.desai@devxlabs.ai"},{"name":"brijeshagarwal","email":"brijesh@devxlabs.ai"},{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"}],"dist":{"shasum":"2fa1041ac7f49f874e064a45b256149672923866","tarball":"https://registry.npmjs.org/@devx-retailos/store-config/-/store-config-0.0.4.tgz","fileCount":48,"integrity":"sha512-sHuLOfK+uTGpZWZuGDSM/PyVQLdr0YrGBsGo1+ffMwcMzZKuZGMi7PxjB8BPElNApOe/MB6C0q2wvW56eTieOw==","signatures":[{"sig":"MEQCIGzdsTnRGZMWk7AePOLxQur7xoDgGW18SN3+47L3okz0AiBdJkEG/Ha7QnVgpaz2Kv2FjtQuW6gLGNd50UnYN5pPow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152060},"main":"./.medusa/server/src/modules/store-config/index.js","_from":"file:devx-retailos-store-config-0.0.4.tgz","types":"./.medusa/server/src/modules/store-config/index.d.ts","exports":{".":{"types":"./.medusa/server/src/modules/store-config/index.d.ts","import":"./.medusa/server/src/modules/store-config/index.js","require":"./.medusa/server/src/modules/store-config/index.js"},"./errors":{"types":"./.medusa/server/src/modules/store-config/errors.d.ts","import":"./.medusa/server/src/modules/store-config/errors.js","require":"./.medusa/server/src/modules/store-config/errors.js"},"./permissions":{"types":"./.medusa/server/src/modules/store-config/permissions.d.ts","import":"./.medusa/server/src/modules/store-config/permissions.js","require":"./.medusa/server/src/modules/store-config/permissions.js"},"./package.json":"./package.json","./.medusa/server/src/modules/store-config":"./.medusa/server/src/modules/store-config/index.js","./.medusa/server/src/modules/store-config/*":"./.medusa/server/src/modules/store-config/*"},"scripts":{"test":"vitest run","build":"medusa plugin:build","clean":"rm -rf .medusa dist .turbo *.tsbuildinfo","develop":"medusa plugin:develop","typecheck":"tsc --noEmit","db:generate":"medusa plugin:db:generate"},"_npmUser":{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"},"_resolved":"/tmp/d489f8312e2aaf9c68c116beef8651b0/devx-retailos-store-config-0.0.4.tgz","_integrity":"sha512-sHuLOfK+uTGpZWZuGDSM/PyVQLdr0YrGBsGo1+ffMwcMzZKuZGMi7PxjB8BPElNApOe/MB6C0q2wvW56eTieOw==","_npmVersion":"10.8.2","description":"Typed, org/store-scoped configuration and atomic sequence counters for retailOS POS backends.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@devx-retailos/core":"0.0.2","@devx-retailos/rbac":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","react":"^18.3.0","typescript":"^5.7.2","@types/react":"^18.3.0","@medusajs/cli":"2.15.5","@medusajs/medusa":"2.15.5","@medusajs/admin-sdk":"2.15.5","@medusajs/framework":"2.15.5","@medusajs/admin-shared":"2.15.5"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","@medusajs/medusa":"^2.15.0","@medusajs/framework":"^2.15.0"},"_npmOperationalInternal":{"tmp":"tmp/store-config_0.0.4_1785407388879_0.3060745476973674","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@devx-retailos/store-config","version":"0.1.0","description":"Typed, org/store-scoped configuration and atomic sequence counters for retailOS POS backends.","license":"MIT","main":"./.medusa/server/src/modules/store-config/index.js","types":"./.medusa/server/src/modules/store-config/index.d.ts","exports":{".":{"types":"./.medusa/server/src/modules/store-config/index.d.ts","import":"./.medusa/server/src/modules/store-config/index.js","require":"./.medusa/server/src/modules/store-config/index.js"},"./permissions":{"types":"./.medusa/server/src/modules/store-config/permissions.d.ts","import":"./.medusa/server/src/modules/store-config/permissions.js","require":"./.medusa/server/src/modules/store-config/permissions.js"},"./errors":{"types":"./.medusa/server/src/modules/store-config/errors.d.ts","import":"./.medusa/server/src/modules/store-config/errors.js","require":"./.medusa/server/src/modules/store-config/errors.js"},"./package.json":"./package.json","./.medusa/server/src/modules/store-config":"./.medusa/server/src/modules/store-config/index.js","./.medusa/server/src/modules/store-config/*":"./.medusa/server/src/modules/store-config/*"},"dependencies":{"@devx-retailos/core":"0.0.2","@devx-retailos/rbac":"0.1.0"},"peerDependencies":{"@medusajs/framework":"^2.15.0","@medusajs/medusa":"^2.15.0","react":"^18.0.0 || ^19.0.0"},"devDependencies":{"@medusajs/admin-sdk":"2.15.5","@medusajs/admin-shared":"2.15.5","@medusajs/cli":"2.15.5","@medusajs/framework":"2.15.5","@medusajs/medusa":"2.15.5","@types/react":"^18.3.0","react":"^18.3.0","typescript":"^5.7.2","zod":"^3.23.0"},"publishConfig":{"access":"public"},"sideEffects":false,"keywords":["medusa-plugin"],"scripts":{"build":"medusa plugin:build","develop":"medusa plugin:develop","db:generate":"medusa plugin:db:generate","test":"vitest run","typecheck":"tsc --noEmit","clean":"rm -rf .medusa dist .turbo *.tsbuildinfo"},"_id":"@devx-retailos/store-config@0.1.0","_integrity":"sha512-bfqFzl0rYz9+y8e0XFTk/ypLl4mqIfmxZZrZRAI+ItGezwrKtbo8NVm5ePx9aaaJk+98/vBN+0u4U4/Y6YeZUA==","_resolved":"/tmp/23309b14713963b42a0d94ea06bcad6f/devx-retailos-store-config-0.1.0.tgz","_from":"file:devx-retailos-store-config-0.1.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-bfqFzl0rYz9+y8e0XFTk/ypLl4mqIfmxZZrZRAI+ItGezwrKtbo8NVm5ePx9aaaJk+98/vBN+0u4U4/Y6YeZUA==","shasum":"1735c799e3104db9bc5e91c33af9b4b49d5da247","tarball":"https://registry.npmjs.org/@devx-retailos/store-config/-/store-config-0.1.0.tgz","fileCount":55,"unpackedSize":190137,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIH+WffhOzCmsuUlJ/KOykQJDQ+su88NnO+A6FwBtL0ztAiEAn1nVf1h6ooBSINNPDNX4qHVfbobCRsmol77bG9Q785o="}]},"_npmUser":{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"},"directories":{},"maintainers":[{"name":"jinangvohera","email":"jinang.vohera@devxlabs.ai"},{"name":"nayan-devx","email":"nayan@devxlabs.ai"},{"name":"kaushal_1717","email":"kaushal.padaliya@devxlabs.ai"},{"name":"karandevx","email":"karan.desai@devxlabs.ai"},{"name":"brijeshagarwal","email":"brijesh@devxlabs.ai"},{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/store-config_0.1.0_1789383179891_0.8762610566684932"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-11T07:55:31.254Z","modified":"2026-09-14T10:53:00.242Z","0.0.1":"2026-06-11T07:55:31.533Z","0.0.2":"2026-06-11T08:25:37.240Z","0.0.3":"2026-06-29T10:21:14.785Z","0.0.4":"2026-07-30T10:29:49.012Z","0.1.0":"2026-09-14T10:53:00.032Z"},"license":"MIT","keywords":["medusa-plugin"],"description":"Typed, org/store-scoped configuration and atomic sequence counters for retailOS POS backends.","maintainers":[{"name":"jinangvohera","email":"jinang.vohera@devxlabs.ai"},{"name":"nayan-devx","email":"nayan@devxlabs.ai"},{"name":"kaushal_1717","email":"kaushal.padaliya@devxlabs.ai"},{"name":"karandevx","email":"karan.desai@devxlabs.ai"},{"name":"brijeshagarwal","email":"brijesh@devxlabs.ai"},{"name":"milanghoghari","email":"milan.ghoghari@devxlabs.ai"}],"readme":"# @devx-retailos/store-config\n\nTyped, org/store-scoped configuration entries and atomic sequence counters for POS backends. Store-level values override org-level values; secret values are masked at the API boundary; sequences increment in a single SQL statement so concurrent requests never produce duplicate numbers.\n\nPart of **retailOS**, a Medusa v2 SDK for offline-store POS systems. Each `@devx-retailos/*` package is an independently installable Medusa plugin that you compose in your brand's Medusa backend.\n\n## Installation\n\n```bash\nnpm install @devx-retailos/store-config\n```\n\nRequires a Medusa v2 project (`@medusajs/framework` / `@medusajs/medusa` `^2.15.0` and React as peers). `@devx-retailos/core` and `@devx-retailos/rbac` are installed automatically as dependencies — API routes enforce permissions through the RBAC module, and config entries are linked to RBAC organizations and stores.\n\n## Setup\n\n```ts\n// medusa-config.ts\nmodule.exports = defineConfig({\n  // ...\n  plugins: [\n    {\n      resolve: \"@devx-retailos/rbac\",\n      options: {},\n    },\n    {\n      resolve: \"@devx-retailos/store-config\",\n      options: {},\n    },\n  ],\n})\n```\n\nThen run migrations to create the `retailos_config_entry` and `retailos_config_sequence` tables:\n\n```bash\nnpx medusa db:migrate\n```\n\n## Usage\n\n```ts\nimport {\n  STORE_CONFIG_MODULE,\n  type StoreConfigModuleService,\n} from \"@devx-retailos/store-config\"\n\nconst config: StoreConfigModuleService = container.resolve(STORE_CONFIG_MODULE)\n```\n\n### Typed config entries\n\nValues are stored as strings with a `value_type` of `\"string\" | \"number\" | \"boolean\" | \"json\" | \"secret\"`. Reads resolve the store-level entry first, then fall back to the org-level entry (`store_id: null`).\n\n```ts\nconst scope = { organization_id: \"org_1\", store_id: \"store_1\" }\n\n// Write (validates the value parses as the declared type)\nawait config.set(\"invoice.tax_rate\", \"18\", scope, { value_type: \"number\" })\n\n// Read the raw entry, or the parsed value\nconst entry = await config.get(\"invoice.tax_rate\", scope)\nconst rate = await config.getTyped<number>(\"invoice.tax_rate\", scope) // 18\n\n// Optionally register known keys at boot so `set` infers their type\nconfig.registerConfigKey({\n  key: \"invoice.tax_rate\",\n  value_type: \"number\",\n  scope: \"both\",\n  description: \"GST rate applied at billing\",\n})\n```\n\nA failed parse throws `StoreConfigTypeError` (code `RETAILOS_STORE_CONFIG_TYPE_MISMATCH`). All error classes extend `RetailOSError` and are importable from `@devx-retailos/store-config/errors`.\n\n### Sequence counters\n\nSequences are rows in `retailos_config_sequence` with a `prefix`, `padding`, and `current_value`. Create one with the generated CRUD, then advance it atomically:\n\n```ts\nawait config.createConfigSequences([\n  { organization_id: \"org_1\", store_id: \"store_1\", key: \"invoice_number\", prefix: \"INV-\", padding: 5 },\n])\n\nconst next = await config.nextSequence(\"invoice_number\", scope) // \"INV-00001\"\nawait config.resetSequence(\"invoice_number\", scope, { value: 0 })\n```\n\n`nextSequence` / `resetSequence` throw `StoreConfigSequenceNotFoundError` (code `RETAILOS_STORE_CONFIG_SEQUENCE_NOT_FOUND`) if no sequence matches the key and scope.\n\n## Permissions\n\nRegistered into `retailos_permission` by a module loader at boot, and exported as\n`STORE_CONFIG_PERMISSIONS` (also from `@devx-retailos/store-config/permissions`) so a host can seed\nthem explicitly. Prefer seeding explicitly if you depend on these rows — the loader resolves the\nRBAC module from the module container, which is not guaranteed to have it registered yet:\n\n```ts\nimport { syncAllPermissions } from \"@devx-retailos/core\"\nimport { RBAC_MODULE } from \"@devx-retailos/rbac\"\nimport { STORE_CONFIG_PERMISSIONS } from \"@devx-retailos/store-config/permissions\"\n\nawait syncAllPermissions(container.resolve(RBAC_MODULE), STORE_CONFIG_PERMISSIONS)\n```\n\n| Key | Description |\n| --- | --- |\n| `cms.config.read` | List and retrieve configuration entries (secrets excluded) |\n| `cms.config.update` | Create or update configuration entries |\n| `cms.config.read_secret` | Read the plaintext value of secret-typed configuration entries |\n| `cms.sequence.read` | List sequence counters and advance to the next value |\n| `cms.sequence.reset` | Reset a sequence counter to a given value |\n\n## Authorization\n\nBy default every route resolves the caller with `@devx-retailos/rbac` — `subjectFromRequest()` for\nthe subject, then role assignments in `retailos_user_role` — and checks the keys above.\n\n**If your app does not assign roles through `retailos_user_role`, that lookup cannot see your\nusers and every route will 403 no matter how the permissions are seeded.** Supply `authorize` to\nenforce with your own decision layer and your own permission vocabulary instead:\n\n```ts\n// medusa-config.ts\n{\n  resolve: \"@devx-retailos/store-config\",\n  options: {\n    authorize: async (req, permission, scope) => {\n      // `permission` is this package's key (\"cms.config.read\", …); map it onto yours.\n      // `scope` is the { organization_id, store_id } the route resolved.\n      return myDecisionLayer.can(req, PERMISSION_MAP[permission], scope)\n    },\n  },\n}\n```\n\nReturning anything but `true` denies, and a throw denies. There is no \"defer to the default\"\nreturn value on purpose: a hook that forgets a branch must fail closed rather than fall back to a\npermission set your app does not model. A non-callable value is ignored with an error logged at\nboot, and the default RBAC check applies.\n\n## API routes\n\nRoutes resolve scope from `organization_id` / `store_id` query params (or body for POSTs) or the `x-retailos-organization-id` / `x-retailos-store-id` headers, and check permissions via RBAC. Entries with `value_type: \"secret\"` are returned with `value: null` unless the caller holds `cms.config.read_secret`.\n\n| Method | Path | Description | Permission |\n| --- | --- | --- | --- |\n| `GET` | `/admin/retailos/config` | List config entries for a scope | `cms.config.read` |\n| `POST` | `/admin/retailos/config` | Create or update a config entry | `cms.config.update` |\n| `GET` | `/admin/retailos/config/:key` | Get one entry (store-level wins over org-level) | `cms.config.read` |\n| `DELETE` | `/admin/retailos/config/:key` | Delete an entry | `cms.config.update` |\n| `GET` | `/admin/retailos/config/sequences` | List sequence counters for a scope | `cms.sequence.read` |\n| `POST` | `/admin/retailos/config/sequences/:key/next` | Atomically advance and return the formatted value | `cms.sequence.read` |\n| `POST` | `/admin/retailos/config/sequences/:key/reset` | Reset a sequence to a value (default 0) | `cms.sequence.reset` |\n\n## Admin UI\n\nShips a config-editor widget injected into the `store.details.after` zone of Medusa Admin, with type-aware inputs (checkbox for booleans, number input, JSON textarea) for editing entries.\n\n## Related packages\n\n- `@devx-retailos/core` — shared types, `Logger`, `RetailOSError`, permission registry.\n- `@devx-retailos/rbac` — organizations, stores, roles, permissions; enforces this module's permission keys.\n- `@devx-retailos/store-details` — extended store metadata (address, contact, tax info).\n- `@devx-retailos/footfall` — time-series visitor footfall per store.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}