{"_id":"@bernierllc/retry-state","_rev":"10-8997ad09de443a5143db9b8ab6e7585a","name":"@bernierllc/retry-state","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.1":{"name":"@bernierllc/retry-state","version":"0.1.1","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"e52d9839aacf988ace8fb267039831706b55810b","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.1.1.tgz","fileCount":27,"integrity":"sha512-SwUM8w/HdvLTl/IRKrvsGQHDx6de0drSaxIdzUrvrKnQ54BBpk5dSc88K926F3wYF7sAIc8gPJgjMA/0+vlPdQ==","signatures":[{"sig":"MEUCIQCfHS25DTFutBGelpza5Ub01uIf8dGd7hLdJAuZIqIf7QIgIzcg+Tb2w64a/kMLY4/QOUarApSVPM7w5F2I7NIq9JQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81164},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ee9dac38230c70ac18e2679c1db260380d2d6c6f","scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.4.2","description":"Atomic retry state management utilities for the BernierLLC package suite","directories":{},"_nodeVersion":"24.4.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.1.1_1753674311462_0.21830581993840248","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@bernierllc/retry-state","version":"0.1.3","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.1.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"8119da68c98c95ba2dfbe0679078046bdf401566","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.1.3.tgz","fileCount":27,"integrity":"sha512-zRKjcC5EkBwv+KErsKl1ld+h24L1NcJm5Fo3xc/VZRbXn6VxaY+zxVmBqE/u9Bf5Ww7sDQsHNVPS6/n2+IZM3A==","signatures":[{"sig":"MEQCIDQX6gcI3u65tqdSPltZIxHLh2PoNE72J6kb9buJ3EaEAiBoWklX1NK8C++43zkEJ5qmlOf5gNTZwdkJKu4HxYNANw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80347},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"4f5f501bc554b1769a4b9e08730717d542801b21","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.4.2","description":"Atomic retry state management utilities","directories":{},"_nodeVersion":"24.4.1","publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.1.3_1756845257710_0.9797519572140487","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bernierllc/retry-state","version":"0.2.0","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"df53ec436ff2afd04b4a425dc7f1f6be29c0d130","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.2.0.tgz","fileCount":27,"integrity":"sha512-Z68zJFWMfn5XKK34Y4KCGZdIYES4SwSGWXi/zH9C0N2i7Y0CUONC4OP9jxY0CYXPNUTKBM+uZQsgS/YQQnRIgw==","signatures":[{"sig":"MEQCIC3ZObF+MKJcjcKSaPbvJPs3aq3Bq6rM5bnC6CbUPRLgAiBBY01i1Raz3aTLSDBmrCGcw6hp/sQxR6cfvJtNZMmwzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80389},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"db551cb6bf3978b86c5dbb9404a7ad53e8c837da","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:148f4428-6c0a-487e-9d66-416aebab0746"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.10.0","description":"Atomic retry state management utilities","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.2.0_1771268219896_0.9897098311231098","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bernierllc/retry-state","version":"0.2.1","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.2.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"ef45bc023d147df4636e46a877e689745816d255","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.2.1.tgz","fileCount":27,"integrity":"sha512-GOZB/mDt/Whlz0M4qOfBAeon9eRZ4IUd7AOMk5TicPv1MbTit2A124NPL+L6wjQwprgbhuQTF2xH+FeK4nR5Fg==","signatures":[{"sig":"MEUCIQDgltYDDjunkhPAEMNI6YDJpXafUkOLVGrdbI1JFLPxqQIgJR6krwJ+6LVrxEHmzpz6nGRipiL5hlZRp6bYjMj4l8s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80384},"main":"dist/index.js","_from":"file:bernierllc-retry-state-0.2.1.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/Users/mattbernier/projects/tools/packages/core/retry-state/bernierllc-retry-state-0.2.1.tgz","_integrity":"sha512-GOZB/mDt/Whlz0M4qOfBAeon9eRZ4IUd7AOMk5TicPv1MbTit2A124NPL+L6wjQwprgbhuQTF2xH+FeK4nR5Fg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.6.2","description":"Atomic retry state management utilities","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.2.1_1772572009847_0.5594012827927959","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bernierllc/retry-state","version":"0.2.2","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"470f102e6d198993dcbe46c17bda6faa75aebe48","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.2.2.tgz","fileCount":27,"integrity":"sha512-wyjiitd5La3IIsuHIPX5l5FhzvecNDWrQAq18GlcF5L7y204fYyhKH2U0pwNITzxD3BgFGM0U4yCzx2HAgk/0Q==","signatures":[{"sig":"MEUCIAdYA+Q9nGxUWMdKBN0RL+S2MYq6Yn8Kl+GnHPXizJyEAiEAnl/553FaYvsqkQ4ACPjz0NJx3rAwv8J20hiqV1oWrwQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80384},"main":"dist/index.js","_from":"file:bernierllc-retry-state-0.2.2.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:148f4428-6c0a-487e-9d66-416aebab0746"}},"_resolved":"/home/runner/work/tools/tools/packages/core/retry-state/bernierllc-retry-state-0.2.2.tgz","_integrity":"sha512-wyjiitd5La3IIsuHIPX5l5FhzvecNDWrQAq18GlcF5L7y204fYyhKH2U0pwNITzxD3BgFGM0U4yCzx2HAgk/0Q==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.11.0","description":"Atomic retry state management utilities","directories":{},"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.2.2_1773163260883_0.456326271536478","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/retry-state","version":"0.3.0","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"1a4db6c1bf66bb718f0073c8690b5ea4b61530b8","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.3.0.tgz","fileCount":27,"integrity":"sha512-vuki10a3Y4ILpCZGPzmz0yIp9Dych6yNVzXcIbGvmcXJETTXy5/PZFcn+NWcZAg8MLaF0+hRd7UST9FS3s+qqg==","signatures":[{"sig":"MEYCIQCKDaJp59kmruvffgAeOxFCR2nwquw/dfmQSegV9uIdDgIhAJjMbNxM3jEqODu0zx9BexoPeEtpo7C7jbbzKlB/YFd4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80384},"main":"dist/index.js","_from":"file:bernierllc-retry-state-0.3.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:148f4428-6c0a-487e-9d66-416aebab0746"}},"_resolved":"/home/runner/work/tools/tools/packages/core/retry-state/bernierllc-retry-state-0.3.0.tgz","_integrity":"sha512-vuki10a3Y4ILpCZGPzmz0yIp9Dych6yNVzXcIbGvmcXJETTXy5/PZFcn+NWcZAg8MLaF0+hRd7UST9FS3s+qqg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.14.1","description":"Atomic retry state management utilities","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.3.0_1779241380401_0.6968040721686881","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@bernierllc/retry-state","version":"0.4.0","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","_id":"@bernierllc/retry-state@0.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"47dd07082776ca51425544d23b5974eaf1d27bec","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.4.0.tgz","fileCount":31,"integrity":"sha512-vYZN9/ggtKDAf+etwsJTjjG5tkC/onthg+/IlXP1qUuTHfstfIu2KAuitE8qBnuUbi3si5B7Hb0j7VazRw9/TA==","signatures":[{"sig":"MEUCIHRb9pMvBoLycizSo21I/OWxX6AqrOd9odqGpStKycraAiEAgdHJFqwgYqEU7iB4W0DURvVDDVr8y5Tz8HXywQ0XbFg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83426},"main":"dist/index.js","_from":"file:bernierllc-retry-state-0.4.0.tgz","types":"dist/index.d.ts","private":false,"scripts":{"test":"jest","build":"tsc","clean":"rm -rf dist","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:148f4428-6c0a-487e-9d66-416aebab0746"}},"_resolved":"/home/runner/work/tools/tools/packages/core/retry-state/bernierllc-retry-state-0.4.0.tgz","_integrity":"sha512-vYZN9/ggtKDAf+etwsJTjjG5tkC/onthg+/IlXP1qUuTHfstfIu2KAuitE8qBnuUbi3si5B7Hb0j7VazRw9/TA==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/retry-state"},"_npmVersion":"11.14.1","description":"Atomic retry state management utilities","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/retry-state_0.4.0_1779243288704_0.4020013811071894","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/retry-state","version":"0.5.0","private":false,"description":"Atomic retry state management utilities","main":"dist/index.js","types":"dist/index.d.ts","keywords":["retry","state","management","persistence","atomic","bernierllc"],"author":{"name":"Bernier LLC"},"license":"MIT","devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/retry-state"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","scripts":{"build":"tsc","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:run":"jest --passWithNoTests","clean":"rm -rf dist"},"_id":"@bernierllc/retry-state@0.5.0","_integrity":"sha512-kJMdbmul/LdSTEik2vaW8kN21I3iu6ugLjtJb6BpFb5sEI4ebye07e3ess+dwPLV6dJY4QnSRAAcMr0Ej8gRSA==","_resolved":"/home/runner/work/tools/tools/packages/core/retry-state/bernierllc-retry-state-0.5.0.tgz","_from":"file:bernierllc-retry-state-0.5.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-kJMdbmul/LdSTEik2vaW8kN21I3iu6ugLjtJb6BpFb5sEI4ebye07e3ess+dwPLV6dJY4QnSRAAcMr0Ej8gRSA==","shasum":"9c91c6f9eda1efba11f87ed4b52c546325f2790a","tarball":"https://registry.npmjs.org/@bernierllc/retry-state/-/retry-state-0.5.0.tgz","fileCount":31,"unpackedSize":83426,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAHzNmgsyELADLdz3rJTjlebqy3rphg4XNd1qWV71M6VAiArJQSmed2m8ZwXYlnfco6n0ks+BiZkbx0yS4aqZlOeyg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:148f4428-6c0a-487e-9d66-416aebab0746"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/retry-state_0.5.0_1779250127476_0.9181044756740211"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-28T03:45:11.386Z","modified":"2026-05-20T04:08:47.813Z","0.1.1":"2025-07-28T03:45:11.649Z","0.1.3":"2025-09-02T20:34:17.941Z","0.2.0":"2026-02-16T18:57:00.037Z","0.2.1":"2026-03-03T21:06:50.048Z","0.2.2":"2026-03-10T17:21:01.096Z","0.3.0":"2026-05-20T01:43:00.599Z","0.4.0":"2026-05-20T02:14:48.860Z","0.5.0":"2026-05-20T04:08:47.678Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"MIT","homepage":"https://github.com/bernierllc/tools/tree/main/packages/retry-state#readme","keywords":["retry","state","management","persistence","atomic","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/retry-state"},"description":"Atomic retry state management utilities","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/retry-state\n\nAtomic retry state management utilities for the BernierLLC package suite.\n\n## Overview\n\n`@bernierllc/retry-state` provides immutable, focused utilities for managing retry operation states. This package is designed to be used as a core dependency by other retry-related packages in the BernierLLC suite.\n\n## Features\n\n- **Immutable State Management**: All state operations return new state objects\n- **Type Safety**: Full TypeScript support with strict typing\n- **Storage Abstraction**: Pluggable storage adapters (Memory, Redis)\n- **Validation**: Built-in state validation with detailed error reporting\n- **Statistics**: Comprehensive analytics and filtering utilities\n- **Zero Dependencies**: Pure functions with no external runtime dependencies\n\n## Installation\n\n```bash\nnpm install @bernierllc/retry-state\n```\n\n## Quick Start\n\n```typescript\nimport { \n  createRetryState, \n  updateRetryState, \n  canRetry, \n  markAsCompleted \n} from '@bernierllc/retry-state';\n\n// Create a new retry state\nconst state = createRetryState({\n  id: 'my-operation',\n  maxRetries: 3,\n  initialDelayMs: 1000\n});\n\n// Check if operation can be retried\nif (canRetry(state)) {\n  // Prepare for next attempt\n  const nextState = updateRetryState(state, {\n    attempt: state.attempt + 1,\n    status: 'retrying',\n    delay: 2000,\n    updateNextRetry: true\n  });\n}\n\n// Mark as completed\nconst completedState = markAsCompleted(state);\n```\n\n## API Reference\n\n### Core Functions\n\n#### `createRetryState(config: RetryStateConfig): RetryState`\n\nCreates a new retry state with the given configuration.\n\n```typescript\nconst state = createRetryState({\n  id: 'unique-operation-id',\n  maxRetries: 5,\n  initialDelayMs: 1000,\n  metadata: { userId: '123', operation: 'email-send' }\n});\n```\n\n#### `updateRetryState(state: RetryState, updates: RetryStateUpdateOptions): RetryState`\n\nCreates a new retry state by applying updates to an existing one.\n\n```typescript\nconst updatedState = updateRetryState(state, {\n  attempt: 2,\n  status: 'retrying',\n  delay: 2000,\n  error: new Error('Network timeout'),\n  updateNextRetry: true\n});\n```\n\n#### `validateRetryState(state: RetryState): RetryStateValidationResult`\n\nValidates a retry state for consistency and correctness.\n\n```typescript\nconst validation = validateRetryState(state);\nif (!validation.isValid) {\n  console.error('Validation errors:', validation.errors);\n}\n```\n\n### State Queries\n\n#### `canRetry(state: RetryState): boolean`\n\nChecks if a retry state can be retried.\n\n#### `hasExceededMaxAttempts(state: RetryState): boolean`\n\nChecks if a retry state has exceeded its maximum attempts.\n\n#### `isReadyForRetry(state: RetryState): boolean`\n\nChecks if a retry state is ready for the next retry attempt.\n\n### State Transitions\n\n#### `markAsCompleted(state: RetryState): RetryState`\n\nMarks a retry state as successfully completed.\n\n#### `markAsFailed(state: RetryState, error: Error): RetryState`\n\nMarks a retry state as failed with the given error.\n\n#### `markAsCancelled(state: RetryState): RetryState`\n\nMarks a retry state as cancelled.\n\n#### `prepareForNextAttempt(state: RetryState, newDelay: number): RetryState`\n\nPrepares a retry state for the next attempt with the given delay.\n\n### Time Utilities\n\n#### `getRetryStateAge(state: RetryState): number`\n\nReturns the age of a retry state in milliseconds.\n\n#### `getTimeSinceLastAttempt(state: RetryState): number | null`\n\nReturns the time since the last attempt in milliseconds.\n\n#### `getTimeUntilNextRetry(state: RetryState): number | null`\n\nReturns the time until the next retry in milliseconds.\n\n### Storage Adapters\n\n#### `MemoryRetryStateStorage`\n\nIn-memory storage with LRU eviction.\n\n```typescript\nimport { MemoryRetryStateStorage } from '@bernierllc/retry-state';\n\nconst storage = new MemoryRetryStateStorage(1000); // Max 1000 states\nawait storage.set('operation-1', state);\nconst retrieved = await storage.get('operation-1');\n```\n\n#### `RedisRetryStateStorage`\n\nRedis storage with automatic fallback to memory.\n\n```typescript\nimport { RedisRetryStateStorage } from '@bernierllc/retry-state';\nimport Redis from 'ioredis';\n\nconst redis = new Redis();\nconst storage = new RedisRetryStateStorage(redis, 'retry:');\n```\n\n#### `createRetryStateStorage()`\n\nFactory function to create storage adapters.\n\n```typescript\nimport { createRetryStateStorage } from '@bernierllc/retry-state';\n\n// Memory storage (default)\nconst memoryStorage = createRetryStateStorage();\n\n// Redis storage\nconst redisStorage = createRetryStateStorage('redis', {\n  redisClient: redis,\n  prefix: 'my-app:retry:'\n});\n```\n\n### Statistics and Analytics\n\n#### `calculateRetryStateStats(states: RetryState[]): RetryStateStats`\n\nCalculates comprehensive statistics for a collection of retry states.\n\n```typescript\nconst stats = calculateRetryStateStats(allStates);\nconsole.log(`Success rate: ${(stats.completed / stats.total * 100).toFixed(1)}%`);\n```\n\n#### `filterRetryStatesByStatus(states: RetryState[], status: RetryStatus): RetryState[]`\n\nFilters retry states by their status.\n\n#### `filterRetryStatesByAge(states: RetryState[], minAgeMs?: number, maxAgeMs?: number): RetryState[]`\n\nFilters retry states by their age.\n\n#### `sortRetryStates(states: RetryState[], field: keyof RetryState, direction: 'asc' | 'desc'): RetryState[]`\n\nSorts retry states by a specified field.\n\n#### `findReadyForRetry(states: RetryState[]): RetryState[]`\n\nFinds retry states that are ready for retry.\n\n#### `calculateSuccessRate(states: RetryState[]): number`\n\nCalculates the success rate as a percentage.\n\n## Types\n\n### `RetryState`\n\n```typescript\ninterface RetryState {\n  readonly id: string;\n  readonly attempt: number;\n  readonly maxRetries: number;\n  readonly status: RetryStatus;\n  readonly lastAttempt: Date | null;\n  readonly nextRetry: Date | null;\n  readonly delay: number;\n  readonly error?: Error | null;\n  readonly metadata?: Record<string, unknown>;\n  readonly createdAt: Date;\n  readonly updatedAt: Date;\n}\n```\n\n### `RetryStatus`\n\n```typescript\ntype RetryStatus = 'pending' | 'retrying' | 'completed' | 'failed' | 'cancelled';\n```\n\n### `RetryStateConfig`\n\n```typescript\ninterface RetryStateConfig {\n  id: string;\n  maxRetries: number;\n  initialDelayMs: number;\n  metadata?: Record<string, unknown>;\n}\n```\n\n### `RetryStateStorage`\n\n```typescript\ninterface RetryStateStorage {\n  get(id: string): Promise<RetryState | null>;\n  set(id: string, state: RetryState): Promise<void>;\n  delete(id: string): Promise<void>;\n  list(prefix?: string): Promise<RetryState[]>;\n  clear(): Promise<void>;\n  exists(id: string): Promise<boolean>;\n}\n```\n\n## Examples\n\n### Basic Retry Loop\n\n```typescript\nimport { \n  createRetryState, \n  canRetry, \n  prepareForNextAttempt, \n  markAsCompleted, \n  markAsFailed \n} from '@bernierllc/retry-state';\n\nasync function executeWithRetry<T>(\n  id: string, \n  operation: () => Promise<T>\n): Promise<T> {\n  let state = createRetryState({\n    id,\n    maxRetries: 3,\n    initialDelayMs: 1000\n  });\n\n  while (canRetry(state)) {\n    try {\n      const result = await operation();\n      state = markAsCompleted(state);\n      return result;\n    } catch (error) {\n      if (state.attempt >= state.maxRetries) {\n        state = markAsFailed(state, error);\n        throw error;\n      }\n      \n      const delay = state.delay * 2; // Exponential backoff\n      state = prepareForNextAttempt(state, delay);\n      \n      await new Promise(resolve => setTimeout(resolve, delay));\n    }\n  }\n  \n  throw new Error('Max retries exceeded');\n}\n```\n\n### Persistent Storage\n\n```typescript\nimport { \n  createRetryStateStorage, \n  createRetryState, \n  updateRetryState \n} from '@bernierllc/retry-state';\n\nconst storage = createRetryStateStorage('memory');\n\nasync function resumeRetry(id: string) {\n  // Try to get existing state\n  let state = await storage.get(id);\n  \n  if (!state) {\n    // Create new state if none exists\n    state = createRetryState({\n      id,\n      maxRetries: 5,\n      initialDelayMs: 1000\n    });\n  }\n  \n  // Update and persist state\n  state = updateRetryState(state, { status: 'retrying' });\n  await storage.set(id, state);\n  \n  return state;\n}\n```\n\n### Analytics Dashboard\n\n```typescript\nimport { \n  calculateRetryStateStats, \n  filterRetryStatesByStatus, \n  calculateSuccessRate \n} from '@bernierllc/retry-state';\n\nasync function generateRetryAnalytics() {\n  const allStates = await storage.list();\n  \n  const stats = calculateRetryStateStats(allStates);\n  const pendingStates = filterRetryStatesByStatus(allStates, 'pending');\n  const successRate = calculateSuccessRate(allStates);\n  \n  return {\n    total: stats.total,\n    pending: stats.pending,\n    successRate: `${successRate.toFixed(1)}%`,\n    averageAttempts: stats.averageAttempts.toFixed(2)\n  };\n}\n```\n\n## Testing\n\n```bash\nnpm test\nnpm run test:coverage\n```\n\n## Contributing\n\nThis package follows the BernierLLC development standards:\n\n- All code must be written in TypeScript with strict mode enabled\n- Tests must achieve 90%+ coverage\n- No external runtime dependencies\n- Comprehensive documentation for all public APIs\n\n## License\n\nMIT License - see [LICENSE](../../LICENSE) for details.\n\n## Related Packages\n\n- `@bernierllc/retry-policy` - Retry policy algorithms and utilities\n- `@bernierllc/retry-manager` - High-level retry orchestration (coming soon)\n- `@bernierllc/retry-suite` - Complete retry system (coming soon) ","readmeFilename":"README.md"}