opencode-rehydar 0.14.1 → 0.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +54 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +74 -0
- package/dist/browser.js.map +1 -0
- package/dist/core/anonymizer.d.ts +309 -0
- package/dist/core/anonymizer.d.ts.map +1 -0
- package/dist/core/anonymizer.js +555 -0
- package/dist/core/anonymizer.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/pii-map-crypto.d.ts +114 -0
- package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
- package/dist/crypto/pii-map-crypto.js +228 -0
- package/dist/crypto/pii-map-crypto.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/ner/bio-decoder.d.ts +64 -0
- package/dist/ner/bio-decoder.d.ts.map +1 -0
- package/dist/ner/bio-decoder.js +218 -0
- package/dist/ner/bio-decoder.js.map +1 -0
- package/dist/ner/index.d.ts +12 -0
- package/dist/ner/index.d.ts.map +1 -0
- package/dist/ner/index.js +12 -0
- package/dist/ner/index.js.map +1 -0
- package/dist/ner/inference-server-client.d.ts +81 -0
- package/dist/ner/inference-server-client.d.ts.map +1 -0
- package/dist/ner/inference-server-client.js +120 -0
- package/dist/ner/inference-server-client.js.map +1 -0
- package/dist/ner/inference-server-ner-model.d.ts +43 -0
- package/dist/ner/inference-server-ner-model.d.ts.map +1 -0
- package/dist/ner/inference-server-ner-model.js +119 -0
- package/dist/ner/inference-server-ner-model.js.map +1 -0
- package/dist/ner/model-manager.d.ts +111 -0
- package/dist/ner/model-manager.d.ts.map +1 -0
- package/dist/ner/model-manager.js +334 -0
- package/dist/ner/model-manager.js.map +1 -0
- package/dist/ner/ner-model.d.ts +172 -0
- package/dist/ner/ner-model.d.ts.map +1 -0
- package/dist/ner/ner-model.js +514 -0
- package/dist/ner/ner-model.js.map +1 -0
- package/dist/ner/onnx-runtime.browser.d.ts +46 -0
- package/dist/ner/onnx-runtime.browser.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.browser.js +90 -0
- package/dist/ner/onnx-runtime.browser.js.map +1 -0
- package/dist/ner/onnx-runtime.d.ts +72 -0
- package/dist/ner/onnx-runtime.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.js +132 -0
- package/dist/ner/onnx-runtime.js.map +1 -0
- package/dist/ner/token-window.d.ts +19 -0
- package/dist/ner/token-window.d.ts.map +1 -0
- package/dist/ner/token-window.js +101 -0
- package/dist/ner/token-window.js.map +1 -0
- package/dist/ner/tokenizer.d.ts +142 -0
- package/dist/ner/tokenizer.d.ts.map +1 -0
- package/dist/ner/tokenizer.js +362 -0
- package/dist/ner/tokenizer.js.map +1 -0
- package/dist/opencode-plugin/git-identity.d.ts +3 -0
- package/dist/opencode-plugin/git-identity.d.ts.map +1 -0
- package/dist/opencode-plugin/git-identity.js +37 -0
- package/dist/opencode-plugin/git-identity.js.map +1 -0
- package/dist/opencode-plugin/github-username.d.ts +3 -0
- package/dist/opencode-plugin/github-username.d.ts.map +1 -0
- package/dist/opencode-plugin/github-username.js +41 -0
- package/dist/opencode-plugin/github-username.js.map +1 -0
- package/dist/opencode-plugin/identity-recognizer.d.ts +5 -0
- package/dist/opencode-plugin/identity-recognizer.d.ts.map +1 -0
- package/dist/opencode-plugin/identity-recognizer.js +21 -0
- package/dist/opencode-plugin/identity-recognizer.js.map +1 -0
- package/dist/opencode-plugin/index.d.ts +7 -0
- package/dist/opencode-plugin/index.d.ts.map +1 -0
- package/dist/opencode-plugin/index.js +6 -0
- package/dist/opencode-plugin/index.js.map +1 -0
- package/dist/opencode-plugin/plugin.d.ts +39 -0
- package/dist/opencode-plugin/plugin.d.ts.map +1 -0
- package/dist/opencode-plugin/plugin.js +294 -0
- package/dist/opencode-plugin/plugin.js.map +1 -0
- package/dist/opencode-plugin/types.d.ts +33 -0
- package/dist/opencode-plugin/types.d.ts.map +1 -0
- package/dist/opencode-plugin/types.js +5 -0
- package/dist/opencode-plugin/types.js.map +1 -0
- package/dist/opencode-plugin/v2/anon-state.d.ts +12 -0
- package/dist/opencode-plugin/v2/anon-state.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/anon-state.js +14 -0
- package/dist/opencode-plugin/v2/anon-state.js.map +1 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.d.ts +13 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.js +33 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.js.map +1 -0
- package/dist/opencode-plugin/v2/index.d.ts +17 -0
- package/dist/opencode-plugin/v2/index.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/index.js +17 -0
- package/dist/opencode-plugin/v2/index.js.map +1 -0
- package/dist/opencode-plugin/v2/logger.d.ts +24 -0
- package/dist/opencode-plugin/v2/logger.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/logger.js +73 -0
- package/dist/opencode-plugin/v2/logger.js.map +1 -0
- package/dist/opencode-plugin/v2/options.d.ts +63 -0
- package/dist/opencode-plugin/v2/options.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/options.js +183 -0
- package/dist/opencode-plugin/v2/options.js.map +1 -0
- package/dist/opencode-plugin/v2/register-hooks.d.ts +43 -0
- package/dist/opencode-plugin/v2/register-hooks.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/register-hooks.js +160 -0
- package/dist/opencode-plugin/v2/register-hooks.js.map +1 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.d.ts +101 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.js +147 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.js.map +1 -0
- package/dist/opencode-plugin/v2/response-rehydrate.d.ts +78 -0
- package/dist/opencode-plugin/v2/response-rehydrate.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/response-rehydrate.js +210 -0
- package/dist/opencode-plugin/v2/response-rehydrate.js.map +1 -0
- package/dist/opencode-plugin/v2/scrub-messages.d.ts +39 -0
- package/dist/opencode-plugin/v2/scrub-messages.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/scrub-messages.js +260 -0
- package/dist/opencode-plugin/v2/scrub-messages.js.map +1 -0
- package/dist/opencode-plugin/v2/sessions.d.ts +17 -0
- package/dist/opencode-plugin/v2/sessions.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/sessions.js +23 -0
- package/dist/opencode-plugin/v2/sessions.js.map +1 -0
- package/dist/opencode-plugin/v2/sse.d.ts +101 -0
- package/dist/opencode-plugin/v2/sse.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/sse.js +235 -0
- package/dist/opencode-plugin/v2/sse.js.map +1 -0
- package/dist/opencode-plugin/v2/types.d.ts +188 -0
- package/dist/opencode-plugin/v2/types.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/types.js +10 -0
- package/dist/opencode-plugin/v2/types.js.map +1 -0
- package/dist/opencode-plugin/vcs-command.d.ts +3 -0
- package/dist/opencode-plugin/vcs-command.d.ts.map +1 -0
- package/dist/opencode-plugin/vcs-command.js +34 -0
- package/dist/opencode-plugin/vcs-command.js.map +1 -0
- package/dist/pipeline/index.d.ts +12 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +12 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/prenormalize.d.ts +48 -0
- package/dist/pipeline/prenormalize.d.ts.map +1 -0
- package/dist/pipeline/prenormalize.js +94 -0
- package/dist/pipeline/prenormalize.js.map +1 -0
- package/dist/pipeline/resolver.d.ts +56 -0
- package/dist/pipeline/resolver.d.ts.map +1 -0
- package/dist/pipeline/resolver.js +239 -0
- package/dist/pipeline/resolver.js.map +1 -0
- package/dist/pipeline/semantic-data-loader.d.ts +171 -0
- package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
- package/dist/pipeline/semantic-data-loader.js +677 -0
- package/dist/pipeline/semantic-data-loader.js.map +1 -0
- package/dist/pipeline/semantic-enricher.d.ts +112 -0
- package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
- package/dist/pipeline/semantic-enricher.js +322 -0
- package/dist/pipeline/semantic-enricher.js.map +1 -0
- package/dist/pipeline/tagger.d.ts +121 -0
- package/dist/pipeline/tagger.d.ts.map +1 -0
- package/dist/pipeline/tagger.js +545 -0
- package/dist/pipeline/tagger.js.map +1 -0
- package/dist/pipeline/title-extractor.d.ts +79 -0
- package/dist/pipeline/title-extractor.d.ts.map +1 -0
- package/dist/pipeline/title-extractor.js +801 -0
- package/dist/pipeline/title-extractor.js.map +1 -0
- package/dist/pipeline/validator.d.ts +65 -0
- package/dist/pipeline/validator.d.ts.map +1 -0
- package/dist/pipeline/validator.js +292 -0
- package/dist/pipeline/validator.js.map +1 -0
- package/dist/proxy/index.d.ts +13 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +12 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/providers/anthropic.d.ts +28 -0
- package/dist/proxy/providers/anthropic.d.ts.map +1 -0
- package/dist/proxy/providers/anthropic.js +265 -0
- package/dist/proxy/providers/anthropic.js.map +1 -0
- package/dist/proxy/providers/index.d.ts +19 -0
- package/dist/proxy/providers/index.d.ts.map +1 -0
- package/dist/proxy/providers/index.js +41 -0
- package/dist/proxy/providers/index.js.map +1 -0
- package/dist/proxy/providers/openai.d.ts +27 -0
- package/dist/proxy/providers/openai.d.ts.map +1 -0
- package/dist/proxy/providers/openai.js +203 -0
- package/dist/proxy/providers/openai.js.map +1 -0
- package/dist/proxy/providers/streaming-tool-loop.d.ts +12 -0
- package/dist/proxy/providers/streaming-tool-loop.d.ts.map +1 -0
- package/dist/proxy/providers/streaming-tool-loop.js +223 -0
- package/dist/proxy/providers/streaming-tool-loop.js.map +1 -0
- package/dist/proxy/providers/types.d.ts +109 -0
- package/dist/proxy/providers/types.d.ts.map +1 -0
- package/dist/proxy/providers/types.js +2 -0
- package/dist/proxy/providers/types.js.map +1 -0
- package/dist/proxy/proxy-server.d.ts +61 -0
- package/dist/proxy/proxy-server.d.ts.map +1 -0
- package/dist/proxy/proxy-server.js +146 -0
- package/dist/proxy/proxy-server.js.map +1 -0
- package/dist/proxy/rehydra-fetch.d.ts +35 -0
- package/dist/proxy/rehydra-fetch.d.ts.map +1 -0
- package/dist/proxy/rehydra-fetch.js +631 -0
- package/dist/proxy/rehydra-fetch.js.map +1 -0
- package/dist/proxy/rehydra-proxy.d.ts +40 -0
- package/dist/proxy/rehydra-proxy.d.ts.map +1 -0
- package/dist/proxy/rehydra-proxy.js +150 -0
- package/dist/proxy/rehydra-proxy.js.map +1 -0
- package/dist/proxy/sse-parser.d.ts +59 -0
- package/dist/proxy/sse-parser.d.ts.map +1 -0
- package/dist/proxy/sse-parser.js +112 -0
- package/dist/proxy/sse-parser.js.map +1 -0
- package/dist/proxy/system-instruction.d.ts +19 -0
- package/dist/proxy/system-instruction.d.ts.map +1 -0
- package/dist/proxy/system-instruction.js +33 -0
- package/dist/proxy/system-instruction.js.map +1 -0
- package/dist/proxy/tool-loop-stream.d.ts +7 -0
- package/dist/proxy/tool-loop-stream.d.ts.map +1 -0
- package/dist/proxy/tool-loop-stream.js +65 -0
- package/dist/proxy/tool-loop-stream.js.map +1 -0
- package/dist/proxy/types.d.ts +138 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +5 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/proxy/wrap-client.d.ts +47 -0
- package/dist/proxy/wrap-client.d.ts.map +1 -0
- package/dist/proxy/wrap-client.js +70 -0
- package/dist/proxy/wrap-client.js.map +1 -0
- package/dist/recognizers/address.d.ts +2 -0
- package/dist/recognizers/address.d.ts.map +1 -0
- package/dist/recognizers/address.js +23 -0
- package/dist/recognizers/address.js.map +1 -0
- package/dist/recognizers/base.d.ts +78 -0
- package/dist/recognizers/base.d.ts.map +1 -0
- package/dist/recognizers/base.js +100 -0
- package/dist/recognizers/base.js.map +1 -0
- package/dist/recognizers/bic-swift.d.ts +10 -0
- package/dist/recognizers/bic-swift.d.ts.map +1 -0
- package/dist/recognizers/bic-swift.js +107 -0
- package/dist/recognizers/bic-swift.js.map +1 -0
- package/dist/recognizers/credit-card.d.ts +32 -0
- package/dist/recognizers/credit-card.d.ts.map +1 -0
- package/dist/recognizers/credit-card.js +160 -0
- package/dist/recognizers/credit-card.js.map +1 -0
- package/dist/recognizers/custom-id.d.ts +28 -0
- package/dist/recognizers/custom-id.d.ts.map +1 -0
- package/dist/recognizers/custom-id.js +116 -0
- package/dist/recognizers/custom-id.js.map +1 -0
- package/dist/recognizers/date.d.ts +10 -0
- package/dist/recognizers/date.d.ts.map +1 -0
- package/dist/recognizers/date.js +228 -0
- package/dist/recognizers/date.js.map +1 -0
- package/dist/recognizers/email.d.ts +10 -0
- package/dist/recognizers/email.d.ts.map +1 -0
- package/dist/recognizers/email.js +75 -0
- package/dist/recognizers/email.js.map +1 -0
- package/dist/recognizers/iban.d.ts +14 -0
- package/dist/recognizers/iban.d.ts.map +1 -0
- package/dist/recognizers/iban.js +67 -0
- package/dist/recognizers/iban.js.map +1 -0
- package/dist/recognizers/index.d.ts +25 -0
- package/dist/recognizers/index.d.ts.map +1 -0
- package/dist/recognizers/index.js +53 -0
- package/dist/recognizers/index.js.map +1 -0
- package/dist/recognizers/ip-address.d.ts +14 -0
- package/dist/recognizers/ip-address.d.ts.map +1 -0
- package/dist/recognizers/ip-address.js +183 -0
- package/dist/recognizers/ip-address.js.map +1 -0
- package/dist/recognizers/phone.d.ts +10 -0
- package/dist/recognizers/phone.d.ts.map +1 -0
- package/dist/recognizers/phone.js +145 -0
- package/dist/recognizers/phone.js.map +1 -0
- package/dist/recognizers/postal-code.d.ts +16 -0
- package/dist/recognizers/postal-code.d.ts.map +1 -0
- package/dist/recognizers/postal-code.js +42 -0
- package/dist/recognizers/postal-code.js.map +1 -0
- package/dist/recognizers/registry.d.ts +59 -0
- package/dist/recognizers/registry.d.ts.map +1 -0
- package/dist/recognizers/registry.js +113 -0
- package/dist/recognizers/registry.js.map +1 -0
- package/dist/recognizers/secrets/api-key.d.ts +6 -0
- package/dist/recognizers/secrets/api-key.d.ts.map +1 -0
- package/dist/recognizers/secrets/api-key.js +40 -0
- package/dist/recognizers/secrets/api-key.js.map +1 -0
- package/dist/recognizers/secrets/aws-credentials.d.ts +7 -0
- package/dist/recognizers/secrets/aws-credentials.d.ts.map +1 -0
- package/dist/recognizers/secrets/aws-credentials.js +68 -0
- package/dist/recognizers/secrets/aws-credentials.js.map +1 -0
- package/dist/recognizers/secrets/config-secret.d.ts +8 -0
- package/dist/recognizers/secrets/config-secret.d.ts.map +1 -0
- package/dist/recognizers/secrets/config-secret.js +59 -0
- package/dist/recognizers/secrets/config-secret.js.map +1 -0
- package/dist/recognizers/secrets/connection-string.d.ts +6 -0
- package/dist/recognizers/secrets/connection-string.d.ts.map +1 -0
- package/dist/recognizers/secrets/connection-string.js +40 -0
- package/dist/recognizers/secrets/connection-string.js.map +1 -0
- package/dist/recognizers/secrets/env-var.d.ts +8 -0
- package/dist/recognizers/secrets/env-var.d.ts.map +1 -0
- package/dist/recognizers/secrets/env-var.js +54 -0
- package/dist/recognizers/secrets/env-var.js.map +1 -0
- package/dist/recognizers/secrets/index.d.ts +22 -0
- package/dist/recognizers/secrets/index.d.ts.map +1 -0
- package/dist/recognizers/secrets/index.js +41 -0
- package/dist/recognizers/secrets/index.js.map +1 -0
- package/dist/recognizers/secrets/jwt.d.ts +6 -0
- package/dist/recognizers/secrets/jwt.d.ts.map +1 -0
- package/dist/recognizers/secrets/jwt.js +47 -0
- package/dist/recognizers/secrets/jwt.js.map +1 -0
- package/dist/recognizers/secrets/key-patterns.d.ts +10 -0
- package/dist/recognizers/secrets/key-patterns.d.ts.map +1 -0
- package/dist/recognizers/secrets/key-patterns.js +15 -0
- package/dist/recognizers/secrets/key-patterns.js.map +1 -0
- package/dist/recognizers/secrets/literal-value.d.ts +10 -0
- package/dist/recognizers/secrets/literal-value.d.ts.map +1 -0
- package/dist/recognizers/secrets/literal-value.js +48 -0
- package/dist/recognizers/secrets/literal-value.js.map +1 -0
- package/dist/recognizers/secrets/private-key.d.ts +6 -0
- package/dist/recognizers/secrets/private-key.d.ts.map +1 -0
- package/dist/recognizers/secrets/private-key.js +16 -0
- package/dist/recognizers/secrets/private-key.js.map +1 -0
- package/dist/recognizers/url.d.ts +14 -0
- package/dist/recognizers/url.d.ts.map +1 -0
- package/dist/recognizers/url.js +121 -0
- package/dist/recognizers/url.js.map +1 -0
- package/dist/storage/browser.d.ts +13 -0
- package/dist/storage/browser.d.ts.map +1 -0
- package/dist/storage/browser.js +13 -0
- package/dist/storage/browser.js.map +1 -0
- package/dist/storage/in-memory.d.ts +60 -0
- package/dist/storage/in-memory.d.ts.map +1 -0
- package/dist/storage/in-memory.js +108 -0
- package/dist/storage/in-memory.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +69 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +274 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/session-base.d.ts +34 -0
- package/dist/storage/session-base.d.ts.map +1 -0
- package/dist/storage/session-base.js +122 -0
- package/dist/storage/session-base.js.map +1 -0
- package/dist/storage/session.d.ts +19 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +31 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/sqlite.d.ts +80 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +255 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +208 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +6 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/streaming/anonymizer-stream.d.ts +63 -0
- package/dist/streaming/anonymizer-stream.d.ts.map +1 -0
- package/dist/streaming/anonymizer-stream.js +184 -0
- package/dist/streaming/anonymizer-stream.js.map +1 -0
- package/dist/streaming/index.d.ts +9 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +8 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/sentence-buffer.d.ts +78 -0
- package/dist/streaming/sentence-buffer.d.ts.map +1 -0
- package/dist/streaming/sentence-buffer.js +239 -0
- package/dist/streaming/sentence-buffer.js.map +1 -0
- package/dist/streaming/stream-factory.d.ts +38 -0
- package/dist/streaming/stream-factory.d.ts.map +1 -0
- package/dist/streaming/stream-factory.js +69 -0
- package/dist/streaming/stream-factory.js.map +1 -0
- package/dist/streaming/types.d.ts +121 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/streaming/types.js +5 -0
- package/dist/streaming/types.js.map +1 -0
- package/dist/types/index.d.ts +269 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +95 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pii-types.d.ts +64 -0
- package/dist/types/pii-types.d.ts.map +1 -0
- package/dist/types/pii-types.js +153 -0
- package/dist/types/pii-types.js.map +1 -0
- package/dist/utils/iban-checksum.d.ts +23 -0
- package/dist/utils/iban-checksum.d.ts.map +1 -0
- package/dist/utils/iban-checksum.js +106 -0
- package/dist/utils/iban-checksum.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-walk.d.ts +21 -0
- package/dist/utils/json-walk.d.ts.map +1 -0
- package/dist/utils/json-walk.js +44 -0
- package/dist/utils/json-walk.js.map +1 -0
- package/dist/utils/luhn.d.ts +17 -0
- package/dist/utils/luhn.d.ts.map +1 -0
- package/dist/utils/luhn.js +55 -0
- package/dist/utils/luhn.js.map +1 -0
- package/dist/utils/offsets.d.ts +86 -0
- package/dist/utils/offsets.d.ts.map +1 -0
- package/dist/utils/offsets.js +124 -0
- package/dist/utils/offsets.js.map +1 -0
- package/dist/utils/path.d.ts +34 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +96 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/regex.d.ts +11 -0
- package/dist/utils/regex.d.ts.map +1 -0
- package/dist/utils/regex.js +14 -0
- package/dist/utils/regex.js.map +1 -0
- package/dist/utils/storage-browser.d.ts +51 -0
- package/dist/utils/storage-browser.d.ts.map +1 -0
- package/dist/utils/storage-browser.js +381 -0
- package/dist/utils/storage-browser.js.map +1 -0
- package/dist/utils/storage-node.d.ts +51 -0
- package/dist/utils/storage-node.d.ts.map +1 -0
- package/dist/utils/storage-node.js +153 -0
- package/dist/utils/storage-node.js.map +1 -0
- package/dist/utils/storage.browser.d.ts +75 -0
- package/dist/utils/storage.browser.d.ts.map +1 -0
- package/dist/utils/storage.browser.js +69 -0
- package/dist/utils/storage.browser.js.map +1 -0
- package/dist/utils/storage.d.ts +73 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +69 -0
- package/dist/utils/storage.js.map +1 -0
- package/index.js +14 -13
- package/package.json +19 -5
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite PII Storage Provider
|
|
3
|
+
* Server-side persistence with dual-runtime support (Node.js + Bun)
|
|
4
|
+
*/
|
|
5
|
+
import type { EncryptedPIIMap } from "../types/index.js";
|
|
6
|
+
import type { PIIStorageProvider, PIIMapMetadata, StoredPIIMap, ListOptions } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* SQLite implementation of PIIStorageProvider
|
|
9
|
+
*
|
|
10
|
+
* Works on both Node.js (using better-sqlite3) and Bun (using bun:sqlite).
|
|
11
|
+
* The runtime is auto-detected, so no configuration is needed.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // Create with file path (works on both Node.js and Bun)
|
|
16
|
+
* const storage = new SQLitePIIStorageProvider('./pii-maps.db');
|
|
17
|
+
* await storage.initialize();
|
|
18
|
+
*
|
|
19
|
+
* // Or use in-memory database for testing
|
|
20
|
+
* const storage = new SQLitePIIStorageProvider(':memory:');
|
|
21
|
+
* await storage.initialize();
|
|
22
|
+
*
|
|
23
|
+
* await storage.save('conv-123', encryptedPiiMap, {
|
|
24
|
+
* createdAt: Date.now(),
|
|
25
|
+
* entityCounts: { PERSON: 2 }
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class SQLitePIIStorageProvider implements PIIStorageProvider {
|
|
30
|
+
private db;
|
|
31
|
+
private readonly dbPath;
|
|
32
|
+
private initialized;
|
|
33
|
+
/**
|
|
34
|
+
* Create a new SQLite storage provider
|
|
35
|
+
* @param dbPath - Path to SQLite database file, or ':memory:' for in-memory
|
|
36
|
+
*/
|
|
37
|
+
constructor(dbPath: string);
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the database connection and create tables
|
|
40
|
+
* Must be called before using other methods
|
|
41
|
+
*/
|
|
42
|
+
initialize(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Ensure database is initialized
|
|
45
|
+
*/
|
|
46
|
+
private ensureInitialized;
|
|
47
|
+
/**
|
|
48
|
+
* Save an encrypted PII map
|
|
49
|
+
*/
|
|
50
|
+
save(conversationId: string, piiMap: EncryptedPIIMap, metadata?: Partial<PIIMapMetadata>): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Load an encrypted PII map
|
|
53
|
+
*/
|
|
54
|
+
load(conversationId: string): Promise<StoredPIIMap | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Delete a PII map
|
|
57
|
+
*/
|
|
58
|
+
delete(conversationId: string): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Check if a PII map exists
|
|
61
|
+
*/
|
|
62
|
+
exists(conversationId: string): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* List stored conversation IDs
|
|
65
|
+
*/
|
|
66
|
+
list(options?: ListOptions): Promise<string[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Delete entries older than the specified date
|
|
69
|
+
*/
|
|
70
|
+
cleanup(olderThan: Date): Promise<number>;
|
|
71
|
+
/**
|
|
72
|
+
* Close the database connection
|
|
73
|
+
*/
|
|
74
|
+
close(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Check if the provider is initialized
|
|
77
|
+
*/
|
|
78
|
+
get isInitialized(): boolean;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAC;AAwFpB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,WAAW,CAAS;IAE5B;;;OAGG;gBACS,MAAM,EAAE,MAAM;IAI1B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,IAAI,CACF,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACH,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAgC1D;;OAEG;IACH,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAchD;;OAEG;IACH,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAehD;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6B9C;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAczC;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,IAAI,aAAa,IAAI,OAAO,CAE3B;CACF"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite PII Storage Provider
|
|
3
|
+
* Server-side persistence with dual-runtime support (Node.js + Bun)
|
|
4
|
+
*/
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Runtime Detection
|
|
7
|
+
// ============================================================================
|
|
8
|
+
/**
|
|
9
|
+
* Check if running in Bun runtime
|
|
10
|
+
*/
|
|
11
|
+
function isBun() {
|
|
12
|
+
return typeof globalThis.Bun !== "undefined";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load the appropriate SQLite driver based on runtime
|
|
16
|
+
*/
|
|
17
|
+
async function loadSQLiteDriver(dbPath) {
|
|
18
|
+
if (isBun()) {
|
|
19
|
+
// Bun: use built-in bun:sqlite
|
|
20
|
+
// Use dynamic import with string to avoid TypeScript trying to resolve the module
|
|
21
|
+
const bunSqlite = "bun:sqlite";
|
|
22
|
+
const bunModule = (await import(/* @vite-ignore */ bunSqlite));
|
|
23
|
+
return new bunModule.Database(dbPath);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Node.js: use better-sqlite3
|
|
27
|
+
try {
|
|
28
|
+
const betterSqlite3 = await import(/* @vite-ignore */ "better-sqlite3");
|
|
29
|
+
const Database = betterSqlite3.default;
|
|
30
|
+
return new Database(dbPath);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof Error &&
|
|
34
|
+
(error.message.includes("Cannot find module") ||
|
|
35
|
+
error.message.includes("MODULE_NOT_FOUND"))) {
|
|
36
|
+
throw new Error("SQLitePIIStorageProvider requires 'better-sqlite3' package on Node.js.\n" +
|
|
37
|
+
"Install it with: npm install better-sqlite3\n" +
|
|
38
|
+
"Note: On Bun, the built-in bun:sqlite is used automatically.");
|
|
39
|
+
}
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// SQLite Storage Provider
|
|
46
|
+
// ============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* SQLite implementation of PIIStorageProvider
|
|
49
|
+
*
|
|
50
|
+
* Works on both Node.js (using better-sqlite3) and Bun (using bun:sqlite).
|
|
51
|
+
* The runtime is auto-detected, so no configuration is needed.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* // Create with file path (works on both Node.js and Bun)
|
|
56
|
+
* const storage = new SQLitePIIStorageProvider('./pii-maps.db');
|
|
57
|
+
* await storage.initialize();
|
|
58
|
+
*
|
|
59
|
+
* // Or use in-memory database for testing
|
|
60
|
+
* const storage = new SQLitePIIStorageProvider(':memory:');
|
|
61
|
+
* await storage.initialize();
|
|
62
|
+
*
|
|
63
|
+
* await storage.save('conv-123', encryptedPiiMap, {
|
|
64
|
+
* createdAt: Date.now(),
|
|
65
|
+
* entityCounts: { PERSON: 2 }
|
|
66
|
+
* });
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export class SQLitePIIStorageProvider {
|
|
70
|
+
db = null;
|
|
71
|
+
dbPath;
|
|
72
|
+
initialized = false;
|
|
73
|
+
/**
|
|
74
|
+
* Create a new SQLite storage provider
|
|
75
|
+
* @param dbPath - Path to SQLite database file, or ':memory:' for in-memory
|
|
76
|
+
*/
|
|
77
|
+
constructor(dbPath) {
|
|
78
|
+
this.dbPath = dbPath;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Initialize the database connection and create tables
|
|
82
|
+
* Must be called before using other methods
|
|
83
|
+
*/
|
|
84
|
+
async initialize() {
|
|
85
|
+
if (this.initialized)
|
|
86
|
+
return;
|
|
87
|
+
this.db = await loadSQLiteDriver(this.dbPath);
|
|
88
|
+
// Create table and index
|
|
89
|
+
this.db.exec(`
|
|
90
|
+
CREATE TABLE IF NOT EXISTS pii_maps (
|
|
91
|
+
conversation_id TEXT PRIMARY KEY,
|
|
92
|
+
ciphertext TEXT NOT NULL,
|
|
93
|
+
iv TEXT NOT NULL,
|
|
94
|
+
auth_tag TEXT NOT NULL,
|
|
95
|
+
entity_counts TEXT,
|
|
96
|
+
model_version TEXT,
|
|
97
|
+
created_at INTEGER NOT NULL,
|
|
98
|
+
updated_at INTEGER
|
|
99
|
+
)
|
|
100
|
+
`);
|
|
101
|
+
this.db.exec(`
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_pii_maps_created_at
|
|
103
|
+
ON pii_maps(created_at)
|
|
104
|
+
`);
|
|
105
|
+
this.initialized = true;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Ensure database is initialized
|
|
109
|
+
*/
|
|
110
|
+
ensureInitialized() {
|
|
111
|
+
if (!this.initialized || this.db === null) {
|
|
112
|
+
throw new Error("SQLitePIIStorageProvider not initialized. Call initialize() first.");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Save an encrypted PII map
|
|
117
|
+
*/
|
|
118
|
+
save(conversationId, piiMap, metadata) {
|
|
119
|
+
try {
|
|
120
|
+
this.ensureInitialized();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return Promise.reject(error);
|
|
124
|
+
}
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
// Check if entry exists to preserve createdAt
|
|
127
|
+
// bun:sqlite returns null, better-sqlite3 returns undefined for no results
|
|
128
|
+
const existing = this.db.prepare("SELECT created_at, entity_counts, model_version FROM pii_maps WHERE conversation_id = ?").get(conversationId);
|
|
129
|
+
const createdAt = existing?.created_at ?? metadata?.createdAt ?? now;
|
|
130
|
+
const existingEntityCounts = existing?.entity_counts;
|
|
131
|
+
const entityCounts = metadata?.entityCounts ??
|
|
132
|
+
(typeof existingEntityCounts === "string" && existingEntityCounts.length > 0
|
|
133
|
+
? JSON.parse(existingEntityCounts)
|
|
134
|
+
: {});
|
|
135
|
+
const modelVersion = metadata?.modelVersion ?? existing?.model_version ?? null;
|
|
136
|
+
this.db.prepare(`
|
|
137
|
+
INSERT OR REPLACE INTO pii_maps
|
|
138
|
+
(conversation_id, ciphertext, iv, auth_tag, entity_counts, model_version, created_at, updated_at)
|
|
139
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
140
|
+
`).run(conversationId, piiMap.ciphertext, piiMap.iv, piiMap.authTag, JSON.stringify(entityCounts), modelVersion, createdAt, now);
|
|
141
|
+
return Promise.resolve();
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Load an encrypted PII map
|
|
145
|
+
*/
|
|
146
|
+
load(conversationId) {
|
|
147
|
+
try {
|
|
148
|
+
this.ensureInitialized();
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return Promise.reject(error);
|
|
152
|
+
}
|
|
153
|
+
const row = this.db.prepare("SELECT * FROM pii_maps WHERE conversation_id = ?").get(conversationId);
|
|
154
|
+
// bun:sqlite returns null, better-sqlite3 returns undefined for no results
|
|
155
|
+
if (row == null)
|
|
156
|
+
return Promise.resolve(null);
|
|
157
|
+
const entityCountsRaw = row.entity_counts;
|
|
158
|
+
return Promise.resolve({
|
|
159
|
+
piiMap: {
|
|
160
|
+
ciphertext: row.ciphertext,
|
|
161
|
+
iv: row.iv,
|
|
162
|
+
authTag: row.auth_tag,
|
|
163
|
+
},
|
|
164
|
+
metadata: {
|
|
165
|
+
createdAt: row.created_at,
|
|
166
|
+
updatedAt: row.updated_at ?? undefined,
|
|
167
|
+
entityCounts: typeof entityCountsRaw === "string" && entityCountsRaw.length > 0
|
|
168
|
+
? JSON.parse(entityCountsRaw)
|
|
169
|
+
: {},
|
|
170
|
+
modelVersion: row.model_version ?? undefined,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Delete a PII map
|
|
176
|
+
*/
|
|
177
|
+
delete(conversationId) {
|
|
178
|
+
try {
|
|
179
|
+
this.ensureInitialized();
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return Promise.reject(error);
|
|
183
|
+
}
|
|
184
|
+
const result = this.db.prepare("DELETE FROM pii_maps WHERE conversation_id = ?").run(conversationId);
|
|
185
|
+
return Promise.resolve(result.changes > 0);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if a PII map exists
|
|
189
|
+
*/
|
|
190
|
+
exists(conversationId) {
|
|
191
|
+
try {
|
|
192
|
+
this.ensureInitialized();
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return Promise.reject(error);
|
|
196
|
+
}
|
|
197
|
+
const row = this.db.prepare("SELECT 1 FROM pii_maps WHERE conversation_id = ?").get(conversationId);
|
|
198
|
+
// bun:sqlite returns null, better-sqlite3 returns undefined for no results
|
|
199
|
+
return Promise.resolve(row != null);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* List stored conversation IDs
|
|
203
|
+
*/
|
|
204
|
+
list(options) {
|
|
205
|
+
try {
|
|
206
|
+
this.ensureInitialized();
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
return Promise.reject(error);
|
|
210
|
+
}
|
|
211
|
+
let sql = "SELECT conversation_id FROM pii_maps";
|
|
212
|
+
const params = [];
|
|
213
|
+
if (options?.olderThan !== undefined) {
|
|
214
|
+
sql += " WHERE created_at < ?";
|
|
215
|
+
params.push(options.olderThan.getTime());
|
|
216
|
+
}
|
|
217
|
+
sql += " ORDER BY created_at DESC";
|
|
218
|
+
if (options?.limit !== undefined && options.limit > 0) {
|
|
219
|
+
sql += " LIMIT ?";
|
|
220
|
+
params.push(options.limit);
|
|
221
|
+
}
|
|
222
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
223
|
+
return Promise.resolve(rows.map((row) => row.conversation_id));
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Delete entries older than the specified date
|
|
227
|
+
*/
|
|
228
|
+
cleanup(olderThan) {
|
|
229
|
+
try {
|
|
230
|
+
this.ensureInitialized();
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
return Promise.reject(error);
|
|
234
|
+
}
|
|
235
|
+
const result = this.db.prepare("DELETE FROM pii_maps WHERE created_at < ?").run(olderThan.getTime());
|
|
236
|
+
return Promise.resolve(result.changes);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Close the database connection
|
|
240
|
+
*/
|
|
241
|
+
close() {
|
|
242
|
+
if (this.db !== null) {
|
|
243
|
+
this.db.close();
|
|
244
|
+
this.db = null;
|
|
245
|
+
this.initialized = false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Check if the provider is initialized
|
|
250
|
+
*/
|
|
251
|
+
get isInitialized() {
|
|
252
|
+
return this.initialized;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII Storage Provider Types
|
|
3
|
+
* Interfaces and types for persisting encrypted PII maps
|
|
4
|
+
*/
|
|
5
|
+
export { EncryptedPIIMap } from "../types/index.js";
|
|
6
|
+
import type { EncryptedPIIMap, AnonymizationResult, AnonymizationPolicy } from "../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Metadata associated with a stored PII map
|
|
9
|
+
*/
|
|
10
|
+
export interface PIIMapMetadata {
|
|
11
|
+
/** Unix timestamp when the PII map was created */
|
|
12
|
+
createdAt: number;
|
|
13
|
+
/** Unix timestamp when the PII map was last updated */
|
|
14
|
+
updatedAt?: number;
|
|
15
|
+
/** Count of entities by type (e.g., { PERSON: 2, EMAIL: 1 }) */
|
|
16
|
+
entityCounts: Record<string, number>;
|
|
17
|
+
/** Version of the model used for detection */
|
|
18
|
+
modelVersion?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A stored PII map with its metadata
|
|
22
|
+
*/
|
|
23
|
+
export interface StoredPIIMap {
|
|
24
|
+
/** The encrypted PII map data */
|
|
25
|
+
piiMap: EncryptedPIIMap;
|
|
26
|
+
/** Associated metadata */
|
|
27
|
+
metadata: PIIMapMetadata;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for listing stored PII maps
|
|
31
|
+
*/
|
|
32
|
+
export interface ListOptions {
|
|
33
|
+
/** Maximum number of conversation IDs to return */
|
|
34
|
+
limit?: number;
|
|
35
|
+
/** Only return entries older than this date */
|
|
36
|
+
olderThan?: Date;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Storage provider interface for persisting encrypted PII maps
|
|
40
|
+
*
|
|
41
|
+
* Implementations:
|
|
42
|
+
* - InMemoryPIIStorageProvider: For development/testing
|
|
43
|
+
* - SQLitePIIStorageProvider: For server-side persistence (Node.js/Bun)
|
|
44
|
+
* - IndexedDBPIIStorageProvider: For browser-side persistence
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const storage = new InMemoryPIIStorageProvider();
|
|
49
|
+
*
|
|
50
|
+
* // Save a PII map
|
|
51
|
+
* await storage.save('conv-123', encryptedPiiMap, {
|
|
52
|
+
* createdAt: Date.now(),
|
|
53
|
+
* entityCounts: { PERSON: 2, EMAIL: 1 }
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* // Load it back
|
|
57
|
+
* const stored = await storage.load('conv-123');
|
|
58
|
+
*
|
|
59
|
+
* // Cleanup old entries (optional)
|
|
60
|
+
* const deleted = await storage.cleanup(new Date(Date.now() - 7 * 24 * 60 * 60 * 1000));
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export interface PIIStorageProvider {
|
|
64
|
+
/**
|
|
65
|
+
* Save an encrypted PII map
|
|
66
|
+
* @param conversationId - Unique conversation identifier
|
|
67
|
+
* @param piiMap - Encrypted PII map (ciphertext, iv, authTag)
|
|
68
|
+
* @param metadata - Optional metadata (createdAt, entityCounts, etc.)
|
|
69
|
+
* If not provided, createdAt defaults to current time
|
|
70
|
+
*/
|
|
71
|
+
save(conversationId: string, piiMap: EncryptedPIIMap, metadata?: Partial<PIIMapMetadata>): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Load an encrypted PII map
|
|
74
|
+
* @param conversationId - Unique conversation identifier
|
|
75
|
+
* @returns The stored PII map with metadata, or null if not found
|
|
76
|
+
*/
|
|
77
|
+
load(conversationId: string): Promise<StoredPIIMap | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Delete a PII map
|
|
80
|
+
* @param conversationId - Unique conversation identifier
|
|
81
|
+
* @returns true if deleted, false if not found
|
|
82
|
+
*/
|
|
83
|
+
delete(conversationId: string): Promise<boolean>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if a PII map exists
|
|
86
|
+
* @param conversationId - Unique conversation identifier
|
|
87
|
+
* @returns true if exists, false otherwise
|
|
88
|
+
*/
|
|
89
|
+
exists(conversationId: string): Promise<boolean>;
|
|
90
|
+
/**
|
|
91
|
+
* List stored conversation IDs
|
|
92
|
+
* @param options - Optional filtering/limiting options
|
|
93
|
+
* @returns Array of conversation IDs
|
|
94
|
+
*/
|
|
95
|
+
list(options?: ListOptions): Promise<string[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Delete entries older than the specified date
|
|
98
|
+
* This is a manual cleanup operation - entries persist forever by default
|
|
99
|
+
* @param olderThan - Delete entries with createdAt before this date
|
|
100
|
+
* @returns Number of entries deleted
|
|
101
|
+
*/
|
|
102
|
+
cleanup(olderThan: Date): Promise<number>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Session-bound interface for anonymization with automatic storage
|
|
106
|
+
*
|
|
107
|
+
* A session wraps an Anonymizer instance with a specific session ID,
|
|
108
|
+
* automatically saving PII maps on anonymize and loading them on rehydrate.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* const session = anonymizer.session('chat-123');
|
|
113
|
+
*
|
|
114
|
+
* // Anonymize - auto-saves to storage
|
|
115
|
+
* const result = await session.anonymize('Hello John Smith!');
|
|
116
|
+
*
|
|
117
|
+
* // Rehydrate - auto-loads and decrypts
|
|
118
|
+
* const original = await session.rehydrate(translatedText);
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
export interface AnonymizerSession {
|
|
122
|
+
/** The session identifier */
|
|
123
|
+
readonly sessionId: string;
|
|
124
|
+
/**
|
|
125
|
+
* Anonymize text and automatically save the encrypted PII map
|
|
126
|
+
* @param text - Input text to anonymize
|
|
127
|
+
* @param locale - Optional locale hint (e.g., 'de-DE', 'en-US')
|
|
128
|
+
* @param policy - Optional policy override
|
|
129
|
+
* @returns Anonymization result (same as Anonymizer.anonymize)
|
|
130
|
+
*/
|
|
131
|
+
anonymize(text: string, locale?: string, policy?: Partial<AnonymizationPolicy>): Promise<AnonymizationResult>;
|
|
132
|
+
/**
|
|
133
|
+
* Rehydrate anonymized text by loading and decrypting the stored PII map
|
|
134
|
+
* @param text - Anonymized text with PII placeholders
|
|
135
|
+
* @returns Original text with PII values restored
|
|
136
|
+
* @throws Error if no PII map found for this session
|
|
137
|
+
*/
|
|
138
|
+
rehydrate(text: string): Promise<string>;
|
|
139
|
+
/**
|
|
140
|
+
* Load the stored PII map for this session (without decrypting)
|
|
141
|
+
* @returns The stored PII map with metadata, or null if not found
|
|
142
|
+
*/
|
|
143
|
+
load(): Promise<StoredPIIMap | null>;
|
|
144
|
+
/**
|
|
145
|
+
* Delete the stored PII map for this session
|
|
146
|
+
* @returns true if deleted, false if not found
|
|
147
|
+
*/
|
|
148
|
+
delete(): Promise<boolean>;
|
|
149
|
+
/**
|
|
150
|
+
* Check if a PII map exists for this session
|
|
151
|
+
* @returns true if exists, false otherwise
|
|
152
|
+
*/
|
|
153
|
+
exists(): Promise<boolean>;
|
|
154
|
+
/**
|
|
155
|
+
* Recursively anonymize all string values in a JSON-serializable structure.
|
|
156
|
+
* Returns a deep copy with every string leaf anonymized via session.anonymize().
|
|
157
|
+
*
|
|
158
|
+
* Useful for anonymizing tool call results or arbitrary JSON payloads
|
|
159
|
+
* in multi-round LLM tool execution loops.
|
|
160
|
+
*
|
|
161
|
+
* @param value - Any JSON-serializable value (object, array, string, number, boolean, null)
|
|
162
|
+
* @param locale - Optional locale hint (e.g., 'de-DE', 'en-US')
|
|
163
|
+
* @param policy - Optional policy override
|
|
164
|
+
* @returns Deep copy with all strings anonymized
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* const result = await session.anonymizeJson({
|
|
169
|
+
* name: "John Smith",
|
|
170
|
+
* email: "john@example.com",
|
|
171
|
+
* age: 30,
|
|
172
|
+
* });
|
|
173
|
+
* // { name: '<PII type="PERSON" id="1"/>', email: '<PII type="EMAIL" id="2"/>', age: 30 }
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
anonymizeJson<T>(value: T, locale?: string, policy?: Partial<AnonymizationPolicy>): Promise<T>;
|
|
177
|
+
/**
|
|
178
|
+
* Recursively rehydrate all string values in a JSON-serializable structure.
|
|
179
|
+
* Returns a deep copy with every string leaf rehydrated via session.rehydrate().
|
|
180
|
+
*
|
|
181
|
+
* @param value - Any JSON-serializable value
|
|
182
|
+
* @returns Deep copy with all strings rehydrated (PII tags replaced with original values)
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const original = await session.rehydrateJson(anonymizedResult);
|
|
187
|
+
* // { name: "John Smith", email: "john@example.com", age: 30 }
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
rehydrateJson<T>(value: T): Promise<T>;
|
|
191
|
+
/**
|
|
192
|
+
* Create a streaming anonymizer bound to this session.
|
|
193
|
+
* The stream automatically uses this session's ID, storage, and key provider.
|
|
194
|
+
* Node.js/Bun only — not available in browser builds.
|
|
195
|
+
*
|
|
196
|
+
* @param config - Optional stream configuration overrides
|
|
197
|
+
* @returns A Transform stream that anonymizes text chunk-by-chunk
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```typescript
|
|
201
|
+
* const session = anonymizer.session('chat-123');
|
|
202
|
+
* const stream = await session.createStream();
|
|
203
|
+
* input.pipe(stream).pipe(output);
|
|
204
|
+
* ```
|
|
205
|
+
*/
|
|
206
|
+
createStream?(config?: Record<string, unknown>): Promise<NodeJS.ReadWriteStream>;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anonymizer Stream
|
|
3
|
+
* Node.js Transform stream that anonymizes text chunk-by-chunk
|
|
4
|
+
* using sentence buffering for NER context.
|
|
5
|
+
*/
|
|
6
|
+
import { Transform, type TransformCallback } from "node:stream";
|
|
7
|
+
import type { RawPIIMap } from "../pipeline/tagger.js";
|
|
8
|
+
import type { StreamConfig } from "./types.js";
|
|
9
|
+
import type { IAnonymizer } from "../storage/session.js";
|
|
10
|
+
/**
|
|
11
|
+
* Transform stream that anonymizes text passing through it.
|
|
12
|
+
*
|
|
13
|
+
* Uses a SentenceBuffer to accumulate text and flush at sentence
|
|
14
|
+
* boundaries, maintaining overlap for NER context.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const stream = await createAnonymizerStream({
|
|
19
|
+
* anonymizer: { ner: { mode: 'quantized' } },
|
|
20
|
+
* sessionId: 'chat-123',
|
|
21
|
+
* piiStorageProvider: storage,
|
|
22
|
+
* keyProvider: keyProvider,
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* createReadStream('input.txt')
|
|
26
|
+
* .pipe(stream)
|
|
27
|
+
* .pipe(createWriteStream('anonymized.txt'));
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class AnonymizerStream extends Transform {
|
|
31
|
+
private readonly sentenceBuffer;
|
|
32
|
+
private readonly keyProvider;
|
|
33
|
+
private readonly piiStorageProvider;
|
|
34
|
+
private readonly sessionId;
|
|
35
|
+
private readonly onChunkCallback?;
|
|
36
|
+
private readonly onFinishCallback?;
|
|
37
|
+
private readonly saveIntervalMs;
|
|
38
|
+
private lastSaveTime;
|
|
39
|
+
private totalEntities;
|
|
40
|
+
private startTime;
|
|
41
|
+
private chunkCount;
|
|
42
|
+
constructor(anonymizer: IAnonymizer, config: StreamConfig, initialPiiMap?: RawPIIMap);
|
|
43
|
+
/**
|
|
44
|
+
* Get the cumulative PII map built across all chunks.
|
|
45
|
+
* Available after stream finishes.
|
|
46
|
+
*/
|
|
47
|
+
getPiiMap(): RawPIIMap;
|
|
48
|
+
/**
|
|
49
|
+
* Get stream statistics.
|
|
50
|
+
*/
|
|
51
|
+
get stats(): {
|
|
52
|
+
totalEntities: number;
|
|
53
|
+
chunksProcessed: number;
|
|
54
|
+
totalProcessingTimeMs: number;
|
|
55
|
+
};
|
|
56
|
+
_transform(chunk: Buffer | string, encoding: BufferEncoding, callback: TransformCallback): void;
|
|
57
|
+
_flush(callback: TransformCallback): void;
|
|
58
|
+
private processChunk;
|
|
59
|
+
private maybeSaveToStorage;
|
|
60
|
+
private processFlush;
|
|
61
|
+
private buildEntityCounts;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=anonymizer-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymizer-stream.d.ts","sourceRoot":"","sources":["../../src/streaming/anonymizer-stream.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAoC;IACrE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAqC;IAEvE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;gBAGrB,UAAU,EAAE,WAAW,EACvB,MAAM,EAAE,YAAY,EACpB,aAAa,CAAC,EAAE,SAAS;IAuB3B;;;OAGG;IACH,SAAS,IAAI,SAAS;IAItB;;OAEG;IACH,IAAI,KAAK,IAAI;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,MAAM,CAAC;KAC/B,CAOA;IAEQ,UAAU,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,iBAAiB,GAC1B,IAAI;IAYE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;YAMpC,YAAY;YAuBZ,kBAAkB;YAsBlB,YAAY;IAgD1B,OAAO,CAAC,iBAAiB;CAY1B"}
|