opencode-rehydra-core 0.14.0
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/LICENSE +22 -0
- package/README.en.md +191 -0
- package/README.md +191 -0
- 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 +40 -0
- package/dist/opencode-plugin/v2/options.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/options.js +132 -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/package.json +148 -0
|
@@ -0,0 +1,631 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rehydra Fetch Wrapper
|
|
3
|
+
* Wraps the native fetch to anonymize outgoing LLM requests
|
|
4
|
+
* and rehydrate incoming LLM responses.
|
|
5
|
+
*/
|
|
6
|
+
import { createAnonymizer } from "../core/anonymizer.js";
|
|
7
|
+
import { decryptPIIMap } from "../crypto/index.js";
|
|
8
|
+
import { rehydrate } from "../pipeline/tagger.js";
|
|
9
|
+
import { AnonymizerSessionImpl } from "../storage/session.js";
|
|
10
|
+
import { SSEParser, isSSEDone, serializeSSEEvent } from "./sse-parser.js";
|
|
11
|
+
import { detectProvider } from "./providers/index.js";
|
|
12
|
+
import { buildPIISystemInstruction } from "./system-instruction.js";
|
|
13
|
+
import { buildTagPrefix } from "../utils/regex.js";
|
|
14
|
+
import { accumulateToolStream, readToolResponse, toolResultStream } from "./tool-loop-stream.js";
|
|
15
|
+
import { DEFAULT_TAG_FORMAT } from "../types/index.js";
|
|
16
|
+
/** Headers to strip from proxied responses — the body is decompressed and may be modified. */
|
|
17
|
+
const STRIP_RESPONSE_HEADERS = ["content-encoding", "content-length"];
|
|
18
|
+
function stripResponseHeaders(headers) {
|
|
19
|
+
const cleaned = new Headers(headers);
|
|
20
|
+
for (const h of STRIP_RESPONSE_HEADERS) {
|
|
21
|
+
cleaned.delete(h);
|
|
22
|
+
}
|
|
23
|
+
return cleaned;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Returns the length of the longest proper prefix of `tagPrefix` that `text`
|
|
27
|
+
* ends with, or 0 if none. Used to hold back a partially-streamed tag prefix
|
|
28
|
+
* (e.g. a chunk ending in `"<P"` or `"<PI"`) so it isn't forwarded raw before
|
|
29
|
+
* the rest of the `<PII.../>` tag arrives in a later SSE chunk.
|
|
30
|
+
*/
|
|
31
|
+
function trailingPartialTagPrefixLen(text, tagPrefix) {
|
|
32
|
+
for (let n = tagPrefix.length - 1; n >= 1; n--) {
|
|
33
|
+
if (text.endsWith(tagPrefix.slice(0, n)))
|
|
34
|
+
return n;
|
|
35
|
+
}
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
let sessionCounter = 0;
|
|
39
|
+
function defaultGetSessionId() {
|
|
40
|
+
return `rehydra-proxy-${Date.now()}-${++sessionCounter}`;
|
|
41
|
+
}
|
|
42
|
+
function errorResponse(status, message) {
|
|
43
|
+
return new Response(JSON.stringify({
|
|
44
|
+
error: { message, type: "rehydra_proxy_error" },
|
|
45
|
+
}), {
|
|
46
|
+
status,
|
|
47
|
+
headers: { "Content-Type": "application/json" },
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates a fetch-compatible function that automatically:
|
|
52
|
+
* 1. Anonymizes text in outgoing LLM API requests
|
|
53
|
+
* 2. Rehydrates text in incoming LLM API responses
|
|
54
|
+
*
|
|
55
|
+
* PII never leaves your infrastructure.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* import OpenAI from 'openai';
|
|
60
|
+
* import { createRehydraFetch, InMemoryKeyProvider, InMemoryPIIStorageProvider } from 'rehydra';
|
|
61
|
+
*
|
|
62
|
+
* const rehydraFetch = createRehydraFetch({
|
|
63
|
+
* keyProvider: new InMemoryKeyProvider(),
|
|
64
|
+
* piiStorageProvider: new InMemoryPIIStorageProvider(),
|
|
65
|
+
* });
|
|
66
|
+
*
|
|
67
|
+
* const openai = new OpenAI({ fetch: rehydraFetch });
|
|
68
|
+
*
|
|
69
|
+
* // PII is automatically anonymized before being sent to OpenAI
|
|
70
|
+
* const response = await openai.chat.completions.create({
|
|
71
|
+
* model: 'gpt-4',
|
|
72
|
+
* messages: [{ role: 'user', content: 'Email john@example.com about the meeting' }],
|
|
73
|
+
* });
|
|
74
|
+
* // Response is automatically rehydrated — contains original PII
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export function createRehydraFetch(config) {
|
|
78
|
+
if (config.maxToolRounds !== undefined &&
|
|
79
|
+
(!Number.isSafeInteger(config.maxToolRounds) || config.maxToolRounds < 0)) {
|
|
80
|
+
throw new Error("maxToolRounds must be a nonnegative safe integer");
|
|
81
|
+
}
|
|
82
|
+
if (config.maxToolResponseBytes !== undefined &&
|
|
83
|
+
(!Number.isSafeInteger(config.maxToolResponseBytes) || config.maxToolResponseBytes <= 0)) {
|
|
84
|
+
throw new Error("maxToolResponseBytes must be a positive safe integer");
|
|
85
|
+
}
|
|
86
|
+
const anonymizer = createAnonymizer({
|
|
87
|
+
...config.anonymizer,
|
|
88
|
+
keyProvider: config.keyProvider,
|
|
89
|
+
piiStorageProvider: config.piiStorageProvider,
|
|
90
|
+
});
|
|
91
|
+
let initialized = false;
|
|
92
|
+
const tagFormat = config.anonymizer?.tagFormat ?? DEFAULT_TAG_FORMAT;
|
|
93
|
+
const getSessionId = config.getSessionId ?? defaultGetSessionId;
|
|
94
|
+
const handleStreaming = config.handleStreaming !== false;
|
|
95
|
+
async function ensureInitialized() {
|
|
96
|
+
if (!initialized) {
|
|
97
|
+
await anonymizer.initialize();
|
|
98
|
+
initialized = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return async (input, init) => {
|
|
102
|
+
try {
|
|
103
|
+
await ensureInitialized();
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
initialized = false; // Allow retry on next request
|
|
107
|
+
const msg = err instanceof Error ? err.message : "Initialization failed";
|
|
108
|
+
return errorResponse(503, `Rehydra proxy not ready: ${msg}`);
|
|
109
|
+
}
|
|
110
|
+
const request = new Request(input, init);
|
|
111
|
+
// Only intercept POST requests with JSON bodies (LLM API calls)
|
|
112
|
+
if (request.method !== "POST") {
|
|
113
|
+
return fetch(request);
|
|
114
|
+
}
|
|
115
|
+
const contentType = request.headers.get("content-type");
|
|
116
|
+
if (contentType === null || !contentType.includes("application/json")) {
|
|
117
|
+
return fetch(request);
|
|
118
|
+
}
|
|
119
|
+
// Detect the LLM provider
|
|
120
|
+
const provider = detectProvider(request.url, request.headers, config.provider);
|
|
121
|
+
// Parse request body
|
|
122
|
+
let body;
|
|
123
|
+
try {
|
|
124
|
+
body = await request.json();
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return errorResponse(400, "Invalid JSON in request body");
|
|
128
|
+
}
|
|
129
|
+
// Get session ID for PII map persistence
|
|
130
|
+
const sessionId = await getSessionId(request);
|
|
131
|
+
// Create a session for this request
|
|
132
|
+
const session = new AnonymizerSessionImpl(anonymizer, sessionId, config.piiStorageProvider, config.keyProvider);
|
|
133
|
+
try {
|
|
134
|
+
// Extract and anonymize text from the request
|
|
135
|
+
const texts = provider.extractRequestText(body);
|
|
136
|
+
const anonymizedTexts = [];
|
|
137
|
+
let piiDetected = false;
|
|
138
|
+
const countsByType = {};
|
|
139
|
+
let totalEntities = 0;
|
|
140
|
+
for (let i = 0; i < texts.length; i++) {
|
|
141
|
+
const result = await session.anonymize(texts[i], config.locale, config.policy);
|
|
142
|
+
anonymizedTexts.push(result.anonymizedText);
|
|
143
|
+
if (result.anonymizedText !== texts[i]) {
|
|
144
|
+
piiDetected = true;
|
|
145
|
+
}
|
|
146
|
+
for (const [type, count] of Object.entries(result.stats.countsByType)) {
|
|
147
|
+
if (count > 0) {
|
|
148
|
+
countsByType[type] = (countsByType[type] ?? 0) + count;
|
|
149
|
+
totalEntities += count;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Report what was anonymized (types and counts only — never raw PII)
|
|
154
|
+
if (config.onAnonymize !== undefined) {
|
|
155
|
+
config.onAnonymize({
|
|
156
|
+
method: request.method,
|
|
157
|
+
url: request.url,
|
|
158
|
+
countsByType,
|
|
159
|
+
totalEntities,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Rebuild the request body with anonymized text
|
|
163
|
+
let anonymizedBody = provider.rebuildRequestBody(body, anonymizedTexts);
|
|
164
|
+
// Inject PII handling instruction when anonymization replaced something.
|
|
165
|
+
// Can be disabled with systemInstruction: false, or overridden with a custom string.
|
|
166
|
+
if (piiDetected &&
|
|
167
|
+
config.systemInstruction !== false &&
|
|
168
|
+
provider.injectSystemInstruction !== undefined) {
|
|
169
|
+
const instruction = typeof config.systemInstruction === "string"
|
|
170
|
+
? config.systemInstruction
|
|
171
|
+
: buildPIISystemInstruction(tagFormat);
|
|
172
|
+
anonymizedBody = provider.injectSystemInstruction(anonymizedBody, instruction);
|
|
173
|
+
}
|
|
174
|
+
// Forward the anonymized request
|
|
175
|
+
const upstreamRequest = new Request(request, {
|
|
176
|
+
body: JSON.stringify(anonymizedBody),
|
|
177
|
+
});
|
|
178
|
+
let response;
|
|
179
|
+
try {
|
|
180
|
+
response = await fetch(upstreamRequest);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
const msg = err instanceof Error ? err.message : "Upstream request failed";
|
|
184
|
+
return errorResponse(502, `Upstream LLM unreachable: ${msg}`);
|
|
185
|
+
}
|
|
186
|
+
if (!response.ok)
|
|
187
|
+
return response;
|
|
188
|
+
// Determine if the response is a streaming SSE response
|
|
189
|
+
const responseContentType = response.headers.get("content-type");
|
|
190
|
+
const isSSE = handleStreaming &&
|
|
191
|
+
provider.isStreamingRequest(body) &&
|
|
192
|
+
responseContentType !== null &&
|
|
193
|
+
responseContentType.includes("text/event-stream");
|
|
194
|
+
if (isSSE && response.body !== null) {
|
|
195
|
+
if (config.onToolCall !== undefined && provider.streamingToolLoop !== undefined &&
|
|
196
|
+
provider.hasResponseToolCalls !== undefined && provider.extractResponseToolCallInfo !== undefined &&
|
|
197
|
+
provider.extractMessages !== undefined && provider.buildToolLoopBody !== undefined && response.ok) {
|
|
198
|
+
return await handleStreamingToolLoop(response, anonymizedBody, session, provider, config, request);
|
|
199
|
+
}
|
|
200
|
+
return rehydrateSSEResponse(response, session, provider, config);
|
|
201
|
+
}
|
|
202
|
+
// Tool execution loop: when onToolCall is configured and provider
|
|
203
|
+
// supports it, intercept tool call responses and run them server-side
|
|
204
|
+
if (config.onToolCall !== undefined &&
|
|
205
|
+
provider.hasResponseToolCalls !== undefined &&
|
|
206
|
+
provider.extractResponseToolCallInfo !== undefined &&
|
|
207
|
+
provider.extractMessages !== undefined &&
|
|
208
|
+
provider.buildToolLoopBody !== undefined) {
|
|
209
|
+
return await handleToolLoop(response, anonymizedBody, session, provider, config, request);
|
|
210
|
+
}
|
|
211
|
+
return rehydrateJSONResponse(response, session, provider);
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
if (request.signal.aborted)
|
|
215
|
+
throw err;
|
|
216
|
+
const msg = err instanceof Error ? err.message : "Internal proxy error";
|
|
217
|
+
return errorResponse(500, msg);
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Buffer and validate the first stream before allowing any tool side effects. */
|
|
222
|
+
async function handleStreamingToolLoop(response, anonymizedBody, session, provider, config, request) {
|
|
223
|
+
const adapter = provider.streamingToolLoop;
|
|
224
|
+
let text;
|
|
225
|
+
let complete;
|
|
226
|
+
try {
|
|
227
|
+
text = await readToolResponse(response, config.maxToolResponseBytes ?? 8 * 1024 * 1024, request.signal);
|
|
228
|
+
complete = accumulateToolStream(text, adapter);
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
if (request.signal.aborted)
|
|
232
|
+
throw err;
|
|
233
|
+
return errorResponse(502, err instanceof Error ? err.message : "Invalid streamed tool response");
|
|
234
|
+
}
|
|
235
|
+
if (!provider.hasResponseToolCalls(complete)) {
|
|
236
|
+
return rehydrateSSEResponse(new Response(text, {
|
|
237
|
+
status: response.status, headers: stripResponseHeaders(response.headers),
|
|
238
|
+
}), session, provider, config);
|
|
239
|
+
}
|
|
240
|
+
const headers = stripResponseHeaders(response.headers);
|
|
241
|
+
headers.set("content-type", "application/json");
|
|
242
|
+
const finalResponse = await handleToolLoop(new Response(JSON.stringify(complete), {
|
|
243
|
+
status: response.status, headers,
|
|
244
|
+
}), anonymizedBody, session, provider, config, request);
|
|
245
|
+
if (!finalResponse.ok)
|
|
246
|
+
return finalResponse;
|
|
247
|
+
let finalBody;
|
|
248
|
+
try {
|
|
249
|
+
finalBody = await finalResponse.json();
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return errorResponse(502, "Invalid JSON in tool-loop response");
|
|
253
|
+
}
|
|
254
|
+
return toolResultStream(finalBody, finalResponse, adapter);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Rehydrate a non-streaming JSON response.
|
|
258
|
+
*/
|
|
259
|
+
async function rehydrateJSONResponse(response, session, provider) {
|
|
260
|
+
// Read raw text so we can fall back to it if JSON parsing fails
|
|
261
|
+
const rawText = await response.text();
|
|
262
|
+
let body;
|
|
263
|
+
try {
|
|
264
|
+
body = JSON.parse(rawText);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Upstream returned invalid JSON — pass through unchanged
|
|
268
|
+
return new Response(rawText, {
|
|
269
|
+
status: response.status,
|
|
270
|
+
statusText: response.statusText,
|
|
271
|
+
headers: stripResponseHeaders(response.headers),
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
return rehydrateJSONResponseFromBody(body, response, session, provider);
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Rehydrate a pre-parsed JSON response body.
|
|
278
|
+
*/
|
|
279
|
+
async function rehydrateJSONResponseFromBody(body, response, session, provider) {
|
|
280
|
+
// Extract response text and rehydrate
|
|
281
|
+
const responseTexts = provider.extractResponseText(body);
|
|
282
|
+
const rehydratedTexts = [];
|
|
283
|
+
for (const text of responseTexts) {
|
|
284
|
+
const rehydrated = await session.rehydrate(text);
|
|
285
|
+
rehydratedTexts.push(rehydrated);
|
|
286
|
+
}
|
|
287
|
+
// Rebuild response body
|
|
288
|
+
let rehydratedBody = provider.rebuildResponseBody(body, rehydratedTexts);
|
|
289
|
+
// Rehydrate tool call arguments
|
|
290
|
+
if (provider.extractResponseToolCalls !== undefined &&
|
|
291
|
+
provider.rebuildResponseToolCalls !== undefined) {
|
|
292
|
+
const toolCallArgs = provider.extractResponseToolCalls(rehydratedBody);
|
|
293
|
+
if (toolCallArgs.length > 0) {
|
|
294
|
+
const rehydratedArgs = [];
|
|
295
|
+
for (const arg of toolCallArgs) {
|
|
296
|
+
const rehydrated = await session.rehydrate(arg);
|
|
297
|
+
rehydratedArgs.push(rehydrated);
|
|
298
|
+
}
|
|
299
|
+
rehydratedBody = provider.rebuildResponseToolCalls(rehydratedBody, rehydratedArgs);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return new Response(JSON.stringify(rehydratedBody), {
|
|
303
|
+
status: response.status,
|
|
304
|
+
statusText: response.statusText,
|
|
305
|
+
headers: response.headers,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Handle multi-round tool execution loop.
|
|
310
|
+
*
|
|
311
|
+
* When the LLM returns tool calls, this function:
|
|
312
|
+
* 1. Rehydrates tool call arguments (restores real PII)
|
|
313
|
+
* 2. Calls the user's onToolCall callback for each tool call
|
|
314
|
+
* 3. Anonymizes the result
|
|
315
|
+
* 4. Appends assistant + tool result messages to the conversation
|
|
316
|
+
* 5. Sends the next request (without re-anonymizing existing messages)
|
|
317
|
+
* 6. Repeats until the LLM returns a final response or maxToolRounds is hit
|
|
318
|
+
*/
|
|
319
|
+
async function handleToolLoop(initialResponse, anonymizedBody, session, provider, config, originalRequest) {
|
|
320
|
+
const maxRounds = config.maxToolRounds ?? 10;
|
|
321
|
+
// Parse the initial response
|
|
322
|
+
const readResponse = (response) => readToolResponse(response, config.maxToolResponseBytes ?? 8 * 1024 * 1024, originalRequest.signal);
|
|
323
|
+
const rawText = await readResponse(initialResponse);
|
|
324
|
+
let currentResponse;
|
|
325
|
+
try {
|
|
326
|
+
currentResponse = JSON.parse(rawText);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return new Response(rawText, {
|
|
330
|
+
status: initialResponse.status,
|
|
331
|
+
statusText: initialResponse.statusText,
|
|
332
|
+
headers: stripResponseHeaders(initialResponse.headers),
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
// If the first response doesn't have tool calls, just rehydrate normally
|
|
336
|
+
if (!provider.hasResponseToolCalls(currentResponse)) {
|
|
337
|
+
return rehydrateJSONResponseFromBody(currentResponse, initialResponse, session, provider);
|
|
338
|
+
}
|
|
339
|
+
// Track the anonymized messages array across rounds
|
|
340
|
+
let currentMessages = provider.extractMessages(anonymizedBody);
|
|
341
|
+
let lastUpstreamResponse = initialResponse;
|
|
342
|
+
let round = 0;
|
|
343
|
+
while (round < maxRounds &&
|
|
344
|
+
provider.hasResponseToolCalls(currentResponse)) {
|
|
345
|
+
round++;
|
|
346
|
+
// Extract tool call details (arguments are still in anonymized form)
|
|
347
|
+
const toolCallInfos = provider.extractResponseToolCallInfo(currentResponse);
|
|
348
|
+
// Rehydrate arguments and invoke the user's callback
|
|
349
|
+
const toolResults = [];
|
|
350
|
+
for (const tc of toolCallInfos) {
|
|
351
|
+
// Rehydrate the arguments string to restore real PII
|
|
352
|
+
originalRequest.signal.throwIfAborted();
|
|
353
|
+
let parsedArgs;
|
|
354
|
+
try {
|
|
355
|
+
const args = JSON.parse(tc.arguments);
|
|
356
|
+
parsedArgs = await session.rehydrateJson(args);
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
parsedArgs = { raw: await session.rehydrate(tc.arguments) };
|
|
360
|
+
}
|
|
361
|
+
originalRequest.signal.throwIfAborted();
|
|
362
|
+
// Call the user's tool handler with real PII
|
|
363
|
+
const result = await config.onToolCall(tc.name, parsedArgs, tc.id);
|
|
364
|
+
// Anonymize the result using the same session (maintains PII ID continuity)
|
|
365
|
+
originalRequest.signal.throwIfAborted();
|
|
366
|
+
const anonymizedResult = await session.anonymizeJson(result, config.locale, config.policy);
|
|
367
|
+
toolResults.push({
|
|
368
|
+
toolCallId: tc.id,
|
|
369
|
+
content: typeof anonymizedResult === "string"
|
|
370
|
+
? anonymizedResult
|
|
371
|
+
: JSON.stringify(anonymizedResult),
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
// Anonymize the assistant's tool call arguments before appending.
|
|
375
|
+
// The LLM may have generated real-looking PII in tool_use inputs
|
|
376
|
+
// instead of echoing back the PII tags it received.
|
|
377
|
+
let sanitizedResponse = currentResponse;
|
|
378
|
+
if (provider.extractResponseToolCalls !== undefined &&
|
|
379
|
+
provider.rebuildResponseToolCalls !== undefined) {
|
|
380
|
+
const rawArgs = provider.extractResponseToolCalls(currentResponse);
|
|
381
|
+
if (rawArgs.length > 0) {
|
|
382
|
+
const anonymizedArgs = [];
|
|
383
|
+
for (const arg of rawArgs) {
|
|
384
|
+
let parsed;
|
|
385
|
+
try {
|
|
386
|
+
parsed = JSON.parse(arg);
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
parsed = arg;
|
|
390
|
+
}
|
|
391
|
+
const anonymized = await session.anonymizeJson(parsed);
|
|
392
|
+
anonymizedArgs.push(typeof anonymized === "string"
|
|
393
|
+
? anonymized
|
|
394
|
+
: JSON.stringify(anonymized));
|
|
395
|
+
}
|
|
396
|
+
sanitizedResponse = provider.rebuildResponseToolCalls(currentResponse, anonymizedArgs);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// Build the next request body (no re-anonymization — messages are already anonymized)
|
|
400
|
+
const nextBody = provider.buildToolLoopBody(anonymizedBody, currentMessages, sanitizedResponse, toolResults);
|
|
401
|
+
// Update message array for next round
|
|
402
|
+
currentMessages = provider.extractMessages(nextBody);
|
|
403
|
+
// Send the next request to the LLM
|
|
404
|
+
const nextRequest = new Request(originalRequest, {
|
|
405
|
+
body: JSON.stringify(nextBody),
|
|
406
|
+
});
|
|
407
|
+
let nextResponse;
|
|
408
|
+
try {
|
|
409
|
+
nextResponse = await fetch(nextRequest);
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
const msg = err instanceof Error ? err.message : "Upstream request failed";
|
|
413
|
+
return errorResponse(502, `Upstream LLM unreachable: ${msg}`);
|
|
414
|
+
}
|
|
415
|
+
lastUpstreamResponse = nextResponse;
|
|
416
|
+
// Parse the new response
|
|
417
|
+
const nextRawText = await readResponse(nextResponse);
|
|
418
|
+
if (!nextResponse.ok)
|
|
419
|
+
return new Response(nextRawText, {
|
|
420
|
+
status: nextResponse.status, statusText: nextResponse.statusText,
|
|
421
|
+
headers: stripResponseHeaders(nextResponse.headers),
|
|
422
|
+
});
|
|
423
|
+
try {
|
|
424
|
+
currentResponse = JSON.parse(nextRawText);
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
return new Response(nextRawText, {
|
|
428
|
+
status: nextResponse.status,
|
|
429
|
+
statusText: nextResponse.statusText,
|
|
430
|
+
headers: stripResponseHeaders(nextResponse.headers),
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// Rehydrate and return the final response
|
|
435
|
+
return rehydrateJSONResponseFromBody(currentResponse, lastUpstreamResponse, session, provider);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Rehydrate a streaming SSE response.
|
|
439
|
+
* Returns a new Response with a transformed body stream.
|
|
440
|
+
*/
|
|
441
|
+
function rehydrateSSEResponse(response, session, provider, config) {
|
|
442
|
+
const sseParser = new SSEParser();
|
|
443
|
+
const decoder = new TextDecoder();
|
|
444
|
+
const encoder = new TextEncoder();
|
|
445
|
+
const tagFormat = config.anonymizer?.tagFormat ?? DEFAULT_TAG_FORMAT;
|
|
446
|
+
const tagPrefix = buildTagPrefix(tagFormat);
|
|
447
|
+
// Buffer for incomplete PII tags that span SSE chunks (content)
|
|
448
|
+
let tagBuffer = "";
|
|
449
|
+
// Per-index buffers for tool call argument fragments
|
|
450
|
+
const toolCallBuffers = new Map();
|
|
451
|
+
// Last seen SSE event per tool call index (used as template during flush)
|
|
452
|
+
const toolCallLastEvent = new Map();
|
|
453
|
+
// We load the PII map once, lazily
|
|
454
|
+
let piiMapPromise = null;
|
|
455
|
+
function getPiiMap() {
|
|
456
|
+
if (piiMapPromise === null) {
|
|
457
|
+
piiMapPromise = (async () => {
|
|
458
|
+
const stored = await config.piiStorageProvider.load(session.sessionId);
|
|
459
|
+
if (stored === null)
|
|
460
|
+
return new Map();
|
|
461
|
+
const key = await config.keyProvider.getKey();
|
|
462
|
+
return decryptPIIMap(stored.piiMap, key);
|
|
463
|
+
})();
|
|
464
|
+
}
|
|
465
|
+
return piiMapPromise;
|
|
466
|
+
}
|
|
467
|
+
const transformStream = new TransformStream({
|
|
468
|
+
async transform(chunk, controller) {
|
|
469
|
+
const text = decoder.decode(chunk, { stream: true });
|
|
470
|
+
const events = sseParser.parse(text);
|
|
471
|
+
for (const event of events) {
|
|
472
|
+
if (isSSEDone(event.data)) {
|
|
473
|
+
controller.enqueue(encoder.encode(serializeSSEEvent(event)));
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
let parsed;
|
|
477
|
+
try {
|
|
478
|
+
parsed = JSON.parse(event.data);
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
// Not JSON — pass through as-is
|
|
482
|
+
controller.enqueue(encoder.encode(serializeSSEEvent(event)));
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
// Process content delta and tool call deltas from this event.
|
|
486
|
+
// In practice, LLM APIs send one or the other per event, but we
|
|
487
|
+
// handle both defensively by chaining rebuilds on the same parsed data.
|
|
488
|
+
let handled = false;
|
|
489
|
+
let rebuiltData = parsed;
|
|
490
|
+
// Content delta
|
|
491
|
+
const delta = provider.extractSSEDelta(parsed);
|
|
492
|
+
if (delta !== null) {
|
|
493
|
+
handled = true;
|
|
494
|
+
const fullText = tagBuffer + delta;
|
|
495
|
+
const incompleteTagIdx = fullText.lastIndexOf(tagPrefix);
|
|
496
|
+
const lastCloseIdx = fullText.lastIndexOf(tagFormat.close);
|
|
497
|
+
let textToRehydrate;
|
|
498
|
+
if (incompleteTagIdx !== -1 &&
|
|
499
|
+
(lastCloseIdx === -1 || lastCloseIdx < incompleteTagIdx)) {
|
|
500
|
+
textToRehydrate = fullText.slice(0, incompleteTagIdx);
|
|
501
|
+
tagBuffer = fullText.slice(incompleteTagIdx);
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
const partialLen = trailingPartialTagPrefixLen(fullText, tagPrefix);
|
|
505
|
+
textToRehydrate = fullText.slice(0, fullText.length - partialLen);
|
|
506
|
+
tagBuffer = fullText.slice(fullText.length - partialLen);
|
|
507
|
+
}
|
|
508
|
+
if (textToRehydrate.length > 0) {
|
|
509
|
+
const piiMap = await getPiiMap();
|
|
510
|
+
const rehydrated = rehydrate(textToRehydrate, piiMap, false, tagFormat);
|
|
511
|
+
rebuiltData = provider.rebuildSSEDelta(rebuiltData, rehydrated);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
// Tool call deltas
|
|
515
|
+
if (provider.extractSSEToolCallDeltas !== undefined && provider.rebuildSSEToolCallDeltas !== undefined) {
|
|
516
|
+
const toolDeltas = provider.extractSSEToolCallDeltas(parsed);
|
|
517
|
+
if (toolDeltas !== null && toolDeltas.length > 0) {
|
|
518
|
+
handled = true;
|
|
519
|
+
const rehydratedArgs = new Map();
|
|
520
|
+
for (const td of toolDeltas) {
|
|
521
|
+
toolCallLastEvent.set(td.index, {
|
|
522
|
+
sseEvent: event.event,
|
|
523
|
+
parsed,
|
|
524
|
+
});
|
|
525
|
+
const existing = toolCallBuffers.get(td.index) ?? "";
|
|
526
|
+
const fullText = existing + td.arguments;
|
|
527
|
+
const incompleteTagIdx = fullText.lastIndexOf(tagPrefix);
|
|
528
|
+
const lastCloseIdx = fullText.lastIndexOf(tagFormat.close);
|
|
529
|
+
let textToRehydrate;
|
|
530
|
+
if (incompleteTagIdx !== -1 &&
|
|
531
|
+
(lastCloseIdx === -1 || lastCloseIdx < incompleteTagIdx)) {
|
|
532
|
+
textToRehydrate = fullText.slice(0, incompleteTagIdx);
|
|
533
|
+
toolCallBuffers.set(td.index, fullText.slice(incompleteTagIdx));
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
const partialLen = trailingPartialTagPrefixLen(fullText, tagPrefix);
|
|
537
|
+
textToRehydrate = fullText.slice(0, fullText.length - partialLen);
|
|
538
|
+
toolCallBuffers.set(td.index, fullText.slice(fullText.length - partialLen));
|
|
539
|
+
}
|
|
540
|
+
if (textToRehydrate.length > 0) {
|
|
541
|
+
const piiMap = await getPiiMap();
|
|
542
|
+
const rehydrated = rehydrate(textToRehydrate, piiMap, false, tagFormat);
|
|
543
|
+
rehydratedArgs.set(td.index, rehydrated);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (rehydratedArgs.size > 0) {
|
|
547
|
+
rebuiltData = provider.rebuildSSEToolCallDeltas(rebuiltData, rehydratedArgs);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
if (handled) {
|
|
552
|
+
if (rebuiltData !== parsed) {
|
|
553
|
+
controller.enqueue(encoder.encode(serializeSSEEvent({
|
|
554
|
+
event: event.event,
|
|
555
|
+
data: JSON.stringify(rebuiltData),
|
|
556
|
+
})));
|
|
557
|
+
}
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
// Check for tool call block stop — flush buffer before forwarding
|
|
561
|
+
if (provider.extractSSEToolCallStop !== undefined &&
|
|
562
|
+
provider.rebuildSSEToolCallDeltas !== undefined) {
|
|
563
|
+
const stopIndex = provider.extractSSEToolCallStop(parsed);
|
|
564
|
+
if (stopIndex !== null) {
|
|
565
|
+
const buffer = toolCallBuffers.get(stopIndex) ?? "";
|
|
566
|
+
if (buffer.length > 0) {
|
|
567
|
+
const piiMap = await getPiiMap();
|
|
568
|
+
const rehydrated = rehydrate(buffer, piiMap, false, tagFormat);
|
|
569
|
+
if (rehydrated.length > 0) {
|
|
570
|
+
const last = toolCallLastEvent.get(stopIndex);
|
|
571
|
+
if (last !== undefined) {
|
|
572
|
+
const rebuilt = provider.rebuildSSEToolCallDeltas(last.parsed, new Map([[stopIndex, rehydrated]]));
|
|
573
|
+
controller.enqueue(encoder.encode(serializeSSEEvent({
|
|
574
|
+
event: last.sseEvent,
|
|
575
|
+
data: JSON.stringify(rebuilt),
|
|
576
|
+
})));
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
toolCallBuffers.delete(stopIndex);
|
|
580
|
+
toolCallLastEvent.delete(stopIndex);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
// Pass through as-is
|
|
585
|
+
controller.enqueue(encoder.encode(serializeSSEEvent(event)));
|
|
586
|
+
}
|
|
587
|
+
},
|
|
588
|
+
async flush(controller) {
|
|
589
|
+
const events = sseParser.flush();
|
|
590
|
+
for (const event of events) {
|
|
591
|
+
controller.enqueue(encoder.encode(serializeSSEEvent(event)));
|
|
592
|
+
}
|
|
593
|
+
if (tagBuffer.length > 0) {
|
|
594
|
+
const piiMap = await getPiiMap();
|
|
595
|
+
const rehydrated = rehydrate(tagBuffer, piiMap, false, tagFormat);
|
|
596
|
+
if (rehydrated.length > 0) {
|
|
597
|
+
controller.enqueue(encoder.encode(`data: ${JSON.stringify({ content: rehydrated })}\n\n`));
|
|
598
|
+
}
|
|
599
|
+
tagBuffer = "";
|
|
600
|
+
}
|
|
601
|
+
// Flush remaining tool call buffers
|
|
602
|
+
if (provider.rebuildSSEToolCallDeltas !== undefined) {
|
|
603
|
+
for (const [index, buffer] of toolCallBuffers) {
|
|
604
|
+
if (buffer.length > 0) {
|
|
605
|
+
const piiMap = await getPiiMap();
|
|
606
|
+
const rehydrated = rehydrate(buffer, piiMap, false, tagFormat);
|
|
607
|
+
if (rehydrated.length > 0) {
|
|
608
|
+
const last = toolCallLastEvent.get(index);
|
|
609
|
+
if (last !== undefined) {
|
|
610
|
+
const rebuilt = provider.rebuildSSEToolCallDeltas(last.parsed, new Map([[index, rehydrated]]));
|
|
611
|
+
controller.enqueue(encoder.encode(serializeSSEEvent({
|
|
612
|
+
event: last.sseEvent,
|
|
613
|
+
data: JSON.stringify(rebuilt),
|
|
614
|
+
})));
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
toolCallBuffers.clear();
|
|
620
|
+
toolCallLastEvent.clear();
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
});
|
|
624
|
+
const transformedBody = response.body.pipeThrough(transformStream);
|
|
625
|
+
return new Response(transformedBody, {
|
|
626
|
+
status: response.status,
|
|
627
|
+
statusText: response.statusText,
|
|
628
|
+
headers: response.headers,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
//# sourceMappingURL=rehydra-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehydra-fetch.js","sourceRoot":"","sources":["../../src/proxy/rehydra-fetch.ts"],"names":[],"mappings":"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"}
|