@wenathlan/extension 1.1.60 → 1.1.61

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/index.js CHANGED
@@ -2178,6 +2178,73 @@ function exportrunstate(states, now) {
2178
2178
  };
2179
2179
  }
2180
2180
 
2181
+ // immutablelog.ts
2182
+ async function sha2562(payload) {
2183
+ const bytes = new TextEncoder().encode(payload);
2184
+ const digest = await crypto.subtle.digest("SHA-256", bytes);
2185
+ return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
2186
+ }
2187
+ function entrybody(entry) {
2188
+ return JSON.stringify({ id: entry.id, runid: entry.runid, kind: entry.kind, summary: entry.summary, origin: entry.origin, ...entry.stepid !== void 0 ? { stepid: entry.stepid } : {}, at: entry.at });
2189
+ }
2190
+ async function entryhashof(input) {
2191
+ return { previous: input.previous, current: await sha2562(`${input.previous}
2192
+ ${entrybody(input.entry)}`), algorithm: "sha-256" };
2193
+ }
2194
+ async function logentryof(input) {
2195
+ if (input.summary.trim() === "") throw new Error("The log entry needs its summary in plain language.");
2196
+ if (input.origin.trim() === "") throw new Error("The log entry needs its origin provenance.");
2197
+ const entry = { id: input.id ?? randomid(), runid: input.runid, kind: input.kind, summary: input.summary, origin: input.origin, ...input.stepid !== void 0 ? { stepid: input.stepid } : {}, at: input.at };
2198
+ return { ...entry, hash: await entryhashof({ previous: input.previous, entry }) };
2199
+ }
2200
+ function openrunlog(input) {
2201
+ if (input.runid.trim() === "" || input.sessionid.trim() === "") throw new Error("The run log needs its run and session ids.");
2202
+ return { runid: input.runid, sessionid: input.sessionid, entries: [], updatedat: input.now };
2203
+ }
2204
+ function lasthashof(log) {
2205
+ const entry = log.entries[log.entries.length - 1];
2206
+ return entry === void 0 ? "0".repeat(64) : entry.hash.current;
2207
+ }
2208
+ async function appendlogentry(input) {
2209
+ if (input.log.seal !== void 0) throw new Error(`The run log of ${input.log.runid} sealed at ${input.log.seal.sealedat} and accepts no append; the seal is terminal.`);
2210
+ const entry = await logentryof({ ...input.id !== void 0 ? { id: input.id } : {}, runid: input.log.runid, kind: input.kind, summary: input.summary, origin: input.origin, ...input.stepid !== void 0 ? { stepid: input.stepid } : {}, at: input.at, previous: lasthashof(input.log) });
2211
+ return { ...input.log, entries: [...input.log.entries, entry], updatedat: input.at };
2212
+ }
2213
+ async function sealrunlog(log, now) {
2214
+ if (log.seal !== void 0) throw new Error(`The run log of ${log.runid} already sealed at ${log.seal.sealedat}; the seal is terminal.`);
2215
+ if (log.entries.length === 0) throw new Error("The run log seals at completion with at least one entry.");
2216
+ const sealhash = await entryhashof({ previous: lasthashof(log), entry: { id: `seal:${log.runid}`, runid: log.runid, kind: "seal", summary: `The run ${log.runid} completed and the log sealed with ${log.entries.length} entries.`, origin: log.entries[log.entries.length - 1]?.origin ?? log.runid, at: now } });
2217
+ const seal = { runid: log.runid, entries: log.entries.length, sealhash, sealedat: now };
2218
+ return { log: { ...log, seal, updatedat: now }, seal };
2219
+ }
2220
+ async function verifylogchain(entries) {
2221
+ let previous = "0".repeat(64);
2222
+ for (let index = 0; index < entries.length; index += 1) {
2223
+ const entry = entries[index];
2224
+ if (entry === void 0) continue;
2225
+ if (entry.hash.previous !== previous) return { valid: false, brokenat: index, reason: `The chain link of entry ${index} carries the previous hash ${entry.hash.previous} while its predecessor hashes to ${previous}; the chain reports tamper evidence.` };
2226
+ const expected = await entryhashof({ previous, entry: { id: entry.id, runid: entry.runid, kind: entry.kind, summary: entry.summary, origin: entry.origin, ...entry.stepid !== void 0 ? { stepid: entry.stepid } : {}, at: entry.at } });
2227
+ if (entry.hash.current !== expected.current) return { valid: false, brokenat: index, reason: `The entry hash of entry ${index} matches neither its body nor its predecessor hash; the chain reports tamper evidence.` };
2228
+ previous = entry.hash.current;
2229
+ }
2230
+ return { valid: true, reason: `The hash chain of ${entries.length} entr${entries.length === 1 ? "y" : "ies"} verifies from the genesis hash to the last entry.` };
2231
+ }
2232
+ async function readverifiedlog(log) {
2233
+ const verification = await verifylogchain(log.entries);
2234
+ if (!verification.valid) return { ok: false, entries: [], reason: verification.reason };
2235
+ return { ok: true, entries: [...log.entries], reason: verification.reason };
2236
+ }
2237
+ async function chainreportof(log) {
2238
+ const verification = await verifylogchain(log.entries);
2239
+ if (!verification.valid) return { runid: log.runid, valid: false, entries: log.entries.length, ...verification.brokenat !== void 0 ? { brokenat: verification.brokenat } : {}, reason: verification.reason };
2240
+ return { runid: log.runid, valid: true, entries: log.entries.length, reason: verification.reason, ...log.seal !== void 0 ? { sealhash: log.seal.sealhash.current, sealedat: log.seal.sealedat } : {} };
2241
+ }
2242
+ async function exportlogchain(log) {
2243
+ const read = await readverifiedlog(log);
2244
+ if (!read.ok) return { runid: log.runid, entries: 0, chainvalid: false, reason: read.reason, log: [] };
2245
+ return { runid: log.runid, entries: read.entries.length, chainvalid: true, reason: read.reason, ...log.seal !== void 0 ? { sealhash: log.seal.sealhash.current, sealedat: log.seal.sealedat } : {}, log: read.entries };
2246
+ }
2247
+
2181
2248
  // memory.ts
2182
2249
  var sessionmemory = class {
2183
2250
  constructor(adapter) {
@@ -4637,6 +4704,139 @@ var sessionmemory = class {
4637
4704
  async exportrunstates() {
4638
4705
  return exportrunstate(await this.listrunstates(), Date.now());
4639
4706
  }
4707
+ /**
4708
+ * Security part one persistence of the 1.1.61 family.
4709
+ * The trust boundary records live here: the per origin automation allowlist scoped per profile workspace with one exact origin per entry, the per site originprofiles with their kind grants and denials, the active consentwindows with their expiry timestamps that expire closed past their boundary, the mid run revokerun events with the halted step ids that stay visible for later consent prompts, the fresh class consents per origin, the mask rules for field shapes per origin, and the sealed immutable run logs with their final hash.
4710
+ * The run log store exposes no update or delete path: appends land whole, the seal closes a log with its final hash and the read path verifies the chain before returning a single entry so a broken link refuses the read.
4711
+ * The adapter seam keeps every accessor a one line storage delegation so a future append only backend replaces the adapter only; the current storage areas offer no append only hardware, so the honest derivation is the hash chain that makes any rewrite detectable at read time.
4712
+ */
4713
+ /** Replaces the per origin automation allowlist of the profile workspaces; every entry carries one exact origin with no wildcard expansion. */
4714
+ async setautomationallowlist(entries) {
4715
+ return this.adapter.set("automationallowlist", entries);
4716
+ }
4717
+ /** Returns the per origin automation allowlist entries, oldest grant first. */
4718
+ async getautomationallowlist() {
4719
+ return await this.adapter.get("automationallowlist") ?? [];
4720
+ }
4721
+ /** Adds one exact origin to the automation allowlist of a profile workspace; a duplicate origin keeps its first grant. */
4722
+ async addallowlistorigin(entry) {
4723
+ const entries = await this.getautomationallowlist();
4724
+ if (entries.some((candidate) => candidate.origin === entry.origin && candidate.profileid === entry.profileid)) return;
4725
+ await this.setautomationallowlist([...entries, entry]);
4726
+ }
4727
+ /** Removes one origin from the automation allowlist; the denydefault posture refuses the origin again after the removal. */
4728
+ async removeallowlistorigin(origin, profileid) {
4729
+ await this.setautomationallowlist((await this.getautomationallowlist()).filter((entry) => !(entry.origin === origin && entry.profileid === profileid)));
4730
+ }
4731
+ /** Replaces the per site origin profiles with their kind grants and denials; one profile per origin. */
4732
+ async setoriginprofiles(profiles) {
4733
+ return this.adapter.set("originprofiles", profiles);
4734
+ }
4735
+ /** Returns the stored per site origin profiles, oldest update first. */
4736
+ async getoriginprofiles() {
4737
+ return await this.adapter.get("originprofiles") ?? [];
4738
+ }
4739
+ /** Upserts one origin profile: a profile of the same origin replaces its grants and denials while a new origin joins the list. */
4740
+ async saveoriginprofile(profile) {
4741
+ const profiles = await this.getoriginprofiles();
4742
+ await this.setoriginprofiles(profiles.some((candidate) => candidate.origin === profile.origin) ? profiles.map((candidate) => candidate.origin === profile.origin ? profile : candidate) : [...profiles, profile]);
4743
+ }
4744
+ /** Replaces the consent windows; active windows keep their expiry timestamps and closed windows stay for the audit trail. */
4745
+ async setconsentwindows(windows) {
4746
+ return this.adapter.set("consentwindows", windows);
4747
+ }
4748
+ /** Returns the stored consent windows, newest start first. */
4749
+ async getconsentwindows() {
4750
+ return await this.adapter.get("consentwindows") ?? [];
4751
+ }
4752
+ /** Expires every consent window past its duration boundary: the closed windows keep their records while their grants bind no step anymore. */
4753
+ async expireconsentwindows(now) {
4754
+ const windows = await this.getconsentwindows();
4755
+ const expired = windows.map((window) => window.state === "active" && now >= window.expiresat ? { ...window, state: "closed", closedat: now } : window);
4756
+ await this.setconsentwindows(expired);
4757
+ return expired;
4758
+ }
4759
+ /** Records one mid run revocation with its halted step ids; the history stays visible for later consent prompts. */
4760
+ async addrevocation(event) {
4761
+ await this.adapter.set("revocations", [event, ...await this.adapter.get("revocations") ?? []].slice(0, 500));
4762
+ }
4763
+ /** Returns the recorded mid run revocations with their halted step ids, newest first. */
4764
+ async getrevocations() {
4765
+ return await this.adapter.get("revocations") ?? [];
4766
+ }
4767
+ /** Replaces the fresh class consents per origin. */
4768
+ async setclassconsents(consents) {
4769
+ return this.adapter.set("classconsents", consents);
4770
+ }
4771
+ /** Returns the fresh class consents per origin, newest grant first. */
4772
+ async getclassconsents() {
4773
+ return await this.adapter.get("classconsents") ?? [];
4774
+ }
4775
+ /** Records one fresh class consent per origin; the prompt of one class never widens another class. */
4776
+ async addclassconsent(consent) {
4777
+ const consents = (await this.getclassconsents()).filter((candidate) => !(candidate.origin === consent.origin && candidate.sensitiveclass === consent.sensitiveclass));
4778
+ await this.setclassconsents([consent, ...consents]);
4779
+ }
4780
+ /** Replaces the mask rules for sensitive field shapes per origin. */
4781
+ async setmaskrules(rules) {
4782
+ return this.adapter.set("maskrules", rules);
4783
+ }
4784
+ /** Returns the stored mask rules for sensitive field shapes per origin, oldest rule first. */
4785
+ async getmaskrules() {
4786
+ return await this.adapter.get("maskrules") ?? [];
4787
+ }
4788
+ /** Adds one mask rule for field shapes, optionally scoped to one origin. */
4789
+ async addmaskrule(rule) {
4790
+ await this.setmaskrules([...await this.getmaskrules(), rule]);
4791
+ }
4792
+ /** Removes one mask rule by its id. */
4793
+ async removemaskrule(id) {
4794
+ await this.setmaskrules((await this.getmaskrules()).filter((rule) => rule.id !== id));
4795
+ }
4796
+ /** Stores the whole run log of one run: the append lands in one storage transaction so the entries and their chain links persist together. */
4797
+ async setimmutablelog(log) {
4798
+ return this.adapter.set(`immutablelog:${log.runid}`, log);
4799
+ }
4800
+ /** Returns the stored run log of one run; an absent log returns undefined. */
4801
+ async getimmutablelog(runid) {
4802
+ return this.adapter.get(`immutablelog:${runid}`);
4803
+ }
4804
+ /** Lists the stored run logs, oldest update first, with the sealed logs carrying their final hash. */
4805
+ async listimmutablelogs() {
4806
+ const index = await this.adapter.get("immutablelogindex") ?? [];
4807
+ const logs = [];
4808
+ for (const runid of index) {
4809
+ const log = await this.getimmutablelog(runid);
4810
+ if (log) logs.push(log);
4811
+ }
4812
+ return logs.sort((one, two) => one.updatedat - two.updatedat);
4813
+ }
4814
+ /** Stores the run log index entry of one run so the log listing reads every stored log. */
4815
+ async trackimmutablelog(runid) {
4816
+ const index = await this.adapter.get("immutablelogindex") ?? [];
4817
+ if (!index.includes(runid)) await this.adapter.set("immutablelogindex", [...index, runid]);
4818
+ }
4819
+ /** Exports the verified log chain of one run for the audit file: the read path verifies the whole hash chain first and a broken link refuses the export with no entries served. */
4820
+ async exportverifiedrunlog(runid) {
4821
+ const log = await this.getimmutablelog(runid);
4822
+ if (!log) throw new Error(`No run log exists for the run ${runid}.`);
4823
+ return exportlogchain(log);
4824
+ }
4825
+ /** Expires the sealed run logs past the user configured retention: the entries reduce to their chain summaries while the seal hash always survives. */
4826
+ async expireimmutablelogs(retention, now) {
4827
+ const logs = await this.listimmutablelogs();
4828
+ if (retention === void 0) return logs;
4829
+ const kept = [];
4830
+ for (const log of logs) {
4831
+ if (log.seal !== void 0 && now - log.seal.sealedat > retention) {
4832
+ const summary = { runid: log.runid, sessionid: log.sessionid, entries: [], seal: { ...log.seal, entries: log.seal.entries }, updatedat: now };
4833
+ await this.setimmutablelog(summary);
4834
+ } else {
4835
+ kept.push(log);
4836
+ }
4837
+ }
4838
+ return kept;
4839
+ }
4640
4840
  };
4641
4841
  function mediakindof(record2) {
4642
4842
  if ("pages" in record2) return "pdf";
@@ -5839,6 +6039,144 @@ async function callgraphql(input) {
5839
6039
  }
5840
6040
  }
5841
6041
 
6042
+ // originpolicy.ts
6043
+ var denydefaultposture = "denydefault";
6044
+ function exactorigin(origin, entry) {
6045
+ return origin.trim() !== "" && origin === entry;
6046
+ }
6047
+ function wildcardentry(entry) {
6048
+ return entry.includes("*") || entry.includes("://*.") || entry.trim() === "" || entry.trim() === "https://" || entry.trim() === "http://";
6049
+ }
6050
+ function allowlistcheck(input) {
6051
+ if (input.origin.trim() === "") return { allowed: false, reason: "The step needs the exact origin it targets." };
6052
+ for (const entry of input.allowlist) {
6053
+ if (wildcardentry(entry.origin)) return { allowed: false, reason: `The allowlist entry ${entry.origin} carries a wildcard; every grant binds to one exact origin with no wildcard expansion.` };
6054
+ }
6055
+ const scoped = input.profileid === void 0 ? input.allowlist : input.allowlist.filter((entry) => entry.profileid === input.profileid);
6056
+ const granted = scoped.some((entry) => exactorigin(input.origin, entry.origin));
6057
+ if (granted) return { allowed: true, reason: `The origin ${input.origin} sits inside the automation allowlist the user granted.` };
6058
+ if (input.sessionorigin !== void 0 && exactorigin(input.origin, input.sessionorigin)) return { allowed: true, reason: `The active tab grant covers ${input.origin} as exactly one explicit single origin grant.` };
6059
+ return { allowed: false, reason: `The denydefault posture refuses ${input.origin} because the origin sits absent from the automation allowlist; grant the origin first.` };
6060
+ }
6061
+ function originprofileof(input) {
6062
+ if (input.origin.trim() === "") throw new Error("The origin profile needs its exact origin.");
6063
+ return { profileid: input.profileid ?? randomid(), origin: input.origin, grants: [...input.grants ?? []], denials: [...input.denials ?? []], createdat: input.now, updatedat: input.now };
6064
+ }
6065
+ function profilekind(input) {
6066
+ if (input.profile.grants.includes(input.kind) && input.decision === "grant") return input.profile;
6067
+ if (input.profile.denials.includes(input.kind) && input.decision === "deny") return input.profile;
6068
+ const grants = input.decision === "grant" ? [.../* @__PURE__ */ new Set([...input.profile.grants, input.kind])] : input.profile.grants.filter((kind) => kind !== input.kind);
6069
+ const denials = input.decision === "deny" ? [.../* @__PURE__ */ new Set([...input.profile.denials, input.kind])] : input.profile.denials.filter((kind) => kind !== input.kind);
6070
+ return { ...input.profile, grants, denials, updatedat: input.now };
6071
+ }
6072
+ function profilegrade(input) {
6073
+ if (!input.sensitive) return { allowed: true, consult: false, reason: `The ${input.kind} kind grades non-sensitive and the origin profile needs no consult.` };
6074
+ if (input.profile === void 0) return { allowed: true, consult: true, reason: `No origin profile exists for the ${input.kind} kind, so the fresh class consent gate alone routes the sensitive step.` };
6075
+ if (input.profile.denials.includes(input.kind)) return { allowed: false, consult: true, reason: `The origin profile of ${input.profile.origin} denies the ${input.kind} kind; a denied kind never runs on that origin.` };
6076
+ if (input.profile.grants.includes(input.kind)) return { allowed: true, consult: true, reason: `The origin profile of ${input.profile.origin} grants the ${input.kind} kind the user reviewed.` };
6077
+ return { allowed: true, consult: true, reason: `The origin profile of ${input.profile.origin} carries no ${input.kind} decision, so the fresh class consent gate alone routes the sensitive step.` };
6078
+ }
6079
+ function stepoptions(step) {
6080
+ if (!step.options) return {};
6081
+ try {
6082
+ const parsed = JSON.parse(step.options);
6083
+ return Boolean(parsed) && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
6084
+ } catch {
6085
+ return {};
6086
+ }
6087
+ }
6088
+ var paymentkinds = /* @__PURE__ */ new Set(["fillcard", "fillcode"]);
6089
+ var credentialkinds = /* @__PURE__ */ new Set(["consentpassword", "saveapikey", "handleauth", "authflow"]);
6090
+ var deletekinds = /* @__PURE__ */ new Set(["discardtab", "closepattern", "clearcookies", "removeattribute", "cleanupartifacts"]);
6091
+ var publishkinds = /* @__PURE__ */ new Set(["postform", "postfiles", "sendmessage", "submitform", "submitsearch", "writeclipboard"]);
6092
+ var defaultsensitivekinds = /* @__PURE__ */ new Set(["attachfile", "uploadfile", "uploadfiles", "downloadfile", "downloadimages", "batchdownload", "pausedownload", "resumedownload", "quarantinedownload", "evaluate"]);
6093
+ function sensitiveclassesof(step) {
6094
+ const options = stepoptions(step);
6095
+ const fields = Array.isArray(options.fields) ? options.fields.filter((item) => Boolean(item) && typeof item === "object") : [];
6096
+ const names = [...fields.map((field) => typeof field.name === "string" ? field.name : ""), typeof options.field === "string" ? options.field : "", typeof options.target === "string" ? options.target : ""].map((name) => name.toLowerCase());
6097
+ const carries = (shape) => names.some((name) => name.includes(shape));
6098
+ const classes = /* @__PURE__ */ new Set();
6099
+ if (paymentkinds.has(step.kind) || carries("card") || carries("cvc") || carries("cvv")) classes.add("payment");
6100
+ const credentialshape = carries("password") || carries("token") || carries("secret") || carries("apikey") || carries("passphrase");
6101
+ const submits = step.kind === "submitform" || step.kind === "postform" || step.kind === "submitsearch" || step.kind === "fillform" || step.kind === "filllabel" || step.kind === "fillplaceholder";
6102
+ if (credentialkinds.has(step.kind) || submits && credentialshape) classes.add("credential");
6103
+ if (deletekinds.has(step.kind)) classes.add("delete");
6104
+ if (publishkinds.has(step.kind) || step.kind === "callrest" || step.kind === "callgraphql") {
6105
+ const verb = typeof options.method === "string" ? options.method.trim().toUpperCase() : typeof options.verb === "string" ? options.verb.trim().toUpperCase() : "";
6106
+ if (step.kind === "callrest" || step.kind === "callgraphql") {
6107
+ if (verb !== "" && !["GET", "HEAD", "OPTIONS"].includes(verb)) classes.add("publish");
6108
+ } else classes.add("publish");
6109
+ }
6110
+ const bydefault = defaultsensitivekinds.has(step.kind);
6111
+ const list = [...classes];
6112
+ if (list.length === 0 && !bydefault) return { classes: [], bydefault: false, sensitive: false, reason: `The ${step.kind} kind carries no sensitive class and no default sensitive grade.` };
6113
+ return { classes: list, bydefault, sensitive: true, reason: `The ${step.kind} kind grades sensitive${list.length > 0 ? ` through the ${list.join(", ")} class${list.length === 1 ? "" : "es"}` : ""}${bydefault ? " by default" : ""}.` };
6114
+ }
6115
+ function classconsentcovers(consents, origin, sensitiveclass, now) {
6116
+ return consents.some((consent) => consent.origin === origin && consent.sensitiveclass === sensitiveclass && consent.grantedat <= now && (consent.expiresat === void 0 || now < consent.expiresat));
6117
+ }
6118
+ function missingclassconsents(input) {
6119
+ const missing = input.classes.filter((kind) => !classconsentcovers(input.consents, input.origin, kind, input.now));
6120
+ if (missing.length > 0) return { needed: true, missing, reason: `The sensitive classes ${missing.join(", ")} need one fresh consent prompt each on ${input.origin}.` };
6121
+ if (input.bydefault && input.classes.length === 0) return { needed: true, missing: [], reason: `The ${input.origin} step grades sensitive by default and needs its fresh consent window prompt.` };
6122
+ return { needed: false, missing: [], reason: `The fresh class consents of ${input.origin} cover every class the step names.` };
6123
+ }
6124
+ function openconsentwindow(input) {
6125
+ if (input.sessionid.trim() === "" || input.origin.trim() === "") throw new Error("The consent window needs its session and its exact origin.");
6126
+ if (!Number.isFinite(input.duration) || input.duration <= 0) throw new Error("The consent window needs its duration as a positive user value; no window defaults to unlimited.");
6127
+ return { id: input.id ?? randomid(), sessionid: input.sessionid, origin: input.origin, startedat: input.now, duration: input.duration, expiresat: input.now + input.duration, boundary: input.boundary?.trim() !== "" && input.boundary !== void 0 ? input.boundary : `${input.duration} milliseconds the user chose`, kinds: [...new Set(input.kinds)], state: "active" };
6128
+ }
6129
+ function consentwindowstate(window, now) {
6130
+ if (window.state === "closed" || now >= window.expiresat) return { state: "expired", remaining: 0, reason: `The consent window of ${window.origin} closed at its ${window.boundary} boundary; the run suspends until a new explicit prompt renews it.` };
6131
+ return { state: "active", remaining: window.expiresat - now, reason: `The consent window of ${window.origin} stays active with ${window.expiresat - now} milliseconds left of its ${window.boundary} boundary.` };
6132
+ }
6133
+ function windowgatesstep(input) {
6134
+ if (input.window === void 0) return { allowed: false, suspended: false, reason: `No active consent window covers ${input.origin}; the consent prompt opens one before any step dispatches.` };
6135
+ if (input.window.sessionid !== input.sessionid) return { allowed: false, suspended: false, reason: `The consent window scopes to the session ${input.window.sessionid} only and never widens to another session.` };
6136
+ if (input.window.origin !== input.origin) return { allowed: false, suspended: false, reason: `The consent window scopes to the origin ${input.window.origin} only and never widens to another origin.` };
6137
+ const state = consentwindowstate(input.window, input.now);
6138
+ if (state.state === "expired") return { allowed: false, suspended: true, reason: state.reason };
6139
+ return { allowed: true, suspended: false, reason: state.reason };
6140
+ }
6141
+ function expireconsentwindows(windows, now) {
6142
+ return windows.map((window) => window.state === "active" && now >= window.expiresat ? { ...window, state: "closed", closedat: now } : window);
6143
+ }
6144
+ function renewconsentwindow(input) {
6145
+ const closed = input.window.state === "active" ? { ...input.window, state: "closed", closedat: input.now } : input.window;
6146
+ const renewed = openconsentwindow({ sessionid: input.window.sessionid, origin: input.window.origin, duration: input.duration, kinds: input.kinds.length > 0 ? input.kinds : input.window.kinds, now: input.now });
6147
+ return { renewed, closed };
6148
+ }
6149
+ function revokerun(input) {
6150
+ if (input.sessionid.trim() === "" || input.runid.trim() === "") throw new Error("The revocation needs its session and run ids.");
6151
+ if (input.actor.trim() === "") throw new Error("The revocation names the acting user.");
6152
+ const halted = [...input.pendingstepid !== void 0 ? [input.pendingstepid] : [], ...input.queuedstepids ?? []];
6153
+ if (halted.length === 0) throw new Error("The revocation halts at least the pending step of the run.");
6154
+ return { id: input.id ?? randomid(), sessionid: input.sessionid, runid: input.runid, haltedstepids: halted, actor: input.actor, reason: input.reason?.trim() !== "" && input.reason !== void 0 ? input.reason : "The user revoked the consent mid run.", at: input.now };
6155
+ }
6156
+ function haltedstepsof(revocation) {
6157
+ return { ...revocation.haltedstepids.length > 0 ? { pending: revocation.haltedstepids[0] } : {}, queued: revocation.haltedstepids.slice(1) };
6158
+ }
6159
+ function scopegrantof(input) {
6160
+ if (input.origin.trim() === "") throw new Error("The consent scope needs its exact origin.");
6161
+ if (input.kinds.length === 0) throw new Error("The consent scope names the kinds it covers.");
6162
+ if (input.boundary.trim() === "") throw new Error("The consent scope names its boundary; no grant defaults to unlimited.");
6163
+ return { origin: input.origin, kinds: [...new Set(input.kinds)], boundary: input.boundary, grantedat: input.now };
6164
+ }
6165
+ function deniedevidenceof(input) {
6166
+ return { origin: input.origin, kind: input.kind, reason: input.reason, at: input.now };
6167
+ }
6168
+ function consentprompttext(input) {
6169
+ const label = input.classes.length > 0 ? `the ${input.classes.join(" and ")} class${input.classes.length === 1 ? "" : "es"}` : "a sensitive by default grade";
6170
+ return `Allow the ${input.kind} step on ${input.origin} graded as ${label} for ${input.duration} milliseconds? The consent window closes at that boundary; no grant ever defaults to unlimited.`;
6171
+ }
6172
+ function denydefaultnotice(origin) {
6173
+ return `The denydefault posture refuses ${origin} until the user adds the origin to the automation allowlist; no step dispatches without the grant.`;
6174
+ }
6175
+ function profilesummary(profile) {
6176
+ if (profile === void 0) return "No origin profile exists for this origin yet; sensitive steps route through their fresh consent prompts.";
6177
+ return `The origin profile of ${profile.origin} grants ${profile.grants.length} kind${profile.grants.length === 1 ? "" : "s"} and denies ${profile.denials.length} kind${profile.denials.length === 1 ? "" : "s"} the user reviewed.`;
6178
+ }
6179
+
5842
6180
  // socketbus.ts
5843
6181
  var socketkinds = ["opensocket", "sendmessage", "waitmessage", "subscribesse", "longpoll"];
5844
6182
  function channelorigin(url) {
@@ -10217,6 +10555,50 @@ function sandboxorigingate(input) {
10217
10555
  function environmentrequirements() {
10218
10556
  return environmentrequirementsof([...allowedactions]);
10219
10557
  }
10558
+ function automationallowlistgate(input) {
10559
+ const verdict = allowlistcheck({ origin: input.origin, allowlist: input.allowlist, ...input.session !== void 0 ? { sessionorigin: input.session.origin } : {} });
10560
+ if (!verdict.allowed) return { allowed: false, reason: verdict.reason };
10561
+ return { allowed: true, reason: verdict.reason };
10562
+ }
10563
+ function originprofilegate(input) {
10564
+ const verdict = profilegrade(input);
10565
+ if (!verdict.allowed) return { allowed: false, reason: verdict.reason };
10566
+ return { allowed: true, reason: verdict.reason };
10567
+ }
10568
+ function consentwindowgate(input) {
10569
+ if (!input.sensitive) return { allowed: true, reason: "The non-sensitive step rides the session origin grants and needs no consent window of its own." };
10570
+ const verdict = windowgatesstep({ window: input.window, sessionid: input.sessionid, origin: input.origin, now: input.now });
10571
+ if (!verdict.allowed) return { allowed: false, reason: verdict.reason };
10572
+ return { allowed: true, reason: verdict.reason };
10573
+ }
10574
+ function revokerungate(input) {
10575
+ if (input.revocation === void 0) return { allowed: true, reason: "No revocation halted the run; the steps keep their reviewed order." };
10576
+ if (input.revocation.sessionid !== input.sessionid) return { allowed: true, reason: "The revocation belongs to another session and halts nothing here." };
10577
+ if (input.revocation.runid !== input.runid) return { allowed: true, reason: "The revocation belongs to another run and halts nothing here." };
10578
+ return { allowed: false, reason: `The revocation of ${input.revocation.actor} halted the pending step and ${Math.max(0, input.revocation.haltedstepids.length - 1)} queued step${Math.max(0, input.revocation.haltedstepids.length - 1) === 1 ? "" : "s"} without executing them: ${input.revocation.haltedstepids.join(", ")}.` };
10579
+ }
10580
+ function sensitiveclassgate(input) {
10581
+ if (!input.sensitive) return { allowed: true, reason: "The step carries no sensitive class and needs no fresh consent prompt." };
10582
+ const verdict = missingclassconsents({ origin: input.origin, classes: input.classes, bydefault: input.bydefault, consents: input.consents, now: input.now });
10583
+ if (verdict.needed) return { allowed: false, reason: verdict.reason };
10584
+ return { allowed: true, reason: verdict.reason };
10585
+ }
10586
+ function consentdurationvalid(duration) {
10587
+ if (!Number.isFinite(duration) || duration <= 0) return { allowed: false, reason: "The consent window duration stays a positive user value in milliseconds; no grant ever defaults to unlimited." };
10588
+ return { allowed: true, reason: `The consent window duration ${duration} milliseconds stays the user configured boundary the prompt names.` };
10589
+ }
10590
+ function logreadgate(input) {
10591
+ if (!input.valid) return { allowed: false, reason: input.brokenat !== void 0 ? `The log chain breaks at entry ${input.brokenat}; the audit accessor refuses the read of a forged record.` : "The log chain fails its verification; the audit accessor refuses the read of a forged record." };
10592
+ return { allowed: true, reason: "The log chain verifies from the genesis hash to the last entry; the audit accessor serves the entries." };
10593
+ }
10594
+ function sensitivepipelingate(input) {
10595
+ const classification = sensitiveclassesof(input.step);
10596
+ const profileverdict = originprofilegate({ profile: input.profile, kind: input.step.kind, sensitive: classification.sensitive });
10597
+ if (!profileverdict.allowed) return { allowed: false, reason: profileverdict.reason ?? "" };
10598
+ const consentverdict = sensitiveclassgate({ origin: input.origin, classes: classification.classes, bydefault: classification.bydefault, sensitive: classification.sensitive, consents: input.consents, now: input.now });
10599
+ if (!consentverdict.allowed) return { allowed: false, reason: `${classification.reason} ${consentverdict.reason}` };
10600
+ return { allowed: true, reason: `${classification.reason} ${consentverdict.reason}` };
10601
+ }
10220
10602
 
10221
10603
  // llm.ts
10222
10604
  var defaultrefusalmarkers = ["i cannot", "i can't", "i'm unable", "refusal:", "cannot comply"];
@@ -10577,7 +10959,7 @@ function budgetcheck(input) {
10577
10959
  }
10578
10960
 
10579
10961
  // version.ts
10580
- var packageversion = "1.1.60";
10962
+ var packageversion = "1.1.61";
10581
10963
 
10582
10964
  // types.ts
10583
10965
  var protocolversion = packageversion;
@@ -11173,6 +11555,79 @@ function streamsummaries(raw) {
11173
11555
  });
11174
11556
  }
11175
11557
 
11558
+ // maskinputs.ts
11559
+ var defaultmaskshapes = ["password", "token", "card", "secret"];
11560
+ var maskmarker = "[redacted]";
11561
+ function fieldshapekind(name) {
11562
+ const lowered = name.toLowerCase();
11563
+ if (lowered.includes("password") || lowered.includes("passwd") || lowered.includes("pwd") || lowered.includes("passphrase")) return "password";
11564
+ if (lowered.includes("token") || lowered.includes("apikey") || lowered.includes("api_key") || lowered.includes("auth") || lowered.includes("bearer")) return "token";
11565
+ if (lowered.includes("card") || lowered.includes("cvc") || lowered.includes("cvv") || lowered.includes("expiry") || lowered.includes("pan")) return "card";
11566
+ if (lowered.includes("secret")) return "secret";
11567
+ return void 0;
11568
+ }
11569
+ function shapesof(input) {
11570
+ const shapes = new Set(defaultmaskshapes);
11571
+ for (const shape of input.settings?.maskshapes ?? []) if (shape.trim() !== "") shapes.add(shape.trim().toLowerCase());
11572
+ for (const rule of input.rules) {
11573
+ const scoped = rule.origin === void 0 || rule.origin === "" || input.origin !== void 0 && rule.origin === input.origin;
11574
+ if (scoped) {
11575
+ for (const shape of rule.shapes) if (shape.trim() !== "") shapes.add(shape.trim().toLowerCase());
11576
+ }
11577
+ }
11578
+ return [...shapes];
11579
+ }
11580
+ function maskingfield(name, shapes) {
11581
+ if (fieldshapekind(name) !== void 0) return true;
11582
+ const lowered = name.toLowerCase();
11583
+ return shapes.some((shape) => shape !== "" && lowered.includes(shape));
11584
+ }
11585
+ function maskvalue(value) {
11586
+ return value === "" ? "" : maskmarker;
11587
+ }
11588
+ function maskfield(input) {
11589
+ return maskingfield(input.name, input.shapes) ? maskvalue(input.value) : input.value;
11590
+ }
11591
+ function maskrecord(record2, shapes) {
11592
+ const masked = {};
11593
+ for (const [key, value] of Object.entries(record2)) {
11594
+ if (typeof value === "string") {
11595
+ const sibling = record2.name;
11596
+ masked[key] = key === "value" && typeof sibling === "string" ? maskfield({ name: sibling, value, shapes }) : maskfield({ name: key, value, shapes });
11597
+ } else if (Array.isArray(value)) masked[key] = value.map((item) => Boolean(item) && typeof item === "object" && !Array.isArray(item) ? maskrecord(item, shapes) : item);
11598
+ else if (Boolean(value) && typeof value === "object") masked[key] = maskrecord(value, shapes);
11599
+ else masked[key] = value;
11600
+ }
11601
+ return masked;
11602
+ }
11603
+ function masktypedvalues(input) {
11604
+ const sensitive = maskingfield(input.step.target ?? "", input.shapes) || maskingfield(input.step.kind, input.shapes);
11605
+ const maskedvalue = input.step.value !== void 0 && sensitive ? maskvalue(input.step.value) : input.step.value;
11606
+ let maskedoptions = input.step.options;
11607
+ if (input.step.options !== void 0) {
11608
+ try {
11609
+ const parsed = JSON.parse(input.step.options);
11610
+ if (Boolean(parsed) && typeof parsed === "object" && !Array.isArray(parsed)) maskedoptions = JSON.stringify(maskrecord(parsed, input.shapes));
11611
+ } catch {
11612
+ }
11613
+ }
11614
+ return { ...maskedvalue !== void 0 ? { value: maskedvalue } : {}, ...maskedoptions !== void 0 ? { options: maskedoptions } : {} };
11615
+ }
11616
+ function maskformstate(fields, shapes) {
11617
+ return fields.map((field) => ({ ...field, value: maskfield({ name: field.name, value: field.value, shapes }) }));
11618
+ }
11619
+ function maskobservation(shot, shapes) {
11620
+ return { ...shot, forms: shot.forms.map((form) => maskingfield(form.name, shapes) ? { ...form, options: [maskmarker] } : form) };
11621
+ }
11622
+ function maskstoredvalues(record2, shapes) {
11623
+ const masked = {};
11624
+ for (const [key, value] of Object.entries(record2)) masked[key] = maskfield({ name: key, value, shapes });
11625
+ return masked;
11626
+ }
11627
+ function maskexport(record2, shapes) {
11628
+ return maskrecord(record2, shapes);
11629
+ }
11630
+
11176
11631
  // modelroute.ts
11177
11632
  function routevalid(route) {
11178
11633
  if (route.kind.trim() === "") return { allowed: false, reason: "The model route needs its task kind." };
@@ -12360,6 +12815,28 @@ function environmentreport(input) {
12360
12815
  ...input.keepalive !== void 0 ? { keepalive: input.keepalive } : {}
12361
12816
  };
12362
12817
  }
12818
+ function consentmodel() {
12819
+ return {
12820
+ version: protocolversion,
12821
+ posture: "denydefault",
12822
+ sensitiveclasses: ["payment", "credential", "delete", "publish"],
12823
+ maskshapes: [...defaultmaskshapes],
12824
+ notes: [
12825
+ "The denydefault posture refuses every origin the user never granted; the per origin automation allowlist holds one exact origin per entry with no wildcard expansion and the active tab grant counts as exactly one explicit single origin grant.",
12826
+ "The per site originprofiles grant and deny single action kinds; a denied kind never runs on that origin and a granted kind still routes its sensitive classes through the fresh consent prompts.",
12827
+ "Every consent window scopes to one session and one origin, binds the duration the user chose and names its boundary; no grant ever defaults to unlimited, and a window past its boundary suspends the run mid step until a new explicit prompt renews it.",
12828
+ "The revokerun is a terminal session event: the pending step and every queued step halt without executing and the immutable log records the user action.",
12829
+ "The immutable run log appends only: every entry chains through its loghash to the hash of its predecessor, the completion seal writes the final hash, and the read path verifies the whole chain before serving a single entry.",
12830
+ "maskinputs keeps typed values, form values and stored values out of every record behind the documented password, token, card and secret shapes the user extends; the observation schema keeps its field shapes while the values carry the redaction marker."
12831
+ ]
12832
+ };
12833
+ }
12834
+ function securityreport(input) {
12835
+ return { version: protocolversion, posture: "denydefault", allowlist: input.allowlist, profiles: input.profiles, windows: input.windows, consents: input.consents, revocations: input.revocations, maskrules: input.maskrules, chain: input.chain };
12836
+ }
12837
+ function logchainreport(input) {
12838
+ return { version: protocolversion, runid: input.runid, valid: input.valid, entries: input.entries, ...input.brokenat !== void 0 ? { brokenat: input.brokenat } : {}, reason: input.reason, ...input.sealhash !== void 0 ? { sealhash: input.sealhash } : {}, ...input.sealedat !== void 0 ? { sealedat: input.sealedat } : {} };
12839
+ }
12363
12840
 
12364
12841
  // workfloweditor.ts
12365
12842
  var palettecategories = ["actions", "controlflow", "waits", "variables", "triggers"];
@@ -13083,6 +13560,7 @@ export {
13083
13560
  agentpresetof,
13084
13561
  agentruncontext,
13085
13562
  agentscopevalid,
13563
+ allowlistcheck,
13086
13564
  allowlistcovers,
13087
13565
  allowlistreport,
13088
13566
  alltools,
@@ -13092,6 +13570,7 @@ export {
13092
13570
  apientries,
13093
13571
  apikeyconsentgranted,
13094
13572
  apireplayspecof,
13573
+ appendlogentry,
13095
13574
  applycooldown,
13096
13575
  applyheaderules,
13097
13576
  applylayer,
@@ -13116,6 +13595,7 @@ export {
13116
13595
  authrefusedmessage,
13117
13596
  authreport,
13118
13597
  autointervalof,
13598
+ automationallowlistgate,
13119
13599
  backoffdelay,
13120
13600
  batchreport,
13121
13601
  beatrun,
@@ -13184,6 +13664,7 @@ export {
13184
13664
  cdpeventruleof,
13185
13665
  cdpkinds,
13186
13666
  cdpreport,
13667
+ chainreportof,
13187
13668
  channellive,
13188
13669
  channeloptionsof,
13189
13670
  channelorigin,
@@ -13192,6 +13673,7 @@ export {
13192
13673
  choosebranch,
13193
13674
  claim,
13194
13675
  claimheartbeat,
13676
+ classconsentcovers,
13195
13677
  classifyintent,
13196
13678
  closechannel,
13197
13679
  closeidlechannels,
@@ -13207,6 +13689,11 @@ export {
13207
13689
  confirmmanualrun,
13208
13690
  connectclient,
13209
13691
  consensusstate,
13692
+ consentdurationvalid,
13693
+ consentmodel,
13694
+ consentprompttext,
13695
+ consentwindowgate,
13696
+ consentwindowstate,
13210
13697
  consolecapture,
13211
13698
  consoleconsentcovers,
13212
13699
  consolediff,
@@ -13243,6 +13730,7 @@ export {
13243
13730
  defaulthttpstream,
13244
13731
  defaultidlewindowms,
13245
13732
  defaultloopbound,
13733
+ defaultmaskshapes,
13246
13734
  defaultmcpconfig,
13247
13735
  defaultmcpport,
13248
13736
  defaultpairinglifetimems,
@@ -13250,6 +13738,9 @@ export {
13250
13738
  defaulttokenlifetimems,
13251
13739
  defaulttriggercooldown,
13252
13740
  delayjitter,
13741
+ deniedevidenceof,
13742
+ denydefaultnotice,
13743
+ denydefaultposture,
13253
13744
  actionrisk as deriveactionrisk,
13254
13745
  detachcdpsession,
13255
13746
  devicepresetof,
@@ -13284,6 +13775,7 @@ export {
13284
13775
  enqueue,
13285
13776
  enqueuerequest,
13286
13777
  entryfresh,
13778
+ entryhashof,
13287
13779
  environmentgrammar,
13288
13780
  environmentgrantgate,
13289
13781
  environmentreport,
@@ -13298,11 +13790,13 @@ export {
13298
13790
  eventnotification,
13299
13791
  eventresponse,
13300
13792
  eventrulematches,
13793
+ exactorigin,
13301
13794
  exchangesreport,
13302
13795
  executorregistry,
13303
13796
  expandblocks,
13304
13797
  expandtemplate,
13305
13798
  expireapprovals,
13799
+ expireconsentwindows,
13306
13800
  expirelayers,
13307
13801
  expirelocks,
13308
13802
  expireprofilerecords,
@@ -13310,6 +13804,7 @@ export {
13310
13804
  expiresessions,
13311
13805
  expiretokens,
13312
13806
  exportcontentreview,
13807
+ exportlogchain,
13313
13808
  exportpresetlibrary,
13314
13809
  exportrunstate,
13315
13810
  exportsessionfile,
@@ -13324,6 +13819,7 @@ export {
13324
13819
  familyofkind,
13325
13820
  fetchoptionsof,
13326
13821
  fetchrequestof,
13822
+ fieldshapekind,
13327
13823
  filteredsessions,
13328
13824
  filterentries,
13329
13825
  filterexchanges,
@@ -13345,6 +13841,7 @@ export {
13345
13841
  growthtrend,
13346
13842
  guardoutput,
13347
13843
  guardverdictgate,
13844
+ haltedstepsof,
13348
13845
  handleframe,
13349
13846
  handoffframe,
13350
13847
  headerfilterof,
@@ -13400,6 +13897,7 @@ export {
13400
13897
  lanereport,
13401
13898
  lapseframes,
13402
13899
  lapseplanof,
13900
+ lasthashof,
13403
13901
  latesttemplate,
13404
13902
  launchbridge,
13405
13903
  layernames,
@@ -13417,7 +13915,10 @@ export {
13417
13915
  locationpresetof,
13418
13916
  locationrangevalid,
13419
13917
  lockkey,
13918
+ logchainreport,
13919
+ logentryof,
13420
13920
  loglevels,
13921
+ logreadgate,
13421
13922
  longtaskcapture,
13422
13923
  loopof,
13423
13924
  mailboxof,
@@ -13429,6 +13930,16 @@ export {
13429
13930
  markpending,
13430
13931
  markprovider,
13431
13932
  markuprenderstep,
13933
+ maskexport,
13934
+ maskfield,
13935
+ maskformstate,
13936
+ maskingfield,
13937
+ maskmarker,
13938
+ maskobservation,
13939
+ maskrecord,
13940
+ maskstoredvalues,
13941
+ masktypedvalues,
13942
+ maskvalue,
13432
13943
  matchmessage,
13433
13944
  matchurl,
13434
13945
  matchurlpattern,
@@ -13441,6 +13952,7 @@ export {
13441
13952
  messagefilterof,
13442
13953
  methoddomain,
13443
13954
  minimapfocus,
13955
+ missingclassconsents,
13444
13956
  mockfor,
13445
13957
  mockreport,
13446
13958
  mockspecof,
@@ -13478,11 +13990,15 @@ export {
13478
13990
  offscreencapabilitygate,
13479
13991
  openchannel,
13480
13992
  openconsensus,
13993
+ openconsentwindow,
13481
13994
  openoffscreen,
13482
13995
  openrun,
13996
+ openrunlog,
13483
13997
  openseal,
13484
13998
  openstreamchannel,
13485
13999
  opentabagent,
14000
+ originprofilegate,
14001
+ originprofileof,
13486
14002
  outcomeresponse,
13487
14003
  overrideinputof,
13488
14004
  overridematches,
@@ -13535,10 +14051,13 @@ export {
13535
14051
  postentry,
13536
14052
  preparehandoff,
13537
14053
  privatemime,
14054
+ profilegrade,
13538
14055
  profilegrantgranted,
14056
+ profilekind,
13539
14057
  profilereport,
13540
14058
  profileretentionwindow,
13541
14059
  profilerkinds,
14060
+ profilesummary,
13542
14061
  progressnoticeframe,
13543
14062
  promptcallframe,
13544
14063
  promptreport,
@@ -13564,6 +14083,7 @@ export {
13564
14083
  readentries,
13565
14084
  readpath,
13566
14085
  readstream,
14086
+ readverifiedlog,
13567
14087
  reattachrun,
13568
14088
  receivemessage,
13569
14089
  receivemessages,
@@ -13598,6 +14118,7 @@ export {
13598
14118
  renderprovenance,
13599
14119
  rendertemplate,
13600
14120
  rendertoolbriefs,
14121
+ renewconsentwindow,
13601
14122
  reordersteps,
13602
14123
  repeatuntilof,
13603
14124
  replannonfail,
@@ -13639,6 +14160,8 @@ export {
13639
14160
  reviewframe,
13640
14161
  revocationruleof,
13641
14162
  revokeclient,
14163
+ revokerun,
14164
+ revokerungate,
13642
14165
  rewritesourcelocation,
13643
14166
  roleaddress,
13644
14167
  roledefaults,
@@ -13680,6 +14203,8 @@ export {
13680
14203
  scheduleinterval,
13681
14204
  scopecheck,
13682
14205
  scopegate,
14206
+ scopegrantof,
14207
+ sealrunlog,
13683
14208
  sealrunstate,
13684
14209
  seamweights,
13685
14210
  searchfields,
@@ -13687,11 +14212,15 @@ export {
13687
14212
  searchsessionrecords,
13688
14213
  searchsteps,
13689
14214
  searchtemplates,
14215
+ securityreport,
13690
14216
  seededrandom,
13691
14217
  selectorresponse,
13692
14218
  sendcdpcommand,
13693
14219
  sendfetch,
13694
14220
  sendmessage,
14221
+ sensitiveclassesof,
14222
+ sensitiveclassgate,
14223
+ sensitivepipelingate,
13695
14224
  sequenceintegrity,
13696
14225
  serializearg,
13697
14226
  serializecdpcommand,
@@ -13711,6 +14240,7 @@ export {
13711
14240
  sessionrestoregate,
13712
14241
  sessiontabof,
13713
14242
  setvariable,
14243
+ shapesof,
13714
14244
  sharelesson,
13715
14245
  shareworkflow,
13716
14246
  shiftentryof,
@@ -13832,6 +14362,7 @@ export {
13832
14362
  validatevaluegen,
13833
14363
  validateworkflow,
13834
14364
  verifyauth,
14365
+ verifylogchain,
13835
14366
  verifytoken,
13836
14367
  verifywebhook,
13837
14368
  visitmatch,
@@ -13844,6 +14375,8 @@ export {
13844
14375
  watchgate,
13845
14376
  webhooksecretok,
13846
14377
  whileof,
14378
+ wildcardentry,
14379
+ windowgatesstep,
13847
14380
  wireformat,
13848
14381
  wizardreport,
13849
14382
  workerpoolsizevalid,