@wenathlan/extension 1.1.64 → 1.1.66
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/README.md +5 -3
- package/dist/attentionfeed.d.ts +74 -0
- package/dist/attentionfeed.d.ts.map +1 -0
- package/dist/backgroundruns.d.ts +71 -0
- package/dist/backgroundruns.d.ts.map +1 -0
- package/dist/datagrid.d.ts +46 -0
- package/dist/datagrid.d.ts.map +1 -0
- package/dist/evidenceviews.d.ts +45 -0
- package/dist/evidenceviews.d.ts.map +1 -0
- package/dist/flowlibrary.d.ts +147 -0
- package/dist/flowlibrary.d.ts.map +1 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1437 -3
- package/dist/index.js.map +4 -4
- package/dist/memory.d.ts +104 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/outputcompare.d.ts +68 -0
- package/dist/outputcompare.d.ts.map +1 -0
- package/dist/pickerviews.d.ts +72 -0
- package/dist/pickerviews.d.ts.map +1 -0
- package/dist/policy.d.ts +122 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/portability.d.ts +35 -0
- package/dist/portability.d.ts.map +1 -0
- package/dist/protocol.d.ts +281 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/quickactions.d.ts +46 -0
- package/dist/quickactions.d.ts.map +1 -0
- package/dist/runreplay.d.ts +53 -0
- package/dist/runreplay.d.ts.map +1 -0
- package/dist/siteprefs.d.ts +45 -0
- package/dist/siteprefs.d.ts.map +1 -0
- package/dist/statusviews.d.ts +65 -0
- package/dist/statusviews.d.ts.map +1 -0
- package/dist/surfaces.d.ts +2 -2
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/syncbridge.d.ts +80 -0
- package/dist/syncbridge.d.ts.map +1 -0
- package/dist/tourviews.d.ts +28 -0
- package/dist/tourviews.d.ts.map +1 -0
- package/dist/types.d.ts +444 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/extension/dist/background.js +1841 -5
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/dashboardpage.html +3 -0
- package/extension/dist/dashboardpage.js +108 -0
- package/extension/dist/dashboardpage.js.map +2 -2
- package/extension/dist/manifest.json +1 -1
- package/extension/dist/optionspage.html +5 -0
- package/extension/dist/optionspage.js +222 -0
- package/extension/dist/optionspage.js.map +2 -2
- package/extension/dist/pagebridge.js.map +1 -1
- package/extension/dist/popup.html +2 -2
- package/extension/dist/popup.js +102 -0
- package/extension/dist/popup.js.map +2 -2
- package/extension/dist/sidepanel.html +2 -2
- package/extension/dist/sidepanel.js +219 -3
- package/extension/dist/sidepanel.js.map +2 -2
- package/extension/dist/style.css +3 -1
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5259,6 +5259,173 @@ var sessionmemory = class {
|
|
|
5259
5259
|
async addstepapproveresolution(resolution) {
|
|
5260
5260
|
await this.adapter.set("stepapproveresolutions", [resolution, ...await this.getstepapproveresolutions()]);
|
|
5261
5261
|
}
|
|
5262
|
+
/**
|
|
5263
|
+
* Interface surface stores of the 1.1.65 family live here, scoped per profile workspace: the siteprofiles with the per site interface preferences, the shortcutkeys bindings and the theme preference per profile, the recenttray entries with their configurable depth and the notification consent and preference per profile.
|
|
5264
|
+
*/
|
|
5265
|
+
/** Returns the siteprofile of one origin; an absent profile keeps the global interface preferences. */
|
|
5266
|
+
async getsiteprofile(origin) {
|
|
5267
|
+
return this.adapter.get(`siteprofile:${origin}`);
|
|
5268
|
+
}
|
|
5269
|
+
/** Stores the siteprofile of one origin with its theme, shortcutkeys and default view; the profile never adjusts a policy gate. */
|
|
5270
|
+
async setsiteprofile(profile) {
|
|
5271
|
+
return this.adapter.set(`siteprofile:${profile.origin}`, profile);
|
|
5272
|
+
}
|
|
5273
|
+
/** Returns every stored siteprofile keyed by origin. */
|
|
5274
|
+
async listsiteprofiles() {
|
|
5275
|
+
const entries = Object.entries(await this.adapter.get("siteprofiles") ?? {});
|
|
5276
|
+
return entries.map(([, profile]) => profile);
|
|
5277
|
+
}
|
|
5278
|
+
/** Stores every siteprofile keyed by origin so the list view reads them in one call. */
|
|
5279
|
+
async setsiteprofiles(profiles) {
|
|
5280
|
+
await this.adapter.set("siteprofiles", Object.fromEntries(profiles.map((profile) => [profile.origin, profile])));
|
|
5281
|
+
}
|
|
5282
|
+
/** Returns the stored shortcutkeys bindings of the profile; an absent set keeps the shipped editable defaults. */
|
|
5283
|
+
async getshortcutbindings() {
|
|
5284
|
+
return await this.adapter.get("shortcutbindings") ?? [];
|
|
5285
|
+
}
|
|
5286
|
+
/** Stores the shortcutkeys bindings the user edited in the optionspage. */
|
|
5287
|
+
async setshortcutbindings(bindings) {
|
|
5288
|
+
return this.adapter.set("shortcutbindings", bindings);
|
|
5289
|
+
}
|
|
5290
|
+
/** Returns the stored darklight theme preference of the profile; an absent preference follows the os preference alone. */
|
|
5291
|
+
async getthemepreference() {
|
|
5292
|
+
return this.adapter.get("themepreference");
|
|
5293
|
+
}
|
|
5294
|
+
/** Stores the darklight theme preference of the profile with its manual override. */
|
|
5295
|
+
async setthemepreference(preference) {
|
|
5296
|
+
return this.adapter.set("themepreference", preference);
|
|
5297
|
+
}
|
|
5298
|
+
/** Returns the recenttray entries, newest first, with their resume and reopen offers. */
|
|
5299
|
+
async getrecenttray() {
|
|
5300
|
+
return await this.adapter.get("recenttray") ?? [];
|
|
5301
|
+
}
|
|
5302
|
+
/** Adds one recenttray entry with the user configured depth; an absent depth keeps every run. */
|
|
5303
|
+
async addrecenttrayentry(entry) {
|
|
5304
|
+
const depth = (await this.getsettings())?.recenttraydepth;
|
|
5305
|
+
const appended = [entry, ...(await this.getrecenttray()).filter((candidate) => candidate.runid !== entry.runid)];
|
|
5306
|
+
await this.adapter.set("recenttray", depth !== void 0 && Number.isInteger(depth) && depth > 0 ? appended.slice(0, depth) : appended);
|
|
5307
|
+
}
|
|
5308
|
+
/** Returns the notification consent and preference of the profile; an absent record keeps the notifications content free and on. */
|
|
5309
|
+
async getnotificationprefs() {
|
|
5310
|
+
return this.adapter.get("notificationprefs");
|
|
5311
|
+
}
|
|
5312
|
+
/** Stores the notification consent and preference of the profile; the content consent gates every page content bearing body. */
|
|
5313
|
+
async setnotificationprefs(prefs) {
|
|
5314
|
+
return this.adapter.set("notificationprefs", prefs);
|
|
5315
|
+
}
|
|
5316
|
+
/** Returns the notification payloads the surface history keeps for the user to open after a do not disturb quiet. */
|
|
5317
|
+
async getnotificationhistory() {
|
|
5318
|
+
return await this.adapter.get("notificationhistory") ?? [];
|
|
5319
|
+
}
|
|
5320
|
+
/** Records one notification payload in the history so its deep link stays reachable while the notifications permission stays outside the manifest. */
|
|
5321
|
+
async addnotificationhistory(payload) {
|
|
5322
|
+
await this.adapter.set("notificationhistory", [payload, ...await this.getnotificationhistory()]);
|
|
5323
|
+
}
|
|
5324
|
+
/**
|
|
5325
|
+
* Ecosystem stores of the 1.1.66 family live here, scoped per profile workspace: the flowlibrary entries with their manifest digests and provenance, the library install and removal events, the syncbridge hooks with their conflict records, the attentionfeed entries with their configurable retention, the runreplay cursors per viewed run, the outputcompare sessions with their metric results and the background run queue state for restart recovery.
|
|
5326
|
+
* The flowlibrary store deduplicates entries by manifest digest, every entry carries its publisher provenance, and the manifest list exports for audit; the memory adapter seam stays the documented marketplace backend boundary because a future remote registry replaces the adapter only.
|
|
5327
|
+
*/
|
|
5328
|
+
/** Returns every flowlibrary entry of the profile workspace, newest first. */
|
|
5329
|
+
async getflowlibrary() {
|
|
5330
|
+
return await this.adapter.get("flowlibrary") ?? [];
|
|
5331
|
+
}
|
|
5332
|
+
/** Replaces the flowlibrary entries of the profile workspace. */
|
|
5333
|
+
async setflowlibrary(entries) {
|
|
5334
|
+
return this.adapter.set("flowlibrary", entries);
|
|
5335
|
+
}
|
|
5336
|
+
/** Adds one flowlibrary entry deduplicated by manifest digest: an entry whose digest already exists replaces its predecessor while its provenance keeps both records. */
|
|
5337
|
+
async addlibraryentry(entry) {
|
|
5338
|
+
const entries = await this.getflowlibrary();
|
|
5339
|
+
const deduped = entries.filter((candidate) => candidate.digest !== entry.digest);
|
|
5340
|
+
await this.setflowlibrary([entry, ...deduped]);
|
|
5341
|
+
return [entry, ...deduped];
|
|
5342
|
+
}
|
|
5343
|
+
/** Removes one flowlibrary entry by its id while the library events keep their record for the audit trail. */
|
|
5344
|
+
async removelibraryentry(entryid) {
|
|
5345
|
+
await this.setflowlibrary((await this.getflowlibrary()).filter((candidate) => candidate.id !== entryid));
|
|
5346
|
+
}
|
|
5347
|
+
/** Returns every library install, update and removal event, newest first. */
|
|
5348
|
+
async getlibraryevents() {
|
|
5349
|
+
return await this.adapter.get("libraryevents") ?? [];
|
|
5350
|
+
}
|
|
5351
|
+
/** Records one library lifecycle event beside the flowlibrary store. */
|
|
5352
|
+
async addlibraryevent(event) {
|
|
5353
|
+
await this.adapter.set("libraryevents", [event, ...await this.getlibraryevents()]);
|
|
5354
|
+
}
|
|
5355
|
+
/** Exports the manifest list of the flowlibrary for audit: one row per entry with its digest, publisher, version, state and provenance and no step payload. */
|
|
5356
|
+
async exportlibrarymanifests() {
|
|
5357
|
+
return (await this.getflowlibrary()).map((entry) => ({ id: entry.id, title: entry.manifest.title, publisher: entry.manifest.publisher, version: entry.manifest.version, digest: entry.digest, state: entry.state, provenance: entry.provenance, addedat: entry.addedat }));
|
|
5358
|
+
}
|
|
5359
|
+
/** Returns every syncbridge hook of the profile workspace; every hook keeps its explicit opt in with no default on. */
|
|
5360
|
+
async getsyncbridgehooks() {
|
|
5361
|
+
return await this.adapter.get("syncbridgehooks") ?? [];
|
|
5362
|
+
}
|
|
5363
|
+
/** Replaces the syncbridge hooks of the profile workspace. */
|
|
5364
|
+
async setsyncbridgehooks(hooks) {
|
|
5365
|
+
return this.adapter.set("syncbridgehooks", hooks);
|
|
5366
|
+
}
|
|
5367
|
+
/** Returns every syncbridge conflict record, newest first, with both versions instead of a silent overwrite. */
|
|
5368
|
+
async getsyncbridgeconflicts() {
|
|
5369
|
+
return await this.adapter.get("syncbridgeconflicts") ?? [];
|
|
5370
|
+
}
|
|
5371
|
+
/** Records one syncbridge conflict with both manifest versions. */
|
|
5372
|
+
async addsyncbridgeconflict(conflict) {
|
|
5373
|
+
await this.adapter.set("syncbridgeconflicts", [conflict, ...await this.getsyncbridgeconflicts()]);
|
|
5374
|
+
}
|
|
5375
|
+
/** Resolves one syncbridge conflict by its id with the resolution the user picked; one conflict resolves exactly once. */
|
|
5376
|
+
async resolvesyncbridgeconflict(id, resolution, now) {
|
|
5377
|
+
const conflicts = await this.getsyncbridgeconflicts();
|
|
5378
|
+
await this.adapter.set("syncbridgeconflicts", conflicts.map((conflict) => conflict.id === id && conflict.resolution === void 0 ? { ...conflict, resolution, resolvedat: now } : conflict));
|
|
5379
|
+
return this.getsyncbridgeconflicts();
|
|
5380
|
+
}
|
|
5381
|
+
/** Returns every attentionfeed entry, newest first, with its cause, refs and deep link. */
|
|
5382
|
+
async getattentionentries() {
|
|
5383
|
+
return await this.adapter.get("attentionfeed") ?? [];
|
|
5384
|
+
}
|
|
5385
|
+
/** Records one attentionfeed entry deduplicated by its cause, run and gate refs while the retention window stays a user setting. */
|
|
5386
|
+
async addattentionentry(entry) {
|
|
5387
|
+
const existing = (await this.getattentionentries()).filter((candidate) => candidate.id !== entry.id);
|
|
5388
|
+
await this.adapter.set("attentionfeed", [entry, ...existing]);
|
|
5389
|
+
}
|
|
5390
|
+
/** Dismisses one attentionfeed entry by its id: the dismissal removes the feed row only while the waiting cause keeps its own resolution path. */
|
|
5391
|
+
async dismissattentionentry(id) {
|
|
5392
|
+
const entries = (await this.getattentionentries()).filter((candidate) => candidate.id !== id);
|
|
5393
|
+
await this.adapter.set("attentionfeed", entries);
|
|
5394
|
+
return entries;
|
|
5395
|
+
}
|
|
5396
|
+
/** Prunes the attentionfeed entries past their retention window; an absent window keeps every entry while the pruned ids return for the audit note. */
|
|
5397
|
+
async pruneattentionentries(now) {
|
|
5398
|
+
const retention = (await this.getsettings())?.attentionretention;
|
|
5399
|
+
const entries = await this.getattentionentries();
|
|
5400
|
+
if (retention === void 0) return { kept: entries, pruned: [] };
|
|
5401
|
+
const kept = entries.filter((entry) => now - entry.at < retention);
|
|
5402
|
+
await this.adapter.set("attentionfeed", kept);
|
|
5403
|
+
return { kept, pruned: entries.filter((entry) => now - entry.at >= retention).map((entry) => entry.id) };
|
|
5404
|
+
}
|
|
5405
|
+
/** Returns the runreplay cursors per viewed run so a reopened replay stands where the viewer left it. */
|
|
5406
|
+
async getreplaycursors() {
|
|
5407
|
+
return await this.adapter.get("replaycursors") ?? {};
|
|
5408
|
+
}
|
|
5409
|
+
/** Stores one runreplay cursor for its viewed run. */
|
|
5410
|
+
async setreplaycursor(runid, cursor) {
|
|
5411
|
+
await this.adapter.set("replaycursors", { ...await this.getreplaycursors(), [runid]: cursor });
|
|
5412
|
+
}
|
|
5413
|
+
/** Returns every outputcompare session with its metric results, newest first. */
|
|
5414
|
+
async getcomparesessions() {
|
|
5415
|
+
return await this.adapter.get("comparesessions") ?? [];
|
|
5416
|
+
}
|
|
5417
|
+
/** Records one outputcompare session with the metric set it used. */
|
|
5418
|
+
async addcomparesession(session) {
|
|
5419
|
+
await this.adapter.set("comparesessions", [session, ...await this.getcomparesessions()]);
|
|
5420
|
+
}
|
|
5421
|
+
/** Returns the background run queue state for restart recovery: every entry with its state and its keepalive hold. */
|
|
5422
|
+
async getbackgroundqueue() {
|
|
5423
|
+
return await this.adapter.get("backgroundqueue") ?? [];
|
|
5424
|
+
}
|
|
5425
|
+
/** Replaces the background run queue state after every transition so the restart recovery reads it in one call. */
|
|
5426
|
+
async setbackgroundqueue(queue) {
|
|
5427
|
+
return this.adapter.set("backgroundqueue", queue);
|
|
5428
|
+
}
|
|
5262
5429
|
};
|
|
5263
5430
|
function mediakindof(record2) {
|
|
5264
5431
|
if ("pages" in record2) return "pdf";
|
|
@@ -11445,6 +11612,108 @@ function logstreamegressgate(input) {
|
|
|
11445
11612
|
if (!input.verified) return { allowed: false, reason: "The logstream chain failed its live verification; the audit excerpt refuses the copy because only a verified range leaves the stream." };
|
|
11446
11613
|
return { allowed: true, reason: `The logstream chain verifies across the ${input.entries} event${input.entries === 1 ? "" : "s"} of the range; the audit excerpt copies as one verified record.` };
|
|
11447
11614
|
}
|
|
11615
|
+
function quickactiongate(input) {
|
|
11616
|
+
if (input.action.origin.trim() === "") return { allowed: false, reason: `The ${input.action.command} quickaction needs the origin of the clicked tab; an originless entry never registers.` };
|
|
11617
|
+
if (!input.granted.includes(input.action.origin)) return { allowed: false, reason: `The ${input.action.command} quickaction stays off the ${input.action.origin} tab because its origin holds no allowlist entry; only permitted actions surface.` };
|
|
11618
|
+
if (input.action.session === true && !input.sessionactive) return { allowed: false, reason: `The ${input.action.command} quickaction needs an active browser session before it registers; the context menu never offers a run action without its session.` };
|
|
11619
|
+
if (input.action.permission !== void 0 && !(input.capabilities ?? []).includes(input.action.permission)) return { allowed: false, reason: `The ${input.action.command} quickaction needs the ${input.action.permission} capability granted before it registers; the context menu never offers an action the current capability set refuses.` };
|
|
11620
|
+
return { allowed: true, reason: `The ${input.action.command} quickaction rides the origin allowlist of the clicked ${input.action.origin} tab and registers.` };
|
|
11621
|
+
}
|
|
11622
|
+
function omniboxtaskgate(input) {
|
|
11623
|
+
if (input.direct) return { allowed: false, reason: "The omnibox keyword never executes a goal directly; every keyword goal routes through the same proposal and review flow as the api and becomes a reviewed plan first." };
|
|
11624
|
+
if (input.text.trim() === "") return { allowed: false, reason: "The omnibox task needs its natural language goal after the keyword; an empty goal never reaches the proposal flow." };
|
|
11625
|
+
if (input.origin.trim() === "") return { allowed: false, reason: "The omnibox task needs its active origin scope; a goal without an origin never reaches the proposal flow." };
|
|
11626
|
+
return { allowed: true, reason: `The omnibox goal for ${input.origin} rides the same proposal flow as the api: the observation, the capabilities and the plan review all recheck it.` };
|
|
11627
|
+
}
|
|
11628
|
+
function shortcutkeygate(input) {
|
|
11629
|
+
if (!input.palettecommands.includes(input.command)) return { allowed: false, reason: `The ${input.command} shortcut binds no commandpalette command; a shortcut may only trigger a command the palette catalog knows.` };
|
|
11630
|
+
if (input.action?.permission !== void 0 && !input.granted.includes(input.action.permission)) return { allowed: false, reason: `The ${input.command} shortcut needs the ${input.action.permission} capability granted before it dispatches; the shortcut never bypasses the palette action gate.` };
|
|
11631
|
+
if (input.action?.session === true && !input.sessionactive) return { allowed: false, reason: `The ${input.command} shortcut needs an active browser session before it dispatches; the shortcut never bypasses the palette action gate.` };
|
|
11632
|
+
return { allowed: true, reason: `The ${input.command} shortcut dispatches through the same palette action gate the commandpalette rides; its gates stay intact.` };
|
|
11633
|
+
}
|
|
11634
|
+
function notificationcontentgate(input) {
|
|
11635
|
+
if (!input.content) return { allowed: true, reason: "The notification body carries no page content, so no content consent is needed and it shows." };
|
|
11636
|
+
if (!input.consent) return { allowed: false, reason: "The notification body carries page content and no content consent exists; a content bearing notification never shows without its consent." };
|
|
11637
|
+
return { allowed: true, reason: "The notification body carries page content and its consent exists, so it shows with the content the user agreed to." };
|
|
11638
|
+
}
|
|
11639
|
+
function pickeroverlaygate(input) {
|
|
11640
|
+
if (input.origin.trim() === "") return { allowed: false, reason: "The pickeroverlay session needs its origin; an originless read never starts." };
|
|
11641
|
+
if (!input.granted.includes(input.origin)) return { allowed: false, reason: `The pickeroverlay reads no element candidate of ${input.origin} because the origin holds no allowlist entry; picker reads stay inside the granted origins.` };
|
|
11642
|
+
return { allowed: true, reason: `The pickeroverlay lists the element candidates of the granted origin ${input.origin} with their stability scored selectors.` };
|
|
11643
|
+
}
|
|
11644
|
+
function shotpanelgate(input) {
|
|
11645
|
+
if (input.captureorigin.trim() === "") return { allowed: false, reason: "The shotpanel view needs the origin of its capture; an originless capture never opens." };
|
|
11646
|
+
if (!input.granted.includes(input.captureorigin)) return { allowed: false, reason: `The shotpanel opens no capture of ${input.captureorigin} because the origin holds no allowlist entry; capture views stay inside the granted origins.` };
|
|
11647
|
+
return { allowed: true, reason: `The shotpanel previews the capture of the granted origin ${input.captureorigin} with its redaction verdicts.` };
|
|
11648
|
+
}
|
|
11649
|
+
function siteprofilegate(input) {
|
|
11650
|
+
const origin = input.origin.trim();
|
|
11651
|
+
if (origin === "") return { allowed: false, reason: "The siteprofile needs its origin; an originless profile never stores." };
|
|
11652
|
+
if (!origin.startsWith("https://") || origin.length <= "https://".length) return { allowed: false, reason: `The siteprofile stores per site interface preferences of https origins only; ${origin} holds no https origin shape.` };
|
|
11653
|
+
return { allowed: true, reason: `The siteprofile of ${origin} stores its theme, shortcutkeys and default view beside the originprofiles policy preferences; no profile ever adjusts a policy gate.` };
|
|
11654
|
+
}
|
|
11655
|
+
function importexportgate(input) {
|
|
11656
|
+
if (input.containssecrets) return { allowed: false, reason: "The importexport bundle carries a secretvault value shape; secret values never leave the browser under any flag, so the bundle refuses in full." };
|
|
11657
|
+
if (input.unmaskedlogs) return { allowed: false, reason: "The importexport bundle carries unmasked log entries; only masked summaries ever move between profiles, so the bundle refuses in full." };
|
|
11658
|
+
return { allowed: true, reason: "The importexport bundle carries no secretvault value and no unmasked log; the originprofiles, the siteprofiles, the notes and the preferences move with their honest exclusion list." };
|
|
11659
|
+
}
|
|
11660
|
+
function librarymanifestgate(input) {
|
|
11661
|
+
if (input.errors.length > 0) return { allowed: false, reason: `The flowlibrary manifest fails schemastrict with ${input.errors.length} error${input.errors.length === 1 ? "" : "s"}: ${input.errors.slice(0, 3).map((error) => `${error.path} expected ${error.expected}`).join("; ")}; the import refuses before anything else.` };
|
|
11662
|
+
return { allowed: true, reason: "The flowlibrary manifest passes schemastrict with no shape error; the validation names every field it checked." };
|
|
11663
|
+
}
|
|
11664
|
+
function librarycapabilitygate(input) {
|
|
11665
|
+
const missing = [...new Set(input.kinds)].filter((kind) => !input.capabilities.includes(kind));
|
|
11666
|
+
if (missing.length > 0) return { allowed: false, reason: `The flowlibrary manifest uses the kind${missing.length === 1 ? "" : "s"} ${missing.join(", ")} the installed capability set lacks; the import refuses in full.` };
|
|
11667
|
+
return { allowed: true, reason: `Every kind of the flowlibrary manifest sits inside the installed capability set of ${input.capabilities.length} kind${input.capabilities.length === 1 ? "" : "s"}.` };
|
|
11668
|
+
}
|
|
11669
|
+
function librarygrantgate(input) {
|
|
11670
|
+
const missing = [...new Set(input.requiredgrants)].filter((origin) => !input.heldgrants.includes(origin));
|
|
11671
|
+
if (missing.length > 0) return { allowed: false, reason: `The flowlibrary manifest requires the grant${missing.length === 1 ? "" : "s"} ${missing.join(", ")} the profile does not hold; the grant diff shows them and the user grants them before the import completes.` };
|
|
11672
|
+
return { allowed: true, reason: `The profile holds every grant the flowlibrary manifest requires${input.requiredgrants.length === 0 ? " and the manifest requires none" : ""}.` };
|
|
11673
|
+
}
|
|
11674
|
+
function librarysensitivegate(input) {
|
|
11675
|
+
if (!input.sensitive) return { allowed: true, reason: "The flowlibrary manifest carries no sensitive mark, so no fresh consent prompt stands before its import." };
|
|
11676
|
+
if (!input.freshconsent) return { allowed: false, reason: "The flowlibrary manifest is marked sensitive; its import needs a fresh consent prompt the user answers before anything lands." };
|
|
11677
|
+
return { allowed: true, reason: "The user answered the fresh consent prompt of the sensitive flowlibrary manifest; the import proceeds behind the same review." };
|
|
11678
|
+
}
|
|
11679
|
+
function libraryquarantinegate(input) {
|
|
11680
|
+
if (!input.signaturepresent && !input.verified) return { allowed: false, reason: "The flowlibrary entry carries no publisher signature; the entry quarantines until the user verifies its publisher, and a quarantined entry never installs on its own." };
|
|
11681
|
+
if (input.signaturepresent && !input.signaturevalid) return { allowed: false, reason: "The publisher signature of the flowlibrary entry failed its verification; the entry quarantines and never installs under any flag." };
|
|
11682
|
+
return { allowed: true, reason: "The publisher signature of the flowlibrary entry verified over its manifest digest; the entry stays available for the grant diff and the import." };
|
|
11683
|
+
}
|
|
11684
|
+
function libraryimportgate(input) {
|
|
11685
|
+
if (!input.proposal) return { allowed: false, reason: "A library import lands as a proposal only; no template ever executes directly and the plan review gates every step as always." };
|
|
11686
|
+
if (!input.planreviewed) return { allowed: false, reason: "The library import proposal has no plan review yet; the plancards render and the user approves one step at a time before any execution." };
|
|
11687
|
+
return { allowed: true, reason: "The library import landed as a proposal and its plan passed the same review as every native task; the consent gates never moved." };
|
|
11688
|
+
}
|
|
11689
|
+
function syncbridgeoptingate(input) {
|
|
11690
|
+
if (!input.optin) return { allowed: false, reason: "The syncbridge hook stays off because no explicit opt in exists; no hook ever defaults on and no manifest moves without the user turning the hook on." };
|
|
11691
|
+
return { allowed: true, reason: "The user explicitly opted the syncbridge hook in; the hook moves manifests only and never secrets or logs." };
|
|
11692
|
+
}
|
|
11693
|
+
function syncbridgescopegate(input) {
|
|
11694
|
+
if (input.carriessecrets) return { allowed: false, reason: "The syncbridge payload carries a secretvault value shape; the bridge moves manifests only, so the payload refuses in full." };
|
|
11695
|
+
if (input.carrieslogs) return { allowed: false, reason: "The syncbridge payload carries log entries; the bridge moves manifests only, so the payload refuses in full." };
|
|
11696
|
+
return { allowed: true, reason: "The syncbridge payload carries manifests only; secrets and logs never ride the bridge under any flag." };
|
|
11697
|
+
}
|
|
11698
|
+
function runreplaygate(input) {
|
|
11699
|
+
if (!input.sealed) return { allowed: false, reason: "The runreplay walks sealed runs only; an open run keeps moving and its replay would show a chain that still grows." };
|
|
11700
|
+
if (!input.chainvalid) return { allowed: false, reason: "The sealed chain of the run failed its verification; the replay refuses the walk because only a verified chain stands as audit evidence." };
|
|
11701
|
+
return { allowed: true, reason: "The run sealed and its chain verified from the genesis hash to the seal; the replay walks it read only, restoring the observation and capture of each step." };
|
|
11702
|
+
}
|
|
11703
|
+
function outputcomparegate(input) {
|
|
11704
|
+
if (input.signaturea.trim() === "" || input.signatureb.trim() === "") return { allowed: false, reason: "The outputcompare needs the task input signature of both runs; a signatureless run never compares." };
|
|
11705
|
+
if (input.signaturea !== input.signatureb) return { allowed: false, reason: "The two runs carry different task input signatures; only runs that started from the same input compare their outcomes." };
|
|
11706
|
+
return { allowed: true, reason: "The two runs share their task input signature, so their step outcomes compare under the recorded metric set." };
|
|
11707
|
+
}
|
|
11708
|
+
function outputcomparereadonlygate(input) {
|
|
11709
|
+
if (input.executessteps) return { allowed: false, reason: "The outputcompare never executes a step; it reads the stored outcomes of both runs only, so any executing path refuses in full." };
|
|
11710
|
+
return { allowed: true, reason: "The outputcompare joins the stored outcomes of both runs without touching the page; no step executes inside a comparison." };
|
|
11711
|
+
}
|
|
11712
|
+
function backgroundrungate(input) {
|
|
11713
|
+
if (!input.reviewed) return { allowed: false, reason: "The background run queue executes reviewed workflows only; an unreviewed workflow never starts, with or without an open surface." };
|
|
11714
|
+
if (!input.keepaliveheld) return { allowed: false, reason: "A background run holds the keepalive signal for its whole duration; a run that releases the signal early stops being a background run." };
|
|
11715
|
+
return { allowed: true, reason: "The reviewed workflow runs in the background with the keepalive signal held and every checkpoint restoring it on each worker wake." };
|
|
11716
|
+
}
|
|
11448
11717
|
|
|
11449
11718
|
// llm.ts
|
|
11450
11719
|
var defaultrefusalmarkers = ["i cannot", "i can't", "i'm unable", "refusal:", "cannot comply"];
|
|
@@ -11805,7 +12074,7 @@ function budgetcheck(input) {
|
|
|
11805
12074
|
}
|
|
11806
12075
|
|
|
11807
12076
|
// version.ts
|
|
11808
|
-
var packageversion = "1.1.
|
|
12077
|
+
var packageversion = "1.1.66";
|
|
11809
12078
|
|
|
11810
12079
|
// types.ts
|
|
11811
12080
|
var protocolversion = packageversion;
|
|
@@ -13376,7 +13645,8 @@ function onboardingsteps() {
|
|
|
13376
13645
|
{ id: "origingrants", surface: "popup", title: "Origin grants", body: "Devthink denies automation by default; grant one exact origin at a time from the popup and every run stays inside the granted origins.", completion: "origingrantscompleted" },
|
|
13377
13646
|
{ id: "planreview", surface: "sidepanel", title: "Plan review", body: "Every task becomes a plan of reviewed steps; read the plancards of each risk class and approve, reject or edit one step at a time.", completion: "planreviewcompleted" },
|
|
13378
13647
|
{ id: "runcontrol", surface: "sidepanel", title: "Run control", body: "Runs start, pause, resume and cancel under your hand; a cancelled run rolls only its queued steps back while the executed steps stay sealed.", completion: "runcontrolcompleted" },
|
|
13379
|
-
{ id: "logaudit", surface: "dashboardpage", title: "Log audit", body: "The immutable log chains every step transition with masked values; open the dashboard, verify the chain and copy a verified range as an audit excerpt.", completion: "logauditcompleted" }
|
|
13648
|
+
{ id: "logaudit", surface: "dashboardpage", title: "Log audit", body: "The immutable log chains every step transition with masked values; open the dashboard, verify the chain and copy a verified range as an audit excerpt.", completion: "logauditcompleted" },
|
|
13649
|
+
{ id: "library", surface: "dashboardpage", title: "Flow library", body: "The flowlibrary shares reviewed workflow templates: browse an entry, read its step list and grant diff, and every install still lands as a proposal behind the same review.", completion: "librarycompleted", optional: true }
|
|
13380
13650
|
];
|
|
13381
13651
|
}
|
|
13382
13652
|
function onboardingstart(previous, now) {
|
|
@@ -13387,7 +13657,7 @@ function onboardingcomplete(state, stepid, now) {
|
|
|
13387
13657
|
const step = steps.find((candidate) => candidate.id === stepid);
|
|
13388
13658
|
if (step === void 0) throw new Error(`The onboarding knows no ${stepid} step.`);
|
|
13389
13659
|
const completed = state.stepscompleted.includes(stepid) ? state.stepscompleted : [...state.stepscompleted, stepid];
|
|
13390
|
-
const done = steps.every((candidate) => completed.includes(candidate.id));
|
|
13660
|
+
const done = steps.filter((candidate) => candidate.optional !== true).every((candidate) => completed.includes(candidate.id));
|
|
13391
13661
|
if (!done) return { state: { ...state, stepscompleted: completed, done: false } };
|
|
13392
13662
|
const consentevent = "onboardingconsentgranted";
|
|
13393
13663
|
return { state: { stepscompleted: completed, done: true, ...state.startedat !== void 0 ? { startedat: state.startedat } : {}, consentevent, completedat: now }, consentevent };
|
|
@@ -13418,6 +13688,1005 @@ function busrouteaction(action, input) {
|
|
|
13418
13688
|
return { dispatched: true, gate: "commandbus", reason: `The ${action.command} action of the ${action.surface} routed through its policy gates and dispatches.` };
|
|
13419
13689
|
}
|
|
13420
13690
|
|
|
13691
|
+
// datagrid.ts
|
|
13692
|
+
function infercolumntype(values) {
|
|
13693
|
+
const present = values.filter((value) => value.trim() !== "");
|
|
13694
|
+
if (present.length === 0) return "empty";
|
|
13695
|
+
if (present.every((value) => /^-?\d+(?:\.\d+)?$/.test(value.trim()))) return "number";
|
|
13696
|
+
if (present.every((value) => value.trim() === "true" || value.trim() === "false")) return "boolean";
|
|
13697
|
+
if (present.every((value) => !Number.isNaN(Date.parse(value.trim())) && /\d{4}-\d{2}-\d{2}/.test(value.trim()))) return "date";
|
|
13698
|
+
return "text";
|
|
13699
|
+
}
|
|
13700
|
+
function datagridcolumnsof(rows) {
|
|
13701
|
+
const fields = [...new Set(rows.flatMap((row) => Object.keys(row)))];
|
|
13702
|
+
return fields.map((field) => ({ field, label: field, type: infercolumntype(rows.map((row) => row[field] ?? "")), inferred: true }));
|
|
13703
|
+
}
|
|
13704
|
+
function datagridof(input) {
|
|
13705
|
+
if (input.title.trim() === "") throw new Error("The datagrid view needs its title.");
|
|
13706
|
+
if (input.origin.trim() === "") throw new Error("The datagrid view needs its origin.");
|
|
13707
|
+
if (input.rows.length === 0) throw new Error("The datagrid view needs at least one extracted row.");
|
|
13708
|
+
const columns = datagridcolumnsof(input.rows);
|
|
13709
|
+
const rows = input.rows.map((row, index) => ({ index, values: Object.fromEntries(columns.map((column) => [column.field, row[column.field] ?? ""])) }));
|
|
13710
|
+
return { id: randomid(), title: input.title.trim(), origin: input.origin.trim(), runid: input.runid, columns, rows, at: input.at };
|
|
13711
|
+
}
|
|
13712
|
+
function sortdatagridrows(view, input) {
|
|
13713
|
+
const column = view.columns.find((candidate) => candidate.field === input.field);
|
|
13714
|
+
if (column === void 0) throw new Error(`The datagrid knows no ${input.field} column to sort.`);
|
|
13715
|
+
const rows = [...view.rows].sort((left, right) => {
|
|
13716
|
+
const leftvalue = left.values[input.field] ?? "";
|
|
13717
|
+
const rightvalue = right.values[input.field] ?? "";
|
|
13718
|
+
let compared = 0;
|
|
13719
|
+
if (column.type === "number") compared = Number(leftvalue) - Number(rightvalue);
|
|
13720
|
+
else if (column.type === "boolean") compared = (leftvalue === "true" ? 1 : 0) - (rightvalue === "true" ? 1 : 0);
|
|
13721
|
+
else if (column.type === "date") compared = Date.parse(leftvalue) - Date.parse(rightvalue);
|
|
13722
|
+
else compared = leftvalue.localeCompare(rightvalue);
|
|
13723
|
+
return input.direction === "descending" ? -compared : compared;
|
|
13724
|
+
}).map((row, index) => ({ ...row, index }));
|
|
13725
|
+
return { ...view, rows };
|
|
13726
|
+
}
|
|
13727
|
+
function filterdatagridrows(view, text2) {
|
|
13728
|
+
const query = text2.trim().toLowerCase();
|
|
13729
|
+
if (query === "") return view;
|
|
13730
|
+
const rows = view.rows.filter((row) => Object.values(row.values).some((value) => value.toLowerCase().includes(query)));
|
|
13731
|
+
return { ...view, rows };
|
|
13732
|
+
}
|
|
13733
|
+
function selectrowrange(view, from, to) {
|
|
13734
|
+
if (from < 0 || to < from || to >= view.rows.length) throw new Error(`The row range ${from} to ${to} names no inclusive slice of the ${view.rows.length} row${view.rows.length === 1 ? "" : "s"}.`);
|
|
13735
|
+
const rows = view.rows.map((row) => ({ ...row, selected: row.index >= from && row.index <= to }));
|
|
13736
|
+
return { ...view, rows };
|
|
13737
|
+
}
|
|
13738
|
+
function exportrowsof(view, scope) {
|
|
13739
|
+
if (scope === "selection") {
|
|
13740
|
+
const selected = view.rows.filter((row) => row.selected === true);
|
|
13741
|
+
if (selected.length === 0) throw new Error("The selection export needs its selected row range; select rows before the export.");
|
|
13742
|
+
return selected;
|
|
13743
|
+
}
|
|
13744
|
+
return view.rows;
|
|
13745
|
+
}
|
|
13746
|
+
function exportmenudescriptors() {
|
|
13747
|
+
return ["csv", "json", "clipboard"].flatMap((format) => ["selection", "step", "run"].map((scope) => ({ format, scope, destination: format === "clipboard" ? "clipboard" : "download" })));
|
|
13748
|
+
}
|
|
13749
|
+
function maskedvalueof(value, field, maskverdicts) {
|
|
13750
|
+
const verdict = maskverdicts[field];
|
|
13751
|
+
if (verdict === void 0) return { value, masked: false };
|
|
13752
|
+
return { value: `${"\u2022".repeat(Math.min(value.length, 8))} (${value.length} characters, masked)`, masked: true };
|
|
13753
|
+
}
|
|
13754
|
+
function csvfield(value) {
|
|
13755
|
+
if (/[",\n]/.test(value)) return `"${value.replaceAll('"', '""')}"`;
|
|
13756
|
+
return value;
|
|
13757
|
+
}
|
|
13758
|
+
function exportdatagrid(view, descriptor, maskverdicts = {}) {
|
|
13759
|
+
const rows = exportrowsof(view, descriptor.scope);
|
|
13760
|
+
const maskedfields = [...new Set(rows.flatMap((row) => Object.keys(row.values)).filter((field) => maskverdicts[field] !== void 0))];
|
|
13761
|
+
if (descriptor.format === "json") {
|
|
13762
|
+
const records = rows.map((row) => Object.fromEntries(view.columns.map((column) => {
|
|
13763
|
+
const masked = maskedvalueof(row.values[column.field] ?? "", column.field, maskverdicts);
|
|
13764
|
+
return [column.field, column.type === "number" && !masked.masked ? Number(masked.value) : column.type === "boolean" && !masked.masked ? masked.value === "true" : masked.value];
|
|
13765
|
+
})));
|
|
13766
|
+
return { format: descriptor.format, scope: descriptor.scope, destination: descriptor.destination, text: JSON.stringify({ view: view.title, origin: view.origin, runid: view.runid, columns: view.columns.map((column) => ({ field: column.field, type: column.type })), rows: records }, null, 2), rows: records.length, maskedfields };
|
|
13767
|
+
}
|
|
13768
|
+
const header = view.columns.map((column) => csvfield(column.label)).join(",");
|
|
13769
|
+
const lines = rows.map((row) => view.columns.map((column) => csvfield(maskedvalueof(row.values[column.field] ?? "", column.field, maskverdicts).value)).join(","));
|
|
13770
|
+
return { format: descriptor.format, scope: descriptor.scope, destination: descriptor.destination, text: [header, ...lines].join("\n"), rows: rows.length, maskedfields };
|
|
13771
|
+
}
|
|
13772
|
+
|
|
13773
|
+
// quickactions.ts
|
|
13774
|
+
function quickactioncatalog() {
|
|
13775
|
+
return [
|
|
13776
|
+
{ id: "extractpage", label: "Extract page data", command: "starttask", surface: "sidepanel", session: true },
|
|
13777
|
+
{ id: "captureshot", label: "Capture a shot", command: "starttask", surface: "sidepanel", permission: "downloads", session: true },
|
|
13778
|
+
{ id: "runrecent", label: "Run the recent task", command: "starttask", surface: "popup", session: true },
|
|
13779
|
+
{ id: "opendashboardpage", label: "Open the dashboard", command: "opendashboardpage", surface: "dashboardpage" }
|
|
13780
|
+
];
|
|
13781
|
+
}
|
|
13782
|
+
function quickactionsfor(catalog, input) {
|
|
13783
|
+
const capabilities = input.grantedcapabilities ?? ["activeTab", "storage", "scripting", "sidePanel"];
|
|
13784
|
+
const grantedcapabilities = capabilities;
|
|
13785
|
+
return catalog.filter((action) => quickactiongate({ action: { command: action.command, origin: input.origin, ...action.permission !== void 0 ? { permission: action.permission } : {}, ...action.session !== void 0 ? { session: action.session } : {} }, granted: input.granted, sessionactive: input.sessionactive, capabilities: grantedcapabilities }).allowed);
|
|
13786
|
+
}
|
|
13787
|
+
function shortcutdefaults() {
|
|
13788
|
+
return [
|
|
13789
|
+
{ command: "starttask", key: "Enter", modifiers: [], editable: true, surface: "popup" },
|
|
13790
|
+
{ command: "pauserun", key: "p", modifiers: ["ctrl", "shift"], editable: true, surface: "sidepanel" },
|
|
13791
|
+
{ command: "resumerun", key: "r", modifiers: ["ctrl", "shift"], editable: true, surface: "sidepanel" },
|
|
13792
|
+
{ command: "cancelrun", key: "x", modifiers: ["ctrl", "shift"], editable: true, surface: "sidepanel" },
|
|
13793
|
+
{ command: "commandpalette", key: ".", modifiers: ["ctrl"], editable: true, surface: "popup" }
|
|
13794
|
+
];
|
|
13795
|
+
}
|
|
13796
|
+
function parseshortcut(text2) {
|
|
13797
|
+
const parts = text2.trim().toLowerCase().split("+").map((part) => part.trim()).filter((part) => part !== "");
|
|
13798
|
+
if (parts.length === 0) throw new Error("The shortcut binding needs its key.");
|
|
13799
|
+
const modifiers = ["ctrl", "alt", "shift", "meta"];
|
|
13800
|
+
const key = parts.filter((part) => !modifiers.includes(part))[0];
|
|
13801
|
+
if (key === void 0 || key === "") throw new Error("The shortcut binding needs its key beside its modifiers.");
|
|
13802
|
+
return { key, modifiers: parts.filter((part) => modifiers.includes(part)) };
|
|
13803
|
+
}
|
|
13804
|
+
function shortcuttext(binding) {
|
|
13805
|
+
return [...binding.modifiers, binding.key].join("+");
|
|
13806
|
+
}
|
|
13807
|
+
function shortcutbindingafter(bindings, command, text2) {
|
|
13808
|
+
const existing = bindings.find((binding) => binding.command === command);
|
|
13809
|
+
if (existing === void 0) throw new Error(`The shortcutkeys know no ${command} command to edit.`);
|
|
13810
|
+
const parsed = parseshortcut(text2);
|
|
13811
|
+
return bindings.map((binding) => binding.command === command ? { ...binding, key: parsed.key, modifiers: parsed.modifiers } : binding);
|
|
13812
|
+
}
|
|
13813
|
+
function shortcutcommandof(bindings, input) {
|
|
13814
|
+
const pressed = [...input.modifiers].map((modifier) => modifier.toLowerCase()).sort();
|
|
13815
|
+
return bindings.find((binding) => binding.key.toLowerCase() === input.key.toLowerCase() && [...binding.modifiers].sort().join("+") === pressed.join("+") && (binding.command === "commandpalette" || binding.surface === input.surface))?.command;
|
|
13816
|
+
}
|
|
13817
|
+
function shortcutdispatchable(command, entries, input) {
|
|
13818
|
+
const entry = entries.find((candidate) => candidate.action.command === command);
|
|
13819
|
+
if (entry === void 0) return command === "commandpalette";
|
|
13820
|
+
return paletteactiongate({ action: { command: entry.action.command, ...entry.action.permission !== void 0 ? { permission: entry.action.permission } : {}, ...entry.action.session !== void 0 ? { session: entry.action.session } : {} }, granted: input.granted, sessionactive: input.sessionactive }).allowed;
|
|
13821
|
+
}
|
|
13822
|
+
function parseomniboxtask(input) {
|
|
13823
|
+
const text2 = input.text.trim();
|
|
13824
|
+
if (text2 === "") throw new Error("The omnibox task needs its natural language goal after the keyword.");
|
|
13825
|
+
if (input.origin.trim() === "") throw new Error("The omnibox task needs its active origin scope.");
|
|
13826
|
+
return { id: randomid(), text: text2, origin: input.origin.trim(), surface: "omnibox", at: input.at };
|
|
13827
|
+
}
|
|
13828
|
+
function omniboxtasktotaskinput(submission) {
|
|
13829
|
+
return { id: submission.id, text: submission.text, context: "", origin: submission.origin, surface: "omnibox", at: submission.at };
|
|
13830
|
+
}
|
|
13831
|
+
|
|
13832
|
+
// statusviews.ts
|
|
13833
|
+
function statusbadgeof(input) {
|
|
13834
|
+
if (input.planstate === void 0) return { state: "idle", waitingcount: 0 };
|
|
13835
|
+
if (input.waitingcount > 0) return { state: "attention", waitingcount: input.waitingcount, ...input.runid !== void 0 ? { runid: input.runid } : {} };
|
|
13836
|
+
if (input.planstate === "approved") return { state: "running", waitingcount: 0, ...input.runid !== void 0 ? { runid: input.runid } : {} };
|
|
13837
|
+
if (input.planstate === "pending") return { state: "waiting", waitingcount: 0, ...input.runid !== void 0 ? { runid: input.runid } : {} };
|
|
13838
|
+
return { state: "idle", waitingcount: 0, ...input.runid !== void 0 ? { runid: input.runid } : {} };
|
|
13839
|
+
}
|
|
13840
|
+
function badgetextof(state) {
|
|
13841
|
+
if (state.state === "attention") return String(state.waitingcount);
|
|
13842
|
+
if (state.state === "running") return "run";
|
|
13843
|
+
if (state.state === "waiting") return "wait";
|
|
13844
|
+
return "";
|
|
13845
|
+
}
|
|
13846
|
+
function badgecolorof(state) {
|
|
13847
|
+
if (state.state === "attention") return "#b3261e";
|
|
13848
|
+
if (state.state === "running") return "#1a73e8";
|
|
13849
|
+
if (state.state === "waiting") return "#e37400";
|
|
13850
|
+
return "#5f6368";
|
|
13851
|
+
}
|
|
13852
|
+
function notifydoneof(input) {
|
|
13853
|
+
if (input.runid.trim() === "") throw new Error("The done notification needs its run id.");
|
|
13854
|
+
return { id: randomid(), kind: "done", title: "The run completed", body: input.summary.trim() === "" ? `The run of ${input.origin} completed; the runsummary holds every step outcome.` : input.summary, deeplink: `#run-${input.runid}`, runid: input.runid, content: false, at: input.at };
|
|
13855
|
+
}
|
|
13856
|
+
function notifyattentionof(input) {
|
|
13857
|
+
if (input.stepid.trim() === "") throw new Error("The attention notification needs its waiting step.");
|
|
13858
|
+
const gate = notificationcontentgate({ content: input.content === true, consent: input.consent === true });
|
|
13859
|
+
if (!gate.allowed) throw new Error(gate.reason ?? "The attention notification refuses its page content.");
|
|
13860
|
+
return { id: randomid(), kind: "attention", title: input.cause === "gatewait" ? "The run waits for review" : input.cause === "phishguard" ? "The phishguard blocked a step" : "The run deferred a step", body: input.reason, deeplink: `#step-${input.stepid}`, runid: input.runid, stepid: input.stepid, content: input.content === true, at: input.at };
|
|
13861
|
+
}
|
|
13862
|
+
function notificationrespectsdnd(payload, dnd) {
|
|
13863
|
+
if (dnd) return { show: false, reason: `The os stays in do not disturb, so the ${payload.kind} notification holds its deep link ${payload.deeplink} in the history instead of showing.` };
|
|
13864
|
+
return { show: true, reason: `The ${payload.kind} notification shows with its deep link ${payload.deeplink}.` };
|
|
13865
|
+
}
|
|
13866
|
+
function recenttrayentryof(input) {
|
|
13867
|
+
if (input.runid.trim() === "") throw new Error("The recenttray entry needs its run id.");
|
|
13868
|
+
return { runid: input.runid, origin: input.origin, outcome: input.outcome, title: input.title, at: input.at, resumable: input.outcome === "halted", reopenable: input.outcome === "completed" || input.outcome === "failed" };
|
|
13869
|
+
}
|
|
13870
|
+
function recenttrayafter(entries, entry, depth) {
|
|
13871
|
+
const appended = [entry, ...entries.filter((candidate) => candidate.runid !== entry.runid)];
|
|
13872
|
+
if (depth === void 0) return appended;
|
|
13873
|
+
if (!Number.isInteger(depth) || depth <= 0) return appended;
|
|
13874
|
+
return appended.slice(0, depth);
|
|
13875
|
+
}
|
|
13876
|
+
function recenttrayactions(entry) {
|
|
13877
|
+
const actions = [];
|
|
13878
|
+
if (entry.resumable) actions.push("resume");
|
|
13879
|
+
if (entry.reopenable) actions.push("reopen");
|
|
13880
|
+
return actions;
|
|
13881
|
+
}
|
|
13882
|
+
function stetoastof(input) {
|
|
13883
|
+
if (input.stepid.trim() === "") throw new Error("The stetoast needs its step.");
|
|
13884
|
+
return { id: randomid(), stepid: input.stepid, kind: input.kind, durationms: input.durationms, at: input.at };
|
|
13885
|
+
}
|
|
13886
|
+
function stetoaststackafter(toasts, toast, livecount) {
|
|
13887
|
+
const history = [...toasts, toast];
|
|
13888
|
+
if (livecount === void 0 || !Number.isInteger(livecount) || livecount <= 0) return { live: history, history };
|
|
13889
|
+
return { live: history.slice(-livecount), history };
|
|
13890
|
+
}
|
|
13891
|
+
function stetoasthistory(toasts) {
|
|
13892
|
+
return [...toasts].reverse();
|
|
13893
|
+
}
|
|
13894
|
+
|
|
13895
|
+
// pickerviews.ts
|
|
13896
|
+
function stabilityscoreof(input) {
|
|
13897
|
+
let score = 0;
|
|
13898
|
+
if (input.hasid) score += 40;
|
|
13899
|
+
if (input.hasstableattributes) score += 25;
|
|
13900
|
+
if (input.hasrole) score += 15;
|
|
13901
|
+
if (input.textunique) score += 10;
|
|
13902
|
+
if (input.selector.trim() === "") score -= 20;
|
|
13903
|
+
else if (input.selector.includes(":nth-child") || input.selector.includes(":nth-of-type")) score -= 15;
|
|
13904
|
+
return Math.max(0, Math.min(100, score));
|
|
13905
|
+
}
|
|
13906
|
+
function pickercandidateof(input) {
|
|
13907
|
+
const score = stabilityscoreof(input);
|
|
13908
|
+
const reasons = [];
|
|
13909
|
+
if (input.hasid) reasons.push("the id anchors the selector");
|
|
13910
|
+
if (input.hasstableattributes) reasons.push("stable attributes back the selector");
|
|
13911
|
+
if (input.hasrole) reasons.push("the aria role names the element");
|
|
13912
|
+
if (input.textunique) reasons.push("the text stays unique on the page");
|
|
13913
|
+
if (reasons.length === 0) reasons.push("only the positional shape anchors the selector");
|
|
13914
|
+
return { selector: input.selector, ...input.text !== void 0 && input.text !== "" ? { text: input.text } : {}, ...input.role !== void 0 && input.role !== "" ? { role: input.role } : {}, stabilityscore: score, reason: `The stability score of ${score} stands because ${reasons.join(", ")}.` };
|
|
13915
|
+
}
|
|
13916
|
+
function pickersessionstart(input) {
|
|
13917
|
+
const gate = pickeroverlaygate({ origin: input.origin, granted: input.granted });
|
|
13918
|
+
if (!gate.allowed) throw new Error(gate.reason);
|
|
13919
|
+
return { id: randomid(), origin: input.origin, candidates: rankcandidates(input.candidates), startedat: input.at };
|
|
13920
|
+
}
|
|
13921
|
+
function rankcandidates(candidates) {
|
|
13922
|
+
return [...candidates].sort((left, right) => right.stabilityscore - left.stabilityscore);
|
|
13923
|
+
}
|
|
13924
|
+
function lockcandidate(session, candidateindex, stepid) {
|
|
13925
|
+
const candidate = session.candidates[candidateindex];
|
|
13926
|
+
if (candidate === void 0) throw new Error(`The picker session knows no candidate ${candidateindex} to lock.`);
|
|
13927
|
+
if (session.lockedstepid !== void 0) throw new Error(`The picker session already locks its candidate for the step ${session.lockedstepid}; one session locks one candidate.`);
|
|
13928
|
+
return { ...session, lockedstepid: stepid, lockedselector: candidate.selector };
|
|
13929
|
+
}
|
|
13930
|
+
function haloof(input) {
|
|
13931
|
+
if (input.selector.trim() === "") throw new Error("The targethalo needs its target selector.");
|
|
13932
|
+
return { stepid: input.stepid, selector: input.selector, rect: input.rect, state: input.state };
|
|
13933
|
+
}
|
|
13934
|
+
function halocolorof(state) {
|
|
13935
|
+
if (state === "running") return "#1a73e8";
|
|
13936
|
+
if (state === "waiting") return "#e37400";
|
|
13937
|
+
if (state === "done") return "#188038";
|
|
13938
|
+
if (state === "failed") return "#b3261e";
|
|
13939
|
+
if (state === "halted") return "#3c4043";
|
|
13940
|
+
return "#5f6368";
|
|
13941
|
+
}
|
|
13942
|
+
function guidedtips() {
|
|
13943
|
+
return [
|
|
13944
|
+
{ id: "selectorstability", surface: "sidepanel", title: "Selector stability", body: "Devthink scores every candidate selector by its stability: an id anchor, stable attributes, an aria role and a unique text each lift the score while a positional shape lowers it, so the proposed step binds to the selector least likely to break.", pickerstep: "candidatepick" },
|
|
13945
|
+
{ id: "candidatelock", surface: "sidepanel", title: "Locking a candidate", body: "Lock one candidate to bind it to the proposed step; one picker session locks one candidate and the locked selector rides the step for its review.", pickerstep: "candidatelock" },
|
|
13946
|
+
{ id: "haloreadout", surface: "sidepanel", title: "The halo read out", body: "During a run the targethalo outlines the active target element and its color follows the step state: gray while pending, blue while running, amber at a gate, green when done, red on failure and dark when halted.", pickerstep: "halotracking" }
|
|
13947
|
+
];
|
|
13948
|
+
}
|
|
13949
|
+
function guidedtipdismiss(tips, dismissed, tipid) {
|
|
13950
|
+
const tip = tips.find((candidate) => candidate.id === tipid);
|
|
13951
|
+
if (tip === void 0) throw new Error(`The guidedtips know no ${tipid} tip.`);
|
|
13952
|
+
return [.../* @__PURE__ */ new Set([...dismissed, tipid])];
|
|
13953
|
+
}
|
|
13954
|
+
function guidedtiprecall(dismissed) {
|
|
13955
|
+
return [];
|
|
13956
|
+
}
|
|
13957
|
+
function pagechipof(input) {
|
|
13958
|
+
if (input.stepid.trim() === "") throw new Error("The pagechip needs its step.");
|
|
13959
|
+
if (input.selector.trim() === "") throw new Error("The pagechip needs its anchor selector.");
|
|
13960
|
+
return { id: randomid(), stepid: input.stepid, selector: input.selector, origin: input.origin, at: input.at };
|
|
13961
|
+
}
|
|
13962
|
+
function pagechipresolve(chip, resolution, surface, at) {
|
|
13963
|
+
if (surface === "background") throw new Error("The pagechip resolution needs its distinct human action from a surface; the background never resolves a review on its own.");
|
|
13964
|
+
const resolved = { ...chip, resolution, resolvedat: at };
|
|
13965
|
+
return {
|
|
13966
|
+
chip: resolved,
|
|
13967
|
+
logevent: { kind: "review", stepid: chip.stepid, summary: `The user ${resolution === "approve" ? "approved" : "rejected"} the step ${chip.stepid} of ${chip.origin} from the pagechip anchored to ${chip.selector} on the ${surface}; one distinct human action resolved the step alone.` }
|
|
13968
|
+
};
|
|
13969
|
+
}
|
|
13970
|
+
|
|
13971
|
+
// evidenceviews.ts
|
|
13972
|
+
function shotpanelof(input) {
|
|
13973
|
+
const gate = shotpanelgate({ captureorigin: input.origin, granted: input.granted });
|
|
13974
|
+
if (!gate.allowed) throw new Error(gate.reason);
|
|
13975
|
+
if (input.stepid.trim() === "") throw new Error("The shotpanel view needs its step.");
|
|
13976
|
+
return { id: randomid(), stepid: input.stepid, runid: input.runid, captureid: input.captureid, provenance: input.provenance, origin: input.origin, redactions: input.redactions ?? [], zoom: 1, pan: { x: 0, y: 0 }, at: input.at };
|
|
13977
|
+
}
|
|
13978
|
+
function shotpanelzoom(view, factor) {
|
|
13979
|
+
if (!(factor > 0)) throw new Error("The shotpanel zoom factor stays a positive number.");
|
|
13980
|
+
return { ...view, zoom: view.zoom * factor };
|
|
13981
|
+
}
|
|
13982
|
+
function shotpanelpan(view, offset) {
|
|
13983
|
+
return { ...view, pan: { x: view.pan.x + offset.x, y: view.pan.y + offset.y } };
|
|
13984
|
+
}
|
|
13985
|
+
function comparepairof(input) {
|
|
13986
|
+
if (input.stepid.trim() === "") throw new Error("The compareviewer pair needs its step.");
|
|
13987
|
+
if (input.beforecaptureid === input.aftercaptureid) throw new Error("The compareviewer pair needs its distinct before and after captures.");
|
|
13988
|
+
return { id: randomid(), stepid: input.stepid, beforecaptureid: input.beforecaptureid, aftercaptureid: input.aftercaptureid, slidervalue: 50 };
|
|
13989
|
+
}
|
|
13990
|
+
function overlayslider(pair, value) {
|
|
13991
|
+
if (!Number.isFinite(value) || value < 0 || value > 100) throw new Error("The compareviewer slider stays between zero and one hundred.");
|
|
13992
|
+
return { ...pair, slidervalue: value };
|
|
13993
|
+
}
|
|
13994
|
+
function comparepairsforsteps(steps, captures) {
|
|
13995
|
+
const pairs = [];
|
|
13996
|
+
for (const step of steps) {
|
|
13997
|
+
if (!step.writeexecuted) continue;
|
|
13998
|
+
const capture = captures[step.stepid];
|
|
13999
|
+
if (capture?.beforecaptureid === void 0 || capture?.aftercaptureid === void 0) continue;
|
|
14000
|
+
pairs.push(comparepairof({ stepid: step.stepid, beforecaptureid: capture.beforecaptureid, aftercaptureid: capture.aftercaptureid }));
|
|
14001
|
+
}
|
|
14002
|
+
return pairs;
|
|
14003
|
+
}
|
|
14004
|
+
|
|
14005
|
+
// siteprefs.ts
|
|
14006
|
+
function siteprofileof(input) {
|
|
14007
|
+
const gate = siteprofilegate({ origin: input.origin });
|
|
14008
|
+
if (!gate.allowed) throw new Error(gate.reason);
|
|
14009
|
+
return { origin: input.origin, ...input.theme !== void 0 ? { theme: input.theme } : {}, ...input.shortcuts !== void 0 ? { shortcuts: input.shortcuts } : {}, ...input.defaultview !== void 0 ? { defaultview: input.defaultview } : {}, updatedat: input.at };
|
|
14010
|
+
}
|
|
14011
|
+
function siteprofileactive(profile, origin) {
|
|
14012
|
+
return profile.origin === origin;
|
|
14013
|
+
}
|
|
14014
|
+
function siteprofilefor(profiles, origin) {
|
|
14015
|
+
return profiles.find((profile) => siteprofileactive(profile, origin));
|
|
14016
|
+
}
|
|
14017
|
+
function darklighttokensof(mode) {
|
|
14018
|
+
const tokens = mode === "dark" ? { surface: "#1f1f1f", elevated: "#2b2b2b", text: "#e3e3e3", muted: "#9aa0a6", accent: "#8ab4f8", border: "#3c4043", focus: "#aecbfa", error: "#f28b82", success: "#81c995", warning: "#fdd663" } : { surface: "#ffffff", elevated: "#f8f9fa", text: "#202124", muted: "#5f6368", accent: "#1a73e8", border: "#dadce0", focus: "#174ea6", error: "#b3261e", success: "#188038", warning: "#e37400" };
|
|
14019
|
+
return { mode, tokens };
|
|
14020
|
+
}
|
|
14021
|
+
function resolveappearance(input) {
|
|
14022
|
+
if (input.siteprofile?.theme !== void 0 && input.siteprofile.theme !== "system") return { ...darklighttokensof(input.siteprofile.theme), source: "site" };
|
|
14023
|
+
if (input.useroverride !== void 0 && input.useroverride !== "system") return { ...darklighttokensof(input.useroverride), source: "user" };
|
|
14024
|
+
return { ...darklighttokensof(input.ospreference), source: "os" };
|
|
14025
|
+
}
|
|
14026
|
+
function applytheme(documentroot, tokens) {
|
|
14027
|
+
for (const [name, value] of Object.entries(tokens.tokens)) documentroot.style.setProperty(`--theme-${name}`, value);
|
|
14028
|
+
documentroot.style.setProperty("color-scheme", tokens.mode);
|
|
14029
|
+
}
|
|
14030
|
+
function localebundles() {
|
|
14031
|
+
return [
|
|
14032
|
+
{
|
|
14033
|
+
language: "en",
|
|
14034
|
+
strings: {
|
|
14035
|
+
"popup.title": "Devthink",
|
|
14036
|
+
"popup.taskinput.placeholder": "Describe the goal for the active tab",
|
|
14037
|
+
"popup.taskinput.submit": "Propose the plan",
|
|
14038
|
+
"popup.palette.open": "Open the commandpalette",
|
|
14039
|
+
"popup.recent.title": "Recent runs",
|
|
14040
|
+
"popup.recent.resume": "Resume",
|
|
14041
|
+
"popup.recent.reopen": "Reopen",
|
|
14042
|
+
"sidepanel.tab.plan": "Plan",
|
|
14043
|
+
"sidepanel.tab.run": "Run",
|
|
14044
|
+
"sidepanel.tab.review": "Review",
|
|
14045
|
+
"sidepanel.data.export": "Export",
|
|
14046
|
+
"dashboard.title": "Dashboard",
|
|
14047
|
+
"options.title": "Options",
|
|
14048
|
+
"options.theme.label": "Theme",
|
|
14049
|
+
"options.theme.dark": "Dark",
|
|
14050
|
+
"options.theme.light": "Light",
|
|
14051
|
+
"options.theme.system": "Follow the system",
|
|
14052
|
+
"options.locale.label": "Language",
|
|
14053
|
+
"options.shortcuts.label": "Shortcutkeys",
|
|
14054
|
+
"options.notifications.label": "Notifications",
|
|
14055
|
+
"options.importexport.label": "Import and export",
|
|
14056
|
+
"options.tour.label": "Feature tour",
|
|
14057
|
+
"stepapprove.approve": "Approve",
|
|
14058
|
+
"stepapprove.reject": "Reject",
|
|
14059
|
+
"stepapprove.edit": "Edit",
|
|
14060
|
+
"pagechip.approve": "Approve",
|
|
14061
|
+
"pagechip.reject": "Reject",
|
|
14062
|
+
"grid.empty": "No extracted rows yet",
|
|
14063
|
+
"toast.stepdone": "Step completed"
|
|
14064
|
+
}
|
|
14065
|
+
},
|
|
14066
|
+
{
|
|
14067
|
+
language: "pt",
|
|
14068
|
+
strings: {
|
|
14069
|
+
"popup.title": "Devthink",
|
|
14070
|
+
"popup.taskinput.placeholder": "Descreva o objetivo para a aba ativa",
|
|
14071
|
+
"popup.taskinput.submit": "Propor o plano",
|
|
14072
|
+
"popup.palette.open": "Abrir a paleta de comandos",
|
|
14073
|
+
"popup.recent.title": "Execu\xE7\xF5es recentes",
|
|
14074
|
+
"popup.recent.resume": "Retomar",
|
|
14075
|
+
"popup.recent.reopen": "Reabrir",
|
|
14076
|
+
"sidepanel.tab.plan": "Plano",
|
|
14077
|
+
"sidepanel.tab.run": "Execu\xE7\xE3o",
|
|
14078
|
+
"sidepanel.tab.review": "Revis\xE3o",
|
|
14079
|
+
"sidepanel.data.export": "Exportar",
|
|
14080
|
+
"dashboard.title": "Painel",
|
|
14081
|
+
"options.title": "Op\xE7\xF5es",
|
|
14082
|
+
"options.theme.label": "Tema",
|
|
14083
|
+
"options.theme.dark": "Escuro",
|
|
14084
|
+
"options.theme.light": "Claro",
|
|
14085
|
+
"options.theme.system": "Seguir o sistema",
|
|
14086
|
+
"options.locale.label": "Idioma",
|
|
14087
|
+
"options.shortcuts.label": "Atalhos",
|
|
14088
|
+
"options.notifications.label": "Notifica\xE7\xF5es",
|
|
14089
|
+
"options.importexport.label": "Importar e exportar",
|
|
14090
|
+
"options.tour.label": "Tour de recursos",
|
|
14091
|
+
"stepapprove.approve": "Aprovar",
|
|
14092
|
+
"stepapprove.reject": "Rejeitar",
|
|
14093
|
+
"stepapprove.edit": "Editar",
|
|
14094
|
+
"pagechip.approve": "Aprovar",
|
|
14095
|
+
"pagechip.reject": "Rejeitar",
|
|
14096
|
+
"grid.empty": "Nenhuma linha extra\xEDda ainda",
|
|
14097
|
+
"toast.stepdone": "Etapa conclu\xEDda"
|
|
14098
|
+
}
|
|
14099
|
+
}
|
|
14100
|
+
];
|
|
14101
|
+
}
|
|
14102
|
+
function localestring(bundles, language, key) {
|
|
14103
|
+
const requested = bundles.find((bundle) => bundle.language === language);
|
|
14104
|
+
const english = bundles.find((bundle) => bundle.language === "en");
|
|
14105
|
+
return requested?.strings[key] ?? english?.strings[key] ?? key;
|
|
14106
|
+
}
|
|
14107
|
+
function supportedlanguages(bundles) {
|
|
14108
|
+
return bundles.map((bundle) => bundle.language);
|
|
14109
|
+
}
|
|
14110
|
+
function localeformat(input) {
|
|
14111
|
+
if (input.kind === "date") {
|
|
14112
|
+
const date = new Date(input.value);
|
|
14113
|
+
const year = date.getUTCFullYear();
|
|
14114
|
+
const month = String(date.getUTCMonth() + 1).padStart(2, "0");
|
|
14115
|
+
const day = String(date.getUTCDate()).padStart(2, "0");
|
|
14116
|
+
const hours = String(date.getUTCHours()).padStart(2, "0");
|
|
14117
|
+
const minutes = String(date.getUTCMinutes()).padStart(2, "0");
|
|
14118
|
+
return input.language === "pt" ? `${day}/${month}/${year} ${hours}:${minutes}` : `${year}-${month}-${day} ${hours}:${minutes}`;
|
|
14119
|
+
}
|
|
14120
|
+
if (input.kind === "duration") {
|
|
14121
|
+
const seconds = Math.round(input.value / 1e3);
|
|
14122
|
+
const minutes = Math.floor(seconds / 60);
|
|
14123
|
+
const rest = seconds % 60;
|
|
14124
|
+
return input.language === "pt" ? `${minutes} min ${rest} s` : `${minutes}m ${rest}s`;
|
|
14125
|
+
}
|
|
14126
|
+
const text2 = String(input.value);
|
|
14127
|
+
const parts = text2.split(".");
|
|
14128
|
+
const whole = parts[0] ?? "0";
|
|
14129
|
+
const fraction = parts[1];
|
|
14130
|
+
const grouped = whole.replace(/\B(?=(\d{3})+(?!\d))/g, input.language === "pt" ? "." : ",");
|
|
14131
|
+
return fraction !== void 0 ? `${grouped}${input.language === "pt" ? "," : "."}${fraction}` : grouped;
|
|
14132
|
+
}
|
|
14133
|
+
|
|
14134
|
+
// portability.ts
|
|
14135
|
+
function importexportpayloadof(input) {
|
|
14136
|
+
if (input.profile.trim() === "") throw new Error("The importexport payload needs its profile name.");
|
|
14137
|
+
const secrets = [...input.originprofiles, ...input.siteprofiles, ...input.notes, ...Object.values(input.preferences)].find((record2) => secretcarrying(record2)) !== void 0;
|
|
14138
|
+
const gate = importexportgate({ containssecrets: secrets, unmaskedlogs: false });
|
|
14139
|
+
if (!gate.allowed) throw new Error(gate.reason);
|
|
14140
|
+
return { version: 1, kind: "settings", profile: input.profile.trim(), exportedat: input.at, contents: { originprofiles: input.originprofiles, siteprofiles: input.siteprofiles, notes: input.notes, preferences: input.preferences }, exclusions: ["secretvault values", "unmasked logs"] };
|
|
14141
|
+
}
|
|
14142
|
+
function secretcarrying(record2) {
|
|
14143
|
+
if (record2 === null || typeof record2 !== "object") return false;
|
|
14144
|
+
const entries = Object.entries(record2);
|
|
14145
|
+
const secretkeys = ["secret", "token", "password", "apikey", "authorization"];
|
|
14146
|
+
return entries.some(([key, value]) => secretkeys.some((shape) => key.toLowerCase().includes(shape)) && typeof value === "string" && value.trim() !== "");
|
|
14147
|
+
}
|
|
14148
|
+
function importexportvalidate(payload) {
|
|
14149
|
+
const records = [...payload.contents.originprofiles, ...payload.contents.siteprofiles, ...payload.contents.notes, ...Object.values(payload.contents.preferences)];
|
|
14150
|
+
const preferencessecrets = Object.entries(payload.contents.preferences).some(([key, value]) => secretcarrying({ [key]: value }));
|
|
14151
|
+
const gate = importexportgate({ containssecrets: records.some((record2) => secretcarrying(record2)) || preferencessecrets, unmaskedlogs: payload.contents.unmaskedlogs !== void 0 });
|
|
14152
|
+
if (!gate.allowed) return { ok: false, reason: gate.reason ?? "The importexport bundle refuses." };
|
|
14153
|
+
if (payload.profile.trim() === "") return { ok: false, reason: "The importexport bundle needs its profile name." };
|
|
14154
|
+
return { ok: true, reason: `The importexport bundle of the profile ${payload.profile} validates with ${payload.contents.originprofiles.length} origin profile${payload.contents.originprofiles.length === 1 ? "" : "s"}, ${payload.contents.siteprofiles.length} site profile${payload.contents.siteprofiles.length === 1 ? "" : "s"} and ${payload.contents.notes.length} note${payload.contents.notes.length === 1 ? "" : "s"}; ${payload.exclusions.join(" and ")} never enter any bundle.` };
|
|
14155
|
+
}
|
|
14156
|
+
function applyimport(payload, current) {
|
|
14157
|
+
const validation = importexportvalidate(payload);
|
|
14158
|
+
if (!validation.ok) throw new Error(validation.reason);
|
|
14159
|
+
const applied = Object.keys(payload.contents.preferences);
|
|
14160
|
+
return { preferences: { ...current, ...payload.contents.preferences }, applied };
|
|
14161
|
+
}
|
|
14162
|
+
function detectfilekind(filename, head) {
|
|
14163
|
+
const extension = filename.toLowerCase().split(".").pop() ?? "";
|
|
14164
|
+
if (extension === "csv") return "csv";
|
|
14165
|
+
if (extension === "json") {
|
|
14166
|
+
const trimmed = head.trim();
|
|
14167
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) return trimmed.includes('"steps"') ? "workflow" : "json";
|
|
14168
|
+
return "json";
|
|
14169
|
+
}
|
|
14170
|
+
if (extension === "yaml" || extension === "yml") return "workflow";
|
|
14171
|
+
return void 0;
|
|
14172
|
+
}
|
|
14173
|
+
function dropimportof(input) {
|
|
14174
|
+
if (input.filename.trim() === "") throw new Error("The dropimport session needs its filename.");
|
|
14175
|
+
const kind = detectfilekind(input.filename, input.head);
|
|
14176
|
+
if (kind === void 0) throw new Error(`The dropimport detects no csv, json or workflow kind in ${input.filename}; the import path refuses the file.`);
|
|
14177
|
+
return { id: `${input.filename}:${input.at}`, filename: input.filename, kind, bytes: input.bytes, accepted: true, at: input.at };
|
|
14178
|
+
}
|
|
14179
|
+
|
|
14180
|
+
// tourviews.ts
|
|
14181
|
+
function featuretourstops() {
|
|
14182
|
+
return [
|
|
14183
|
+
{ id: "origingrants", surface: "popup", focus: "#allowlist", title: "Origin grants", body: "Devthink denies automation by default; grant one exact origin at a time and every run stays inside the granted origins.", order: 1 },
|
|
14184
|
+
{ id: "planreview", surface: "sidepanel", focus: "#plancards", title: "Plan review", body: "Every task becomes a plan of reviewed steps; read the plancards of each risk class and approve, reject or edit one step at a time.", order: 2 },
|
|
14185
|
+
{ id: "runcontrol", surface: "sidepanel", focus: "#timeline", title: "Run control", body: "Runs start, pause, resume and cancel under your hand while the stepstimeline follows every transition.", order: 3 },
|
|
14186
|
+
{ id: "logaudit", surface: "dashboardpage", focus: "#sessiongrid", title: "Log audit", body: "The immutable log chains every step transition with masked values; verify the chain and copy a verified range as an audit excerpt.", order: 4 },
|
|
14187
|
+
{ id: "datagrid", surface: "sidepanel", focus: "#datagrid", title: "The datagrid", body: "Extraction results render as a grid with inferred column types; sort and filter locally, select a row range and export csv, json or clipboard with masked values only.", order: 5 },
|
|
14188
|
+
{ id: "compareviewer", surface: "sidepanel", focus: "#compareviewer", title: "The compareviewer", body: "Every executed write step pairs its before and after captures; the slider overlays the two so you see exactly what the step changed.", order: 6 },
|
|
14189
|
+
{ id: "pickeroverlay", surface: "sidepanel", focus: "#picker", title: "The pickeroverlay", body: "Start a picker session to list the element candidates of the granted origin with stability scored selectors; lock one candidate for the proposed step.", order: 7 }
|
|
14190
|
+
];
|
|
14191
|
+
}
|
|
14192
|
+
function featuretourordered(stops) {
|
|
14193
|
+
return [...stops].sort((left, right) => left.order - right.order);
|
|
14194
|
+
}
|
|
14195
|
+
function featuretourstopat(stops, position) {
|
|
14196
|
+
return featuretourordered(stops)[position];
|
|
14197
|
+
}
|
|
14198
|
+
function a11ylabelof(input) {
|
|
14199
|
+
if (input.control.trim() === "") throw new Error("The a11ylabel needs its control.");
|
|
14200
|
+
if (input.name.trim() === "") throw new Error("The a11ylabel needs its accessible name.");
|
|
14201
|
+
return { control: input.control, role: input.role, name: input.name, ...input.state !== void 0 ? { state: input.state } : {}, ...input.value !== void 0 ? { value: input.value } : {} };
|
|
14202
|
+
}
|
|
14203
|
+
function a11ylabelsfor(surface) {
|
|
14204
|
+
const labels = {
|
|
14205
|
+
popup: [
|
|
14206
|
+
a11ylabelof({ control: "taskinput", role: "textbox", name: "popup.taskinput.placeholder", state: "idle" }),
|
|
14207
|
+
a11ylabelof({ control: "submit", role: "button", name: "popup.taskinput.submit" }),
|
|
14208
|
+
a11ylabelof({ control: "palette", role: "button", name: "popup.palette.open" }),
|
|
14209
|
+
a11ylabelof({ control: "recenttray", role: "list", name: "popup.recent.title", value: "0 runs" })
|
|
14210
|
+
],
|
|
14211
|
+
sidepanel: [
|
|
14212
|
+
a11ylabelof({ control: "plantab", role: "tab", name: "sidepanel.tab.plan", state: "selected" }),
|
|
14213
|
+
a11ylabelof({ control: "runtab", role: "tab", name: "sidepanel.tab.run", state: "unselected" }),
|
|
14214
|
+
a11ylabelof({ control: "reviewtab", role: "tab", name: "sidepanel.tab.review", state: "unselected" }),
|
|
14215
|
+
a11ylabelof({ control: "datagrid", role: "table", name: "grid.empty" }),
|
|
14216
|
+
a11ylabelof({ control: "compareviewer", role: "slider", name: "sidepanel.data.compare", value: "50" }),
|
|
14217
|
+
a11ylabelof({ control: "picker", role: "button", name: "sidepanel.data.picker" })
|
|
14218
|
+
],
|
|
14219
|
+
dashboardpage: [
|
|
14220
|
+
a11ylabelof({ control: "sessiongrid", role: "table", name: "dashboard.title", value: "0 runs" }),
|
|
14221
|
+
a11ylabelof({ control: "historysearch", role: "search", name: "dashboard.history" }),
|
|
14222
|
+
a11ylabelof({ control: "dropzone", role: "region", name: "options.importexport.label" })
|
|
14223
|
+
],
|
|
14224
|
+
optionspage: [
|
|
14225
|
+
a11ylabelof({ control: "theme", role: "radiogroup", name: "options.theme.label", value: "system" }),
|
|
14226
|
+
a11ylabelof({ control: "locale", role: "combobox", name: "options.locale.label", value: "en" }),
|
|
14227
|
+
a11ylabelof({ control: "shortcuts", role: "group", name: "options.shortcuts.label" }),
|
|
14228
|
+
a11ylabelof({ control: "notifications", role: "switch", name: "options.notifications.label", state: "off" }),
|
|
14229
|
+
a11ylabelof({ control: "importexport", role: "region", name: "options.importexport.label" }),
|
|
14230
|
+
a11ylabelof({ control: "tour", role: "button", name: "options.tour.label" })
|
|
14231
|
+
],
|
|
14232
|
+
onboarding: [
|
|
14233
|
+
a11ylabelof({ control: "onboarding", role: "dialog", name: "options.tour.label", state: "open" })
|
|
14234
|
+
],
|
|
14235
|
+
omnibox: [
|
|
14236
|
+
a11ylabelof({ control: "omnibox", role: "textbox", name: "popup.taskinput.placeholder" })
|
|
14237
|
+
],
|
|
14238
|
+
page: [
|
|
14239
|
+
a11ylabelof({ control: "pagechip", role: "group", name: "pagechip.approve", state: "pending" })
|
|
14240
|
+
]
|
|
14241
|
+
};
|
|
14242
|
+
return labels[surface];
|
|
14243
|
+
}
|
|
14244
|
+
function a11ylabellocalized(label, bundles, language) {
|
|
14245
|
+
return { ...label, name: localestring(bundles, language, label.name) };
|
|
14246
|
+
}
|
|
14247
|
+
function a11ylabelslocalizedfor(surface, bundles, language) {
|
|
14248
|
+
return a11ylabelsfor(surface).map((label) => a11ylabellocalized(label, bundles, language));
|
|
14249
|
+
}
|
|
14250
|
+
|
|
14251
|
+
// flowlibrary.ts
|
|
14252
|
+
async function sha2563(payload) {
|
|
14253
|
+
const bytes = new TextEncoder().encode(payload);
|
|
14254
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
14255
|
+
return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
14256
|
+
}
|
|
14257
|
+
function manifestbody(manifest) {
|
|
14258
|
+
return JSON.stringify({ id: manifest.id, title: manifest.title, description: manifest.description, version: manifest.version, publisher: manifest.publisher, ...manifest.registry !== void 0 ? { registry: manifest.registry } : {}, steps: manifest.steps, kinds: manifest.kinds, requiredgrants: manifest.requiredgrants, dataexpectations: manifest.dataexpectations, sensitive: manifest.sensitive });
|
|
14259
|
+
}
|
|
14260
|
+
async function manifestdigest(manifest) {
|
|
14261
|
+
const { publish, ...body } = manifest;
|
|
14262
|
+
void publish;
|
|
14263
|
+
return sha2563(manifestbody(body));
|
|
14264
|
+
}
|
|
14265
|
+
async function validatemanifest(input) {
|
|
14266
|
+
const errors = [];
|
|
14267
|
+
const raw = input.manifest;
|
|
14268
|
+
if (!Boolean(raw) || typeof raw !== "object" || Array.isArray(raw)) return { ok: false, errors: [{ path: "manifest", expected: "object", found: Array.isArray(raw) ? "array" : typeof raw, reason: "Every flowlibrary manifest travels as one plain object." }], reason: "The flowlibrary manifest is no plain object; schemastrict refuses the carrier before any import." };
|
|
14269
|
+
const candidate = raw;
|
|
14270
|
+
if (typeof candidate.id !== "string" || candidate.id.trim() === "") errors.push({ path: "id", expected: "string", found: typeof candidate.id, reason: "The flowlibrary manifest needs its id." });
|
|
14271
|
+
if (typeof candidate.title !== "string" || candidate.title.trim() === "") errors.push({ path: "title", expected: "string", found: typeof candidate.title, reason: "The flowlibrary manifest needs its title." });
|
|
14272
|
+
if (typeof candidate.description !== "string") errors.push({ path: "description", expected: "string", found: typeof candidate.description, reason: "The flowlibrary manifest needs its description." });
|
|
14273
|
+
if (typeof candidate.version !== "string" || candidate.version.trim() === "") errors.push({ path: "version", expected: "string", found: typeof candidate.version, reason: "The flowlibrary manifest needs its version." });
|
|
14274
|
+
if (typeof candidate.publisher !== "string" || candidate.publisher.trim() === "") errors.push({ path: "publisher", expected: "string", found: typeof candidate.publisher, reason: "The flowlibrary manifest names its publisher." });
|
|
14275
|
+
if (!Array.isArray(candidate.steps) || candidate.steps.length === 0) errors.push({ path: "steps", expected: "array", found: Array.isArray(candidate.steps) ? "empty array" : typeof candidate.steps, reason: "The flowlibrary manifest declares its steps." });
|
|
14276
|
+
if (Array.isArray(candidate.steps)) {
|
|
14277
|
+
candidate.steps.forEach((step, index) => {
|
|
14278
|
+
const shape = step;
|
|
14279
|
+
if (!Boolean(shape) || typeof shape !== "object" || typeof shape.id !== "string" || shape.id.trim() === "" || typeof shape.kind !== "string" || shape.kind.trim() === "" || typeof shape.label !== "string") errors.push({ path: `steps.${index}`, expected: "flowlibrarystep", found: typeof step, reason: "Every flowlibrary step needs its id, kind and label." });
|
|
14280
|
+
});
|
|
14281
|
+
}
|
|
14282
|
+
if (!Array.isArray(candidate.kinds) || candidate.kinds.length === 0) errors.push({ path: "kinds", expected: "array", found: typeof candidate.kinds, reason: "The flowlibrary manifest declares the action kinds its steps use." });
|
|
14283
|
+
if (!Array.isArray(candidate.requiredgrants)) errors.push({ path: "requiredgrants", expected: "array", found: typeof candidate.requiredgrants, reason: "The flowlibrary manifest declares its required origin grants." });
|
|
14284
|
+
if (!Array.isArray(candidate.dataexpectations)) errors.push({ path: "dataexpectations", expected: "array", found: typeof candidate.dataexpectations, reason: "The flowlibrary manifest declares its data expectations with minimization hints." });
|
|
14285
|
+
if (typeof candidate.sensitive !== "boolean") errors.push({ path: "sensitive", expected: "boolean", found: typeof candidate.sensitive, reason: "The flowlibrary manifest marks whether it is sensitive." });
|
|
14286
|
+
const unknownfields = Object.keys(candidate).filter((key) => !["id", "title", "description", "version", "publisher", "registry", "steps", "kinds", "requiredgrants", "dataexpectations", "sensitive", "publish"].includes(key));
|
|
14287
|
+
for (const field of unknownfields) errors.push({ path: field, expected: "absent", found: "present", reason: `The flowlibrary manifest carries the unknown field ${field}; schemastrict refuses unknown fields.` });
|
|
14288
|
+
const schemagate = librarymanifestgate({ errors });
|
|
14289
|
+
if (!schemagate.allowed) return { ok: false, errors, reason: schemagate.reason ?? "The flowlibrary manifest fails schemastrict." };
|
|
14290
|
+
const manifest = { id: candidate.id, title: candidate.title, description: candidate.description, version: candidate.version, publisher: candidate.publisher, ...typeof candidate.registry === "string" && candidate.registry.trim() !== "" ? { registry: candidate.registry } : {}, steps: candidate.steps.map((step) => ({ id: step.id, kind: step.kind, label: step.label, ...step.target !== void 0 ? { target: step.target } : {}, ...step.value !== void 0 ? { value: step.value } : {}, ...step.namespace !== void 0 ? { namespace: step.namespace } : {} })), kinds: candidate.kinds, requiredgrants: candidate.requiredgrants, dataexpectations: candidate.dataexpectations, sensitive: candidate.sensitive, ...isPublish(candidate.publish) ? { publish: candidate.publish } : {} };
|
|
14291
|
+
const kinds = [...new Set(manifest.steps.map((step) => step.kind))];
|
|
14292
|
+
const capabilitygate = librarycapabilitygate({ kinds, capabilities: input.capabilities });
|
|
14293
|
+
if (!capabilitygate.allowed) return { ok: false, errors: [], reason: capabilitygate.reason ?? "", manifest };
|
|
14294
|
+
return { ok: true, errors: [], reason: `The manifest ${manifest.id} of ${manifest.publisher} validates under schemastrict with ${manifest.steps.length} step${manifest.steps.length === 1 ? "" : "s"} and ${kinds.length} kind${kinds.length === 1 ? "" : "s"} inside the installed capability set.`, manifest };
|
|
14295
|
+
}
|
|
14296
|
+
function isPublish(value) {
|
|
14297
|
+
if (!Boolean(value) || typeof value !== "object") return false;
|
|
14298
|
+
const shape = value;
|
|
14299
|
+
return typeof shape.publisher === "string" && shape.publisher.trim() !== "" && typeof shape.signature === "string" && shape.signature.trim() !== "" && typeof shape.digest === "string" && shape.digest.trim() !== "" && typeof shape.provenance === "string" && typeof shape.publishedat === "number";
|
|
14300
|
+
}
|
|
14301
|
+
async function verifypublishersignature(manifest) {
|
|
14302
|
+
if (manifest.publish === void 0) return { verified: false, reason: `The manifest ${manifest.id} of ${manifest.publisher} carries no publisher signature; the entry quarantines until the user verifies its publisher.` };
|
|
14303
|
+
const digest = await manifestdigest(manifest);
|
|
14304
|
+
if (manifest.publish.digest !== digest) return { verified: false, reason: `The publisher signature of ${manifest.publish.publisher} covers the digest ${manifest.publish.digest} while the manifest body hashes to ${digest}; the verification refuses the signature in full.` };
|
|
14305
|
+
if (manifest.publish.publisher !== manifest.publisher) return { verified: false, reason: `The publisher signature names ${manifest.publish.publisher} while the manifest carries the publisher ${manifest.publisher}; the verification refuses the signature in full.` };
|
|
14306
|
+
const seal = await sha2563(`${manifest.publish.publisher}
|
|
14307
|
+
${manifest.publish.digest}
|
|
14308
|
+
${manifest.publish.provenance}`);
|
|
14309
|
+
if (manifest.publish.signature !== seal) return { verified: false, reason: `The publisher signature of ${manifest.publish.publisher} seals neither the manifest digest nor its provenance; the verification refuses the signature in full.` };
|
|
14310
|
+
return { verified: true, reason: `The publisher signature of ${manifest.publish.publisher} verifies over the manifest digest ${digest.slice(0, 12)}\u2026 with its provenance ${manifest.publish.provenance}.` };
|
|
14311
|
+
}
|
|
14312
|
+
async function signmanifest(manifest, provenance, publishedat) {
|
|
14313
|
+
const digest = await manifestdigest(manifest);
|
|
14314
|
+
return { publisher: manifest.publisher, signature: await sha2563(`${manifest.publisher}
|
|
14315
|
+
${digest}
|
|
14316
|
+
${provenance}`), digest, provenance, publishedat };
|
|
14317
|
+
}
|
|
14318
|
+
async function libraryentryof(input) {
|
|
14319
|
+
const digest = await manifestdigest(input.manifest);
|
|
14320
|
+
const verification = await verifypublishersignature(input.manifest);
|
|
14321
|
+
const quarantinegate = libraryquarantinegate({ verified: verification.verified, signaturepresent: input.manifest.publish !== void 0, signaturevalid: verification.verified });
|
|
14322
|
+
const state = quarantinegate.allowed ? "available" : "quarantined";
|
|
14323
|
+
return { id: `${input.manifest.id}@${input.manifest.version}`, manifest: input.manifest, digest, state, provenance: `${input.provenance}; ${verification.reason}`, addedat: input.now };
|
|
14324
|
+
}
|
|
14325
|
+
function grantdiffof(input) {
|
|
14326
|
+
const required = [...new Set(input.manifest.requiredgrants)];
|
|
14327
|
+
const added = required.filter((origin) => !input.heldgrants.includes(origin));
|
|
14328
|
+
const kept = required.filter((origin) => input.heldgrants.includes(origin));
|
|
14329
|
+
const originmappings = required.map((origin) => ({ origin, kinds: [...new Set(input.manifest.steps.map((step) => step.kind))] }));
|
|
14330
|
+
return { added, kept, originmappings };
|
|
14331
|
+
}
|
|
14332
|
+
function sensitiveconsentfor(manifest, freshconsent) {
|
|
14333
|
+
const gate = librarysensitivegate({ sensitive: manifest.sensitive, freshconsent });
|
|
14334
|
+
return { required: manifest.sensitive, reason: gate.reason ?? "" };
|
|
14335
|
+
}
|
|
14336
|
+
function libraryproposalof(entry) {
|
|
14337
|
+
const gate = libraryimportgate({ proposal: true, planreviewed: true });
|
|
14338
|
+
return { objective: `Install the flowlibrary template ${entry.manifest.title} version ${entry.manifest.version} of ${entry.manifest.publisher} with ${entry.manifest.steps.length} steps and ${entry.manifest.requiredgrants.length} required grant${entry.manifest.requiredgrants.length === 1 ? "" : "s"}.`, reviewed: true, reason: gate.reason ?? "" };
|
|
14339
|
+
}
|
|
14340
|
+
function manifestrisk(manifest) {
|
|
14341
|
+
let risk = "read";
|
|
14342
|
+
for (const step of manifest.steps) {
|
|
14343
|
+
const candidate = actionrisk(step.kind);
|
|
14344
|
+
if (candidate === "sensitive") return "sensitive";
|
|
14345
|
+
if (candidate === "interaction") risk = "interaction";
|
|
14346
|
+
}
|
|
14347
|
+
return risk;
|
|
14348
|
+
}
|
|
14349
|
+
function installlibrary(input) {
|
|
14350
|
+
const manifest = input.entry.manifest;
|
|
14351
|
+
const prefix = input.selectornamespace?.trim() ?? "";
|
|
14352
|
+
const steps = manifest.steps.map((step) => ({
|
|
14353
|
+
id: `${manifest.id}-${step.id}`,
|
|
14354
|
+
kind: step.kind,
|
|
14355
|
+
label: step.label,
|
|
14356
|
+
...step.target !== void 0 ? { target: prefix === "" ? step.target : `${prefix} ${step.target}`.trim() } : {},
|
|
14357
|
+
...step.value !== void 0 ? { value: step.value } : {}
|
|
14358
|
+
}));
|
|
14359
|
+
return { id: `library:${manifest.id}:${manifest.version}`, name: manifest.title, version: 1, origins: [...new Set(manifest.requiredgrants)], steps, blocks: [], risk: manifestrisk(manifest), reviewstate: "pending", createdat: input.now };
|
|
14360
|
+
}
|
|
14361
|
+
function updatelibrary(input) {
|
|
14362
|
+
if (input.incoming.digest === input.existing.digest) return { changedsteps: [], addedgrants: [], versionfrom: input.existing.manifest.version, versionto: input.incoming.manifest.version, replace: false, reason: `The incoming ${input.incoming.manifest.id} carries the same manifest digest as the installed entry; the update replaces nothing.` };
|
|
14363
|
+
const existingsteps = new Set(input.existing.manifest.steps.map((step) => step.id));
|
|
14364
|
+
const incomingsteps = new Set(input.incoming.manifest.steps.map((step) => step.id));
|
|
14365
|
+
const changedsteps = [.../* @__PURE__ */ new Set([...existingsteps, ...incomingsteps])].filter((id) => {
|
|
14366
|
+
const before = input.existing.manifest.steps.find((step) => step.id === id);
|
|
14367
|
+
const after = input.incoming.manifest.steps.find((step) => step.id === id);
|
|
14368
|
+
return before === void 0 || after === void 0 || before.kind !== after.kind || before.target !== after.target || before.value !== after.value;
|
|
14369
|
+
});
|
|
14370
|
+
const addedgrants = [...new Set(input.incoming.manifest.requiredgrants)].filter((origin) => !input.existing.manifest.requiredgrants.includes(origin));
|
|
14371
|
+
return { changedsteps, addedgrants, versionfrom: input.existing.manifest.version, versionto: input.incoming.manifest.version, replace: true, reason: `The update of ${input.incoming.manifest.id} from version ${input.existing.manifest.version} to ${input.incoming.manifest.version} changes ${changedsteps.length} step${changedsteps.length === 1 ? "" : "s"} and adds ${addedgrants.length} grant${addedgrants.length === 1 ? "" : "s"}; the version diff surfaces before the replace.` };
|
|
14372
|
+
}
|
|
14373
|
+
function removelibrary(input) {
|
|
14374
|
+
return { removed: input.entry.id, keptforks: input.forks.map((fork) => fork.id), reason: `The library entry ${input.entry.manifest.title} leaves the store while its ${input.forks.length} local fork${input.forks.length === 1 ? "" : "s"} stay untouched; a fork is an independent local workflow.` };
|
|
14375
|
+
}
|
|
14376
|
+
function forklibrary(input) {
|
|
14377
|
+
const manifest = input.entry.manifest;
|
|
14378
|
+
const steps = manifest.steps.map((step) => ({ id: `fork-${step.id}`, kind: step.kind, label: step.label, ...step.target !== void 0 ? { target: step.target } : {}, ...step.value !== void 0 ? { value: step.value } : {} }));
|
|
14379
|
+
return { id: `fork:${manifest.id}:${input.now}`, name: `${manifest.title} fork`, version: 1, origins: [...new Set(manifest.requiredgrants)], steps, blocks: [], risk: manifestrisk(manifest), reviewstate: "pending", createdat: input.now };
|
|
14380
|
+
}
|
|
14381
|
+
function librarysearch(input) {
|
|
14382
|
+
const query = input.query?.trim().toLowerCase() ?? "";
|
|
14383
|
+
return input.entries.filter((entry) => {
|
|
14384
|
+
if (input.filter?.publisher !== void 0 && entry.manifest.publisher !== input.filter.publisher) return false;
|
|
14385
|
+
if (input.filter?.sensitive !== void 0 && entry.manifest.sensitive !== input.filter.sensitive) return false;
|
|
14386
|
+
if (input.filter?.state !== void 0 && entry.state !== input.filter.state) return false;
|
|
14387
|
+
if (query === "") return true;
|
|
14388
|
+
return [entry.manifest.title, entry.manifest.description, entry.manifest.publisher].some((text2) => text2.toLowerCase().includes(query));
|
|
14389
|
+
});
|
|
14390
|
+
}
|
|
14391
|
+
function librarybrowserow(entry) {
|
|
14392
|
+
return { id: entry.id, title: entry.manifest.title, publisher: entry.manifest.publisher, version: entry.manifest.version, grants: entry.manifest.requiredgrants, sensitive: entry.manifest.sensitive, state: entry.state, ...entry.manifest.registry !== void 0 ? { registry: entry.manifest.registry } : {} };
|
|
14393
|
+
}
|
|
14394
|
+
function librarystepsview(entry) {
|
|
14395
|
+
return entry.manifest.steps.map((step) => {
|
|
14396
|
+
const expectations = entry.manifest.dataexpectations.filter((expectation) => expectation.stepid === step.id);
|
|
14397
|
+
return { id: step.id, kind: step.kind, label: step.label, ...step.target !== void 0 ? { target: step.target } : {}, ...step.namespace !== void 0 ? { namespace: step.namespace } : {}, families: expectations.map((expectation) => expectation.family), fields: [...new Set(expectations.flatMap((expectation) => expectation.fields))] };
|
|
14398
|
+
});
|
|
14399
|
+
}
|
|
14400
|
+
function dataexpectationssummary(manifest) {
|
|
14401
|
+
const families = /* @__PURE__ */ new Map();
|
|
14402
|
+
for (const expectation of manifest.dataexpectations) {
|
|
14403
|
+
const entry = families.get(expectation.family) ?? { fields: /* @__PURE__ */ new Set(), steps: /* @__PURE__ */ new Set() };
|
|
14404
|
+
for (const field of expectation.fields) entry.fields.add(field);
|
|
14405
|
+
entry.steps.add(expectation.stepid);
|
|
14406
|
+
families.set(expectation.family, entry);
|
|
14407
|
+
}
|
|
14408
|
+
return [...families.entries()].map(([family, entry]) => ({ family, fields: [...entry.fields], steps: [...entry.steps] }));
|
|
14409
|
+
}
|
|
14410
|
+
function libraryeventof(input) {
|
|
14411
|
+
if (input.entryid.trim() === "") throw new Error("The library event needs its entry id.");
|
|
14412
|
+
return { id: `libraryevent:${input.kind}:${input.entryid}:${input.now}`, kind: input.kind, entryid: input.entryid, title: input.title, version: input.version, detail: input.detail, at: input.now };
|
|
14413
|
+
}
|
|
14414
|
+
function exportlibrarymanifests(entries) {
|
|
14415
|
+
return entries.map((entry) => ({ id: entry.id, title: entry.manifest.title, publisher: entry.manifest.publisher, version: entry.manifest.version, digest: entry.digest, state: entry.state, provenance: entry.provenance, addedat: entry.addedat }));
|
|
14416
|
+
}
|
|
14417
|
+
|
|
14418
|
+
// syncbridge.ts
|
|
14419
|
+
async function sha2564(payload) {
|
|
14420
|
+
const bytes = new TextEncoder().encode(payload);
|
|
14421
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
14422
|
+
return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
14423
|
+
}
|
|
14424
|
+
async function syncdigestof(manifest) {
|
|
14425
|
+
const { publish, ...body } = manifest;
|
|
14426
|
+
void publish;
|
|
14427
|
+
return sha2564(JSON.stringify(body));
|
|
14428
|
+
}
|
|
14429
|
+
function syncbridgehookof(input) {
|
|
14430
|
+
if (input.endpoint.trim() === "") throw new Error(`The ${input.provider} hook needs its user configured endpoint; no provider address is ever hardcoded.`);
|
|
14431
|
+
const gate = syncbridgeoptingate({ optin: false });
|
|
14432
|
+
if (gate.allowed) throw new Error("The syncbridge hook never starts with its opt in on; no hook ever defaults on.");
|
|
14433
|
+
return { id: `sync:${input.provider}:${input.now}`, provider: input.provider, direction: input.direction, optin: false, endpoint: input.endpoint.trim(), state: "idle", createdat: input.now };
|
|
14434
|
+
}
|
|
14435
|
+
function syncbridgeoptinflip(hook, optin) {
|
|
14436
|
+
return { ...hook, optin, state: "idle" };
|
|
14437
|
+
}
|
|
14438
|
+
function syncbridgeproviders() {
|
|
14439
|
+
return [
|
|
14440
|
+
{ provider: "file", label: "File provider", operations: ["pull", "push", "list"], note: "The file provider moves manifests through manual import and export files the user picks; the bridge carries no secret and no log entry under any flag." },
|
|
14441
|
+
{ provider: "web", label: "Web provider stub", operations: ["pull", "push", "list"], note: "The web provider stays a stub behind its opt in gate: the endpoint stays the user's configured registry value and no network call ships before the ecosystem part two backend exists." }
|
|
14442
|
+
];
|
|
14443
|
+
}
|
|
14444
|
+
async function syncbridgeexportpayload(manifests) {
|
|
14445
|
+
const digests = [];
|
|
14446
|
+
for (const manifest of manifests) digests.push(await syncdigestof(manifest));
|
|
14447
|
+
return { version: 1, kind: "syncbridge", manifests, digests, exclusions: ["secretvault values", "logs"] };
|
|
14448
|
+
}
|
|
14449
|
+
function syncbridgevalidate(payload) {
|
|
14450
|
+
const carriessecrets = payload.secrets !== void 0 || Array.isArray(payload.manifests) && payload.manifests.some((manifest) => secretcarrying2(manifest));
|
|
14451
|
+
const gate = syncbridgescopegate({ carriessecrets, carrieslogs: payload.logs !== void 0 });
|
|
14452
|
+
if (!gate.allowed) return { ok: false, reason: gate.reason ?? "The syncbridge payload refuses." };
|
|
14453
|
+
if (payload.kind !== "syncbridge") return { ok: false, reason: "The syncbridge payload names its kind; a foreign payload never imports." };
|
|
14454
|
+
if (!Array.isArray(payload.manifests)) return { ok: false, reason: "The syncbridge payload carries its manifest list." };
|
|
14455
|
+
return { ok: true, reason: `The syncbridge payload carries ${payload.manifests.length} manifest${payload.manifests.length === 1 ? "" : "s"} and no secret and no log entry; the bridge moves manifests only.` };
|
|
14456
|
+
}
|
|
14457
|
+
function secretcarrying2(record2) {
|
|
14458
|
+
if (record2 === null || typeof record2 !== "object") return false;
|
|
14459
|
+
const entries = Object.entries(record2);
|
|
14460
|
+
const secretkeys = ["secret", "token", "password", "apikey", "authorization"];
|
|
14461
|
+
return entries.some(([key, value]) => secretkeys.some((shape) => key.toLowerCase().includes(shape)) && typeof value === "string" && value.trim() !== "");
|
|
14462
|
+
}
|
|
14463
|
+
async function syncbridgescan(input) {
|
|
14464
|
+
const gate = syncbridgeoptingate({ optin: input.hook.optin });
|
|
14465
|
+
if (!gate.allowed) return { conflicts: [], synced: [], reason: gate.reason ?? "" };
|
|
14466
|
+
const conflicts = [];
|
|
14467
|
+
const synced = [];
|
|
14468
|
+
for (const remotemanifest of input.remote) {
|
|
14469
|
+
const localmanifest = input.local.find((candidate) => candidate.manifestid === remotemanifest.manifestid);
|
|
14470
|
+
if (localmanifest === void 0) {
|
|
14471
|
+
synced.push(remotemanifest.manifestid);
|
|
14472
|
+
continue;
|
|
14473
|
+
}
|
|
14474
|
+
if (localmanifest.digest === remotemanifest.digest) {
|
|
14475
|
+
synced.push(remotemanifest.manifestid);
|
|
14476
|
+
continue;
|
|
14477
|
+
}
|
|
14478
|
+
conflicts.push({ id: `conflict:${remotemanifest.manifestid}:${input.now}`, hookid: input.hook.id, manifestid: remotemanifest.manifestid, local: { digest: localmanifest.digest, version: localmanifest.version }, remote: { digest: remotemanifest.digest, version: remotemanifest.version }, detectedat: input.now });
|
|
14479
|
+
}
|
|
14480
|
+
return { conflicts, synced, reason: `The ${input.hook.provider} hook of ${input.hook.endpoint} scanned ${input.remote.length} remote manifest${input.remote.length === 1 ? "" : "s"} against ${input.local.length} local entr${input.local.length === 1 ? "y" : "ies"}: ${synced.length} moved while ${conflicts.length} conflict${conflicts.length === 1 ? "" : "s"} surfaced both versions instead of a silent overwrite.` };
|
|
14481
|
+
}
|
|
14482
|
+
function resolveconflict(conflict, resolution, now) {
|
|
14483
|
+
if (conflict.resolution !== void 0) throw new Error(`The conflict ${conflict.id} already resolved at ${conflict.resolvedat}; one conflict resolves exactly once.`);
|
|
14484
|
+
return { ...conflict, resolution, resolvedat: now };
|
|
14485
|
+
}
|
|
14486
|
+
function conflictsfor(conflicts, hookid) {
|
|
14487
|
+
return hookid === void 0 ? conflicts : conflicts.filter((conflict) => conflict.hookid === hookid);
|
|
14488
|
+
}
|
|
14489
|
+
function webproviderstub(hook) {
|
|
14490
|
+
const gate = syncbridgeoptingate({ optin: hook.optin });
|
|
14491
|
+
return { hookid: hook.id, endpoint: hook.endpoint, optin: hook.optin, operations: ["pull", "push", "list"], stub: true, reason: gate.allowed ? `The web provider of ${hook.endpoint} stays a stub behind its explicit opt in; the ecosystem part two backend brings its network path.` : gate.reason ?? "" };
|
|
14492
|
+
}
|
|
14493
|
+
function fileproviderof(hook) {
|
|
14494
|
+
return { hookid: hook.id, operations: [{ kind: "pull", label: "Pull the manifests of one dropped syncbridge file" }, { kind: "push", label: "Push the local manifests into one export file" }, { kind: "list", label: "List the manifests the hook carries" }] };
|
|
14495
|
+
}
|
|
14496
|
+
|
|
14497
|
+
// attentionfeed.ts
|
|
14498
|
+
function attentionseverityof(cause) {
|
|
14499
|
+
if (cause === "gatewait" || cause === "phishguard") return "critical";
|
|
14500
|
+
if (cause === "deferral") return "warning";
|
|
14501
|
+
return "info";
|
|
14502
|
+
}
|
|
14503
|
+
function attentiondeeplinkof(cause, runid, gateref) {
|
|
14504
|
+
if (cause === "gatewait") return `devthink://gate/${encodeURIComponent(gateref ?? "unknown")}?run=${encodeURIComponent(runid)}`;
|
|
14505
|
+
if (cause === "phishguard") return `devthink://phishguard?run=${encodeURIComponent(runid)}`;
|
|
14506
|
+
if (cause === "deferral") return `devthink://deferred?run=${encodeURIComponent(runid)}`;
|
|
14507
|
+
return `devthink://error?run=${encodeURIComponent(runid)}`;
|
|
14508
|
+
}
|
|
14509
|
+
function attentionentryof(input) {
|
|
14510
|
+
if (input.runid.trim() === "") throw new Error("The attention entry needs its run ref.");
|
|
14511
|
+
if (input.summary.trim() === "") throw new Error("The attention entry needs its summary in plain language.");
|
|
14512
|
+
return { id: `attention:${input.cause}:${input.runid}:${input.gateref ?? "none"}`, cause: input.cause, severity: attentionseverityof(input.cause), runid: input.runid, ...input.gateref !== void 0 && input.gateref.trim() !== "" ? { gateref: input.gateref } : {}, origin: input.origin, summary: input.summary, deeplink: attentiondeeplinkof(input.cause, input.runid, input.gateref), at: input.at };
|
|
14513
|
+
}
|
|
14514
|
+
function collectattention(input) {
|
|
14515
|
+
const entries = [];
|
|
14516
|
+
for (const wait of input.gatewaits ?? []) entries.push(attentionentryof({ cause: "gatewait", runid: wait.runid, origin: wait.origin, summary: `The ${wait.kind} gate of the step ${wait.stepid} waits ${wait.waitedms} milliseconds for one human action.`, gateref: wait.gateid, at: input.now }));
|
|
14517
|
+
for (const block of input.phishblocks ?? []) entries.push(attentionentryof({ cause: "phishguard", runid: block.runid, origin: block.origin, summary: `The phishguard blocked a credential step on ${block.origin} that resembles the granted ${block.matchedorigin}: ${block.reason}`, at: input.now }));
|
|
14518
|
+
for (const deferral of input.deferrals ?? []) entries.push(attentionentryof({ cause: "deferral", runid: deferral.runid, origin: deferral.origin, summary: `A command deferred past its rate window on ${deferral.origin}: ${deferral.reason}`, at: input.now }));
|
|
14519
|
+
for (const failure of input.failures ?? []) entries.push(attentionentryof({ cause: "failure", runid: failure.runid, origin: failure.origin, summary: `The step ${failure.stepid} failed: ${failure.message}`, at: input.now }));
|
|
14520
|
+
return entries;
|
|
14521
|
+
}
|
|
14522
|
+
function dedupeattention(entries) {
|
|
14523
|
+
const seen = /* @__PURE__ */ new Set();
|
|
14524
|
+
const kept = [];
|
|
14525
|
+
for (const entry of [...entries].sort((a, b) => a.at - b.at)) {
|
|
14526
|
+
const key = `${entry.cause}:${entry.runid}:${entry.gateref ?? "none"}`;
|
|
14527
|
+
if (seen.has(key)) continue;
|
|
14528
|
+
seen.add(key);
|
|
14529
|
+
kept.push(entry);
|
|
14530
|
+
}
|
|
14531
|
+
return kept;
|
|
14532
|
+
}
|
|
14533
|
+
function rankattention(entries) {
|
|
14534
|
+
const order = { critical: 0, warning: 1, info: 2 };
|
|
14535
|
+
return [...entries].sort((a, b) => order[a.severity] - order[b.severity] || b.at - a.at);
|
|
14536
|
+
}
|
|
14537
|
+
function attentioncountof(entries) {
|
|
14538
|
+
return rankattention(dedupeattention(entries)).length;
|
|
14539
|
+
}
|
|
14540
|
+
function dismissattention(entries, id) {
|
|
14541
|
+
return entries.filter((entry) => entry.id !== id);
|
|
14542
|
+
}
|
|
14543
|
+
function pruneattention(entries, retention, now) {
|
|
14544
|
+
if (retention === void 0) return { kept: entries, pruned: [] };
|
|
14545
|
+
const kept = entries.filter((entry) => now - entry.at < retention);
|
|
14546
|
+
return { kept, pruned: entries.filter((entry) => now - entry.at >= retention).map((entry) => entry.id) };
|
|
14547
|
+
}
|
|
14548
|
+
function attentionnotifications(entries, now) {
|
|
14549
|
+
return rankattention(dedupeattention(entries)).map((entry) => ({ id: `notify:${entry.id}`, kind: "attention", title: entry.cause === "gatewait" ? "A gate waits for you" : entry.cause === "phishguard" ? "The phishguard blocked a step" : entry.cause === "deferral" ? "A command deferred" : "A step failed", body: entry.summary, deeplink: entry.deeplink, runid: entry.runid, ...entry.gateref !== void 0 ? { stepid: entry.gateref } : {}, content: false, at: now }));
|
|
14550
|
+
}
|
|
14551
|
+
|
|
14552
|
+
// backgroundruns.ts
|
|
14553
|
+
function backgroundqueueentryof(input) {
|
|
14554
|
+
if (input.workflowid.trim() === "") throw new Error("The background queue entry needs its workflow id.");
|
|
14555
|
+
return { id: `background:${input.workflowid}:${input.now}`, workflowid: input.workflowid, state: "queued", keepaliveheld: false, queuedat: input.now, summary: input.summary };
|
|
14556
|
+
}
|
|
14557
|
+
function enqueuebackgroundrun(input) {
|
|
14558
|
+
return [...input.queue, backgroundqueueentryof({ workflowid: input.workflowid, summary: input.summary, now: input.now })];
|
|
14559
|
+
}
|
|
14560
|
+
function nextbackgroundrun(queue) {
|
|
14561
|
+
return [...queue].filter((entry) => entry.state === "queued").sort((a, b) => a.queuedat - b.queuedat)[0];
|
|
14562
|
+
}
|
|
14563
|
+
function beginbackgroundrun(entry, now, reviewed) {
|
|
14564
|
+
const gate = backgroundrungate({ reviewed, keepaliveheld: true });
|
|
14565
|
+
return { entry: gate.allowed ? { ...entry, state: "running", keepaliveheld: true, startedat: now } : entry, gate: { allowed: gate.allowed, reason: gate.reason ?? "" } };
|
|
14566
|
+
}
|
|
14567
|
+
function finishbackgroundrun(entry, state, now) {
|
|
14568
|
+
return { ...entry, state, keepaliveheld: false, endedat: now };
|
|
14569
|
+
}
|
|
14570
|
+
function resumebackgroundqueue(queue, now) {
|
|
14571
|
+
const requeued = [];
|
|
14572
|
+
const next = queue.map((entry) => {
|
|
14573
|
+
if (entry.state !== "running") return entry;
|
|
14574
|
+
requeued.push(entry.id);
|
|
14575
|
+
const { startedat, ...rest } = entry;
|
|
14576
|
+
void startedat;
|
|
14577
|
+
return { ...rest, state: "queued", keepaliveheld: false };
|
|
14578
|
+
});
|
|
14579
|
+
void now;
|
|
14580
|
+
return { queue: next, requeued };
|
|
14581
|
+
}
|
|
14582
|
+
function backgroundrunattention(entry, origin) {
|
|
14583
|
+
if (entry.state === "failed") return { cause: "failure", runid: entry.id, origin, summary: `The background run of ${entry.workflowid} failed: ${entry.summary}` };
|
|
14584
|
+
if (entry.state === "queued") return { cause: "deferral", runid: entry.id, origin, summary: `The background run of ${entry.workflowid} waits for its executor turn.` };
|
|
14585
|
+
return void 0;
|
|
14586
|
+
}
|
|
14587
|
+
function backgroundrunsview(queue) {
|
|
14588
|
+
return queue.map((entry) => ({ id: entry.id, workflowid: entry.workflowid, state: entry.state, keepaliveheld: entry.keepaliveheld, queuedat: entry.queuedat, ...entry.startedat !== void 0 ? { startedat: entry.startedat } : {}, ...entry.endedat !== void 0 ? { endedat: entry.endedat } : {}, summary: entry.summary, progress: entry.state === "running" ? `Running with the keepalive signal held since ${entry.startedat ?? entry.queuedat}` : entry.state === "queued" ? "Queued for the next executor turn" : entry.state === "done" ? "Completed in the background" : "Failed; the attentionfeed carries the cause" }));
|
|
14589
|
+
}
|
|
14590
|
+
function backgroundtrayrows(queue, origin) {
|
|
14591
|
+
return queue.filter((entry) => entry.state === "done" || entry.state === "failed").map((entry) => ({ runid: entry.id, origin, outcome: entry.state === "done" ? "completed" : "failed", title: `Background run of ${entry.workflowid}`, at: entry.endedat ?? entry.queuedat, resumable: false, reopenable: true }));
|
|
14592
|
+
}
|
|
14593
|
+
function cancelbackgroundentry(queue, id) {
|
|
14594
|
+
const cancelled = [];
|
|
14595
|
+
const next = queue.filter((entry) => {
|
|
14596
|
+
if (entry.id === id && entry.state === "queued") {
|
|
14597
|
+
cancelled.push(entry.id);
|
|
14598
|
+
return false;
|
|
14599
|
+
}
|
|
14600
|
+
return true;
|
|
14601
|
+
});
|
|
14602
|
+
return { queue: next, cancelled };
|
|
14603
|
+
}
|
|
14604
|
+
|
|
14605
|
+
// runreplay.ts
|
|
14606
|
+
function restoredrefsof(entry) {
|
|
14607
|
+
const observation = /observation (\d+)/i.exec(entry.summary);
|
|
14608
|
+
const capture = /capture ([a-z0-9-]+)/i.exec(entry.summary);
|
|
14609
|
+
return { ...observation !== null ? { observationversion: Number(observation[1]) } : {}, ...capture !== null ? { captureid: capture[1] } : {} };
|
|
14610
|
+
}
|
|
14611
|
+
function replaystepof(entry, index, gates) {
|
|
14612
|
+
const refs = restoredrefsof(entry);
|
|
14613
|
+
return { stepid: entry.stepid ?? entry.id, index, summary: entry.summary, ...refs.observationversion !== void 0 ? { observationversion: refs.observationversion } : {}, ...refs.captureid !== void 0 ? { captureid: refs.captureid } : {}, gateresolutions: entry.stepid === void 0 ? [] : gates.filter((gate) => gate.gateid === entry.stepid) };
|
|
14614
|
+
}
|
|
14615
|
+
function runreplaysessionof(input) {
|
|
14616
|
+
if (input.runid.trim() === "") throw new Error("The runreplay session needs its recorded run id.");
|
|
14617
|
+
if (input.entries.length === 0) throw new Error("The runreplay session needs at least one verified log entry to walk.");
|
|
14618
|
+
const steps = input.entries.map((entry, index) => replaystepof(entry, index, input.gates ?? []));
|
|
14619
|
+
return { id: `replay:${input.runid}:${input.now}`, runid: input.runid, cursor: 0, playing: false, steps, openedat: input.now, actions: [] };
|
|
14620
|
+
}
|
|
14621
|
+
function replaymove(session, direction, now) {
|
|
14622
|
+
const next = direction === "forward" ? Math.min(session.steps.length - 1, session.cursor + 1) : Math.max(0, session.cursor - 1);
|
|
14623
|
+
const step = session.steps[next];
|
|
14624
|
+
return { ...session, cursor: next, playing: false, actions: [...session.actions, { kind: "step", at: now, ...step !== void 0 ? { stepid: step.stepid } : {} }] };
|
|
14625
|
+
}
|
|
14626
|
+
function replayjump(session, stepid, now) {
|
|
14627
|
+
const index = session.steps.findIndex((step) => step.stepid === stepid);
|
|
14628
|
+
if (index === -1) throw new Error(`The runreplay knows no ${stepid} step in the recorded chain of ${session.runid}.`);
|
|
14629
|
+
return { ...session, cursor: index, playing: false, actions: [...session.actions, { kind: "jump", stepid, at: now }] };
|
|
14630
|
+
}
|
|
14631
|
+
function replayplay(session, playing, now) {
|
|
14632
|
+
return { ...session, playing, actions: [...session.actions, { kind: playing ? "play" : "pause", at: now }] };
|
|
14633
|
+
}
|
|
14634
|
+
function replayviewaction(session, action) {
|
|
14635
|
+
return { ...session, actions: [...session.actions, { kind: action.kind, ...action.stepid !== void 0 ? { stepid: action.stepid } : {}, at: action.at }] };
|
|
14636
|
+
}
|
|
14637
|
+
function replayrestoredview(step) {
|
|
14638
|
+
return { stepid: step.stepid, index: step.index, summary: step.summary, ...step.observationversion !== void 0 ? { observationversion: step.observationversion } : {}, ...step.captureid !== void 0 ? { captureid: step.captureid } : {}, gateresolutions: step.gateresolutions };
|
|
14639
|
+
}
|
|
14640
|
+
function replaycursorof(session) {
|
|
14641
|
+
return { runid: session.runid, cursor: session.cursor, playing: session.playing };
|
|
14642
|
+
}
|
|
14643
|
+
|
|
14644
|
+
// outputcompare.ts
|
|
14645
|
+
function taskinputsignatureof(input) {
|
|
14646
|
+
return `${input.objective.trim()}|${input.steps.length}|${input.steps.join(",")}`;
|
|
14647
|
+
}
|
|
14648
|
+
function comparemetricdefaults() {
|
|
14649
|
+
return ["agreement", "divergence", "durationdelta"];
|
|
14650
|
+
}
|
|
14651
|
+
function joinruns(logsa, logsb) {
|
|
14652
|
+
const sequence = [];
|
|
14653
|
+
for (const entry of logsa) if (!sequence.includes(entry.stepid)) sequence.push(entry.stepid);
|
|
14654
|
+
for (const entry of logsb) if (!sequence.includes(entry.stepid)) sequence.push(entry.stepid);
|
|
14655
|
+
return sequence.map((stepid, index) => {
|
|
14656
|
+
const a = logsa.find((entry) => entry.stepid === stepid);
|
|
14657
|
+
const b = logsb.find((entry) => entry.stepid === stepid);
|
|
14658
|
+
return { stepid, index, ...a !== void 0 ? { a } : {}, ...b !== void 0 ? { b } : {} };
|
|
14659
|
+
});
|
|
14660
|
+
}
|
|
14661
|
+
function stepcomparisonof(pair) {
|
|
14662
|
+
const a = pair.a;
|
|
14663
|
+
const b = pair.b;
|
|
14664
|
+
if (a === void 0 || b === void 0) return { stepid: pair.stepid, index: pair.index, agreement: "onlyone", summarya: a?.summary ?? "", summaryb: b?.summary ?? "", durationdelta: 0 };
|
|
14665
|
+
const agree = a.state === b.state && a.summary === b.summary;
|
|
14666
|
+
return { stepid: pair.stepid, index: pair.index, agreement: agree ? "agree" : "diverge", summarya: a.summary, summaryb: b.summary, durationdelta: a.duration - b.duration };
|
|
14667
|
+
}
|
|
14668
|
+
function firstdivergenceof(steps) {
|
|
14669
|
+
const divergent = steps.find((step) => step.agreement !== "agree");
|
|
14670
|
+
return divergent === void 0 ? void 0 : divergent.index;
|
|
14671
|
+
}
|
|
14672
|
+
function outputcomparesessionof(input) {
|
|
14673
|
+
if (input.runids[0].trim() === "" || input.runids[1].trim() === "") throw new Error("The outputcompare session needs both run ids.");
|
|
14674
|
+
if (input.runids[0] === input.runids[1]) throw new Error("The outputcompare session compares two distinct runs; one run never stands beside itself.");
|
|
14675
|
+
const metrics = input.metrics ?? comparemetricdefaults();
|
|
14676
|
+
const steps = joinruns(input.logsa, input.logsb).map((pair) => stepcomparisonof(pair));
|
|
14677
|
+
const firstdivergence = firstdivergenceof(steps);
|
|
14678
|
+
return { id: `compare:${input.runids[0]}:${input.runids[1]}:${input.now}`, runids: input.runids, metrics, steps, ...firstdivergence !== void 0 ? { firstdivergence } : {}, openedat: input.now };
|
|
14679
|
+
}
|
|
14680
|
+
function comparesessionmetrics(session) {
|
|
14681
|
+
const agree = session.steps.filter((step) => step.agreement === "agree").length;
|
|
14682
|
+
const diverge = session.steps.filter((step) => step.agreement === "diverge").length;
|
|
14683
|
+
const onlyone = session.steps.filter((step) => step.agreement === "onlyone").length;
|
|
14684
|
+
return { metrics: session.metrics, agree, diverge, onlyone, ...session.firstdivergence !== void 0 ? { firstdivergence: session.firstdivergence } : {}, reason: `The comparison of ${session.runids[0]} and ${session.runids[1]} graded ${agree} agreeing, ${diverge} divergent and ${onlyone} single run step${agree + diverge + onlyone === 1 ? "" : "s"} under the metric set ${session.metrics.join(", ")}${session.firstdivergence !== void 0 ? ` with the first divergence at step index ${session.firstdivergence}` : " with agreement across the whole sequence"}.` };
|
|
14685
|
+
}
|
|
14686
|
+
function outputcompareview(session) {
|
|
14687
|
+
return session.steps.map((step) => ({ stepid: step.stepid, index: step.index, agreement: step.agreement, summarya: step.summarya, summaryb: step.summaryb, durationdelta: step.durationdelta, highlighted: session.firstdivergence !== void 0 && step.index === session.firstdivergence }));
|
|
14688
|
+
}
|
|
14689
|
+
|
|
13421
14690
|
// taskqueue.ts
|
|
13422
14691
|
function emptyqueue(input = {}) {
|
|
13423
14692
|
return { lanes: input.lanes ?? [], priorities: input.priorities ?? [], completionpolicy: input.completionpolicy ?? "all", items: [], claims: [] };
|
|
@@ -14374,6 +15643,12 @@ function transparencyreport(input) {
|
|
|
14374
15643
|
function surfacesnapshot(input) {
|
|
14375
15644
|
return { version: protocolversion, surface: input.surface, palette: input.palette, timeline: input.timeline, logstream: input.logstream, plancards: input.plancards, ...input.onboarding !== void 0 ? { onboarding: input.onboarding } : {} };
|
|
14376
15645
|
}
|
|
15646
|
+
function interfaceviews(input) {
|
|
15647
|
+
return { version: protocolversion, ...input.datagrid !== void 0 ? { datagrid: input.datagrid } : {}, exportmenu: input.exportmenu, badge: input.badge, recenttray: input.recenttray, toasts: input.toasts, appearance: input.appearance };
|
|
15648
|
+
}
|
|
15649
|
+
function ecosystemviews(input) {
|
|
15650
|
+
return { version: protocolversion, library: input.library, installed: input.installed, syncbridge: input.syncbridge, attention: input.attention, backgroundruns: input.backgroundruns, ...input.replay !== void 0 ? { replay: input.replay } : {}, ...input.compare !== void 0 ? { compare: input.compare } : {} };
|
|
15651
|
+
}
|
|
14377
15652
|
|
|
14378
15653
|
// workfloweditor.ts
|
|
14379
15654
|
var palettecategories = ["actions", "controlflow", "waits", "variables", "triggers"];
|
|
@@ -15079,6 +16354,10 @@ function yamlscalarvalue(text2) {
|
|
|
15079
16354
|
return text2;
|
|
15080
16355
|
}
|
|
15081
16356
|
export {
|
|
16357
|
+
a11ylabellocalized,
|
|
16358
|
+
a11ylabelof,
|
|
16359
|
+
a11ylabelsfor,
|
|
16360
|
+
a11ylabelslocalizedfor,
|
|
15082
16361
|
acceptrenderresult,
|
|
15083
16362
|
acceptworkerresponse,
|
|
15084
16363
|
ackreview,
|
|
@@ -15114,11 +16393,13 @@ export {
|
|
|
15114
16393
|
appendlogstreamevent,
|
|
15115
16394
|
applycooldown,
|
|
15116
16395
|
applyheaderules,
|
|
16396
|
+
applyimport,
|
|
15117
16397
|
applylayer,
|
|
15118
16398
|
applyoverride,
|
|
15119
16399
|
applyretry,
|
|
15120
16400
|
applyreview,
|
|
15121
16401
|
applyruntimeout,
|
|
16402
|
+
applytheme,
|
|
15122
16403
|
applytimeout,
|
|
15123
16404
|
approvalframes,
|
|
15124
16405
|
approvalprompt,
|
|
@@ -15131,6 +16412,11 @@ export {
|
|
|
15131
16412
|
attachcdpsession,
|
|
15132
16413
|
attachtargetof,
|
|
15133
16414
|
attachtimeline,
|
|
16415
|
+
attentioncountof,
|
|
16416
|
+
attentiondeeplinkof,
|
|
16417
|
+
attentionentryof,
|
|
16418
|
+
attentionnotifications,
|
|
16419
|
+
attentionseverityof,
|
|
15134
16420
|
auditexcerptof,
|
|
15135
16421
|
authconsentgranted,
|
|
15136
16422
|
authorizeurl,
|
|
@@ -15138,9 +16424,17 @@ export {
|
|
|
15138
16424
|
authreport,
|
|
15139
16425
|
autointervalof,
|
|
15140
16426
|
automationallowlistgate,
|
|
16427
|
+
backgroundqueueentryof,
|
|
16428
|
+
backgroundrunattention,
|
|
16429
|
+
backgroundrungate,
|
|
16430
|
+
backgroundrunsview,
|
|
16431
|
+
backgroundtrayrows,
|
|
15141
16432
|
backoffdelay,
|
|
16433
|
+
badgecolorof,
|
|
16434
|
+
badgetextof,
|
|
15142
16435
|
batchreport,
|
|
15143
16436
|
beatrun,
|
|
16437
|
+
beginbackgroundrun,
|
|
15144
16438
|
bindlocalhost,
|
|
15145
16439
|
bindparam,
|
|
15146
16440
|
bindvariables,
|
|
@@ -15186,6 +16480,7 @@ export {
|
|
|
15186
16480
|
callmodel,
|
|
15187
16481
|
callrest,
|
|
15188
16482
|
callsreport,
|
|
16483
|
+
cancelbackgroundentry,
|
|
15189
16484
|
cancelframes,
|
|
15190
16485
|
cancellederror,
|
|
15191
16486
|
cancelrun,
|
|
@@ -15231,10 +16526,15 @@ export {
|
|
|
15231
16526
|
closeidlechannels,
|
|
15232
16527
|
closeoffscreen,
|
|
15233
16528
|
closerun,
|
|
16529
|
+
collectattention,
|
|
15234
16530
|
collectmessages,
|
|
15235
16531
|
collectresults,
|
|
15236
16532
|
commandguard,
|
|
16533
|
+
comparemetricdefaults,
|
|
15237
16534
|
compareoutputs,
|
|
16535
|
+
comparepairof,
|
|
16536
|
+
comparepairsforsteps,
|
|
16537
|
+
comparesessionmetrics,
|
|
15238
16538
|
complete,
|
|
15239
16539
|
composeworkflow,
|
|
15240
16540
|
conditionof,
|
|
@@ -15242,6 +16542,7 @@ export {
|
|
|
15242
16542
|
confirmdeletegate,
|
|
15243
16543
|
confirmmanualrun,
|
|
15244
16544
|
confirmpaygate,
|
|
16545
|
+
conflictsfor,
|
|
15245
16546
|
connectallowentryof,
|
|
15246
16547
|
connectallowgate,
|
|
15247
16548
|
connectallowlist,
|
|
@@ -15282,10 +16583,15 @@ export {
|
|
|
15282
16583
|
croprect,
|
|
15283
16584
|
crossesviewport,
|
|
15284
16585
|
cursorfrom,
|
|
16586
|
+
darklighttokensof,
|
|
16587
|
+
dataexpectationssummary,
|
|
16588
|
+
datagridcolumnsof,
|
|
16589
|
+
datagridof,
|
|
15285
16590
|
datasetresponse,
|
|
15286
16591
|
debuggate,
|
|
15287
16592
|
debuggerconsentcovers,
|
|
15288
16593
|
debugwaitbudgetallowed,
|
|
16594
|
+
dedupeattention,
|
|
15289
16595
|
dedupeimages,
|
|
15290
16596
|
defaultapprovalwindowms,
|
|
15291
16597
|
defaultchallengelifetimems,
|
|
@@ -15310,6 +16616,7 @@ export {
|
|
|
15310
16616
|
denydefaultposture,
|
|
15311
16617
|
actionrisk as deriveactionrisk,
|
|
15312
16618
|
detachcdpsession,
|
|
16619
|
+
detectfilekind,
|
|
15313
16620
|
devicepresetof,
|
|
15314
16621
|
diffpreviewgate,
|
|
15315
16622
|
diffpreviewof,
|
|
@@ -15319,15 +16626,18 @@ export {
|
|
|
15319
16626
|
diffversions,
|
|
15320
16627
|
disarmkillswitch,
|
|
15321
16628
|
disconnectclient,
|
|
16629
|
+
dismissattention,
|
|
15322
16630
|
dispatchtool,
|
|
15323
16631
|
distillrunsummary,
|
|
15324
16632
|
domainkinds,
|
|
15325
16633
|
downloadreport,
|
|
15326
16634
|
draftplan,
|
|
15327
16635
|
drainqueue,
|
|
16636
|
+
dropimportof,
|
|
15328
16637
|
dryrunprojection,
|
|
15329
16638
|
dryrunreport,
|
|
15330
16639
|
dryrunworkflow,
|
|
16640
|
+
ecosystemviews,
|
|
15331
16641
|
editedcorrectionof,
|
|
15332
16642
|
editnote,
|
|
15333
16643
|
editorsavegate,
|
|
@@ -15347,6 +16657,7 @@ export {
|
|
|
15347
16657
|
emulationstateof,
|
|
15348
16658
|
enforcemaxclients,
|
|
15349
16659
|
enqueue,
|
|
16660
|
+
enqueuebackgroundrun,
|
|
15350
16661
|
enqueuerequest,
|
|
15351
16662
|
entryfresh,
|
|
15352
16663
|
entryhashof,
|
|
@@ -15383,8 +16694,12 @@ export {
|
|
|
15383
16694
|
expiretokens,
|
|
15384
16695
|
expirnotes,
|
|
15385
16696
|
exportcontentreview,
|
|
16697
|
+
exportdatagrid,
|
|
16698
|
+
exportlibrarymanifests,
|
|
15386
16699
|
exportlogchain,
|
|
16700
|
+
exportmenudescriptors,
|
|
15387
16701
|
exportpresetlibrary,
|
|
16702
|
+
exportrowsof,
|
|
15388
16703
|
exportrunstate,
|
|
15389
16704
|
exportsessionfile,
|
|
15390
16705
|
exportworkflow,
|
|
@@ -15396,19 +16711,27 @@ export {
|
|
|
15396
16711
|
failureclass,
|
|
15397
16712
|
fallbackroute,
|
|
15398
16713
|
familyofkind,
|
|
16714
|
+
featuretourordered,
|
|
16715
|
+
featuretourstopat,
|
|
16716
|
+
featuretourstops,
|
|
15399
16717
|
fetchoptionsof,
|
|
15400
16718
|
fetchrequestof,
|
|
15401
16719
|
fieldshapekind,
|
|
15402
16720
|
fieldshaperegions,
|
|
16721
|
+
fileproviderof,
|
|
16722
|
+
filterdatagridrows,
|
|
15403
16723
|
filteredsessions,
|
|
15404
16724
|
filterentries,
|
|
15405
16725
|
filterexchanges,
|
|
15406
16726
|
filterlogstream,
|
|
16727
|
+
finishbackgroundrun,
|
|
15407
16728
|
finishrecording,
|
|
16729
|
+
firstdivergenceof,
|
|
15408
16730
|
fixedheadermatch,
|
|
15409
16731
|
flowmetricnames,
|
|
15410
16732
|
flowspecof,
|
|
15411
16733
|
foreachof,
|
|
16734
|
+
forklibrary,
|
|
15412
16735
|
formpayloadof,
|
|
15413
16736
|
formreportresponse,
|
|
15414
16737
|
framedlog,
|
|
@@ -15420,6 +16743,7 @@ export {
|
|
|
15420
16743
|
gatestateof,
|
|
15421
16744
|
generatedvalueallowed,
|
|
15422
16745
|
grantallowlistentry,
|
|
16746
|
+
grantdiffof,
|
|
15423
16747
|
graphqlopenvelope,
|
|
15424
16748
|
graphqlrequestof,
|
|
15425
16749
|
groupselect,
|
|
@@ -15427,6 +16751,11 @@ export {
|
|
|
15427
16751
|
growthtrend,
|
|
15428
16752
|
guardoutput,
|
|
15429
16753
|
guardverdictgate,
|
|
16754
|
+
guidedtipdismiss,
|
|
16755
|
+
guidedtiprecall,
|
|
16756
|
+
guidedtips,
|
|
16757
|
+
halocolorof,
|
|
16758
|
+
haloof,
|
|
15430
16759
|
haltedstepsof,
|
|
15431
16760
|
handleframe,
|
|
15432
16761
|
handoffframe,
|
|
@@ -15451,13 +16780,19 @@ export {
|
|
|
15451
16780
|
imagefilterof,
|
|
15452
16781
|
imagematches,
|
|
15453
16782
|
imagenames,
|
|
16783
|
+
importexportgate,
|
|
16784
|
+
importexportpayloadof,
|
|
16785
|
+
importexportvalidate,
|
|
15454
16786
|
importpresetlibrary,
|
|
15455
16787
|
importsessionfile,
|
|
15456
16788
|
importworkflow,
|
|
16789
|
+
infercolumntype,
|
|
15457
16790
|
inflightreport,
|
|
15458
16791
|
inheritconsent,
|
|
15459
16792
|
initialize,
|
|
15460
16793
|
inmemoryvault,
|
|
16794
|
+
installlibrary,
|
|
16795
|
+
interfaceviews,
|
|
15461
16796
|
interleavetimeline,
|
|
15462
16797
|
iscdpkind,
|
|
15463
16798
|
iscontrolflowkind,
|
|
@@ -15479,6 +16814,7 @@ export {
|
|
|
15479
16814
|
iswatchkind,
|
|
15480
16815
|
isworkflowkind,
|
|
15481
16816
|
joinbranches,
|
|
16817
|
+
joinruns,
|
|
15482
16818
|
jsonpathrulesof,
|
|
15483
16819
|
keepalivegate,
|
|
15484
16820
|
keepaliveintervalvalid,
|
|
@@ -15493,18 +16829,34 @@ export {
|
|
|
15493
16829
|
layernames,
|
|
15494
16830
|
layoutreport,
|
|
15495
16831
|
levelrank,
|
|
16832
|
+
librarybrowserow,
|
|
16833
|
+
librarycapabilitygate,
|
|
16834
|
+
libraryentryof,
|
|
16835
|
+
libraryeventof,
|
|
16836
|
+
librarygrantgate,
|
|
16837
|
+
libraryimportgate,
|
|
16838
|
+
librarymanifestgate,
|
|
16839
|
+
libraryproposalof,
|
|
16840
|
+
libraryquarantinegate,
|
|
16841
|
+
librarysearch,
|
|
16842
|
+
librarysensitivegate,
|
|
16843
|
+
librarystepsview,
|
|
15496
16844
|
listapprovals,
|
|
15497
16845
|
listdue,
|
|
15498
16846
|
listremotestatus,
|
|
15499
16847
|
listtools,
|
|
15500
16848
|
livebufferof,
|
|
15501
16849
|
loadworkflow,
|
|
16850
|
+
localebundles,
|
|
16851
|
+
localeformat,
|
|
16852
|
+
localestring,
|
|
15502
16853
|
localhostbind,
|
|
15503
16854
|
localsensitivegrade,
|
|
15504
16855
|
locationconsentcovers,
|
|
15505
16856
|
locationconsentgate,
|
|
15506
16857
|
locationpresetof,
|
|
15507
16858
|
locationrangevalid,
|
|
16859
|
+
lockcandidate,
|
|
15508
16860
|
lockkey,
|
|
15509
16861
|
logbufferboundvalid,
|
|
15510
16862
|
logchainreport,
|
|
@@ -15519,6 +16871,7 @@ export {
|
|
|
15519
16871
|
lookalikedistance,
|
|
15520
16872
|
loopof,
|
|
15521
16873
|
mailboxof,
|
|
16874
|
+
manifestdigest,
|
|
15522
16875
|
manualpreview,
|
|
15523
16876
|
manualrunpreview,
|
|
15524
16877
|
mapresponse,
|
|
@@ -15527,6 +16880,7 @@ export {
|
|
|
15527
16880
|
markpending,
|
|
15528
16881
|
markprovider,
|
|
15529
16882
|
markuprenderstep,
|
|
16883
|
+
maskedvalueof,
|
|
15530
16884
|
maskexport,
|
|
15531
16885
|
maskfield,
|
|
15532
16886
|
maskformstate,
|
|
@@ -15579,12 +16933,17 @@ export {
|
|
|
15579
16933
|
newsessiondiff,
|
|
15580
16934
|
newsessionrecord,
|
|
15581
16935
|
newworkflowrun,
|
|
16936
|
+
nextbackgroundrun,
|
|
15582
16937
|
nextrequest,
|
|
15583
16938
|
nobatchresolution,
|
|
15584
16939
|
nonceof,
|
|
15585
16940
|
normalizeendpoint,
|
|
15586
16941
|
notebodyof,
|
|
15587
16942
|
notehistoryentry,
|
|
16943
|
+
notificationcontentgate,
|
|
16944
|
+
notificationrespectsdnd,
|
|
16945
|
+
notifyattentionof,
|
|
16946
|
+
notifydoneof,
|
|
15588
16947
|
oauthflowof,
|
|
15589
16948
|
observationmodeof,
|
|
15590
16949
|
observationresponse,
|
|
@@ -15592,6 +16951,8 @@ export {
|
|
|
15592
16951
|
offfamilyof,
|
|
15593
16952
|
offloadkinds,
|
|
15594
16953
|
offscreencapabilitygate,
|
|
16954
|
+
omniboxtaskgate,
|
|
16955
|
+
omniboxtasktotaskinput,
|
|
15595
16956
|
onboardingcomplete,
|
|
15596
16957
|
onboardingconsentgate,
|
|
15597
16958
|
onboardingstart,
|
|
@@ -15613,8 +16974,15 @@ export {
|
|
|
15613
16974
|
originprofilegate,
|
|
15614
16975
|
originprofileof,
|
|
15615
16976
|
outcomeresponse,
|
|
16977
|
+
outputcomparegate,
|
|
16978
|
+
outputcomparereadonlygate,
|
|
16979
|
+
outputcomparesessionof,
|
|
16980
|
+
outputcompareview,
|
|
16981
|
+
overlayslider,
|
|
15616
16982
|
overrideinputof,
|
|
15617
16983
|
overridematches,
|
|
16984
|
+
pagechipof,
|
|
16985
|
+
pagechipresolve,
|
|
15618
16986
|
pairclient,
|
|
15619
16987
|
pairexchange,
|
|
15620
16988
|
pairingframes,
|
|
@@ -15630,8 +16998,10 @@ export {
|
|
|
15630
16998
|
parsecompletion,
|
|
15631
16999
|
parseframe,
|
|
15632
17000
|
parsehtmlbody,
|
|
17001
|
+
parseomniboxtask,
|
|
15633
17002
|
parseoutput,
|
|
15634
17003
|
parseproposal,
|
|
17004
|
+
parseshortcut,
|
|
15635
17005
|
parsessetext,
|
|
15636
17006
|
parsestream,
|
|
15637
17007
|
parsetokens,
|
|
@@ -15664,6 +17034,9 @@ export {
|
|
|
15664
17034
|
phishthresholdgate,
|
|
15665
17035
|
phishthresholdvalid,
|
|
15666
17036
|
phishverdictof,
|
|
17037
|
+
pickercandidateof,
|
|
17038
|
+
pickeroverlaygate,
|
|
17039
|
+
pickersessionstart,
|
|
15667
17040
|
ping,
|
|
15668
17041
|
planallowlist,
|
|
15669
17042
|
plancardgroups,
|
|
@@ -15697,6 +17070,7 @@ export {
|
|
|
15697
17070
|
providervalid,
|
|
15698
17071
|
proxygate,
|
|
15699
17072
|
proxyrouteof,
|
|
17073
|
+
pruneattention,
|
|
15700
17074
|
prunerunstates,
|
|
15701
17075
|
prunescratchpad,
|
|
15702
17076
|
publishmessage,
|
|
@@ -15705,8 +17079,13 @@ export {
|
|
|
15705
17079
|
queuecomplete,
|
|
15706
17080
|
queuefire,
|
|
15707
17081
|
queuelanesvalid,
|
|
17082
|
+
quickactioncatalog,
|
|
17083
|
+
quickactiongate,
|
|
17084
|
+
quickactionsfor,
|
|
15708
17085
|
randomid,
|
|
15709
17086
|
rankapis,
|
|
17087
|
+
rankattention,
|
|
17088
|
+
rankcandidates,
|
|
15710
17089
|
rankrecall,
|
|
15711
17090
|
ratelimitboundsvalid,
|
|
15712
17091
|
ratelimitbudgetallowed,
|
|
@@ -15722,6 +17101,9 @@ export {
|
|
|
15722
17101
|
recallentryof,
|
|
15723
17102
|
receivemessage,
|
|
15724
17103
|
receivemessages,
|
|
17104
|
+
recenttrayactions,
|
|
17105
|
+
recenttrayafter,
|
|
17106
|
+
recenttrayentryof,
|
|
15725
17107
|
reconnectwaits,
|
|
15726
17108
|
recordagentusage,
|
|
15727
17109
|
recordenvironment,
|
|
@@ -15752,6 +17134,7 @@ export {
|
|
|
15752
17134
|
releaselock,
|
|
15753
17135
|
releaserunlock,
|
|
15754
17136
|
removeedge,
|
|
17137
|
+
removelibrary,
|
|
15755
17138
|
removenode,
|
|
15756
17139
|
removetemplate,
|
|
15757
17140
|
rendermessage,
|
|
@@ -15765,8 +17148,15 @@ export {
|
|
|
15765
17148
|
replannonfail,
|
|
15766
17149
|
replanreviewgate,
|
|
15767
17150
|
replayagentrun,
|
|
17151
|
+
replaycursorof,
|
|
17152
|
+
replayjump,
|
|
17153
|
+
replaymove,
|
|
17154
|
+
replayplay,
|
|
17155
|
+
replayrestoredview,
|
|
17156
|
+
replaystepof,
|
|
15768
17157
|
replaytrace,
|
|
15769
17158
|
replayurl,
|
|
17159
|
+
replayviewaction,
|
|
15770
17160
|
reportstep,
|
|
15771
17161
|
requestbody,
|
|
15772
17162
|
requestreview,
|
|
@@ -15775,7 +17165,9 @@ export {
|
|
|
15775
17165
|
resolutionhistoryafter,
|
|
15776
17166
|
resolutionlogeventof,
|
|
15777
17167
|
resolutionverdict,
|
|
17168
|
+
resolveappearance,
|
|
15778
17169
|
resolveapproval,
|
|
17170
|
+
resolveconflict,
|
|
15779
17171
|
resolvedrisk,
|
|
15780
17172
|
resolveescalation,
|
|
15781
17173
|
resolvegate,
|
|
@@ -15791,6 +17183,7 @@ export {
|
|
|
15791
17183
|
restoreplanof,
|
|
15792
17184
|
restorereviewgranted,
|
|
15793
17185
|
resumeall,
|
|
17186
|
+
resumebackgroundqueue,
|
|
15794
17187
|
resumehandoff,
|
|
15795
17188
|
resumeone,
|
|
15796
17189
|
retireentries,
|
|
@@ -15832,6 +17225,8 @@ export {
|
|
|
15832
17225
|
runloop,
|
|
15833
17226
|
runparallel,
|
|
15834
17227
|
runrepeatuntil,
|
|
17228
|
+
runreplaygate,
|
|
17229
|
+
runreplaysessionof,
|
|
15835
17230
|
runreviewgranted,
|
|
15836
17231
|
runstep,
|
|
15837
17232
|
runsummarytask,
|
|
@@ -15877,12 +17272,14 @@ export {
|
|
|
15877
17272
|
securityreport,
|
|
15878
17273
|
seededrandom,
|
|
15879
17274
|
selectorresponse,
|
|
17275
|
+
selectrowrange,
|
|
15880
17276
|
semanticrecallscopegate,
|
|
15881
17277
|
sendcdpcommand,
|
|
15882
17278
|
sendfetch,
|
|
15883
17279
|
sendmessage,
|
|
15884
17280
|
sensitiveclassesof,
|
|
15885
17281
|
sensitiveclassgate,
|
|
17282
|
+
sensitiveconsentfor,
|
|
15886
17283
|
sensitivepipelingate,
|
|
15887
17284
|
sequenceintegrity,
|
|
15888
17285
|
serializearg,
|
|
@@ -15910,35 +17307,57 @@ export {
|
|
|
15910
17307
|
sharelesson,
|
|
15911
17308
|
shareworkflow,
|
|
15912
17309
|
shiftentryof,
|
|
17310
|
+
shortcutbindingafter,
|
|
17311
|
+
shortcutcommandof,
|
|
17312
|
+
shortcutdefaults,
|
|
17313
|
+
shortcutdispatchable,
|
|
17314
|
+
shortcutkeygate,
|
|
17315
|
+
shortcuttext,
|
|
17316
|
+
shotpanelgate,
|
|
17317
|
+
shotpanelof,
|
|
17318
|
+
shotpanelpan,
|
|
17319
|
+
shotpanelzoom,
|
|
15913
17320
|
signalsreport,
|
|
17321
|
+
signmanifest,
|
|
15914
17322
|
sitenoteof,
|
|
15915
17323
|
sitenotesreadgate,
|
|
15916
17324
|
sitenoteswritegate,
|
|
17325
|
+
siteprofileactive,
|
|
17326
|
+
siteprofilefor,
|
|
17327
|
+
siteprofilegate,
|
|
17328
|
+
siteprofileof,
|
|
15917
17329
|
snapnode,
|
|
15918
17330
|
snapshotplanof,
|
|
15919
17331
|
snapshotretentionwindow,
|
|
15920
17332
|
snapshotsections,
|
|
15921
17333
|
socketgate,
|
|
15922
17334
|
socketkinds,
|
|
17335
|
+
sortdatagridrows,
|
|
15923
17336
|
sourcemapconsentcovers,
|
|
15924
17337
|
spamdetect,
|
|
15925
17338
|
spamruleof,
|
|
15926
17339
|
spawn,
|
|
15927
17340
|
spawngrade,
|
|
15928
17341
|
sserequestheaders,
|
|
17342
|
+
stabilityscoreof,
|
|
15929
17343
|
stackedcount,
|
|
15930
17344
|
stackframes,
|
|
15931
17345
|
stackgate,
|
|
15932
17346
|
starttls,
|
|
17347
|
+
statusbadgeof,
|
|
15933
17348
|
statusclassof,
|
|
15934
17349
|
steal,
|
|
15935
17350
|
stepapprovegate,
|
|
17351
|
+
stepcomparisonof,
|
|
15936
17352
|
stepenvironmentvalid,
|
|
15937
17353
|
stepmodeof,
|
|
15938
17354
|
stepresolutionof,
|
|
15939
17355
|
stepstimelinenodes,
|
|
15940
17356
|
steptemplateof,
|
|
15941
17357
|
stepwindows,
|
|
17358
|
+
stetoasthistory,
|
|
17359
|
+
stetoastof,
|
|
17360
|
+
stetoaststackafter,
|
|
15942
17361
|
stopone,
|
|
15943
17362
|
streamchunkframe,
|
|
15944
17363
|
streamdelta,
|
|
@@ -15954,6 +17373,7 @@ export {
|
|
|
15954
17373
|
summaryhistoryentry,
|
|
15955
17374
|
summaryrequestof,
|
|
15956
17375
|
summarywindowvalid,
|
|
17376
|
+
supportedlanguages,
|
|
15957
17377
|
surfacepalette,
|
|
15958
17378
|
surfacesnapshot,
|
|
15959
17379
|
swarmcosts,
|
|
@@ -15962,6 +17382,15 @@ export {
|
|
|
15962
17382
|
swarmstateof,
|
|
15963
17383
|
swarmstatereport,
|
|
15964
17384
|
sweepreviews,
|
|
17385
|
+
syncbridgeexportpayload,
|
|
17386
|
+
syncbridgehookof,
|
|
17387
|
+
syncbridgeoptinflip,
|
|
17388
|
+
syncbridgeoptingate,
|
|
17389
|
+
syncbridgeproviders,
|
|
17390
|
+
syncbridgescan,
|
|
17391
|
+
syncbridgescopegate,
|
|
17392
|
+
syncbridgevalidate,
|
|
17393
|
+
syncdigestof,
|
|
15965
17394
|
tabreportresponse,
|
|
15966
17395
|
tabsessionkey,
|
|
15967
17396
|
tabsessionrefof,
|
|
@@ -15970,6 +17399,7 @@ export {
|
|
|
15970
17399
|
taskhistoryafter,
|
|
15971
17400
|
taskinputof,
|
|
15972
17401
|
taskinputproposalgate,
|
|
17402
|
+
taskinputsignatureof,
|
|
15973
17403
|
taskstatechecksum,
|
|
15974
17404
|
taskstateof,
|
|
15975
17405
|
taskstatevalid,
|
|
@@ -16032,6 +17462,7 @@ export {
|
|
|
16032
17462
|
unreadcount,
|
|
16033
17463
|
untrustedrendergate,
|
|
16034
17464
|
unwrapgraphql,
|
|
17465
|
+
updatelibrary,
|
|
16035
17466
|
updaterule,
|
|
16036
17467
|
urlencodeform,
|
|
16037
17468
|
usagetotals,
|
|
@@ -16040,6 +17471,7 @@ export {
|
|
|
16040
17471
|
validatefieldmatch,
|
|
16041
17472
|
validateformrecord,
|
|
16042
17473
|
validateframe,
|
|
17474
|
+
validatemanifest,
|
|
16043
17475
|
validateregexrule,
|
|
16044
17476
|
validatesiteoverride,
|
|
16045
17477
|
validatestep,
|
|
@@ -16061,6 +17493,7 @@ export {
|
|
|
16061
17493
|
verifyauth,
|
|
16062
17494
|
verifylogchain,
|
|
16063
17495
|
verifylogstream,
|
|
17496
|
+
verifypublishersignature,
|
|
16064
17497
|
verifytoken,
|
|
16065
17498
|
verifywebhook,
|
|
16066
17499
|
visitmatch,
|
|
@@ -16072,6 +17505,7 @@ export {
|
|
|
16072
17505
|
watchexpressionof,
|
|
16073
17506
|
watchgate,
|
|
16074
17507
|
webhooksecretok,
|
|
17508
|
+
webproviderstub,
|
|
16075
17509
|
whileof,
|
|
16076
17510
|
wildcardentry,
|
|
16077
17511
|
windowgatesstep,
|