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,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response rehydration for the V2 `http.response` / `experimental.ws.receive`
|
|
3
|
+
* hooks.
|
|
4
|
+
*
|
|
5
|
+
* The model only ever sees PII tags; its output must be rewritten back to the
|
|
6
|
+
* real values before the user sees it. Referencing `deps.rehydrate` keeps the
|
|
7
|
+
* PII map lookup in the caller (the session store) so this module stays free of
|
|
8
|
+
* storage concerns.
|
|
9
|
+
*
|
|
10
|
+
* Rewriting strategy by surface:
|
|
11
|
+
* - JSON `http.response`: parse, walk string leaves, re-serialise.
|
|
12
|
+
* - SSE `http.response`: streamed through a {@link SseStreamRewriter}; only
|
|
13
|
+
* complete frames are rewritten so a tag split across chunks, across SSE
|
|
14
|
+
* events, or split inside a streamed delta field is never emitted truncated.
|
|
15
|
+
* - WebSocket frames: only `primary` frames are rehydrated. JSON frames are
|
|
16
|
+
* parsed and walked, carrying a tag split across the delta field of two frames
|
|
17
|
+
* on the matching JSON pointer; non-JSON frames fall back to text replacement
|
|
18
|
+
* with a per-session tail buffer that holds an incomplete trailing PII tag
|
|
19
|
+
* until the next frame completes it.
|
|
20
|
+
*
|
|
21
|
+
* Every failure is logged and the original payload is passed through — a failed
|
|
22
|
+
* rehydration must never corrupt the response or break OpenCode.
|
|
23
|
+
*/
|
|
24
|
+
import type { RehydrateTailStore } from "./rehydrate-tail.js";
|
|
25
|
+
import type { HttpResponseKind, V2Logger } from "./types.js";
|
|
26
|
+
export { InMemoryRehydrateTailStore } from "./rehydrate-tail.js";
|
|
27
|
+
export type { RehydrateTailStore } from "./rehydrate-tail.js";
|
|
28
|
+
export interface ResponseRehydrateDeps {
|
|
29
|
+
/** Restores PII tags in a single string. */
|
|
30
|
+
rehydrate: (input: string) => Promise<string>;
|
|
31
|
+
log: V2Logger;
|
|
32
|
+
sessionID: string;
|
|
33
|
+
kind: HttpResponseKind;
|
|
34
|
+
/** Tag prefix used to detect an incomplete trailing tag (`<PII`). */
|
|
35
|
+
tagPrefix?: string;
|
|
36
|
+
/** Tag close delimiter used to detect a complete tag (`/>`). */
|
|
37
|
+
tagClose?: string;
|
|
38
|
+
/** Per-session WebSocket tail buffer; defaults to a shared instance. */
|
|
39
|
+
tailStore?: RehydrateTailStore;
|
|
40
|
+
}
|
|
41
|
+
/** Dependencies accepted by the WebSocket frame rehydrator. */
|
|
42
|
+
export interface WsFrameRehydrateDeps {
|
|
43
|
+
rehydrate: (input: string) => Promise<string>;
|
|
44
|
+
log: V2Logger;
|
|
45
|
+
sessionID?: string;
|
|
46
|
+
tagPrefix?: string;
|
|
47
|
+
tagClose?: string;
|
|
48
|
+
tailStore?: RehydrateTailStore;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Rehydrates an HTTP response produced for a session request.
|
|
52
|
+
*
|
|
53
|
+
* Only `primary` responses are processed: `title` / `compaction` / `generate`
|
|
54
|
+
* responses are not user-facing, so restoring real values there would only leak
|
|
55
|
+
* PII. Unsupported content types are left untouched.
|
|
56
|
+
*/
|
|
57
|
+
export declare function rehydrateHttpResponse(event: {
|
|
58
|
+
response: Response;
|
|
59
|
+
}, deps: ResponseRehydrateDeps): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Restores a WebSocket frame in place.
|
|
62
|
+
*
|
|
63
|
+
* Only `primary` frames are rehydrated: `title` / `compaction` / `generate`
|
|
64
|
+
* frames are not user-facing, so restoring real values there would only leak
|
|
65
|
+
* PII. Any fragment held from an earlier frame is dropped on a non-primary
|
|
66
|
+
* frame so it cannot surface later.
|
|
67
|
+
*
|
|
68
|
+
* Complete JSON frames are parsed and walked so escaped characters are handled
|
|
69
|
+
* correctly; a tag split across the delta field of consecutive JSON frames is
|
|
70
|
+
* carried on the matching JSON pointer. Other frames use raw replacement,
|
|
71
|
+
* holding an incomplete trailing tag in a per-session text buffer until a later
|
|
72
|
+
* frame completes it.
|
|
73
|
+
*/
|
|
74
|
+
export declare function rehydrateWsFrame(event: {
|
|
75
|
+
frame: string;
|
|
76
|
+
kind?: HttpResponseKind;
|
|
77
|
+
}, deps: WsFrameRehydrateDeps): Promise<void>;
|
|
78
|
+
//# sourceMappingURL=response-rehydrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-rehydrate.d.ts","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/response-rehydrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAQ9D,MAAM,WAAW,qBAAqB;IACpC,4CAA4C;IAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAmGD;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,EAC7B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,gBAAgB,CAAA;CAAE,EACjD,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Df"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response rehydration for the V2 `http.response` / `experimental.ws.receive`
|
|
3
|
+
* hooks.
|
|
4
|
+
*
|
|
5
|
+
* The model only ever sees PII tags; its output must be rewritten back to the
|
|
6
|
+
* real values before the user sees it. Referencing `deps.rehydrate` keeps the
|
|
7
|
+
* PII map lookup in the caller (the session store) so this module stays free of
|
|
8
|
+
* storage concerns.
|
|
9
|
+
*
|
|
10
|
+
* Rewriting strategy by surface:
|
|
11
|
+
* - JSON `http.response`: parse, walk string leaves, re-serialise.
|
|
12
|
+
* - SSE `http.response`: streamed through a {@link SseStreamRewriter}; only
|
|
13
|
+
* complete frames are rewritten so a tag split across chunks, across SSE
|
|
14
|
+
* events, or split inside a streamed delta field is never emitted truncated.
|
|
15
|
+
* - WebSocket frames: only `primary` frames are rehydrated. JSON frames are
|
|
16
|
+
* parsed and walked, carrying a tag split across the delta field of two frames
|
|
17
|
+
* on the matching JSON pointer; non-JSON frames fall back to text replacement
|
|
18
|
+
* with a per-session tail buffer that holds an incomplete trailing PII tag
|
|
19
|
+
* until the next frame completes it.
|
|
20
|
+
*
|
|
21
|
+
* Every failure is logged and the original payload is passed through — a failed
|
|
22
|
+
* rehydration must never corrupt the response or break OpenCode.
|
|
23
|
+
*/
|
|
24
|
+
import { walkJson } from "../../utils/json-walk.js";
|
|
25
|
+
import { SseStreamRewriter } from "./sse.js";
|
|
26
|
+
import { DEFAULT_TAG_CLOSE, DEFAULT_TAG_PREFIX, InMemoryRehydrateTailStore, splitTrailingTag, walkJsonWithTail, } from "./rehydrate-tail.js";
|
|
27
|
+
// Re-exported so existing consumers keep importing the tail store from here.
|
|
28
|
+
export { InMemoryRehydrateTailStore } from "./rehydrate-tail.js";
|
|
29
|
+
/**
|
|
30
|
+
* Fallback store used when a caller does not inject one. Tests should inject a
|
|
31
|
+
* fresh store to keep sessions isolated.
|
|
32
|
+
*/
|
|
33
|
+
const sharedTailStore = new InMemoryRehydrateTailStore();
|
|
34
|
+
/** Normalizes an unknown thrown value into a loggable message. */
|
|
35
|
+
function errorMessage(error) {
|
|
36
|
+
return error instanceof Error ? error.message : String(error);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Builds a replacement response with the same status and headers.
|
|
40
|
+
*
|
|
41
|
+
* `content-length` is dropped because the rehydrated body differs in length and
|
|
42
|
+
* a stale value would truncate or over-read it.
|
|
43
|
+
*/
|
|
44
|
+
function withBody(original, body) {
|
|
45
|
+
const headers = new Headers(original.headers);
|
|
46
|
+
headers.delete("content-length");
|
|
47
|
+
return new Response(body, {
|
|
48
|
+
status: original.status,
|
|
49
|
+
statusText: original.statusText,
|
|
50
|
+
headers,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Rehydrates a JSON response body on `event.response`.
|
|
55
|
+
*
|
|
56
|
+
* JSON is the safest surface to rewrite: `JSON.parse` / `JSON.stringify` keeps
|
|
57
|
+
* the payload valid while every string leaf is passed through `rehydrate`.
|
|
58
|
+
*/
|
|
59
|
+
async function rehydrateJsonResponse(event, deps) {
|
|
60
|
+
const rawBody = await event.response.clone().text();
|
|
61
|
+
const parsed = JSON.parse(rawBody);
|
|
62
|
+
const restored = await walkJson(parsed, deps.rehydrate);
|
|
63
|
+
event.response = withBody(event.response, JSON.stringify(restored));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Rehydrates a streamed SSE response body by piping it through a
|
|
67
|
+
* {@link SseStreamRewriter}. The body is never fully buffered, so OpenCode keeps
|
|
68
|
+
* receiving incremental frames.
|
|
69
|
+
*/
|
|
70
|
+
async function rehydrateSseResponse(event, deps) {
|
|
71
|
+
const rewriter = new SseStreamRewriter(deps.rehydrate, (message) => {
|
|
72
|
+
deps.log.error("rehydra SSE frame rewrite failed", {
|
|
73
|
+
sessionID: deps.sessionID,
|
|
74
|
+
error: message,
|
|
75
|
+
});
|
|
76
|
+
}, {
|
|
77
|
+
sessionID: deps.sessionID,
|
|
78
|
+
tagPrefix: deps.tagPrefix,
|
|
79
|
+
tagClose: deps.tagClose,
|
|
80
|
+
});
|
|
81
|
+
const encoder = new TextEncoder();
|
|
82
|
+
const source = event.response.body;
|
|
83
|
+
const { readable, writable } = new TransformStream({
|
|
84
|
+
async transform(chunk, controller) {
|
|
85
|
+
const text = await rewriter.push(chunk);
|
|
86
|
+
if (text.length > 0) {
|
|
87
|
+
controller.enqueue(encoder.encode(text));
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
async flush(controller) {
|
|
91
|
+
const text = await rewriter.flush();
|
|
92
|
+
if (text.length > 0) {
|
|
93
|
+
controller.enqueue(encoder.encode(text));
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const headers = new Headers(event.response.headers);
|
|
98
|
+
headers.delete("content-length");
|
|
99
|
+
event.response = new Response(readable, {
|
|
100
|
+
status: event.response.status,
|
|
101
|
+
statusText: event.response.statusText,
|
|
102
|
+
headers,
|
|
103
|
+
});
|
|
104
|
+
if (source === null) {
|
|
105
|
+
await writable.close();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
source.pipeTo(writable).catch((error) => {
|
|
109
|
+
deps.log.error("rehydra SSE stream failed", {
|
|
110
|
+
sessionID: deps.sessionID,
|
|
111
|
+
error: errorMessage(error),
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Rehydrates an HTTP response produced for a session request.
|
|
117
|
+
*
|
|
118
|
+
* Only `primary` responses are processed: `title` / `compaction` / `generate`
|
|
119
|
+
* responses are not user-facing, so restoring real values there would only leak
|
|
120
|
+
* PII. Unsupported content types are left untouched.
|
|
121
|
+
*/
|
|
122
|
+
export async function rehydrateHttpResponse(event, deps) {
|
|
123
|
+
if (deps.kind !== "primary") {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const contentType = event.response.headers.get("content-type") ?? "";
|
|
128
|
+
if (contentType.includes("application/json")) {
|
|
129
|
+
await rehydrateJsonResponse(event, deps);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (contentType.includes("text/event-stream")) {
|
|
133
|
+
await rehydrateSseResponse(event, deps);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
deps.log.error("rehydra http.response hook failed", {
|
|
138
|
+
sessionID: deps.sessionID,
|
|
139
|
+
kind: deps.kind,
|
|
140
|
+
error: errorMessage(error),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Restores a WebSocket frame in place.
|
|
146
|
+
*
|
|
147
|
+
* Only `primary` frames are rehydrated: `title` / `compaction` / `generate`
|
|
148
|
+
* frames are not user-facing, so restoring real values there would only leak
|
|
149
|
+
* PII. Any fragment held from an earlier frame is dropped on a non-primary
|
|
150
|
+
* frame so it cannot surface later.
|
|
151
|
+
*
|
|
152
|
+
* Complete JSON frames are parsed and walked so escaped characters are handled
|
|
153
|
+
* correctly; a tag split across the delta field of consecutive JSON frames is
|
|
154
|
+
* carried on the matching JSON pointer. Other frames use raw replacement,
|
|
155
|
+
* holding an incomplete trailing tag in a per-session text buffer until a later
|
|
156
|
+
* frame completes it.
|
|
157
|
+
*/
|
|
158
|
+
export async function rehydrateWsFrame(event, deps) {
|
|
159
|
+
const store = deps.tailStore ?? sharedTailStore;
|
|
160
|
+
const sessionID = deps.sessionID ?? "";
|
|
161
|
+
const tagPrefix = deps.tagPrefix ?? DEFAULT_TAG_PREFIX;
|
|
162
|
+
const tagClose = deps.tagClose ?? DEFAULT_TAG_CLOSE;
|
|
163
|
+
if (event.kind !== "primary") {
|
|
164
|
+
// Fail closed: never restore PII in a non-primary response, and drop any
|
|
165
|
+
// fragment left behind by an earlier frame.
|
|
166
|
+
store.delete(sessionID);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const combined = store.get(sessionID) + event.frame;
|
|
170
|
+
const originalFrame = event.frame;
|
|
171
|
+
try {
|
|
172
|
+
let parsed;
|
|
173
|
+
let isJson = true;
|
|
174
|
+
try {
|
|
175
|
+
parsed = JSON.parse(combined);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
isJson = false;
|
|
179
|
+
}
|
|
180
|
+
if (isJson) {
|
|
181
|
+
const result = await walkJsonWithTail(parsed, deps.rehydrate, {
|
|
182
|
+
store,
|
|
183
|
+
sessionID,
|
|
184
|
+
pointerPrefix: "ws:",
|
|
185
|
+
tagPrefix,
|
|
186
|
+
tagClose,
|
|
187
|
+
});
|
|
188
|
+
// Preserve the frame byte-for-byte when nothing was rehydrated; otherwise
|
|
189
|
+
// re-serialize so escaped characters are handled correctly. `combined`
|
|
190
|
+
// includes any fragment held back from a previous frame.
|
|
191
|
+
event.frame = result.changed ? JSON.stringify(result.value) : combined;
|
|
192
|
+
// Clear the byte-level text tail; JSON-pointer tails were updated above.
|
|
193
|
+
store.set(sessionID, "");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const restored = await deps.rehydrate(combined);
|
|
197
|
+
const { emitted, tail } = splitTrailingTag(restored, tagPrefix, tagClose);
|
|
198
|
+
event.frame = emitted;
|
|
199
|
+
store.set(sessionID, tail);
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
store.delete(sessionID);
|
|
203
|
+
event.frame = originalFrame;
|
|
204
|
+
deps.log.error("rehydra experimental.ws.receive hook failed", {
|
|
205
|
+
sessionID,
|
|
206
|
+
error: errorMessage(error),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=response-rehydrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-rehydrate.js","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/response-rehydrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message scrubbing for OpenCode Plugin V2 session hooks.
|
|
3
|
+
*
|
|
4
|
+
* Walks the messages attached to a model request and anonymizes every string
|
|
5
|
+
* that can carry secrets: user/assistant/reasoning text, tool arguments,
|
|
6
|
+
* completed tool output, and V1-style part state.
|
|
7
|
+
*
|
|
8
|
+
* The scrub runs on a deep copy; only after it completes successfully are the
|
|
9
|
+
* results written back into the caller's original objects (preserving the
|
|
10
|
+
* references Plugin V2 relies on). If any step throws, the originals are left
|
|
11
|
+
* untouched and the error propagates so the caller can block the request
|
|
12
|
+
* instead of leaking raw PII (fail-closed).
|
|
13
|
+
*/
|
|
14
|
+
import { PIIType } from "../../types/index.js";
|
|
15
|
+
import type { AnonymizationPolicy } from "../../types/index.js";
|
|
16
|
+
import type { AnonymizationState } from "./anon-state.js";
|
|
17
|
+
import type { Message, ScrubContext, SessionResolver } from "./types.js";
|
|
18
|
+
export interface ScrubMessagesOptions {
|
|
19
|
+
/** Locale hint passed to `anonymize()`; defaults to the plugin option. */
|
|
20
|
+
locale?: string;
|
|
21
|
+
/** Base policy (URL/IP disabled by default). */
|
|
22
|
+
policy?: Partial<AnonymizationPolicy>;
|
|
23
|
+
/** Whether the VCS identity recognizers are enabled. */
|
|
24
|
+
vcsIdentities: boolean;
|
|
25
|
+
/** Builds the extended policy that enables identity types for a VCS output. */
|
|
26
|
+
identityPolicy: (types: PIIType[]) => Partial<AnonymizationPolicy>;
|
|
27
|
+
}
|
|
28
|
+
export interface ScrubResult {
|
|
29
|
+
/** Entities anonymized during this call. */
|
|
30
|
+
scrubbed: number;
|
|
31
|
+
byType: Record<string, number>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Anonymizes the messages of a session request in place.
|
|
35
|
+
*
|
|
36
|
+
* @returns the number of entities removed and a per-type breakdown for logging.
|
|
37
|
+
*/
|
|
38
|
+
export declare function scrubMessages(eventMessages: Message[], ctx: ScrubContext, resolveSession: SessionResolver, state: AnonymizationState, options: ScrubMessagesOptions): Promise<ScrubResult>;
|
|
39
|
+
//# sourceMappingURL=scrub-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub-messages.d.ts","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/scrub-messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EACV,OAAO,EAGP,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAgHD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,OAAO,EAAE,EACxB,GAAG,EAAE,YAAY,EACjB,cAAc,EAAE,eAAe,EAC/B,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,WAAW,CAAC,CA+KtB"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message scrubbing for OpenCode Plugin V2 session hooks.
|
|
3
|
+
*
|
|
4
|
+
* Walks the messages attached to a model request and anonymizes every string
|
|
5
|
+
* that can carry secrets: user/assistant/reasoning text, tool arguments,
|
|
6
|
+
* completed tool output, and V1-style part state.
|
|
7
|
+
*
|
|
8
|
+
* The scrub runs on a deep copy; only after it completes successfully are the
|
|
9
|
+
* results written back into the caller's original objects (preserving the
|
|
10
|
+
* references Plugin V2 relies on). If any step throws, the originals are left
|
|
11
|
+
* untouched and the error propagates so the caller can block the request
|
|
12
|
+
* instead of leaking raw PII (fail-closed).
|
|
13
|
+
*/
|
|
14
|
+
import { PIIType } from "../../types/index.js";
|
|
15
|
+
import { vcsCommandTypes } from "../vcs-command.js";
|
|
16
|
+
/** Reads a shell command from a tool input object, if present. */
|
|
17
|
+
function extractCommand(input) {
|
|
18
|
+
if (input === null || typeof input !== "object")
|
|
19
|
+
return undefined;
|
|
20
|
+
const command = input.command;
|
|
21
|
+
return typeof command === "string" ? command : undefined;
|
|
22
|
+
}
|
|
23
|
+
/** Resolves the session ID carried by a message, for diagnostic logging only. */
|
|
24
|
+
function messageSessionID(message) {
|
|
25
|
+
const info = message.info;
|
|
26
|
+
if (info !== undefined && info !== null && typeof info === "object") {
|
|
27
|
+
const sessionID = info.sessionID;
|
|
28
|
+
if (typeof sessionID === "string" && sessionID.length > 0)
|
|
29
|
+
return sessionID;
|
|
30
|
+
}
|
|
31
|
+
const sessionID = message.sessionID;
|
|
32
|
+
if (typeof sessionID === "string" && sessionID.length > 0)
|
|
33
|
+
return sessionID;
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
/** Deep-clones a JSON-like value (message payloads contain no class instances). */
|
|
37
|
+
function deepClone(value) {
|
|
38
|
+
if (Array.isArray(value)) {
|
|
39
|
+
const items = value;
|
|
40
|
+
return items.map((item) => deepClone(item));
|
|
41
|
+
}
|
|
42
|
+
if (value !== null && typeof value === "object") {
|
|
43
|
+
const source = value;
|
|
44
|
+
const out = {};
|
|
45
|
+
for (const [key, item] of Object.entries(source)) {
|
|
46
|
+
out[key] = deepClone(item);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Copies the fields the scrubber mutates from a scrubbed part back onto the
|
|
54
|
+
* original part, keeping the original object identities intact.
|
|
55
|
+
*/
|
|
56
|
+
function restorePart(original, scrubbed) {
|
|
57
|
+
if (original === undefined ||
|
|
58
|
+
original === null ||
|
|
59
|
+
scrubbed === undefined ||
|
|
60
|
+
scrubbed === null) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
original.text = scrubbed.text;
|
|
64
|
+
original.input = scrubbed.input;
|
|
65
|
+
original.result = scrubbed.result;
|
|
66
|
+
restorePartState(original.state, scrubbed.state);
|
|
67
|
+
}
|
|
68
|
+
/** Copies mutable tool-state fields back onto the original part state. */
|
|
69
|
+
function restorePartState(original, scrubbed) {
|
|
70
|
+
if (original === undefined ||
|
|
71
|
+
original === null ||
|
|
72
|
+
scrubbed === undefined ||
|
|
73
|
+
scrubbed === null) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
original.input = scrubbed.input;
|
|
77
|
+
original.error = scrubbed.error;
|
|
78
|
+
original.output = scrubbed.output;
|
|
79
|
+
}
|
|
80
|
+
/** Applies scrub results from `source` back onto the original message parts. */
|
|
81
|
+
function restoreScrubbedParts(originalMessages, scrubbedMessages) {
|
|
82
|
+
for (let index = 0; index < originalMessages.length; index++) {
|
|
83
|
+
const original = originalMessages[index];
|
|
84
|
+
const scrubbed = scrubbedMessages[index];
|
|
85
|
+
if (original === undefined ||
|
|
86
|
+
original === null ||
|
|
87
|
+
scrubbed === undefined ||
|
|
88
|
+
scrubbed === null) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
restorePartArray(original.content, scrubbed.content);
|
|
92
|
+
restorePartArray(original.parts, scrubbed.parts);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function restorePartArray(originalParts, scrubbedParts) {
|
|
96
|
+
if (!Array.isArray(originalParts) || !Array.isArray(scrubbedParts)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const length = Math.min(originalParts.length, scrubbedParts.length);
|
|
100
|
+
for (let index = 0; index < length; index++) {
|
|
101
|
+
restorePart(originalParts[index], scrubbedParts[index]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Anonymizes the messages of a session request in place.
|
|
106
|
+
*
|
|
107
|
+
* @returns the number of entities removed and a per-type breakdown for logging.
|
|
108
|
+
*/
|
|
109
|
+
export async function scrubMessages(eventMessages, ctx, resolveSession, state, options) {
|
|
110
|
+
let scrubbed = 0;
|
|
111
|
+
const byType = {};
|
|
112
|
+
const record = (result) => {
|
|
113
|
+
if (result.stats.totalEntities <= 0)
|
|
114
|
+
return;
|
|
115
|
+
state.hasAnonymized = true;
|
|
116
|
+
scrubbed += result.stats.totalEntities;
|
|
117
|
+
for (const [type, count] of Object.entries(result.stats.countsByType)) {
|
|
118
|
+
byType[type] = (byType[type] ?? 0) + count;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// Recursively anonymize a value. Object keys are preserved so execution
|
|
122
|
+
// arguments and JSON property names stay intact.
|
|
123
|
+
const scrubValue = async (value, session, policy) => {
|
|
124
|
+
if (typeof value === "string") {
|
|
125
|
+
const result = await session.anonymize(value, options.locale, policy);
|
|
126
|
+
record(result);
|
|
127
|
+
return result.anonymizedText;
|
|
128
|
+
}
|
|
129
|
+
if (Array.isArray(value)) {
|
|
130
|
+
const items = value;
|
|
131
|
+
const out = [];
|
|
132
|
+
for (const item of items) {
|
|
133
|
+
out.push(await scrubValue(item, session, policy));
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
if (value !== null && typeof value === "object") {
|
|
138
|
+
const source = value;
|
|
139
|
+
const out = {};
|
|
140
|
+
for (const [key, item] of Object.entries(source)) {
|
|
141
|
+
out[key] = await scrubValue(item, session, policy);
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
return value;
|
|
146
|
+
};
|
|
147
|
+
// Tool call id → shell command, so a later `tool-result` can use the identity
|
|
148
|
+
// policy its matching `tool-call` requires.
|
|
149
|
+
const commandByCallID = new Map();
|
|
150
|
+
const policyForCommand = (command) => {
|
|
151
|
+
if (!options.vcsIdentities || typeof command !== "string")
|
|
152
|
+
return undefined;
|
|
153
|
+
const commands = vcsCommandTypes(command);
|
|
154
|
+
const types = [];
|
|
155
|
+
if (commands.has("github"))
|
|
156
|
+
types.push(PIIType.GITHUB_USERNAME);
|
|
157
|
+
if (commands.has("git"))
|
|
158
|
+
types.push(PIIType.PERSON);
|
|
159
|
+
if (types.length === 0)
|
|
160
|
+
return undefined;
|
|
161
|
+
return options.identityPolicy(types);
|
|
162
|
+
};
|
|
163
|
+
const commandFor = (part) => {
|
|
164
|
+
const callID = part.callID ?? part.id;
|
|
165
|
+
if (callID === undefined)
|
|
166
|
+
return undefined;
|
|
167
|
+
return commandByCallID.get(callID);
|
|
168
|
+
};
|
|
169
|
+
const scrubPart = async (part, session) => {
|
|
170
|
+
// V1-style part state (kept so the scrubber works for both message shapes).
|
|
171
|
+
const partState = part.state;
|
|
172
|
+
if (partState !== undefined &&
|
|
173
|
+
partState !== null &&
|
|
174
|
+
typeof partState === "object") {
|
|
175
|
+
if (partState.input !== undefined) {
|
|
176
|
+
const command = extractCommand(partState.input);
|
|
177
|
+
if (command !== undefined) {
|
|
178
|
+
commandByCallID.set(part.callID ?? part.id ?? "", command);
|
|
179
|
+
}
|
|
180
|
+
partState.input = await scrubValue(partState.input, session, options.policy);
|
|
181
|
+
}
|
|
182
|
+
if (typeof partState.error === "string") {
|
|
183
|
+
partState.error = (await scrubValue(partState.error, session, options.policy));
|
|
184
|
+
}
|
|
185
|
+
if (partState.status === "completed" && typeof partState.output === "string") {
|
|
186
|
+
const command = extractCommand(partState.input) ?? commandFor(part);
|
|
187
|
+
const policyOverride = policyForCommand(command) ?? options.policy;
|
|
188
|
+
partState.output = (await scrubValue(partState.output, session, policyOverride));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// V2 tool arguments.
|
|
192
|
+
if (part.type === "tool-call" && part.input !== undefined) {
|
|
193
|
+
const command = extractCommand(part.input);
|
|
194
|
+
if (command !== undefined && part.id !== undefined) {
|
|
195
|
+
commandByCallID.set(part.id, command);
|
|
196
|
+
}
|
|
197
|
+
part.input = await scrubValue(part.input, session, options.policy);
|
|
198
|
+
}
|
|
199
|
+
// V2 tool output.
|
|
200
|
+
if (part.type === "tool-result" && part.result !== undefined) {
|
|
201
|
+
const command = extractCommand(part.input) ?? commandFor(part);
|
|
202
|
+
const policyOverride = policyForCommand(command) ?? options.policy;
|
|
203
|
+
part.result = await scrubValue(part.result, session, policyOverride);
|
|
204
|
+
}
|
|
205
|
+
// Any textual part (text, reasoning, compaction).
|
|
206
|
+
if (typeof part.text === "string") {
|
|
207
|
+
const result = await session.anonymize(part.text, options.locale, options.policy);
|
|
208
|
+
record(result);
|
|
209
|
+
part.text = result.anonymizedText;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
// Scrub a deep copy first; the originals are only touched after the whole
|
|
213
|
+
// pass succeeds, so a mid-way failure cannot send partially scrubbed PII.
|
|
214
|
+
const workingMessages = deepClone(eventMessages);
|
|
215
|
+
const session = resolveSession(ctx.sessionID);
|
|
216
|
+
for (const message of workingMessages) {
|
|
217
|
+
if (message === null || typeof message !== "object")
|
|
218
|
+
continue;
|
|
219
|
+
const messageSession = messageSessionID(message);
|
|
220
|
+
if (messageSession !== undefined && messageSession !== ctx.sessionID) {
|
|
221
|
+
ctx.logger.debug("message sessionID differs from event sessionID", {
|
|
222
|
+
eventSessionID: ctx.sessionID,
|
|
223
|
+
messageSessionID: messageSession,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
if (Array.isArray(message.content)) {
|
|
227
|
+
for (const part of message.content) {
|
|
228
|
+
if (part !== null && typeof part === "object") {
|
|
229
|
+
await scrubPart(part, session);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (Array.isArray(message.parts)) {
|
|
234
|
+
for (const part of message.parts) {
|
|
235
|
+
if (part !== null && typeof part === "object") {
|
|
236
|
+
await scrubPart(part, session);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
restoreScrubbedParts(eventMessages, workingMessages);
|
|
242
|
+
if (scrubbed > 0) {
|
|
243
|
+
const nonZero = {};
|
|
244
|
+
for (const [type, count] of Object.entries(byType)) {
|
|
245
|
+
if (count > 0)
|
|
246
|
+
nonZero[type] = count;
|
|
247
|
+
}
|
|
248
|
+
ctx.logger.info(`scrubbed ${scrubbed} secret(s) from messages`, {
|
|
249
|
+
scrubbed: nonZero,
|
|
250
|
+
messageCount: eventMessages.length,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
ctx.logger.debug("no secrets found in messages", {
|
|
255
|
+
messageCount: eventMessages.length,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
return { scrubbed, byType };
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=scrub-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub-messages.js","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/scrub-messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory session registry for the V2 plugin.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode identifies a conversation by `sessionID`; each conversation gets
|
|
5
|
+
* its own {@link AnonymizerSessionImpl} so PII maps stay isolated. Sessions are
|
|
6
|
+
* process-local and intentionally not persisted here.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnonymizerSessionImpl } from "../../storage/session-base.js";
|
|
9
|
+
/** Lazily creates and memoizes one session per OpenCode session ID. */
|
|
10
|
+
export declare class SessionStore {
|
|
11
|
+
private readonly map;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the session for `sessionID`, creating it via `factory` on first use.
|
|
14
|
+
*/
|
|
15
|
+
get(sessionID: string, factory: () => AnonymizerSessionImpl): AnonymizerSessionImpl;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/sessions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,uEAAuE;AACvE,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiD;IAErE;;OAEG;IACH,GAAG,CACD,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,qBAAqB,GACnC,qBAAqB;CAQzB"}
|