@zuplo/cli 6.70.69 → 6.70.71

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.
Files changed (60) hide show
  1. package/node_modules/@types/node/README.md +1 -1
  2. package/node_modules/@types/node/http2.d.ts +1 -0
  3. package/node_modules/@types/node/package.json +2 -2
  4. package/node_modules/@zuplo/core/package.json +1 -1
  5. package/node_modules/@zuplo/graphql/package.json +1 -1
  6. package/node_modules/@zuplo/openapi-tools/package.json +1 -1
  7. package/node_modules/@zuplo/otel/package.json +1 -1
  8. package/node_modules/@zuplo/runtime/out/esm/{chunk-GEVKFSKR.js → chunk-AZIRK6TC.js} +1 -1
  9. package/node_modules/@zuplo/runtime/out/esm/{chunk-GEVKFSKR.js.map → chunk-AZIRK6TC.js.map} +1 -1
  10. package/node_modules/@zuplo/runtime/out/esm/{chunk-YLRLRHUN.js → chunk-E7U425SB.js} +93 -92
  11. package/node_modules/@zuplo/runtime/out/esm/chunk-E7U425SB.js.map +1 -0
  12. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  13. package/node_modules/@zuplo/runtime/out/esm/index.js.map +1 -1
  14. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +7 -7
  15. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js.map +1 -1
  16. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
  17. package/node_modules/@zuplo/runtime/out/types/index.d.ts +384 -0
  18. package/node_modules/@zuplo/runtime/out/types/mcp-gateway/index.d.ts +3 -1
  19. package/node_modules/@zuplo/runtime/package.json +1 -1
  20. package/node_modules/acorn/CHANGELOG.md +14 -0
  21. package/node_modules/acorn/README.md +3 -0
  22. package/node_modules/acorn/dist/acorn.d.mts +6 -0
  23. package/node_modules/acorn/dist/acorn.d.ts +6 -0
  24. package/node_modules/acorn/dist/acorn.js +87 -49
  25. package/node_modules/acorn/dist/acorn.mjs +87 -49
  26. package/node_modules/acorn/package.json +2 -2
  27. package/node_modules/protobufjs/dist/light/protobuf.js +161 -203
  28. package/node_modules/protobufjs/dist/light/protobuf.js.map +1 -1
  29. package/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
  30. package/node_modules/protobufjs/dist/light/protobuf.min.js.map +1 -1
  31. package/node_modules/protobufjs/dist/minimal/protobuf.js +34 -77
  32. package/node_modules/protobufjs/dist/minimal/protobuf.js.map +1 -1
  33. package/node_modules/protobufjs/dist/minimal/protobuf.min.js +3 -3
  34. package/node_modules/protobufjs/dist/minimal/protobuf.min.js.map +1 -1
  35. package/node_modules/protobufjs/dist/protobuf.js +181 -223
  36. package/node_modules/protobufjs/dist/protobuf.js.map +1 -1
  37. package/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  38. package/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
  39. package/node_modules/protobufjs/index.d.ts +0 -8
  40. package/node_modules/protobufjs/package.json +2 -3
  41. package/node_modules/protobufjs/src/converter.js +5 -4
  42. package/node_modules/protobufjs/src/decoder.js +1 -1
  43. package/node_modules/protobufjs/src/service.js +5 -7
  44. package/node_modules/protobufjs/src/type.js +3 -1
  45. package/node_modules/protobufjs/src/util/minimal.js +1 -4
  46. package/node_modules/protobufjs/src/verifier.js +1 -1
  47. package/package.json +6 -6
  48. package/node_modules/@protobufjs/inquire/CHANGELOG.md +0 -8
  49. package/node_modules/@protobufjs/inquire/LICENSE +0 -26
  50. package/node_modules/@protobufjs/inquire/README.md +0 -13
  51. package/node_modules/@protobufjs/inquire/index.d.ts +0 -10
  52. package/node_modules/@protobufjs/inquire/index.js +0 -38
  53. package/node_modules/@protobufjs/inquire/package.json +0 -21
  54. package/node_modules/@protobufjs/inquire/tests/data/array.js +0 -1
  55. package/node_modules/@protobufjs/inquire/tests/data/emptyArray.js +0 -1
  56. package/node_modules/@protobufjs/inquire/tests/data/emptyObject.js +0 -1
  57. package/node_modules/@protobufjs/inquire/tests/data/object.js +0 -1
  58. package/node_modules/@protobufjs/inquire/tests/index.js +0 -20
  59. package/node_modules/@zuplo/runtime/out/esm/chunk-YLRLRHUN.js.map +0 -1
  60. /package/node_modules/@zuplo/runtime/out/esm/{chunk-YLRLRHUN.js.LEGAL.txt → chunk-E7U425SB.js.LEGAL.txt} +0 -0
@@ -22,5 +22,5 @@
22
22
  * DEALINGS IN THE SOFTWARE.
23
23
  *--------------------------------------------------------------------------------------------*/
24
24
 
25
- import{b as l}from"../chunk-GEVKFSKR.js";import{a as o,da as n}from"../chunk-ZIKV2LUM.js";function g(u={request:new Request("https://api.example.com")}){let e=[];function t(i){e.push(Promise.resolve(i))}return o(t,"waitUntil"),{context:new s({event:{waitUntil:t},route:u.route}),invokeResponse:o(async()=>{await Promise.all(e)},"invokeResponse")}}o(g,"createMockContext");var p={path:"/",methods:["GET"],handler:{module:{},export:"default"},raw:o(()=>({}),"raw")},s=class extends EventTarget{static{o(this,"MockZuploContext")}#e;contextId;requestId;log;route;custom;incomingRequestProperties;parentContext;analyticsContext;constructor({event:e,route:t=p,parentContext:r}){super(),this.requestId=crypto.randomUUID(),this.contextId=crypto.randomUUID(),this.log={info:n.console.info,log:n.console.log,debug:n.console.debug,warn:n.console.warn,error:n.console.error,setLogProperties:o(()=>{},"setLogProperties")},this.custom={},this.route=t,this.incomingRequestProperties={asn:1234,asOrganization:"ORGANIZATION",city:"Seattle",region:"Washington",regionCode:"WA",colo:"SEA",continent:"NA",country:"US",postalCode:"98004",metroCode:"SEA",latitude:void 0,longitude:void 0,timezone:void 0,httpProtocol:void 0,clientCert:void 0,clientMtlsVerificationStatus:void 0,clientMtlsVerificationReason:void 0,clientCertFingerprintSha256:void 0,clientCertNotBefore:void 0,clientCertNotAfter:void 0,clientCertIssuerDn:void 0,clientCertSubjectDn:void 0},this.parentContext=r,this.#e=e,this.analyticsContext=new l(this.requestId)}waitUntil(e){this.#e.waitUntil(e)}invokeInboundPolicy(e,t){throw new Error("Not implemented")}invokeOutboundPolicy(e,t,r){throw new Error("Not implemented")}invokeRoute(e,t){throw new Error("Not implemented")}addResponseSendingHook(e){throw new Error("Not implemented")}addResponseSendingFinalHook(e){throw new Error("Not implemented")}addEventListener(e,t,r){let d=o(i=>{try{typeof t=="function"?t(i):t.handleEvent(i)}catch(a){throw this.log.error(`Error invoking event ${e}. See following logs for details.`),a}},"wrapped");super.addEventListener(e,d,r)}};export{s as MockZuploContext,g as createMockContext};
25
+ import{b as l}from"../chunk-AZIRK6TC.js";import{a as o,da as n}from"../chunk-ZIKV2LUM.js";function g(u={request:new Request("https://api.example.com")}){let e=[];function t(i){e.push(Promise.resolve(i))}return o(t,"waitUntil"),{context:new s({event:{waitUntil:t},route:u.route}),invokeResponse:o(async()=>{await Promise.all(e)},"invokeResponse")}}o(g,"createMockContext");var p={path:"/",methods:["GET"],handler:{module:{},export:"default"},raw:o(()=>({}),"raw")},s=class extends EventTarget{static{o(this,"MockZuploContext")}#e;contextId;requestId;log;route;custom;incomingRequestProperties;parentContext;analyticsContext;constructor({event:e,route:t=p,parentContext:r}){super(),this.requestId=crypto.randomUUID(),this.contextId=crypto.randomUUID(),this.log={info:n.console.info,log:n.console.log,debug:n.console.debug,warn:n.console.warn,error:n.console.error,setLogProperties:o(()=>{},"setLogProperties")},this.custom={},this.route=t,this.incomingRequestProperties={asn:1234,asOrganization:"ORGANIZATION",city:"Seattle",region:"Washington",regionCode:"WA",colo:"SEA",continent:"NA",country:"US",postalCode:"98004",metroCode:"SEA",latitude:void 0,longitude:void 0,timezone:void 0,httpProtocol:void 0,clientCert:void 0,clientMtlsVerificationStatus:void 0,clientMtlsVerificationReason:void 0,clientCertFingerprintSha256:void 0,clientCertNotBefore:void 0,clientCertNotAfter:void 0,clientCertIssuerDn:void 0,clientCertSubjectDn:void 0},this.parentContext=r,this.#e=e,this.analyticsContext=new l(this.requestId)}waitUntil(e){this.#e.waitUntil(e)}invokeInboundPolicy(e,t){throw new Error("Not implemented")}invokeOutboundPolicy(e,t,r){throw new Error("Not implemented")}invokeRoute(e,t){throw new Error("Not implemented")}addResponseSendingHook(e){throw new Error("Not implemented")}addResponseSendingFinalHook(e){throw new Error("Not implemented")}addEventListener(e,t,r){let d=o(i=>{try{typeof t=="function"?t(i):t.handleEvent(i)}catch(a){throw this.log.error(`Error invoking event ${e}. See following logs for details.`),a}},"wrapped");super.addEventListener(e,d,r)}};export{s as MockZuploContext,g as createMockContext};
26
26
  //# sourceMappingURL=index.js.map
@@ -2899,6 +2899,291 @@ export declare class DataDogMetricsPlugin extends MetricsPlugin {
2899
2899
  static setContext(context: ZuploContext, data: DataDogMetricsContext): void;
2900
2900
  }
2901
2901
 
2902
+ /**
2903
+ * Scans the incoming request body for sensitive data — PII, secrets, and
2904
+ * financial identifiers — using an extensible catalog of built-in recognizers
2905
+ * plus any custom patterns, and takes a configurable action when a match is
2906
+ * found.
2907
+ *
2908
+ * The action is one of `mask` (redact matches before forwarding the request),
2909
+ * `block` (reject with a `422` listing the detected entity names only), or
2910
+ * `log` (record a warning and forward unchanged). Only text content types are
2911
+ * inspected; binary bodies pass through untouched, and the body is read from a
2912
+ * clone so the upstream still receives the original stream.
2913
+ *
2914
+ * @title Data Loss Prevention
2915
+ * @product api-gateway
2916
+ * @public
2917
+ * @param request - The ZuploRequest
2918
+ * @param context - The ZuploContext
2919
+ * @param options - The policy options set in policies.json
2920
+ * @param policyName - The name of the policy as set in policies.json
2921
+ * @returns A Request or a Response
2922
+ */
2923
+ export declare const DataLossPreventionInboundPolicy: InboundPolicyHandler<DataLossPreventionInboundPolicyOptions>;
2924
+
2925
+ /**
2926
+ * The options for the Data Loss Prevention inbound policy. Scans the incoming request body for sensitive data and applies the configured action (mask, block, or log).
2927
+ * @public
2928
+ */
2929
+ export declare interface DataLossPreventionInboundPolicyOptions {
2930
+ /**
2931
+ * The detection engine. Only `builtin` (in-isolate regex + checksum detection with context-word scoring) is available today. This is the extension point for a future hosted `presidio-service` mode; declaring it now keeps adding that mode an additive, non-breaking change.
2932
+ */
2933
+ engine?: "builtin";
2934
+ /**
2935
+ * Built-in recognizer ids and/or group selectors to enable. Entity ids follow a {category}-{scope}-{name} taxonomy, and any dash-aligned id prefix acts as a selector (for example `secret` is every secret, `id-au` is Australia's identifiers, `secret-aws` is both AWS entities), plus the named groups `pii` and `region-eu`. Available selectors: `contact`, `finance`, `finance-us`, `id`, `id-au`, `id-br`, `id-ca`, `id-es`, `id-fr`, `id-in`, `id-it`, `id-nl`, `id-pl`, `id-sg`, `id-uk`, `id-us`, `network`, `pii`, `region-eu`, `secret`, `secret-aws`. When omitted, the full built-in catalog is used.
2936
+ */
2937
+ entities?: (
2938
+ | "contact"
2939
+ | "finance"
2940
+ | "finance-us"
2941
+ | "id"
2942
+ | "id-au"
2943
+ | "id-br"
2944
+ | "id-ca"
2945
+ | "id-es"
2946
+ | "id-fr"
2947
+ | "id-in"
2948
+ | "id-it"
2949
+ | "id-nl"
2950
+ | "id-pl"
2951
+ | "id-sg"
2952
+ | "id-uk"
2953
+ | "id-us"
2954
+ | "network"
2955
+ | "pii"
2956
+ | "region-eu"
2957
+ | "secret"
2958
+ | "secret-aws"
2959
+ | "contact-email"
2960
+ | "contact-phone"
2961
+ | "finance-credit-card"
2962
+ | "finance-crypto-wallet"
2963
+ | "finance-cvv"
2964
+ | "finance-iban"
2965
+ | "finance-swift-bic"
2966
+ | "finance-us-aba-routing"
2967
+ | "finance-us-bank-account"
2968
+ | "id-au-abn"
2969
+ | "id-au-acn"
2970
+ | "id-au-medicare"
2971
+ | "id-au-tfn"
2972
+ | "id-br-cpf"
2973
+ | "id-ca-sin"
2974
+ | "id-es-nif"
2975
+ | "id-fr-nir"
2976
+ | "id-in-aadhaar"
2977
+ | "id-in-pan"
2978
+ | "id-it-fiscal-code"
2979
+ | "id-nl-bsn"
2980
+ | "id-pl-pesel"
2981
+ | "id-sg-nric"
2982
+ | "id-uk-nhs"
2983
+ | "id-uk-nino"
2984
+ | "id-us-itin"
2985
+ | "id-us-passport"
2986
+ | "id-us-ssn"
2987
+ | "network-ipv4"
2988
+ | "network-ipv6"
2989
+ | "network-mac"
2990
+ | "secret-anthropic"
2991
+ | "secret-aws-access-key"
2992
+ | "secret-aws-bedrock"
2993
+ | "secret-azure-client"
2994
+ | "secret-databricks"
2995
+ | "secret-digitalocean"
2996
+ | "secret-discord-webhook"
2997
+ | "secret-github"
2998
+ | "secret-gitlab"
2999
+ | "secret-google-api-key"
3000
+ | "secret-heroku"
3001
+ | "secret-hugging-face"
3002
+ | "secret-jwt"
3003
+ | "secret-mailchimp"
3004
+ | "secret-mailgun"
3005
+ | "secret-npm"
3006
+ | "secret-openai"
3007
+ | "secret-perplexity"
3008
+ | "secret-postman"
3009
+ | "secret-private-key"
3010
+ | "secret-pypi"
3011
+ | "secret-sendgrid"
3012
+ | "secret-sentry"
3013
+ | "secret-shopify"
3014
+ | "secret-slack"
3015
+ | "secret-square"
3016
+ | "secret-stripe"
3017
+ | "secret-telegram-bot"
3018
+ | "secret-terraform"
3019
+ | "secret-twilio"
3020
+ | "secret-zuplo"
3021
+ )[];
3022
+ /**
3023
+ * Additional customer-defined regex recognizers. Invalid patterns are logged and skipped rather than failing the request.
3024
+ */
3025
+ customPatterns?: DlpCustomPattern[];
3026
+ /**
3027
+ * What to do when sensitive data is detected. `mask` redacts matches before forwarding the request, `block` rejects with a 422 listing only the detected entity names, and `log` records a warning and forwards the request unchanged.
3028
+ */
3029
+ action?: "mask" | "block" | "log";
3030
+ /**
3031
+ * The string that replaces detected values when `action` is `mask`.
3032
+ */
3033
+ mask?: string;
3034
+ /**
3035
+ * Minimum confidence (0-1) a match must reach to count as a finding. Context-dependent recognizers (for example `finance-us-bank-account` or `finance-us-aba-routing`) sit below the default threshold of 0.5 until a context word near the match boosts them above it. Lower the threshold to surface them everywhere; raise it to keep only prefix- or checksum-validated matches.
3036
+ */
3037
+ minConfidence?: number;
3038
+ /**
3039
+ * Override the set of scannable content-type prefixes. When omitted, the built-in text content-type allow-list (JSON, XML, form-encoded, text/*) is used.
3040
+ */
3041
+ contentTypes?: string[];
3042
+ }
3043
+
3044
+ /**
3045
+ * Scans the upstream response body for sensitive data — PII, secrets, and
3046
+ * financial identifiers — using an extensible catalog of built-in recognizers
3047
+ * plus any custom patterns, and takes a configurable action when a match is
3048
+ * found.
3049
+ *
3050
+ * The action is one of `mask` (redact matches before returning the response),
3051
+ * `block` (replace the response with a `422` listing the detected entity names
3052
+ * only), or `log` (record a warning and return unchanged). Only text content
3053
+ * types are inspected; binary bodies pass through untouched, and the body is
3054
+ * read from a clone so the client still receives the original stream.
3055
+ *
3056
+ * @title Data Loss Prevention
3057
+ * @product api-gateway
3058
+ * @public
3059
+ * @param response - The outgoing Response from the handler
3060
+ * @param request - The original incoming Request
3061
+ * @param context - The current context of the Request
3062
+ * @param options - The configuration options for the policy
3063
+ * @param policyName - The name of the policy as set in policies.json
3064
+ * @returns A Response
3065
+ */
3066
+ export declare const DataLossPreventionOutboundPolicy: OutboundPolicyHandler<DataLossPreventionOutboundPolicyOptions>;
3067
+
3068
+ /**
3069
+ * The options for the Data Loss Prevention outbound policy. Scans the upstream response body for sensitive data and applies the configured action (mask, block, or log).
3070
+ * @public
3071
+ */
3072
+ export declare interface DataLossPreventionOutboundPolicyOptions {
3073
+ /**
3074
+ * The detection engine. Only `builtin` (in-isolate regex + checksum detection with context-word scoring) is available today. This is the extension point for a future hosted `presidio-service` mode; declaring it now keeps adding that mode an additive, non-breaking change.
3075
+ */
3076
+ engine?: "builtin";
3077
+ /**
3078
+ * Built-in recognizer ids and/or group selectors to enable. Entity ids follow a {category}-{scope}-{name} taxonomy, and any dash-aligned id prefix acts as a selector (for example `secret` is every secret, `id-au` is Australia's identifiers, `secret-aws` is both AWS entities), plus the named groups `pii` and `region-eu`. Available selectors: `contact`, `finance`, `finance-us`, `id`, `id-au`, `id-br`, `id-ca`, `id-es`, `id-fr`, `id-in`, `id-it`, `id-nl`, `id-pl`, `id-sg`, `id-uk`, `id-us`, `network`, `pii`, `region-eu`, `secret`, `secret-aws`. When omitted, the full built-in catalog is used.
3079
+ */
3080
+ entities?: (
3081
+ | "contact"
3082
+ | "finance"
3083
+ | "finance-us"
3084
+ | "id"
3085
+ | "id-au"
3086
+ | "id-br"
3087
+ | "id-ca"
3088
+ | "id-es"
3089
+ | "id-fr"
3090
+ | "id-in"
3091
+ | "id-it"
3092
+ | "id-nl"
3093
+ | "id-pl"
3094
+ | "id-sg"
3095
+ | "id-uk"
3096
+ | "id-us"
3097
+ | "network"
3098
+ | "pii"
3099
+ | "region-eu"
3100
+ | "secret"
3101
+ | "secret-aws"
3102
+ | "contact-email"
3103
+ | "contact-phone"
3104
+ | "finance-credit-card"
3105
+ | "finance-crypto-wallet"
3106
+ | "finance-cvv"
3107
+ | "finance-iban"
3108
+ | "finance-swift-bic"
3109
+ | "finance-us-aba-routing"
3110
+ | "finance-us-bank-account"
3111
+ | "id-au-abn"
3112
+ | "id-au-acn"
3113
+ | "id-au-medicare"
3114
+ | "id-au-tfn"
3115
+ | "id-br-cpf"
3116
+ | "id-ca-sin"
3117
+ | "id-es-nif"
3118
+ | "id-fr-nir"
3119
+ | "id-in-aadhaar"
3120
+ | "id-in-pan"
3121
+ | "id-it-fiscal-code"
3122
+ | "id-nl-bsn"
3123
+ | "id-pl-pesel"
3124
+ | "id-sg-nric"
3125
+ | "id-uk-nhs"
3126
+ | "id-uk-nino"
3127
+ | "id-us-itin"
3128
+ | "id-us-passport"
3129
+ | "id-us-ssn"
3130
+ | "network-ipv4"
3131
+ | "network-ipv6"
3132
+ | "network-mac"
3133
+ | "secret-anthropic"
3134
+ | "secret-aws-access-key"
3135
+ | "secret-aws-bedrock"
3136
+ | "secret-azure-client"
3137
+ | "secret-databricks"
3138
+ | "secret-digitalocean"
3139
+ | "secret-discord-webhook"
3140
+ | "secret-github"
3141
+ | "secret-gitlab"
3142
+ | "secret-google-api-key"
3143
+ | "secret-heroku"
3144
+ | "secret-hugging-face"
3145
+ | "secret-jwt"
3146
+ | "secret-mailchimp"
3147
+ | "secret-mailgun"
3148
+ | "secret-npm"
3149
+ | "secret-openai"
3150
+ | "secret-perplexity"
3151
+ | "secret-postman"
3152
+ | "secret-private-key"
3153
+ | "secret-pypi"
3154
+ | "secret-sendgrid"
3155
+ | "secret-sentry"
3156
+ | "secret-shopify"
3157
+ | "secret-slack"
3158
+ | "secret-square"
3159
+ | "secret-stripe"
3160
+ | "secret-telegram-bot"
3161
+ | "secret-terraform"
3162
+ | "secret-twilio"
3163
+ | "secret-zuplo"
3164
+ )[];
3165
+ /**
3166
+ * Additional customer-defined regex recognizers. Invalid patterns are logged and skipped rather than failing the response.
3167
+ */
3168
+ customPatterns?: DlpCustomPattern_2[];
3169
+ /**
3170
+ * What to do when sensitive data is detected. `mask` redacts matches before returning the response, `block` replaces the response with a 422 listing only the detected entity names, and `log` records a warning and returns the response unchanged.
3171
+ */
3172
+ action?: "mask" | "block" | "log";
3173
+ /**
3174
+ * The string that replaces detected values when `action` is `mask`.
3175
+ */
3176
+ mask?: string;
3177
+ /**
3178
+ * Minimum confidence (0-1) a match must reach to count as a finding. Context-dependent recognizers (for example `finance-us-bank-account` or `finance-us-aba-routing`) sit below the default threshold of 0.5 until a context word near the match boosts them above it. Lower the threshold to surface them everywhere; raise it to keep only prefix- or checksum-validated matches.
3179
+ */
3180
+ minConfidence?: number;
3181
+ /**
3182
+ * Override the set of scannable content-type prefixes. When omitted, the built-in text content-type allow-list (JSON, XML, form-encoded, text/*) is used.
3183
+ */
3184
+ contentTypes?: string[];
3185
+ }
3186
+
2902
3187
  /**
2903
3188
  * Default function to generate Hydrolix log entries
2904
3189
  * @public
@@ -2924,6 +3209,44 @@ export declare interface DispatchRequestLoggerEntries<T> {
2924
3209
  (entries: T[]): Promise<void>;
2925
3210
  }
2926
3211
 
3212
+ declare interface DlpCustomPattern {
3213
+ /**
3214
+ * Identifier reported in findings and block details for this pattern.
3215
+ */
3216
+ name: string;
3217
+ /**
3218
+ * A JavaScript regular expression source string. Remember to escape backslashes for JSON (for example `\\d` for a digit).
3219
+ */
3220
+ pattern: string;
3221
+ /**
3222
+ * Base confidence (0-1) for matches of this pattern. The default of 0.85 is above the default detection threshold; combine a low value with `context` words for patterns that are only sensitive in context.
3223
+ */
3224
+ confidence?: number;
3225
+ /**
3226
+ * Context words that boost a match's confidence by 0.45 when one appears near the match (in the surrounding field, label, or key).
3227
+ */
3228
+ context?: string[];
3229
+ }
3230
+
3231
+ declare interface DlpCustomPattern_2 {
3232
+ /**
3233
+ * Identifier reported in findings and block details for this pattern.
3234
+ */
3235
+ name: string;
3236
+ /**
3237
+ * A JavaScript regular expression source string. Remember to escape backslashes for JSON (for example `\\d` for a digit).
3238
+ */
3239
+ pattern: string;
3240
+ /**
3241
+ * Base confidence (0-1) for matches of this pattern. The default of 0.85 is above the default detection threshold; combine a low value with `context` words for patterns that are only sensitive in context.
3242
+ */
3243
+ confidence?: number;
3244
+ /**
3245
+ * Context words that boost a match's confidence by 0.45 when one appears near the match (in the surrounding field, label, or key).
3246
+ */
3247
+ context?: string[];
3248
+ }
3249
+
2927
3250
  declare interface DynaTraceLoggingOptions {
2928
3251
  url: string;
2929
3252
  apiToken: string;
@@ -3259,6 +3582,67 @@ export declare class GoogleCloudLoggingPlugin extends LogPlugin {
3259
3582
  /* Excluded from this release type: getTransport */
3260
3583
  }
3261
3584
 
3585
+ /**
3586
+ * Reports GraphQL errors returned in response bodies to Zuplo's GraphQL
3587
+ * analytics. GraphQL servers following the standard Apollo / graphql-yoga
3588
+ * pattern return `200 OK` with an `errors[]` array in the body when an
3589
+ * operation fails, which HTTP-level analytics alone report as a success —
3590
+ * add this policy to a GraphQL route and failed operations show up as
3591
+ * failures on the GraphQL dashboard, classified by error type.
3592
+ *
3593
+ * Each error in `errors[]` is classified from its `extensions.code`
3594
+ * following the Apollo Server conventions (`GRAPHQL_PARSE_FAILED` →
3595
+ * `syntax`, `GRAPHQL_VALIDATION_FAILED` → `validation`, `UNAUTHENTICATED` /
3596
+ * `FORBIDDEN` → `auth`, timeout codes → `timeout`); custom codes can be
3597
+ * mapped with `errorCodeClassification`, and anything unrecognized falls
3598
+ * back to `defaultErrorClass` (`resolver`). Optionally set `logErrors` to
3599
+ * also write a structured warning per errored response. Bodies larger
3600
+ * than `maxResponseBytes` (default 5 MiB) are not inspected.
3601
+ *
3602
+ * The response always passes through unchanged — the body is read from a
3603
+ * clone, and any internal failure is swallowed so reporting can never
3604
+ * break the request. The route must be marked `x-graphql: true` in
3605
+ * `routes.oas.json` (which enables GraphQL analytics for the route);
3606
+ * without the marker the policy logs a warning and does nothing.
3607
+ *
3608
+ * @title GraphQL Analytics
3609
+ * @product api-gateway
3610
+ * @beta
3611
+ * @public
3612
+ * @param response - The outgoing Response from the handler
3613
+ * @param request - The original incoming Request
3614
+ * @param context - The current context of the Request
3615
+ * @param options - The configuration options for the policy
3616
+ * @param policyName - The name of the policy as set in policies.json
3617
+ * @returns A Response
3618
+ */
3619
+ export declare const GraphqlAnalyticsOutboundPolicy: OutboundPolicyHandler<GraphqlAnalyticsOutboundPolicyOptions>;
3620
+
3621
+ /**
3622
+ * The options for the GraphQL Analytics outbound policy. Reads GraphQL `errors[]` from the response body and reports them to Zuplo's GraphQL analytics.
3623
+ * @public
3624
+ */
3625
+ export declare interface GraphqlAnalyticsOutboundPolicyOptions {
3626
+ /**
3627
+ * Additional `extensions.code` → error-class mappings for codes your GraphQL server emits. Entries are merged over (and win against) the built-in Apollo-convention map (`GRAPHQL_PARSE_FAILED` → `syntax`, `GRAPHQL_VALIDATION_FAILED` / `BAD_USER_INPUT` → `validation`, `UNAUTHENTICATED` / `FORBIDDEN` → `auth`, timeout codes → `timeout`, `INTERNAL_SERVER_ERROR` → `resolver`). Keys are matched case-sensitively; built-in codes are matched case-insensitively.
3628
+ */
3629
+ errorCodeClassification?: {
3630
+ [k: string]: "syntax" | "validation" | "auth" | "timeout" | "resolver";
3631
+ };
3632
+ /**
3633
+ * The error class reported for a GraphQL error whose `extensions.code` is missing or not in the classification map.
3634
+ */
3635
+ defaultErrorClass?: "syntax" | "validation" | "auth" | "timeout" | "resolver";
3636
+ /**
3637
+ * When `true`, also write a structured warning to the request log (message, `extensions.code`, and path of each error — capped at the first 10) whenever a response contains GraphQL errors.
3638
+ */
3639
+ logErrors?: boolean;
3640
+ /**
3641
+ * Maximum response body size in bytes the policy will inspect. Larger bodies — by `Content-Length`, or measured while reading when the header is absent — pass through without being scanned, so their GraphQL errors (if any) go unreported. The default is 5 MiB.
3642
+ */
3643
+ maxResponseBytes?: number;
3644
+ }
3645
+
3262
3646
  /**
3263
3647
  * The main request handler for the Zuplo runtime. This class initializes the gateway
3264
3648
  * and handles all incoming HTTP requests through the configured pipeline.
@@ -1462,7 +1462,9 @@ export declare interface McpEntraOAuthInboundPolicyOptions {
1462
1462
  /**
1463
1463
  * Activates the MCP Gateway internal routes (OAuth authorization server,
1464
1464
  * upstream connection management, well-known metadata) on the runtime router.
1465
- * The plugin is a no-op when no MCP-related policy is present.
1465
+ * When no MCP-related policy is present the plugin registers no routes; it
1466
+ * still records `plugin.mcp-gateway` feature usage on construction so gateway
1467
+ * adoption is visible in telemetry regardless of route configuration.
1466
1468
  *
1467
1469
  * Importing from `@zuplo/runtime/mcp-gateway` is the opt-in: the runtime core
1468
1470
  * does not statically reference any MCP gateway code, so unrelated projects
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/runtime",
3
3
  "type": "module",
4
- "version": "6.70.69",
4
+ "version": "6.70.71",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {
@@ -1,3 +1,17 @@
1
+ ## 8.17.0 (2026-06-11)
2
+
3
+ ### New features
4
+
5
+ The new `strict` option can be used to start script sources in strict mode.
6
+
7
+ ### Bug fixes
8
+
9
+ Fix a number of corner case bugs when `using` or `await using` appear in `for` loop specs.
10
+
11
+ Disallow `new super()` expressions.
12
+
13
+ Don't allow the conditional in a ternary expression to be a (naked) arrow function.
14
+
1
15
  ## 8.16.0 (2026-02-19)
2
16
 
3
17
  ### New features
@@ -86,6 +86,9 @@ required):
86
86
  will be valid, even if `ecmaVersion` is less than 6. If set to `"commonjs"`,
87
87
  it is the same as `"script"` except that the top-level scope behaves like a function.
88
88
 
89
+ - **strict**: When set to true, enable strict parsing mode even if
90
+ `sourceType` is `"script"`.
91
+
89
92
  - **onInsertedSemicolon**: If given a callback, that callback will be
90
93
  called whenever a missing semicolon is inserted by the parser. The
91
94
  callback will be given the character offset of the point where the
@@ -619,6 +619,12 @@ export interface Options {
619
619
  */
620
620
  sourceType?: "script" | "module" | "commonjs"
621
621
 
622
+ /**
623
+ * When set to true, enable strict parsing mode even if `sourceType`
624
+ * is `"script"`.
625
+ */
626
+ strict?: boolean
627
+
622
628
  /**
623
629
  * a callback that will be called when a semicolon is automatically inserted.
624
630
  * @param lastTokEnd the position of the comma as an offset
@@ -619,6 +619,12 @@ export interface Options {
619
619
  */
620
620
  sourceType?: "script" | "module" | "commonjs"
621
621
 
622
+ /**
623
+ * When set to true, enable strict parsing mode even if `sourceType`
624
+ * is `"script"`.
625
+ */
626
+ strict?: boolean
627
+
622
628
  /**
623
629
  * a callback that will be called when a semicolon is automatically inserted.
624
630
  * @param lastTokEnd the position of the comma as an offset