opencode-rehydar 0.14.1 → 0.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +54 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +74 -0
- package/dist/browser.js.map +1 -0
- package/dist/core/anonymizer.d.ts +309 -0
- package/dist/core/anonymizer.d.ts.map +1 -0
- package/dist/core/anonymizer.js +555 -0
- package/dist/core/anonymizer.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/pii-map-crypto.d.ts +114 -0
- package/dist/crypto/pii-map-crypto.d.ts.map +1 -0
- package/dist/crypto/pii-map-crypto.js +228 -0
- package/dist/crypto/pii-map-crypto.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/ner/bio-decoder.d.ts +64 -0
- package/dist/ner/bio-decoder.d.ts.map +1 -0
- package/dist/ner/bio-decoder.js +218 -0
- package/dist/ner/bio-decoder.js.map +1 -0
- package/dist/ner/index.d.ts +12 -0
- package/dist/ner/index.d.ts.map +1 -0
- package/dist/ner/index.js +12 -0
- package/dist/ner/index.js.map +1 -0
- package/dist/ner/inference-server-client.d.ts +81 -0
- package/dist/ner/inference-server-client.d.ts.map +1 -0
- package/dist/ner/inference-server-client.js +120 -0
- package/dist/ner/inference-server-client.js.map +1 -0
- package/dist/ner/inference-server-ner-model.d.ts +43 -0
- package/dist/ner/inference-server-ner-model.d.ts.map +1 -0
- package/dist/ner/inference-server-ner-model.js +119 -0
- package/dist/ner/inference-server-ner-model.js.map +1 -0
- package/dist/ner/model-manager.d.ts +111 -0
- package/dist/ner/model-manager.d.ts.map +1 -0
- package/dist/ner/model-manager.js +334 -0
- package/dist/ner/model-manager.js.map +1 -0
- package/dist/ner/ner-model.d.ts +172 -0
- package/dist/ner/ner-model.d.ts.map +1 -0
- package/dist/ner/ner-model.js +514 -0
- package/dist/ner/ner-model.js.map +1 -0
- package/dist/ner/onnx-runtime.browser.d.ts +46 -0
- package/dist/ner/onnx-runtime.browser.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.browser.js +90 -0
- package/dist/ner/onnx-runtime.browser.js.map +1 -0
- package/dist/ner/onnx-runtime.d.ts +72 -0
- package/dist/ner/onnx-runtime.d.ts.map +1 -0
- package/dist/ner/onnx-runtime.js +132 -0
- package/dist/ner/onnx-runtime.js.map +1 -0
- package/dist/ner/token-window.d.ts +19 -0
- package/dist/ner/token-window.d.ts.map +1 -0
- package/dist/ner/token-window.js +101 -0
- package/dist/ner/token-window.js.map +1 -0
- package/dist/ner/tokenizer.d.ts +142 -0
- package/dist/ner/tokenizer.d.ts.map +1 -0
- package/dist/ner/tokenizer.js +362 -0
- package/dist/ner/tokenizer.js.map +1 -0
- package/dist/opencode-plugin/git-identity.d.ts +3 -0
- package/dist/opencode-plugin/git-identity.d.ts.map +1 -0
- package/dist/opencode-plugin/git-identity.js +37 -0
- package/dist/opencode-plugin/git-identity.js.map +1 -0
- package/dist/opencode-plugin/github-username.d.ts +3 -0
- package/dist/opencode-plugin/github-username.d.ts.map +1 -0
- package/dist/opencode-plugin/github-username.js +41 -0
- package/dist/opencode-plugin/github-username.js.map +1 -0
- package/dist/opencode-plugin/identity-recognizer.d.ts +5 -0
- package/dist/opencode-plugin/identity-recognizer.d.ts.map +1 -0
- package/dist/opencode-plugin/identity-recognizer.js +21 -0
- package/dist/opencode-plugin/identity-recognizer.js.map +1 -0
- package/dist/opencode-plugin/index.d.ts +7 -0
- package/dist/opencode-plugin/index.d.ts.map +1 -0
- package/dist/opencode-plugin/index.js +6 -0
- package/dist/opencode-plugin/index.js.map +1 -0
- package/dist/opencode-plugin/plugin.d.ts +39 -0
- package/dist/opencode-plugin/plugin.d.ts.map +1 -0
- package/dist/opencode-plugin/plugin.js +294 -0
- package/dist/opencode-plugin/plugin.js.map +1 -0
- package/dist/opencode-plugin/types.d.ts +33 -0
- package/dist/opencode-plugin/types.d.ts.map +1 -0
- package/dist/opencode-plugin/types.js +5 -0
- package/dist/opencode-plugin/types.js.map +1 -0
- package/dist/opencode-plugin/v2/anon-state.d.ts +12 -0
- package/dist/opencode-plugin/v2/anon-state.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/anon-state.js +14 -0
- package/dist/opencode-plugin/v2/anon-state.js.map +1 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.d.ts +13 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.js +33 -0
- package/dist/opencode-plugin/v2/deep-rehydrate.js.map +1 -0
- package/dist/opencode-plugin/v2/index.d.ts +17 -0
- package/dist/opencode-plugin/v2/index.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/index.js +17 -0
- package/dist/opencode-plugin/v2/index.js.map +1 -0
- package/dist/opencode-plugin/v2/logger.d.ts +24 -0
- package/dist/opencode-plugin/v2/logger.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/logger.js +73 -0
- package/dist/opencode-plugin/v2/logger.js.map +1 -0
- package/dist/opencode-plugin/v2/options.d.ts +63 -0
- package/dist/opencode-plugin/v2/options.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/options.js +183 -0
- package/dist/opencode-plugin/v2/options.js.map +1 -0
- package/dist/opencode-plugin/v2/register-hooks.d.ts +43 -0
- package/dist/opencode-plugin/v2/register-hooks.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/register-hooks.js +160 -0
- package/dist/opencode-plugin/v2/register-hooks.js.map +1 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.d.ts +101 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.js +147 -0
- package/dist/opencode-plugin/v2/rehydrate-tail.js.map +1 -0
- package/dist/opencode-plugin/v2/response-rehydrate.d.ts +78 -0
- package/dist/opencode-plugin/v2/response-rehydrate.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/response-rehydrate.js +210 -0
- package/dist/opencode-plugin/v2/response-rehydrate.js.map +1 -0
- package/dist/opencode-plugin/v2/scrub-messages.d.ts +39 -0
- package/dist/opencode-plugin/v2/scrub-messages.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/scrub-messages.js +260 -0
- package/dist/opencode-plugin/v2/scrub-messages.js.map +1 -0
- package/dist/opencode-plugin/v2/sessions.d.ts +17 -0
- package/dist/opencode-plugin/v2/sessions.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/sessions.js +23 -0
- package/dist/opencode-plugin/v2/sessions.js.map +1 -0
- package/dist/opencode-plugin/v2/sse.d.ts +101 -0
- package/dist/opencode-plugin/v2/sse.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/sse.js +235 -0
- package/dist/opencode-plugin/v2/sse.js.map +1 -0
- package/dist/opencode-plugin/v2/types.d.ts +188 -0
- package/dist/opencode-plugin/v2/types.d.ts.map +1 -0
- package/dist/opencode-plugin/v2/types.js +10 -0
- package/dist/opencode-plugin/v2/types.js.map +1 -0
- package/dist/opencode-plugin/vcs-command.d.ts +3 -0
- package/dist/opencode-plugin/vcs-command.d.ts.map +1 -0
- package/dist/opencode-plugin/vcs-command.js +34 -0
- package/dist/opencode-plugin/vcs-command.js.map +1 -0
- package/dist/pipeline/index.d.ts +12 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +12 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/prenormalize.d.ts +48 -0
- package/dist/pipeline/prenormalize.d.ts.map +1 -0
- package/dist/pipeline/prenormalize.js +94 -0
- package/dist/pipeline/prenormalize.js.map +1 -0
- package/dist/pipeline/resolver.d.ts +56 -0
- package/dist/pipeline/resolver.d.ts.map +1 -0
- package/dist/pipeline/resolver.js +239 -0
- package/dist/pipeline/resolver.js.map +1 -0
- package/dist/pipeline/semantic-data-loader.d.ts +171 -0
- package/dist/pipeline/semantic-data-loader.d.ts.map +1 -0
- package/dist/pipeline/semantic-data-loader.js +677 -0
- package/dist/pipeline/semantic-data-loader.js.map +1 -0
- package/dist/pipeline/semantic-enricher.d.ts +112 -0
- package/dist/pipeline/semantic-enricher.d.ts.map +1 -0
- package/dist/pipeline/semantic-enricher.js +322 -0
- package/dist/pipeline/semantic-enricher.js.map +1 -0
- package/dist/pipeline/tagger.d.ts +121 -0
- package/dist/pipeline/tagger.d.ts.map +1 -0
- package/dist/pipeline/tagger.js +545 -0
- package/dist/pipeline/tagger.js.map +1 -0
- package/dist/pipeline/title-extractor.d.ts +79 -0
- package/dist/pipeline/title-extractor.d.ts.map +1 -0
- package/dist/pipeline/title-extractor.js +801 -0
- package/dist/pipeline/title-extractor.js.map +1 -0
- package/dist/pipeline/validator.d.ts +65 -0
- package/dist/pipeline/validator.d.ts.map +1 -0
- package/dist/pipeline/validator.js +292 -0
- package/dist/pipeline/validator.js.map +1 -0
- package/dist/proxy/index.d.ts +13 -0
- package/dist/proxy/index.d.ts.map +1 -0
- package/dist/proxy/index.js +12 -0
- package/dist/proxy/index.js.map +1 -0
- package/dist/proxy/providers/anthropic.d.ts +28 -0
- package/dist/proxy/providers/anthropic.d.ts.map +1 -0
- package/dist/proxy/providers/anthropic.js +265 -0
- package/dist/proxy/providers/anthropic.js.map +1 -0
- package/dist/proxy/providers/index.d.ts +19 -0
- package/dist/proxy/providers/index.d.ts.map +1 -0
- package/dist/proxy/providers/index.js +41 -0
- package/dist/proxy/providers/index.js.map +1 -0
- package/dist/proxy/providers/openai.d.ts +27 -0
- package/dist/proxy/providers/openai.d.ts.map +1 -0
- package/dist/proxy/providers/openai.js +203 -0
- package/dist/proxy/providers/openai.js.map +1 -0
- package/dist/proxy/providers/streaming-tool-loop.d.ts +12 -0
- package/dist/proxy/providers/streaming-tool-loop.d.ts.map +1 -0
- package/dist/proxy/providers/streaming-tool-loop.js +223 -0
- package/dist/proxy/providers/streaming-tool-loop.js.map +1 -0
- package/dist/proxy/providers/types.d.ts +109 -0
- package/dist/proxy/providers/types.d.ts.map +1 -0
- package/dist/proxy/providers/types.js +2 -0
- package/dist/proxy/providers/types.js.map +1 -0
- package/dist/proxy/proxy-server.d.ts +61 -0
- package/dist/proxy/proxy-server.d.ts.map +1 -0
- package/dist/proxy/proxy-server.js +146 -0
- package/dist/proxy/proxy-server.js.map +1 -0
- package/dist/proxy/rehydra-fetch.d.ts +35 -0
- package/dist/proxy/rehydra-fetch.d.ts.map +1 -0
- package/dist/proxy/rehydra-fetch.js +631 -0
- package/dist/proxy/rehydra-fetch.js.map +1 -0
- package/dist/proxy/rehydra-proxy.d.ts +40 -0
- package/dist/proxy/rehydra-proxy.d.ts.map +1 -0
- package/dist/proxy/rehydra-proxy.js +150 -0
- package/dist/proxy/rehydra-proxy.js.map +1 -0
- package/dist/proxy/sse-parser.d.ts +59 -0
- package/dist/proxy/sse-parser.d.ts.map +1 -0
- package/dist/proxy/sse-parser.js +112 -0
- package/dist/proxy/sse-parser.js.map +1 -0
- package/dist/proxy/system-instruction.d.ts +19 -0
- package/dist/proxy/system-instruction.d.ts.map +1 -0
- package/dist/proxy/system-instruction.js +33 -0
- package/dist/proxy/system-instruction.js.map +1 -0
- package/dist/proxy/tool-loop-stream.d.ts +7 -0
- package/dist/proxy/tool-loop-stream.d.ts.map +1 -0
- package/dist/proxy/tool-loop-stream.js +65 -0
- package/dist/proxy/tool-loop-stream.js.map +1 -0
- package/dist/proxy/types.d.ts +138 -0
- package/dist/proxy/types.d.ts.map +1 -0
- package/dist/proxy/types.js +5 -0
- package/dist/proxy/types.js.map +1 -0
- package/dist/proxy/wrap-client.d.ts +47 -0
- package/dist/proxy/wrap-client.d.ts.map +1 -0
- package/dist/proxy/wrap-client.js +70 -0
- package/dist/proxy/wrap-client.js.map +1 -0
- package/dist/recognizers/address.d.ts +2 -0
- package/dist/recognizers/address.d.ts.map +1 -0
- package/dist/recognizers/address.js +23 -0
- package/dist/recognizers/address.js.map +1 -0
- package/dist/recognizers/base.d.ts +78 -0
- package/dist/recognizers/base.d.ts.map +1 -0
- package/dist/recognizers/base.js +100 -0
- package/dist/recognizers/base.js.map +1 -0
- package/dist/recognizers/bic-swift.d.ts +10 -0
- package/dist/recognizers/bic-swift.d.ts.map +1 -0
- package/dist/recognizers/bic-swift.js +107 -0
- package/dist/recognizers/bic-swift.js.map +1 -0
- package/dist/recognizers/credit-card.d.ts +32 -0
- package/dist/recognizers/credit-card.d.ts.map +1 -0
- package/dist/recognizers/credit-card.js +160 -0
- package/dist/recognizers/credit-card.js.map +1 -0
- package/dist/recognizers/custom-id.d.ts +28 -0
- package/dist/recognizers/custom-id.d.ts.map +1 -0
- package/dist/recognizers/custom-id.js +116 -0
- package/dist/recognizers/custom-id.js.map +1 -0
- package/dist/recognizers/date.d.ts +10 -0
- package/dist/recognizers/date.d.ts.map +1 -0
- package/dist/recognizers/date.js +228 -0
- package/dist/recognizers/date.js.map +1 -0
- package/dist/recognizers/email.d.ts +10 -0
- package/dist/recognizers/email.d.ts.map +1 -0
- package/dist/recognizers/email.js +75 -0
- package/dist/recognizers/email.js.map +1 -0
- package/dist/recognizers/iban.d.ts +14 -0
- package/dist/recognizers/iban.d.ts.map +1 -0
- package/dist/recognizers/iban.js +67 -0
- package/dist/recognizers/iban.js.map +1 -0
- package/dist/recognizers/index.d.ts +25 -0
- package/dist/recognizers/index.d.ts.map +1 -0
- package/dist/recognizers/index.js +53 -0
- package/dist/recognizers/index.js.map +1 -0
- package/dist/recognizers/ip-address.d.ts +14 -0
- package/dist/recognizers/ip-address.d.ts.map +1 -0
- package/dist/recognizers/ip-address.js +183 -0
- package/dist/recognizers/ip-address.js.map +1 -0
- package/dist/recognizers/phone.d.ts +10 -0
- package/dist/recognizers/phone.d.ts.map +1 -0
- package/dist/recognizers/phone.js +145 -0
- package/dist/recognizers/phone.js.map +1 -0
- package/dist/recognizers/postal-code.d.ts +16 -0
- package/dist/recognizers/postal-code.d.ts.map +1 -0
- package/dist/recognizers/postal-code.js +42 -0
- package/dist/recognizers/postal-code.js.map +1 -0
- package/dist/recognizers/registry.d.ts +59 -0
- package/dist/recognizers/registry.d.ts.map +1 -0
- package/dist/recognizers/registry.js +113 -0
- package/dist/recognizers/registry.js.map +1 -0
- package/dist/recognizers/secrets/api-key.d.ts +6 -0
- package/dist/recognizers/secrets/api-key.d.ts.map +1 -0
- package/dist/recognizers/secrets/api-key.js +40 -0
- package/dist/recognizers/secrets/api-key.js.map +1 -0
- package/dist/recognizers/secrets/aws-credentials.d.ts +7 -0
- package/dist/recognizers/secrets/aws-credentials.d.ts.map +1 -0
- package/dist/recognizers/secrets/aws-credentials.js +68 -0
- package/dist/recognizers/secrets/aws-credentials.js.map +1 -0
- package/dist/recognizers/secrets/config-secret.d.ts +8 -0
- package/dist/recognizers/secrets/config-secret.d.ts.map +1 -0
- package/dist/recognizers/secrets/config-secret.js +59 -0
- package/dist/recognizers/secrets/config-secret.js.map +1 -0
- package/dist/recognizers/secrets/connection-string.d.ts +6 -0
- package/dist/recognizers/secrets/connection-string.d.ts.map +1 -0
- package/dist/recognizers/secrets/connection-string.js +40 -0
- package/dist/recognizers/secrets/connection-string.js.map +1 -0
- package/dist/recognizers/secrets/env-var.d.ts +8 -0
- package/dist/recognizers/secrets/env-var.d.ts.map +1 -0
- package/dist/recognizers/secrets/env-var.js +54 -0
- package/dist/recognizers/secrets/env-var.js.map +1 -0
- package/dist/recognizers/secrets/index.d.ts +22 -0
- package/dist/recognizers/secrets/index.d.ts.map +1 -0
- package/dist/recognizers/secrets/index.js +41 -0
- package/dist/recognizers/secrets/index.js.map +1 -0
- package/dist/recognizers/secrets/jwt.d.ts +6 -0
- package/dist/recognizers/secrets/jwt.d.ts.map +1 -0
- package/dist/recognizers/secrets/jwt.js +47 -0
- package/dist/recognizers/secrets/jwt.js.map +1 -0
- package/dist/recognizers/secrets/key-patterns.d.ts +10 -0
- package/dist/recognizers/secrets/key-patterns.d.ts.map +1 -0
- package/dist/recognizers/secrets/key-patterns.js +15 -0
- package/dist/recognizers/secrets/key-patterns.js.map +1 -0
- package/dist/recognizers/secrets/literal-value.d.ts +10 -0
- package/dist/recognizers/secrets/literal-value.d.ts.map +1 -0
- package/dist/recognizers/secrets/literal-value.js +48 -0
- package/dist/recognizers/secrets/literal-value.js.map +1 -0
- package/dist/recognizers/secrets/private-key.d.ts +6 -0
- package/dist/recognizers/secrets/private-key.d.ts.map +1 -0
- package/dist/recognizers/secrets/private-key.js +16 -0
- package/dist/recognizers/secrets/private-key.js.map +1 -0
- package/dist/recognizers/url.d.ts +14 -0
- package/dist/recognizers/url.d.ts.map +1 -0
- package/dist/recognizers/url.js +121 -0
- package/dist/recognizers/url.js.map +1 -0
- package/dist/storage/browser.d.ts +13 -0
- package/dist/storage/browser.d.ts.map +1 -0
- package/dist/storage/browser.js +13 -0
- package/dist/storage/browser.js.map +1 -0
- package/dist/storage/in-memory.d.ts +60 -0
- package/dist/storage/in-memory.d.ts.map +1 -0
- package/dist/storage/in-memory.js +108 -0
- package/dist/storage/in-memory.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +11 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/indexeddb.d.ts +69 -0
- package/dist/storage/indexeddb.d.ts.map +1 -0
- package/dist/storage/indexeddb.js +274 -0
- package/dist/storage/indexeddb.js.map +1 -0
- package/dist/storage/session-base.d.ts +34 -0
- package/dist/storage/session-base.d.ts.map +1 -0
- package/dist/storage/session-base.js +122 -0
- package/dist/storage/session-base.js.map +1 -0
- package/dist/storage/session.d.ts +19 -0
- package/dist/storage/session.d.ts.map +1 -0
- package/dist/storage/session.js +31 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/sqlite.d.ts +80 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +255 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/types.d.ts +208 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +6 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/streaming/anonymizer-stream.d.ts +63 -0
- package/dist/streaming/anonymizer-stream.d.ts.map +1 -0
- package/dist/streaming/anonymizer-stream.js +184 -0
- package/dist/streaming/anonymizer-stream.js.map +1 -0
- package/dist/streaming/index.d.ts +9 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +8 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/sentence-buffer.d.ts +78 -0
- package/dist/streaming/sentence-buffer.d.ts.map +1 -0
- package/dist/streaming/sentence-buffer.js +239 -0
- package/dist/streaming/sentence-buffer.js.map +1 -0
- package/dist/streaming/stream-factory.d.ts +38 -0
- package/dist/streaming/stream-factory.d.ts.map +1 -0
- package/dist/streaming/stream-factory.js +69 -0
- package/dist/streaming/stream-factory.js.map +1 -0
- package/dist/streaming/types.d.ts +121 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/streaming/types.js +5 -0
- package/dist/streaming/types.js.map +1 -0
- package/dist/types/index.d.ts +269 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +95 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pii-types.d.ts +64 -0
- package/dist/types/pii-types.d.ts.map +1 -0
- package/dist/types/pii-types.js +153 -0
- package/dist/types/pii-types.js.map +1 -0
- package/dist/utils/iban-checksum.d.ts +23 -0
- package/dist/utils/iban-checksum.d.ts.map +1 -0
- package/dist/utils/iban-checksum.js +106 -0
- package/dist/utils/iban-checksum.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-walk.d.ts +21 -0
- package/dist/utils/json-walk.d.ts.map +1 -0
- package/dist/utils/json-walk.js +44 -0
- package/dist/utils/json-walk.js.map +1 -0
- package/dist/utils/luhn.d.ts +17 -0
- package/dist/utils/luhn.d.ts.map +1 -0
- package/dist/utils/luhn.js +55 -0
- package/dist/utils/luhn.js.map +1 -0
- package/dist/utils/offsets.d.ts +86 -0
- package/dist/utils/offsets.d.ts.map +1 -0
- package/dist/utils/offsets.js +124 -0
- package/dist/utils/offsets.js.map +1 -0
- package/dist/utils/path.d.ts +34 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +96 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/regex.d.ts +11 -0
- package/dist/utils/regex.d.ts.map +1 -0
- package/dist/utils/regex.js +14 -0
- package/dist/utils/regex.js.map +1 -0
- package/dist/utils/storage-browser.d.ts +51 -0
- package/dist/utils/storage-browser.d.ts.map +1 -0
- package/dist/utils/storage-browser.js +381 -0
- package/dist/utils/storage-browser.js.map +1 -0
- package/dist/utils/storage-node.d.ts +51 -0
- package/dist/utils/storage-node.d.ts.map +1 -0
- package/dist/utils/storage-node.js +153 -0
- package/dist/utils/storage-node.js.map +1 -0
- package/dist/utils/storage.browser.d.ts +75 -0
- package/dist/utils/storage.browser.d.ts.map +1 -0
- package/dist/utils/storage.browser.js +69 -0
- package/dist/utils/storage.browser.js.map +1 -0
- package/dist/utils/storage.d.ts +73 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +69 -0
- package/dist/utils/storage.js.map +1 -0
- package/index.js +14 -13
- package/package.json +19 -5
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared tail buffering for streamed PII-tag rehydration.
|
|
3
|
+
*
|
|
4
|
+
* Model output arrives in fragments: a single `<PII .../>` tag can be split
|
|
5
|
+
* across SSE events, WebSocket byte chunks, or JSON delta frames. Rehydrating
|
|
6
|
+
* a fragment in isolation would emit an unterminated tag (or worse, drop the
|
|
7
|
+
* real value), so incomplete fragments are held back and prepended to the next
|
|
8
|
+
* fragment of the same stream.
|
|
9
|
+
*
|
|
10
|
+
* Two buffers are maintained per session:
|
|
11
|
+
* - a byte/text tail for raw text payloads (SSE `data:` bodies, non-JSON WS
|
|
12
|
+
* frames),
|
|
13
|
+
* - a JSON pointer tail so each string field of a JSON delta frame continues
|
|
14
|
+
* from the fragment left by the previous frame.
|
|
15
|
+
*/
|
|
16
|
+
/** Longest PII tag fragment we hold back while awaiting its closing delimiter. */
|
|
17
|
+
export const MAX_TAG_TAIL_LENGTH = 256;
|
|
18
|
+
/** Default tag prefix, matching `DEFAULT_TAG_FORMAT`. */
|
|
19
|
+
export const DEFAULT_TAG_PREFIX = "<PII";
|
|
20
|
+
/** Default tag close delimiter. */
|
|
21
|
+
export const DEFAULT_TAG_CLOSE = "/>";
|
|
22
|
+
/** Default in-memory tail store. */
|
|
23
|
+
export class InMemoryRehydrateTailStore {
|
|
24
|
+
textTails = new Map();
|
|
25
|
+
jsonTails = new Map();
|
|
26
|
+
get(sessionID) {
|
|
27
|
+
return this.textTails.get(sessionID) ?? "";
|
|
28
|
+
}
|
|
29
|
+
set(sessionID, tail) {
|
|
30
|
+
if (tail.length === 0) {
|
|
31
|
+
this.textTails.delete(sessionID);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.textTails.set(sessionID, tail);
|
|
35
|
+
}
|
|
36
|
+
getJsonTail(sessionID, pointer) {
|
|
37
|
+
return this.jsonTails.get(sessionID)?.get(pointer) ?? "";
|
|
38
|
+
}
|
|
39
|
+
setJsonTail(sessionID, pointer, tail) {
|
|
40
|
+
const pointers = this.jsonTails.get(sessionID);
|
|
41
|
+
if (tail.length === 0) {
|
|
42
|
+
if (pointers === undefined)
|
|
43
|
+
return;
|
|
44
|
+
pointers.delete(pointer);
|
|
45
|
+
if (pointers.size === 0)
|
|
46
|
+
this.jsonTails.delete(sessionID);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (pointers === undefined) {
|
|
50
|
+
this.jsonTails.set(sessionID, new Map([[pointer, tail]]));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
pointers.set(pointer, tail);
|
|
54
|
+
}
|
|
55
|
+
delete(sessionID) {
|
|
56
|
+
this.textTails.delete(sessionID);
|
|
57
|
+
this.jsonTails.delete(sessionID);
|
|
58
|
+
}
|
|
59
|
+
clear() {
|
|
60
|
+
this.textTails.clear();
|
|
61
|
+
this.jsonTails.clear();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Finds the start of a trailing, unterminated PII tag fragment.
|
|
66
|
+
*
|
|
67
|
+
* Returns `-1` when the text has no incomplete tag, so a caller can safely
|
|
68
|
+
* emit it. When a fragment is found, the caller must hold it back (prepending
|
|
69
|
+
* it to the next fragment) instead of emitting a truncated tag.
|
|
70
|
+
*/
|
|
71
|
+
export function incompleteTagStart(text, tagPrefix, tagClose) {
|
|
72
|
+
const start = text.lastIndexOf(tagPrefix);
|
|
73
|
+
if (start >= 0 && text.indexOf(tagClose, start) === -1) {
|
|
74
|
+
return start;
|
|
75
|
+
}
|
|
76
|
+
// A tag can also be split before its full prefix has arrived (e.g. the frame
|
|
77
|
+
// ends with `<PI`). Hold back the longest trailing prefix fragment.
|
|
78
|
+
const maxPrefix = Math.min(text.length, tagPrefix.length - 1);
|
|
79
|
+
for (let length = maxPrefix; length >= 1; length--) {
|
|
80
|
+
const suffix = text.slice(text.length - length);
|
|
81
|
+
if (suffix === tagPrefix.slice(0, length)) {
|
|
82
|
+
return text.length - length;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return -1;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Splits a restored string at its trailing unterminated tag fragment.
|
|
89
|
+
*
|
|
90
|
+
* When the fragment is longer than {@link MAX_TAG_TAIL_LENGTH} the whole string
|
|
91
|
+
* is emitted: holding an unbounded fragment risks stalling the stream, so the
|
|
92
|
+
* cap forces a flush.
|
|
93
|
+
*/
|
|
94
|
+
export function splitTrailingTag(text, tagPrefix, tagClose) {
|
|
95
|
+
const start = incompleteTagStart(text, tagPrefix, tagClose);
|
|
96
|
+
if (start < 0) {
|
|
97
|
+
return { emitted: text, tail: "" };
|
|
98
|
+
}
|
|
99
|
+
const fragment = text.slice(start);
|
|
100
|
+
if (fragment.length > MAX_TAG_TAIL_LENGTH) {
|
|
101
|
+
return { emitted: text, tail: "" };
|
|
102
|
+
}
|
|
103
|
+
return { emitted: text.slice(0, start), tail: fragment };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Walks a JSON value, restoring every string leaf.
|
|
107
|
+
*
|
|
108
|
+
* Each leaf is prefixed with the fragment previously held for its JSON pointer
|
|
109
|
+
* (so a tag split across delta frames is reassembled), then any trailing
|
|
110
|
+
* unterminated fragment is held back for the next frame. `changed` reports
|
|
111
|
+
* whether any leaf differs from the original, letting callers keep the frame
|
|
112
|
+
* byte-for-byte when nothing needed rewriting.
|
|
113
|
+
*/
|
|
114
|
+
export async function walkJsonWithTail(value, rehydrate, ctx, pointer = "") {
|
|
115
|
+
if (typeof value === "string") {
|
|
116
|
+
const key = ctx.pointerPrefix + pointer;
|
|
117
|
+
const held = ctx.store.getJsonTail(ctx.sessionID, key);
|
|
118
|
+
const restored = await rehydrate(held + value);
|
|
119
|
+
const { emitted, tail } = splitTrailingTag(restored, ctx.tagPrefix, ctx.tagClose);
|
|
120
|
+
ctx.store.setJsonTail(ctx.sessionID, key, tail);
|
|
121
|
+
return { value: emitted, changed: emitted !== value };
|
|
122
|
+
}
|
|
123
|
+
if (Array.isArray(value)) {
|
|
124
|
+
const items = value;
|
|
125
|
+
const output = [];
|
|
126
|
+
let changed = false;
|
|
127
|
+
for (let index = 0; index < items.length; index++) {
|
|
128
|
+
const result = await walkJsonWithTail(items[index], rehydrate, ctx, `${pointer}/${index}`);
|
|
129
|
+
output.push(result.value);
|
|
130
|
+
changed = changed || result.changed;
|
|
131
|
+
}
|
|
132
|
+
return { value: output, changed };
|
|
133
|
+
}
|
|
134
|
+
if (value !== null && typeof value === "object") {
|
|
135
|
+
const source = value;
|
|
136
|
+
const output = {};
|
|
137
|
+
let changed = false;
|
|
138
|
+
for (const key of Object.keys(source)) {
|
|
139
|
+
const result = await walkJsonWithTail(source[key], rehydrate, ctx, `${pointer}/${key}`);
|
|
140
|
+
output[key] = result.value;
|
|
141
|
+
changed = changed || result.changed;
|
|
142
|
+
}
|
|
143
|
+
return { value: output, changed };
|
|
144
|
+
}
|
|
145
|
+
return { value, changed: false };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=rehydrate-tail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehydrate-tail.js","sourceRoot":"","sources":["../../../src/opencode-plugin/v2/rehydrate-tail.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|