pi-rehydra 0.0.0-stage → 1.0.2
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/README.en.md +60 -0
- package/README.md +59 -2
- 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/host-agnostic/normalize-options.d.ts +45 -0
- package/dist/host-agnostic/normalize-options.d.ts.map +1 -0
- package/dist/host-agnostic/normalize-options.js +116 -0
- package/dist/host-agnostic/normalize-options.js.map +1 -0
- package/dist/host-agnostic/scrub.d.ts +105 -0
- package/dist/host-agnostic/scrub.d.ts.map +1 -0
- package/dist/host-agnostic/scrub.js +179 -0
- package/dist/host-agnostic/scrub.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/pi-extension/extension.d.ts +40 -0
- package/dist/pi-extension/extension.d.ts.map +1 -0
- package/dist/pi-extension/extension.js +495 -0
- package/dist/pi-extension/extension.js.map +1 -0
- package/dist/pi-extension/git-identity.d.ts +3 -0
- package/dist/pi-extension/git-identity.d.ts.map +1 -0
- package/dist/pi-extension/git-identity.js +37 -0
- package/dist/pi-extension/git-identity.js.map +1 -0
- package/dist/pi-extension/github-username.d.ts +3 -0
- package/dist/pi-extension/github-username.d.ts.map +1 -0
- package/dist/pi-extension/github-username.js +41 -0
- package/dist/pi-extension/github-username.js.map +1 -0
- package/dist/pi-extension/host-types.d.ts +125 -0
- package/dist/pi-extension/host-types.d.ts.map +1 -0
- package/dist/pi-extension/host-types.js +12 -0
- package/dist/pi-extension/host-types.js.map +1 -0
- package/dist/pi-extension/identity-recognizer.d.ts +5 -0
- package/dist/pi-extension/identity-recognizer.d.ts.map +1 -0
- package/dist/pi-extension/identity-recognizer.js +21 -0
- package/dist/pi-extension/identity-recognizer.js.map +1 -0
- package/dist/pi-extension/index.d.ts +28 -0
- package/dist/pi-extension/index.d.ts.map +1 -0
- package/dist/pi-extension/index.js +15 -0
- package/dist/pi-extension/index.js.map +1 -0
- package/dist/pi-extension/options.d.ts +36 -0
- package/dist/pi-extension/options.d.ts.map +1 -0
- package/dist/pi-extension/options.js +2 -0
- package/dist/pi-extension/options.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 +642 -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 +119 -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/dist/utils/tool-arguments.d.ts +43 -0
- package/dist/utils/tool-arguments.d.ts.map +1 -0
- package/dist/utils/tool-arguments.js +153 -0
- package/dist/utils/tool-arguments.js.map +1 -0
- package/index.d.ts +11 -0
- package/index.js +7 -0
- package/package.json +56 -4
package/README.en.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# pi-rehydra
|
|
2
|
+
|
|
3
|
+
Scrub detected secrets from Pi conversations before the main LLM request.
|
|
4
|
+
|
|
5
|
+
[中文](./README.md)
|
|
6
|
+
|
|
7
|
+
This extension intercepts the conversation between [Pi](https://pi.dev) and the LLM. Secrets from your `.env` files are replaced with placeholders before they leave your machine, and transparently restored before any tool (shell commands, file writes, etc.) executes locally; a placeholder that cannot be restored blocks that tool call.
|
|
8
|
+
|
|
9
|
+
It uses Pi's `ExtensionAPI` events: `context_with_system`, `tool_call`, `tool_result`, `message_end`, and `session_start` / `session_shutdown`.
|
|
10
|
+
|
|
11
|
+
Detection and rehydration are local. The model only sees placeholders; your tools always see real values.
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pi install npm:pi-rehydra
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Pi writes the package entry to `~/.pi/agent/settings.json`. Edit that file to add extension options:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"packages": [
|
|
24
|
+
{
|
|
25
|
+
"source": "npm:pi-rehydra"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"rehydra": {
|
|
29
|
+
"envFiles": [".env", ".env.local"],
|
|
30
|
+
"redactValues": ["sk-live-abc123..."],
|
|
31
|
+
"allowLiteralTagsIn": ["write", "edit"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Every key under `rehydra` is an extension option: `envFiles`, `redactValues`, `minValueLength`, `disableTypes`, `locale`, `vcsIdentities`, `policy`, `anonymizer`, `tagFormat`. `envFiles` defaults to `["**/.env*"]`, skipping `node_modules`, `.git`, and symlinks.
|
|
37
|
+
|
|
38
|
+
`allowLiteralTagsIn` defaults to an empty array (always block). Tools listed here — typically `write` and `edit` — keep an **unresolvable** literal tag in their arguments instead of aborting, so you can write documentation or tests that intentionally show tag examples. Every allowed occurrence is logged (`allowed literal tag in tool args`, tool name and argument path only). Resolvable tags are still restored in every tool.
|
|
39
|
+
|
|
40
|
+
## How it works
|
|
41
|
+
|
|
42
|
+
| Event | Effect |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `session_start` | Instantiate the anonymizer, build the session map, parse the `rehydra` config |
|
|
45
|
+
| `context_with_system` | Anonymize all request messages and inject the rehydra instruction when needed |
|
|
46
|
+
| `tool_call` | Strictly restore PII tags in tool arguments before local execution; an unresolvable tag blocks the call |
|
|
47
|
+
| `tool_result` | Anonymize the completed tool result before it re-enters model context |
|
|
48
|
+
| `message_end` | Rewrite the final assistant message so PII tags are replaced with real values |
|
|
49
|
+
| `session_shutdown` | Dispose of the anonymizer and session registry |
|
|
50
|
+
|
|
51
|
+
## Limitations
|
|
52
|
+
- Tool-argument rehydration is strict: when a tag is absent from this session's map (or the map is missing, or decryption fails), the tool call is blocked rather than run with `<PII .../>` as a real value. A placeholder can only be restored from the same session's map; the default map is in memory, so tags from before a process restart cannot be restored.
|
|
53
|
+
|
|
54
|
+
- Model calls that bypass these hooks (rare, e.g. user-initiated notes) are not intercepted.
|
|
55
|
+
- `URL` and `IP_ADDRESS` are disabled by default; re-enable with `disableTypes: []`.
|
|
56
|
+
- This extension cannot guarantee that title or compaction summaries stay sanitized — disable title agents if you need titles to be human-readable.
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
MIT
|
package/README.md
CHANGED
|
@@ -1,3 +1,60 @@
|
|
|
1
|
-
#
|
|
1
|
+
# pi-rehydra
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
在主 LLM 请求发出之前,脱敏 Pi 对话中检测到的密钥。
|
|
4
|
+
|
|
5
|
+
[English](./README.en.md)
|
|
6
|
+
|
|
7
|
+
这个扩展拦截 [Pi](https://pi.dev) 与 LLM 之间的对话。你的 `.env` 文件中的密钥在离开本机前被替换为占位符,并在工具(shell 命令、文件写入等)在本地执行前透明还原;无法还原的占位符会阻止该次工具调用。
|
|
8
|
+
|
|
9
|
+
它依赖 Pi 的 `ExtensionAPI`:`context_with_system`、`tool_call`、`tool_result`、`message_end`、`session_start` / `session_shutdown`。
|
|
10
|
+
|
|
11
|
+
脱敏和还原都在本地进行;模型只用占位符推理,工具始终拿到真实值。
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pi install npm:pi-rehydra
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Pi 会在 `~/.pi/agent/settings.json` 写入包声明。然后编辑该文件添加扩展配置:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"packages": [
|
|
24
|
+
{
|
|
25
|
+
"source": "npm:pi-rehydra"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"rehydra": {
|
|
29
|
+
"envFiles": [".env", ".env.local"],
|
|
30
|
+
"redactValues": ["sk-live-abc123..."],
|
|
31
|
+
"allowLiteralTagsIn": ["write", "edit"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`rehydra` 键的所有字段都是扩展配置项:`envFiles`、`redactValues`、`minValueLength`、`disableTypes`、`locale`、`vcsIdentities`、`policy`、`anonymizer`、`tagFormat`。`envFiles` 默认是 `["**/.env*"]`,会跳过 `node_modules`、`.git` 和符号链接。
|
|
37
|
+
|
|
38
|
+
`allowLiteralTagsIn` 默认是空数组(一律阻断)。列进这个数组的工具(通常是 `write`、`edit`)在参数里出现**无法还原**的字面标签时不再阻断,而是原样保留——用于写文档或测试时故意写标签示例。放行会在日志里留痕(`allowed literal tag in tool args`,只带工具名与参数路径);能还原的标签在任何工具里都照常还原。
|
|
39
|
+
|
|
40
|
+
## 工作原理
|
|
41
|
+
|
|
42
|
+
| 钩子 | 作用 |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `session_start` | 实例化匿名器、装配会话映射、解析 `rehydra` 配置 |
|
|
45
|
+
| `context_with_system` | 匿名化模型请求前的所有消息,并按需追加 rehydra 指令 |
|
|
46
|
+
| `tool_call` | 在工具执行前严格还原工具入参中的 PII 标签;任一标签无法还原即阻断该次调用 |
|
|
47
|
+
| `tool_result` | 在结果返回给模型前脱敏真实 PII |
|
|
48
|
+
| `message_end` | 改写最终回答的文本块,把 PII 标签还原为真实值 |
|
|
49
|
+
| `session_shutdown` | 释放匿名器与会话注册表 |
|
|
50
|
+
|
|
51
|
+
## 限制
|
|
52
|
+
- 工具入参还原是严格的:标签不在本次会话映射中(或映射缺失、解密失败)时,该次工具调用会被阻止,不会把 `<PII .../>` 当作真实值执行。占位符只能由同一条会话的映射还原;默认使用内存映射,进程重启后旧标签无法还原。
|
|
53
|
+
|
|
54
|
+
- 不会拦截用户在 UI 里粘贴的、且未走这些 hook 的模型调用。
|
|
55
|
+
- 默认禁用 `URL` 和 `IP_ADDRESS`;通过 `disableTypes: []` 重新启用。
|
|
56
|
+
- Pi 扩展无法保证消息标题(title)与元数据走相同的 hook,因此这些字段仍可能包含占位符。建议在脱敏时启用完整的 PII 脱敏策略。
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
MIT
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rehydra Module - Browser Entry Point
|
|
3
|
+
* Browser-safe entry point for on-device PII anonymization
|
|
4
|
+
*
|
|
5
|
+
* This module excludes Node.js-specific exports like SQLitePIIStorageProvider.
|
|
6
|
+
* For full functionality including SQLite, use the main entry point or import from 'rehydra/node'.
|
|
7
|
+
*/
|
|
8
|
+
export * from "./types/index.js";
|
|
9
|
+
export type { Recognizer } from "./recognizers/index.js";
|
|
10
|
+
export { RegexRecognizer, RecognizerRegistry, createDefaultRegistry, createRegistry, getGlobalRegistry, emailRecognizer, phoneRecognizer, ukPostalCodeRecognizer, streetAddressRecognizer, UK_POSTAL_CODE_PATTERN, isValidUKPostalCode, normalizeUKPostalCode, ibanRecognizer, bicSwiftRecognizer, creditCardRecognizer, ipAddressRecognizer, urlRecognizer, createCustomIdRecognizer, createCaseIdRecognizer, createCustomerIdRecognizer, } from "./recognizers/index.js";
|
|
11
|
+
export { NERModel, NERModelStub, createNERModel, createNERModelStub, WordPieceTokenizer, loadVocabFromFile, parseVocab, loadRuntime, detectRuntime, getRuntimeType, type INERModel, type NERModelConfig, type NERPrediction, type NERModelMode, type DownloadProgressCallback, type OrtSessionOptions, MODEL_REGISTRY, getModelCacheDir, isModelDownloaded, downloadModel, ensureModel, clearModelCache, listDownloadedModels, } from "./ner/index.js";
|
|
12
|
+
export { prenormalize, resolveEntities, tagEntities, validateOutput, generateTag, parseTag, rehydrate, enrichSemantics, inferGender, classifyLocation, getDatabaseStats, hasName, hasLocation, isSemanticDataAvailable, isSemanticDataDownloaded, getSemanticDataCacheDir, getDataDirectory, downloadSemanticData, ensureSemanticData, initializeSemanticData, loadSemanticData, clearSemanticData, clearSemanticDataCache, getSemanticDataInfo, SEMANTIC_DATA_FILES, extractTitle, extractTitlesFromSpans, mergeAdjacentTitleSpans, getTitlesForLanguage, getAllTitles, startsWithTitle, isOnlyTitle, type SemanticDataFileInfo, type EnricherConfig, type GenderResult, type LocationResult, type TitleExtractionResult, } from "./pipeline/index.js";
|
|
13
|
+
export type { KeyProvider } from "./crypto/index.js";
|
|
14
|
+
export { encryptPIIMap, decryptPIIMap, generateKey, deriveKey, generateSalt, InMemoryKeyProvider, ConfigKeyProvider, validateKey, secureCompare, uint8ArrayToBase64, base64ToUint8Array, } from "./crypto/index.js";
|
|
15
|
+
export { getStorageProvider, isNode, isBrowser, resetStorageProvider, setStorageProvider, type StorageProvider, } from "#storage";
|
|
16
|
+
export { type PIIStorageProvider, type PIIMapMetadata, type StoredPIIMap, type ListOptions, type AnonymizerSession, InMemoryPIIStorageProvider, IndexedDBPIIStorageProvider, } from "./storage/browser.js";
|
|
17
|
+
export { join as pathJoin, dirname as pathDirname, basename as pathBasename, normalize as pathNormalize, extname as pathExtname, isAbsolute as pathIsAbsolute, } from "./utils/path.js";
|
|
18
|
+
import { Anonymizer as AnonymizerCore, anonymize as anonymizeCore, anonymizeRegexOnly as anonymizeRegexOnlyCore, anonymizeWithNER as anonymizeWithNERCore, type AnonymizerConfig, type NERConfig } from "./core/index.js";
|
|
19
|
+
export type { AnonymizerConfig, NERConfig };
|
|
20
|
+
/**
|
|
21
|
+
* Anonymizer instance
|
|
22
|
+
* Main class for performing PII anonymization
|
|
23
|
+
*/
|
|
24
|
+
export declare class Anonymizer extends AnonymizerCore {
|
|
25
|
+
constructor(config?: AnonymizerConfig);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates an anonymizer with the specified configuration
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Regex-only (no NER)
|
|
33
|
+
* const anonymizer = createAnonymizer();
|
|
34
|
+
*
|
|
35
|
+
* // With NER (auto-downloads model on first use)
|
|
36
|
+
* const anonymizer = createAnonymizer({
|
|
37
|
+
* ner: { mode: 'quantized' }
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* // With NER and progress callback
|
|
41
|
+
* const anonymizer = createAnonymizer({
|
|
42
|
+
* ner: {
|
|
43
|
+
* mode: 'standard',
|
|
44
|
+
* onStatus: (status) => console.log(status),
|
|
45
|
+
* onDownloadProgress: (p) => console.log(`${p.file}: ${p.percent}%`)
|
|
46
|
+
* }
|
|
47
|
+
* });
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function createAnonymizer(config?: AnonymizerConfig): Anonymizer;
|
|
51
|
+
export declare const anonymize: typeof anonymizeCore;
|
|
52
|
+
export declare const anonymizeRegexOnly: typeof anonymizeRegexOnlyCore;
|
|
53
|
+
export declare const anonymizeWithNER: typeof anonymizeWithNERCore;
|
|
54
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rehydra Module - Browser Entry Point
|
|
3
|
+
* Browser-safe entry point for on-device PII anonymization
|
|
4
|
+
*
|
|
5
|
+
* This module excludes Node.js-specific exports like SQLitePIIStorageProvider.
|
|
6
|
+
* For full functionality including SQLite, use the main entry point or import from 'rehydra/node'.
|
|
7
|
+
*/
|
|
8
|
+
// Re-export types
|
|
9
|
+
export * from "./types/index.js";
|
|
10
|
+
export { RegexRecognizer, RecognizerRegistry, createDefaultRegistry, createRegistry, getGlobalRegistry, emailRecognizer, phoneRecognizer, ukPostalCodeRecognizer, streetAddressRecognizer, UK_POSTAL_CODE_PATTERN, isValidUKPostalCode, normalizeUKPostalCode, ibanRecognizer, bicSwiftRecognizer, creditCardRecognizer, ipAddressRecognizer, urlRecognizer, createCustomIdRecognizer, createCaseIdRecognizer, createCustomerIdRecognizer, } from "./recognizers/index.js";
|
|
11
|
+
// Re-export NER components
|
|
12
|
+
export { NERModel, NERModelStub, createNERModel, createNERModelStub, WordPieceTokenizer, loadVocabFromFile, parseVocab, loadRuntime, detectRuntime, getRuntimeType, MODEL_REGISTRY, getModelCacheDir, isModelDownloaded, downloadModel, ensureModel, clearModelCache, listDownloadedModels, } from "./ner/index.js";
|
|
13
|
+
// Re-export pipeline components
|
|
14
|
+
export { prenormalize, resolveEntities, tagEntities, validateOutput, generateTag, parseTag, rehydrate, enrichSemantics, inferGender, classifyLocation, getDatabaseStats, hasName, hasLocation,
|
|
15
|
+
// Semantic data loader exports
|
|
16
|
+
isSemanticDataAvailable, isSemanticDataDownloaded, getSemanticDataCacheDir, getDataDirectory, downloadSemanticData, ensureSemanticData, initializeSemanticData, loadSemanticData, clearSemanticData, clearSemanticDataCache, getSemanticDataInfo, SEMANTIC_DATA_FILES,
|
|
17
|
+
// Title extractor exports
|
|
18
|
+
extractTitle, extractTitlesFromSpans, mergeAdjacentTitleSpans, getTitlesForLanguage, getAllTitles, startsWithTitle, isOnlyTitle, } from "./pipeline/index.js";
|
|
19
|
+
export { encryptPIIMap, decryptPIIMap, generateKey, deriveKey, generateSalt, InMemoryKeyProvider, ConfigKeyProvider, validateKey, secureCompare, uint8ArrayToBase64, base64ToUint8Array, } from "./crypto/index.js";
|
|
20
|
+
// Re-export storage utilities (file system abstraction)
|
|
21
|
+
export { getStorageProvider, isNode, isBrowser, resetStorageProvider, setStorageProvider, } from "#storage";
|
|
22
|
+
// Re-export PII storage providers (browser-safe only - no SQLite)
|
|
23
|
+
export { InMemoryPIIStorageProvider, IndexedDBPIIStorageProvider,
|
|
24
|
+
// Note: SQLitePIIStorageProvider is NOT exported in browser build
|
|
25
|
+
// Import from 'rehydra/storage/sqlite' if needed in Node.js
|
|
26
|
+
} from "./storage/browser.js";
|
|
27
|
+
// Re-export path utilities
|
|
28
|
+
export { join as pathJoin, dirname as pathDirname, basename as pathBasename, normalize as pathNormalize, extname as pathExtname, isAbsolute as pathIsAbsolute, } from "./utils/path.js";
|
|
29
|
+
// Import core anonymizer components
|
|
30
|
+
import { Anonymizer as AnonymizerCore, anonymize as anonymizeCore, anonymizeRegexOnly as anonymizeRegexOnlyCore, anonymizeWithNER as anonymizeWithNERCore, } from "./core/index.js";
|
|
31
|
+
// Import session implementation
|
|
32
|
+
import { AnonymizerSessionImpl } from "./storage/session-base.js";
|
|
33
|
+
/**
|
|
34
|
+
* Anonymizer instance
|
|
35
|
+
* Main class for performing PII anonymization
|
|
36
|
+
*/
|
|
37
|
+
export class Anonymizer extends AnonymizerCore {
|
|
38
|
+
constructor(config = {}) {
|
|
39
|
+
super(config, (anonymizer, sessionId, storage, keyProvider) => {
|
|
40
|
+
return new AnonymizerSessionImpl(anonymizer, sessionId, storage, keyProvider);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Creates an anonymizer with the specified configuration
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* // Regex-only (no NER)
|
|
50
|
+
* const anonymizer = createAnonymizer();
|
|
51
|
+
*
|
|
52
|
+
* // With NER (auto-downloads model on first use)
|
|
53
|
+
* const anonymizer = createAnonymizer({
|
|
54
|
+
* ner: { mode: 'quantized' }
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* // With NER and progress callback
|
|
58
|
+
* const anonymizer = createAnonymizer({
|
|
59
|
+
* ner: {
|
|
60
|
+
* mode: 'standard',
|
|
61
|
+
* onStatus: (status) => console.log(status),
|
|
62
|
+
* onDownloadProgress: (p) => console.log(`${p.file}: ${p.percent}%`)
|
|
63
|
+
* }
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export function createAnonymizer(config) {
|
|
68
|
+
return new Anonymizer(config);
|
|
69
|
+
}
|
|
70
|
+
// Re-export standalone functions from core
|
|
71
|
+
export const anonymize = anonymizeCore;
|
|
72
|
+
export const anonymizeRegexOnly = anonymizeRegexOnlyCore;
|
|
73
|
+
export const anonymizeWithNER = anonymizeWithNERCore;
|
|
74
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Anonymizer Module
|
|
3
|
+
* Shared implementation for both browser and Node.js entry points
|
|
4
|
+
*/
|
|
5
|
+
import { AnonymizationResult, AnonymizationPolicy, AnonymizationMode, SemanticConfig, SecretsConfig, PIIType, TagFormat } from "../types/index.js";
|
|
6
|
+
import { RecognizerRegistry } from "../recognizers/index.js";
|
|
7
|
+
import { type INERModel, type OrtSessionOptions } from "../ner/index.js";
|
|
8
|
+
import { type NERModelMode, type DownloadProgressCallback } from "../ner/model-manager.js";
|
|
9
|
+
import { type RawPIIMap } from "../pipeline/tagger.js";
|
|
10
|
+
import { type KeyProvider } from "../crypto/index.js";
|
|
11
|
+
export type { RawPIIMap } from "../pipeline/tagger.js";
|
|
12
|
+
import type { PIIStorageProvider, AnonymizerSession } from "../storage/types.js";
|
|
13
|
+
export type { PIIStorageProvider, AnonymizerSession };
|
|
14
|
+
/**
|
|
15
|
+
* NER configuration options
|
|
16
|
+
*/
|
|
17
|
+
export interface NERConfig {
|
|
18
|
+
/**
|
|
19
|
+
* NER model mode:
|
|
20
|
+
* - 'standard': Full-size multilingual model (~1.1 GB)
|
|
21
|
+
* - 'quantized': Smaller quantized model (~280 MB)
|
|
22
|
+
* - 'disabled': No NER, regex-only detection
|
|
23
|
+
* - 'custom': Use custom model paths
|
|
24
|
+
*/
|
|
25
|
+
mode: NERModelMode;
|
|
26
|
+
/**
|
|
27
|
+
* Custom model path (required when mode is 'custom')
|
|
28
|
+
*/
|
|
29
|
+
modelPath?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Custom vocab path (required when mode is 'custom')
|
|
32
|
+
*/
|
|
33
|
+
vocabPath?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Whether to auto-download model if not present
|
|
36
|
+
* @default true
|
|
37
|
+
*/
|
|
38
|
+
autoDownload?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Callback for download progress
|
|
41
|
+
*/
|
|
42
|
+
onDownloadProgress?: DownloadProgressCallback;
|
|
43
|
+
/**
|
|
44
|
+
* Callback for status messages
|
|
45
|
+
*/
|
|
46
|
+
onStatus?: (status: string) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Confidence thresholds per PII type (0.0 - 1.0)
|
|
49
|
+
* Overrides default thresholds for specified types
|
|
50
|
+
* @example { PERSON: 0.8, ORG: 0.7 }
|
|
51
|
+
*/
|
|
52
|
+
thresholds?: Partial<Record<PIIType, number>>;
|
|
53
|
+
/**
|
|
54
|
+
* ONNX session options for performance tuning
|
|
55
|
+
* Allows customizing execution providers, threading, and graph optimizations
|
|
56
|
+
* @example { executionProviders: ['CoreMLExecutionProvider', 'CPUExecutionProvider'] }
|
|
57
|
+
*/
|
|
58
|
+
sessionOptions?: OrtSessionOptions;
|
|
59
|
+
/**
|
|
60
|
+
* Inference backend: 'local' (default) or 'inference-server'
|
|
61
|
+
* - 'local': Local ONNX Runtime inference (CPU)
|
|
62
|
+
* - 'inference-server': Remote GPU inference via HTTP (enterprise deployment)
|
|
63
|
+
* @default 'local'
|
|
64
|
+
*/
|
|
65
|
+
backend?: "local" | "inference-server";
|
|
66
|
+
/**
|
|
67
|
+
* Inference server URL (required when backend is 'inference-server')
|
|
68
|
+
* @example 'http://localhost:8080'
|
|
69
|
+
*/
|
|
70
|
+
inferenceServerUrl?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Inference server request timeout in milliseconds (default: 30000)
|
|
73
|
+
* Only used when backend is 'inference-server'
|
|
74
|
+
*/
|
|
75
|
+
inferenceServerTimeout?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Enable case-insensitive fallback for detecting lowercase names.
|
|
78
|
+
* Runs a second NER pass on title-cased text and merges new detections.
|
|
79
|
+
* Doubles NER inference time but catches names like "tom" that the
|
|
80
|
+
* case-sensitive model would otherwise miss.
|
|
81
|
+
* @default false
|
|
82
|
+
*/
|
|
83
|
+
caseFallback?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Confidence penalty multiplier for case-fallback detections (0.0 - 1.0).
|
|
86
|
+
* Applied as: confidence * caseFallbackPenalty
|
|
87
|
+
* @default 0.85
|
|
88
|
+
*/
|
|
89
|
+
caseFallbackPenalty?: number;
|
|
90
|
+
/**
|
|
91
|
+
* Number of content tokens shared by adjacent windows when a long input is
|
|
92
|
+
* split into multiple inference windows. Larger overlap improves recall for
|
|
93
|
+
* entities near window boundaries at the cost of more windows.
|
|
94
|
+
* @default min(64, floor((maxLength - 2) / 4))
|
|
95
|
+
*/
|
|
96
|
+
windowOverlapTokens?: number;
|
|
97
|
+
/**
|
|
98
|
+
* Maximum number of inference windows per input. Inputs that tokenize to
|
|
99
|
+
* more windows are scanned only up to this bound (onWindowCap fires once per
|
|
100
|
+
* capped inference pass — so twice for one input when caseFallback runs a
|
|
101
|
+
* second pass). Guards against unbounded inference cost on very large
|
|
102
|
+
* opaque payloads (e.g. multi-megabyte base64 attachments).
|
|
103
|
+
* @default undefined (unbounded — full coverage)
|
|
104
|
+
*/
|
|
105
|
+
maxWindowsPerInput?: number;
|
|
106
|
+
/**
|
|
107
|
+
* Called when an input exceeds maxWindowsPerInput and its tail is left
|
|
108
|
+
* unscanned by NER. Callers should log/meter this — it is a coverage
|
|
109
|
+
* reduction, not an error. When absent, a console warning is emitted.
|
|
110
|
+
* `inputLength` is the full input character count.
|
|
111
|
+
*/
|
|
112
|
+
onWindowCap?: (info: {
|
|
113
|
+
scannedWindows: number;
|
|
114
|
+
inputLength: number;
|
|
115
|
+
}) => void;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Anonymizer configuration
|
|
119
|
+
*/
|
|
120
|
+
export interface AnonymizerConfig {
|
|
121
|
+
/** Recognizer registry (uses default if not provided) */
|
|
122
|
+
registry?: RecognizerRegistry;
|
|
123
|
+
/**
|
|
124
|
+
* Anonymization mode:
|
|
125
|
+
* - 'pseudonymize': Reversible anonymization with encrypted PII map (default)
|
|
126
|
+
* - 'anonymize': Irreversible anonymization without PII map
|
|
127
|
+
* @default 'pseudonymize'
|
|
128
|
+
*/
|
|
129
|
+
mode?: AnonymizationMode;
|
|
130
|
+
/**
|
|
131
|
+
* NER configuration
|
|
132
|
+
* @default { mode: 'disabled' }
|
|
133
|
+
*/
|
|
134
|
+
ner?: NERConfig;
|
|
135
|
+
/**
|
|
136
|
+
* Semantic enrichment configuration
|
|
137
|
+
* Enables MT-friendly PII tags with gender/scope attributes
|
|
138
|
+
* @default { enabled: false }
|
|
139
|
+
*/
|
|
140
|
+
semantic?: SemanticConfig;
|
|
141
|
+
/**
|
|
142
|
+
* Secrets/credentials detection configuration
|
|
143
|
+
* Detects API keys, private keys, JWTs, connection strings, etc.
|
|
144
|
+
* @default { enabled: false }
|
|
145
|
+
*/
|
|
146
|
+
secrets?: SecretsConfig;
|
|
147
|
+
/** Key provider for encryption (generates random key if not provided) */
|
|
148
|
+
keyProvider?: KeyProvider;
|
|
149
|
+
/**
|
|
150
|
+
* PII storage provider for automatic session-based persistence
|
|
151
|
+
* When provided, enables the session() method for automatic PII map storage
|
|
152
|
+
*/
|
|
153
|
+
piiStorageProvider?: PIIStorageProvider;
|
|
154
|
+
/** Default policy — merged with SDK defaults, so partial overrides are safe */
|
|
155
|
+
defaultPolicy?: Partial<AnonymizationPolicy>;
|
|
156
|
+
/** Model version string */
|
|
157
|
+
modelVersion?: string;
|
|
158
|
+
/** Policy version string */
|
|
159
|
+
policyVersion?: string;
|
|
160
|
+
/**
|
|
161
|
+
* Optional callback for validation warnings emitted during anonymization.
|
|
162
|
+
* When not provided, warnings are silently ignored.
|
|
163
|
+
* Previously these were logged via console.warn, which pollutes stdout
|
|
164
|
+
* in TUI-based editors.
|
|
165
|
+
*/
|
|
166
|
+
onValidationWarning?: (warnings: Array<{
|
|
167
|
+
code: string;
|
|
168
|
+
message: string;
|
|
169
|
+
}>) => void;
|
|
170
|
+
/**
|
|
171
|
+
* Tag format configuration for PII placeholder tags.
|
|
172
|
+
* Controls the delimiters and keyword used in tags.
|
|
173
|
+
* @default { open: "<", close: "/>", keyword: "PII" } (XML-style)
|
|
174
|
+
* @example { open: "[[", close: "]]" } for bracket-style tags
|
|
175
|
+
*/
|
|
176
|
+
tagFormat?: TagFormat;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Session implementation factory type
|
|
180
|
+
*/
|
|
181
|
+
export type SessionFactory = (anonymizer: Anonymizer, sessionId: string, storage: PIIStorageProvider, keyProvider: KeyProvider) => AnonymizerSession;
|
|
182
|
+
/**
|
|
183
|
+
* Anonymizer instance
|
|
184
|
+
* Main class for performing PII anonymization
|
|
185
|
+
*/
|
|
186
|
+
export declare class Anonymizer {
|
|
187
|
+
private registry;
|
|
188
|
+
private nerModel;
|
|
189
|
+
private nerConfig;
|
|
190
|
+
private semanticConfig;
|
|
191
|
+
private secretsConfig;
|
|
192
|
+
private mode;
|
|
193
|
+
private keyProvider;
|
|
194
|
+
private piiStorageProvider;
|
|
195
|
+
private defaultPolicy;
|
|
196
|
+
private modelVersion;
|
|
197
|
+
private policyVersion;
|
|
198
|
+
private initialized;
|
|
199
|
+
private semanticDataReady;
|
|
200
|
+
private sessionFactory;
|
|
201
|
+
private onValidationWarning;
|
|
202
|
+
private tagFormat;
|
|
203
|
+
constructor(config?: AnonymizerConfig, sessionFactory?: SessionFactory);
|
|
204
|
+
/**
|
|
205
|
+
* Returns the resolved tag format configuration
|
|
206
|
+
*/
|
|
207
|
+
get resolvedTagFormat(): TagFormat;
|
|
208
|
+
/**
|
|
209
|
+
* Initializes the anonymizer
|
|
210
|
+
* Downloads NER model and semantic data if needed and loads them
|
|
211
|
+
*/
|
|
212
|
+
initialize(): Promise<void>;
|
|
213
|
+
/**
|
|
214
|
+
* Anonymizes text, replacing PII with placeholder tags
|
|
215
|
+
* @param text - Input text to anonymize
|
|
216
|
+
* @param locale - Optional locale hint (e.g., 'de-DE', 'en-US')
|
|
217
|
+
* @param policy - Optional policy override
|
|
218
|
+
* @param existingPiiMap - Optional existing PII map for session-level ID reuse
|
|
219
|
+
* @returns Anonymization result with anonymized text and encrypted PII map
|
|
220
|
+
*/
|
|
221
|
+
anonymize(text: string, locale?: string, policy?: Partial<AnonymizationPolicy>, existingPiiMap?: RawPIIMap): Promise<AnonymizationResult>;
|
|
222
|
+
/**
|
|
223
|
+
* Disposes of resources
|
|
224
|
+
*/
|
|
225
|
+
dispose(): Promise<void>;
|
|
226
|
+
/**
|
|
227
|
+
* Gets the recognizer registry
|
|
228
|
+
*/
|
|
229
|
+
getRegistry(): RecognizerRegistry;
|
|
230
|
+
/**
|
|
231
|
+
* Gets the NER model
|
|
232
|
+
*/
|
|
233
|
+
getNERModel(): INERModel | null;
|
|
234
|
+
/**
|
|
235
|
+
* Whether the anonymizer is initialized
|
|
236
|
+
*/
|
|
237
|
+
get isInitialized(): boolean;
|
|
238
|
+
/**
|
|
239
|
+
* Creates a session-bound interface for automatic PII map storage
|
|
240
|
+
*
|
|
241
|
+
* @param sessionId - Unique identifier for this session/conversation
|
|
242
|
+
* @returns AnonymizerSession that auto-saves on anonymize and auto-loads on rehydrate
|
|
243
|
+
* @throws Error if piiStorageProvider was not configured
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* ```typescript
|
|
247
|
+
* const session = anonymizer.session('chat-123');
|
|
248
|
+
*
|
|
249
|
+
* // Anonymize - auto-saves to storage
|
|
250
|
+
* const result = await session.anonymize('Hello John Smith!');
|
|
251
|
+
*
|
|
252
|
+
* // Rehydrate - auto-loads and decrypts
|
|
253
|
+
* const original = await session.rehydrate(translatedText);
|
|
254
|
+
* ```
|
|
255
|
+
*/
|
|
256
|
+
session(sessionId: string): AnonymizerSession;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Creates an anonymizer with the specified configuration
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```typescript
|
|
263
|
+
* // Regex-only (no NER)
|
|
264
|
+
* const anonymizer = createAnonymizer();
|
|
265
|
+
*
|
|
266
|
+
* // With NER (auto-downloads model on first use)
|
|
267
|
+
* const anonymizer = createAnonymizer({
|
|
268
|
+
* ner: { mode: 'quantized' }
|
|
269
|
+
* });
|
|
270
|
+
*
|
|
271
|
+
* // With NER and progress callback
|
|
272
|
+
* const anonymizer = createAnonymizer({
|
|
273
|
+
* ner: {
|
|
274
|
+
* mode: 'standard',
|
|
275
|
+
* onStatus: (status) => console.log(status),
|
|
276
|
+
* onDownloadProgress: (p) => console.log(`${p.file}: ${p.percent}%`)
|
|
277
|
+
* }
|
|
278
|
+
* });
|
|
279
|
+
* ```
|
|
280
|
+
*/
|
|
281
|
+
export declare function createAnonymizer(config?: AnonymizerConfig, sessionFactory?: SessionFactory): Anonymizer;
|
|
282
|
+
/**
|
|
283
|
+
* Convenience function for one-off anonymization
|
|
284
|
+
* Creates a temporary anonymizer with default settings (regex-only)
|
|
285
|
+
*/
|
|
286
|
+
export declare function anonymize(text: string, locale?: string, policy?: Partial<AnonymizationPolicy>): Promise<AnonymizationResult>;
|
|
287
|
+
/**
|
|
288
|
+
* Quick regex-only anonymization (no NER, faster)
|
|
289
|
+
*/
|
|
290
|
+
export declare function anonymizeRegexOnly(text: string, policy?: Partial<AnonymizationPolicy>): Promise<AnonymizationResult>;
|
|
291
|
+
/**
|
|
292
|
+
* Full anonymization with NER
|
|
293
|
+
* Auto-downloads the quantized model on first use
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* ```typescript
|
|
297
|
+
* const result = await anonymizeWithNER(
|
|
298
|
+
* 'Contact John Smith at john@example.com',
|
|
299
|
+
* {
|
|
300
|
+
* mode: 'quantized',
|
|
301
|
+
* onStatus: console.log
|
|
302
|
+
* }
|
|
303
|
+
* );
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
306
|
+
export declare function anonymizeWithNER(text: string, nerConfig: Omit<NERConfig, "mode"> & {
|
|
307
|
+
mode?: "standard" | "quantized";
|
|
308
|
+
}, policy?: Partial<AnonymizationPolicy>): Promise<AnonymizationResult>;
|
|
309
|
+
//# sourceMappingURL=anonymizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymizer.d.ts","sourceRoot":"","sources":["../../src/core/anonymizer.ts"],"names":[],"mappings":"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"}
|