@wenathlan/extension 1.1.62 → 1.1.64
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/environments.d.ts +10 -0
- package/dist/environments.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +956 -1
- package/dist/index.js.map +4 -4
- package/dist/memory.d.ts +126 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/planreview.d.ts +87 -0
- package/dist/planreview.d.ts.map +1 -0
- package/dist/policy.d.ts +101 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/protocol.d.ts +135 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/sessioninterface.d.ts +213 -0
- package/dist/sessioninterface.d.ts.map +1 -0
- package/dist/surfaces.d.ts +59 -0
- package/dist/surfaces.d.ts.map +1 -0
- package/dist/types.d.ts +376 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/extension/dist/background.js +1394 -2
- package/extension/dist/background.js.map +4 -4
- package/extension/dist/dashboardpage.html +13 -0
- package/extension/dist/dashboardpage.js +129 -0
- package/extension/dist/dashboardpage.js.map +7 -0
- package/extension/dist/manifest.json +5 -2
- package/extension/dist/offscreen.js +5 -0
- package/extension/dist/offscreen.js.map +2 -2
- package/extension/dist/optionspage.html +14 -0
- package/extension/dist/optionspage.js +118 -0
- package/extension/dist/optionspage.js.map +7 -0
- package/extension/dist/pagebridge.js.map +1 -1
- package/extension/dist/popup.html +4 -1
- package/extension/dist/popup.js +193 -0
- package/extension/dist/popup.js.map +3 -3
- package/extension/dist/sidepanel.html +7 -2
- package/extension/dist/sidepanel.js +693 -219
- package/extension/dist/sidepanel.js.map +3 -3
- package/extension/dist/transparencypage.html +1 -0
- package/extension/dist/transparencypage.js +42 -0
- package/extension/dist/transparencypage.js.map +2 -2
- package/extension/manifest.json +5 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5000,6 +5000,265 @@ var sessionmemory = class {
|
|
|
5000
5000
|
phishverdicts: await this.getphishverdicts()
|
|
5001
5001
|
};
|
|
5002
5002
|
}
|
|
5003
|
+
/**
|
|
5004
|
+
* Session interface persistence of the 1.1.63 family.
|
|
5005
|
+
* The five session stores live here, scoped per profile workspace: the sitenotes per origin with sensitive bodies sealed at rest, the append only scratchpad entries per task with their step provenance, the distilled runsummaries per run and origin, the correctionmemory entries per origin and kind captured from plan review, and the consentmemory entries per origin with every grant, denial, expiry and revocation carrying its boundary; beside them the semanticrecall index with fingerprint deduplication answers ranked queries inside the run scope, the incremental historysearch corpus indexes session metadata, notes and summaries as they are written, the errorsurface payloads of failed steps keep their retry hints with the policy verdict, the per tab session references isolate parallel tabs, and the export bundles notes, summaries and corrections as one audit bundle.
|
|
5006
|
+
* The recall seam stays documented: the local fingerprint index answers every query today while a future remote recall backend can take the same shapes behind the seam without touching the callers.
|
|
5007
|
+
*/
|
|
5008
|
+
/** Replaces the stored site notes; a sensitive note carries its sealedbody only so the plain body never persists. */
|
|
5009
|
+
async setsitenotes(notes) {
|
|
5010
|
+
return this.adapter.set("sitenotes", notes);
|
|
5011
|
+
}
|
|
5012
|
+
/** Returns the stored site notes, oldest update first. */
|
|
5013
|
+
async getsitenotes() {
|
|
5014
|
+
return await this.adapter.get("sitenotes") ?? [];
|
|
5015
|
+
}
|
|
5016
|
+
/** Reads the site notes of one origin only; the read gate keeps the origin inside the session grants. */
|
|
5017
|
+
async readsitenotes(origin) {
|
|
5018
|
+
return (await this.getsitenotes()).filter((note) => note.origin === origin);
|
|
5019
|
+
}
|
|
5020
|
+
/** Writes one site note: a note of the same id keeps its latest edit while a new note joins the store. */
|
|
5021
|
+
async writesitenote(note) {
|
|
5022
|
+
const notes = await this.getsitenotes();
|
|
5023
|
+
await this.setsitenotes(notes.some((candidate) => candidate.id === note.id) ? notes.map((candidate) => candidate.id === note.id ? note : candidate) : [...notes, note]);
|
|
5024
|
+
}
|
|
5025
|
+
/** Removes one site note by its id. */
|
|
5026
|
+
async removesitenote(id) {
|
|
5027
|
+
await this.setsitenotes((await this.getsitenotes()).filter((note) => note.id !== id));
|
|
5028
|
+
}
|
|
5029
|
+
/** Expires the site notes past the user configured window; an absent window keeps every note. */
|
|
5030
|
+
async expiresitenotes(retention, now) {
|
|
5031
|
+
if (retention === void 0) return await this.getsitenotes();
|
|
5032
|
+
const kept = (await this.getsitenotes()).filter((note) => now - note.updatedat < retention);
|
|
5033
|
+
await this.setsitenotes(kept);
|
|
5034
|
+
return kept;
|
|
5035
|
+
}
|
|
5036
|
+
/** Replaces the stored scratchpad entries per task. */
|
|
5037
|
+
async setscratchpad(entries) {
|
|
5038
|
+
return this.adapter.set("scratchpad", entries);
|
|
5039
|
+
}
|
|
5040
|
+
/** Returns every stored scratchpad entry, newest first. */
|
|
5041
|
+
async getscratchpadall() {
|
|
5042
|
+
return await this.adapter.get("scratchpad") ?? [];
|
|
5043
|
+
}
|
|
5044
|
+
/** Appends one scratchpad entry: the pad stays append only so no later write rewrites an earlier entry. */
|
|
5045
|
+
async appendscratchentry(entry) {
|
|
5046
|
+
await this.setscratchpad([entry, ...await this.getscratchpadall()]);
|
|
5047
|
+
}
|
|
5048
|
+
/** Reads the scratchpad of one task session, newest first; entries of another task never cross the boundary. */
|
|
5049
|
+
async readscratchpad(taskid, sessionid) {
|
|
5050
|
+
return (await this.getscratchpadall()).filter((entry) => entry.taskid === taskid && entry.sessionid === sessionid);
|
|
5051
|
+
}
|
|
5052
|
+
/** Prunes the scratchpad entries past the user configured window; an absent window keeps every entry. */
|
|
5053
|
+
async prunescratchentries(window, now) {
|
|
5054
|
+
if (window === void 0) return await this.getscratchpadall();
|
|
5055
|
+
const kept = (await this.getscratchpadall()).filter((entry) => now - entry.at < window);
|
|
5056
|
+
await this.setscratchpad(kept);
|
|
5057
|
+
return kept;
|
|
5058
|
+
}
|
|
5059
|
+
/** Stores one distilled run summary of a completed run. */
|
|
5060
|
+
async setrunsummary(summary) {
|
|
5061
|
+
return this.adapter.set(`runsummary:${summary.runid}`, summary);
|
|
5062
|
+
}
|
|
5063
|
+
/** Returns the stored run summary of one run; an absent summary returns undefined. */
|
|
5064
|
+
async getrunsummary(runid) {
|
|
5065
|
+
return this.adapter.get(`runsummary:${runid}`);
|
|
5066
|
+
}
|
|
5067
|
+
/** Lists the stored run summaries, oldest distillation first, optionally filtered by origin. */
|
|
5068
|
+
async listrunsummaries(origin) {
|
|
5069
|
+
const index = await this.adapter.get("runsummaryindex") ?? [];
|
|
5070
|
+
const summaries = [];
|
|
5071
|
+
for (const runid of index) {
|
|
5072
|
+
const summary = await this.getrunsummary(runid);
|
|
5073
|
+
if (summary) summaries.push(summary);
|
|
5074
|
+
}
|
|
5075
|
+
const filtered = origin === void 0 ? summaries : summaries.filter((summary) => summary.origins.includes(origin));
|
|
5076
|
+
return filtered.sort((one, two) => one.distilledat - two.distilledat);
|
|
5077
|
+
}
|
|
5078
|
+
/** Tracks one run in the run summary index so the listing reads every stored summary. */
|
|
5079
|
+
async trackrunsummary(runid) {
|
|
5080
|
+
const index = await this.adapter.get("runsummaryindex") ?? [];
|
|
5081
|
+
if (!index.includes(runid)) await this.adapter.set("runsummaryindex", [...index, runid]);
|
|
5082
|
+
}
|
|
5083
|
+
/** Expires the run summaries past the user configured window; an absent window keeps every summary. */
|
|
5084
|
+
async expirerunsummaries(retention, now) {
|
|
5085
|
+
const summaries = await this.listrunsummaries();
|
|
5086
|
+
if (retention === void 0) return summaries;
|
|
5087
|
+
const kept = [];
|
|
5088
|
+
for (const summary of summaries) {
|
|
5089
|
+
if (now - summary.distilledat > retention) await this.adapter.set(`runsummary:${summary.runid}`, { ...summary, steps: [], kinds: [], origins: summary.origins });
|
|
5090
|
+
else kept.push(summary);
|
|
5091
|
+
}
|
|
5092
|
+
return kept;
|
|
5093
|
+
}
|
|
5094
|
+
/** Replaces the semantic recall index with its fingerprint deduplicated entries. */
|
|
5095
|
+
async setrecallindex(index) {
|
|
5096
|
+
return this.adapter.set("recallindex", index);
|
|
5097
|
+
}
|
|
5098
|
+
/** Returns the stored semantic recall index entries, newest first. */
|
|
5099
|
+
async getrecallindex() {
|
|
5100
|
+
return await this.adapter.get("recallindex") ?? [];
|
|
5101
|
+
}
|
|
5102
|
+
/** Adds one recall index entry with fingerprint deduplication: a repeated extraction keeps its first entry. */
|
|
5103
|
+
async addrecallentry(entry) {
|
|
5104
|
+
const index = await this.getrecallindex();
|
|
5105
|
+
if (index.some((candidate) => candidate.fingerprint === entry.fingerprint && candidate.origin === entry.origin)) return;
|
|
5106
|
+
await this.setrecallindex([entry, ...index]);
|
|
5107
|
+
}
|
|
5108
|
+
/** Answers one semantic recall query across the extraction stores: the local index ranks by text similarity inside the run scope and returns the provenance of every match. */
|
|
5109
|
+
async semanticrecall(query, scope, rank) {
|
|
5110
|
+
return rank(await this.getrecallindex(), query, scope);
|
|
5111
|
+
}
|
|
5112
|
+
/** Expires the recall index entries past the user configured window; the extraction records themselves stay for the audit trail. */
|
|
5113
|
+
async expirerecallentries(window, now) {
|
|
5114
|
+
if (window === void 0) return await this.getrecallindex();
|
|
5115
|
+
const kept = (await this.getrecallindex()).filter((entry) => now - entry.at < window);
|
|
5116
|
+
await this.setrecallindex(kept);
|
|
5117
|
+
return kept;
|
|
5118
|
+
}
|
|
5119
|
+
/** Replaces the stored correction memory entries per origin and kind. */
|
|
5120
|
+
async setcorrections(corrections) {
|
|
5121
|
+
return this.adapter.set("corrections", corrections);
|
|
5122
|
+
}
|
|
5123
|
+
/** Returns the stored correction memory entries, newest first, optionally filtered by origin and kind. */
|
|
5124
|
+
async getcorrections(filter) {
|
|
5125
|
+
const entries = await this.adapter.get("corrections") ?? [];
|
|
5126
|
+
return entries.filter((entry) => (filter?.origin === void 0 || entry.origin === filter.origin) && (filter?.kind === void 0 || entry.kind === filter.kind));
|
|
5127
|
+
}
|
|
5128
|
+
/** Records one correction memory entry captured from a plan review edit or rejection. */
|
|
5129
|
+
async addcorrection(entry) {
|
|
5130
|
+
await this.setcorrections([entry, ...await this.adapter.get("corrections") ?? []]);
|
|
5131
|
+
}
|
|
5132
|
+
/** Expires the correction memory entries past the user configured window; an absent window keeps every correction. */
|
|
5133
|
+
async expirecorrectionentries(window, now) {
|
|
5134
|
+
if (window === void 0) return await this.getcorrections();
|
|
5135
|
+
const kept = (await this.getcorrections()).filter((entry) => now - entry.at < window);
|
|
5136
|
+
await this.setcorrections(kept);
|
|
5137
|
+
return kept;
|
|
5138
|
+
}
|
|
5139
|
+
/** Replaces the stored consent memory entries per origin. */
|
|
5140
|
+
async setconsentmemory(entries) {
|
|
5141
|
+
return this.adapter.set("consentmemory", entries);
|
|
5142
|
+
}
|
|
5143
|
+
/** Returns the stored consent memory entries, newest first, optionally filtered by origin. */
|
|
5144
|
+
async getconsentmemory(origin) {
|
|
5145
|
+
const entries = await this.adapter.get("consentmemory") ?? [];
|
|
5146
|
+
return origin === void 0 ? entries : entries.filter((entry) => entry.origin === origin);
|
|
5147
|
+
}
|
|
5148
|
+
/** Records one consent memory entry per origin: every grant, denial, expiry and revocation lands with its boundary and kinds. */
|
|
5149
|
+
async addconsentmemoryentry(entry) {
|
|
5150
|
+
await this.setconsentmemory([entry, ...await this.adapter.get("consentmemory") ?? []]);
|
|
5151
|
+
}
|
|
5152
|
+
/** Replaces the stored error surface payloads of failed steps. */
|
|
5153
|
+
async seterrorsurfaces(surfaces) {
|
|
5154
|
+
return this.adapter.set("errorsurfaces", surfaces);
|
|
5155
|
+
}
|
|
5156
|
+
/** Returns the stored error surface payloads, newest first, optionally filtered by step. */
|
|
5157
|
+
async geterrorsurfaces(stepid) {
|
|
5158
|
+
const surfaces = await this.adapter.get("errorsurfaces") ?? [];
|
|
5159
|
+
return stepid === void 0 ? surfaces : surfaces.filter((surface) => surface.stepid === stepid);
|
|
5160
|
+
}
|
|
5161
|
+
/** Records one error surface payload of a failed step with its retry hint and the policy verdict. */
|
|
5162
|
+
async adderrorsurface(surface) {
|
|
5163
|
+
await this.seterrorsurfaces([surface, ...await this.adapter.get("errorsurfaces") ?? []].slice(0, 500));
|
|
5164
|
+
}
|
|
5165
|
+
/** Replaces the incremental history search corpus of session metadata, notes and run summaries. */
|
|
5166
|
+
async sethistoryindex(corpus) {
|
|
5167
|
+
return this.adapter.set("historyindex", corpus);
|
|
5168
|
+
}
|
|
5169
|
+
/** Returns the incremental history search corpus, newest entry first. */
|
|
5170
|
+
async gethistoryindex() {
|
|
5171
|
+
return await this.adapter.get("historyindex") ?? [];
|
|
5172
|
+
}
|
|
5173
|
+
/** Adds one corpus entry to the incremental history index on each store write. */
|
|
5174
|
+
async addhistoryentry(entry) {
|
|
5175
|
+
const corpus = await this.gethistoryindex();
|
|
5176
|
+
await this.sethistoryindex([entry, ...corpus.filter((candidate) => !(candidate.source === entry.source && candidate.id === entry.id))]);
|
|
5177
|
+
}
|
|
5178
|
+
/** Answers one history search query against the incremental corpus with the matched terms highlighted. */
|
|
5179
|
+
async historysearch(query, search) {
|
|
5180
|
+
return search(await this.gethistoryindex(), query);
|
|
5181
|
+
}
|
|
5182
|
+
/** Stores one per tab session reference so parallel tabs never collide inside the session stores. */
|
|
5183
|
+
async settabsession(ref) {
|
|
5184
|
+
return this.adapter.set(`tabsession:${ref.tabid}`, ref);
|
|
5185
|
+
}
|
|
5186
|
+
/** Returns the per tab session reference of one tab; an absent reference returns undefined. */
|
|
5187
|
+
async gettabsession(tabid) {
|
|
5188
|
+
return this.adapter.get(`tabsession:${tabid}`);
|
|
5189
|
+
}
|
|
5190
|
+
/** Lists every per tab session reference so the sessiongrid reads the per tab lock state of concurrent sessions. */
|
|
5191
|
+
async listtabsessions() {
|
|
5192
|
+
const tabs = await this.adapter.get("tabsessionindex") ?? [];
|
|
5193
|
+
const refs = [];
|
|
5194
|
+
for (const tabid of tabs) {
|
|
5195
|
+
const ref = await this.gettabsession(tabid);
|
|
5196
|
+
if (ref) refs.push(ref);
|
|
5197
|
+
}
|
|
5198
|
+
return refs;
|
|
5199
|
+
}
|
|
5200
|
+
/** Tracks one tab in the per tab session index so the listing reads every isolated reference. */
|
|
5201
|
+
async tracktabsession(tabid) {
|
|
5202
|
+
const tabs = await this.adapter.get("tabsessionindex") ?? [];
|
|
5203
|
+
if (!tabs.includes(tabid)) await this.adapter.set("tabsessionindex", [...tabs, tabid]);
|
|
5204
|
+
}
|
|
5205
|
+
/** Exports the site notes, the run summaries and the correction memory as one audit bundle: sensitive note bodies stay sealed in the export. */
|
|
5206
|
+
async exportsessionbundle(exportedat) {
|
|
5207
|
+
return { kind: "sessionbundle", notes: await this.getsitenotes(), summaries: await this.listrunsummaries(), corrections: await this.getcorrections(), exportedat };
|
|
5208
|
+
}
|
|
5209
|
+
/**
|
|
5210
|
+
* Interface surface stores of the 1.1.64 family live here, scoped per profile workspace: the commandpalette usage counts the recent first ranking reads, the taskinput history of natural language goals, the onboarding completion state, the per surface layout preferences, the logstream filter preferences and the stepapprove resolution history per origin.
|
|
5211
|
+
*/
|
|
5212
|
+
/** Returns every commandpalette usage record so the ranking lifts the recent commands first. */
|
|
5213
|
+
async getpaletteusage() {
|
|
5214
|
+
return await this.adapter.get("paletteusage") ?? [];
|
|
5215
|
+
}
|
|
5216
|
+
/** Replaces the commandpalette usage records after one use: the count grows and the last use time moves so the ranking reads both. */
|
|
5217
|
+
async setpaletteusage(records) {
|
|
5218
|
+
return this.adapter.set("paletteusage", records);
|
|
5219
|
+
}
|
|
5220
|
+
/** Returns the stored taskinput history, newest first. */
|
|
5221
|
+
async gettaskinputs() {
|
|
5222
|
+
return await this.adapter.get("taskinputs") ?? [];
|
|
5223
|
+
}
|
|
5224
|
+
/** Adds one taskinput submission to the per profile history; the retention window stays a user setting. */
|
|
5225
|
+
async addtaskinput(entry) {
|
|
5226
|
+
const retention = (await this.getsettings())?.taskinputretention;
|
|
5227
|
+
const history = [entry, ...await this.gettaskinputs()];
|
|
5228
|
+
await this.adapter.set("taskinputs", retention === void 0 ? history : history.filter((candidate) => entry.at - candidate.at < retention));
|
|
5229
|
+
}
|
|
5230
|
+
/** Returns the onboarding completion state; an absent state means the walkthrough never ran. */
|
|
5231
|
+
async getonboardingstate() {
|
|
5232
|
+
return this.adapter.get("onboarding");
|
|
5233
|
+
}
|
|
5234
|
+
/** Stores the onboarding completion state; a done walkthrough never runs again on its own. */
|
|
5235
|
+
async setonboardingstate(state) {
|
|
5236
|
+
return this.adapter.set("onboarding", state);
|
|
5237
|
+
}
|
|
5238
|
+
/** Returns the layout preferences of one surface; an absent preference set returns undefined. */
|
|
5239
|
+
async getsurfacelayout(surface) {
|
|
5240
|
+
return this.adapter.get(`surfacelayout:${surface}`);
|
|
5241
|
+
}
|
|
5242
|
+
/** Stores the layout preferences of one surface, scoped per profile workspace. */
|
|
5243
|
+
async setsurfacelayout(layout) {
|
|
5244
|
+
return this.adapter.set(`surfacelayout:${layout.surface}`, layout);
|
|
5245
|
+
}
|
|
5246
|
+
/** Returns the stored logstream filter preferences of the live view. */
|
|
5247
|
+
async getlogstreamfilters() {
|
|
5248
|
+
return this.adapter.get("logstreamfilters");
|
|
5249
|
+
}
|
|
5250
|
+
/** Stores the logstream filter preferences of the live view. */
|
|
5251
|
+
async setlogstreamfilters(filter) {
|
|
5252
|
+
return this.adapter.set("logstreamfilters", filter);
|
|
5253
|
+
}
|
|
5254
|
+
/** Returns every stored stepapprove resolution, newest first, with its human provenance. */
|
|
5255
|
+
async getstepapproveresolutions() {
|
|
5256
|
+
return await this.adapter.get("stepapproveresolutions") ?? [];
|
|
5257
|
+
}
|
|
5258
|
+
/** Records one stepapprove resolution in the per origin history. */
|
|
5259
|
+
async addstepapproveresolution(resolution) {
|
|
5260
|
+
await this.adapter.set("stepapproveresolutions", [resolution, ...await this.getstepapproveresolutions()]);
|
|
5261
|
+
}
|
|
5003
5262
|
};
|
|
5004
5263
|
function mediakindof(record2) {
|
|
5005
5264
|
if ("pages" in record2) return "pdf";
|
|
@@ -5996,6 +6255,11 @@ function isolatedinjection(step) {
|
|
|
5996
6255
|
}
|
|
5997
6256
|
return { world: "ISOLATED", code: step.value, args };
|
|
5998
6257
|
}
|
|
6258
|
+
var runsummarytask = "runsummary";
|
|
6259
|
+
function summaryrequestof(input) {
|
|
6260
|
+
if (input.payload.trim() === "") throw new Error("The runsummary request needs its payload reference.");
|
|
6261
|
+
return { id: input.id, runid: input.runid, stepid: input.sessionid, task: runsummarytask, payload: input.payload, transferables: [], sentat: input.sentat };
|
|
6262
|
+
}
|
|
5999
6263
|
|
|
6000
6264
|
// httpclient.ts
|
|
6001
6265
|
var httpkinds = ["fetchurl", "parsejson", "parsehtml", "callrest", "callgraphql"];
|
|
@@ -11095,6 +11359,92 @@ function untrustedrendergate(input) {
|
|
|
11095
11359
|
if (input.environment === "sandboxframe") return { allowed: true, reason: "The extracted markup renders inside the sandboxframe under its nonce with scripts and handlers stripped; the untrusted content never reenters the page context." };
|
|
11096
11360
|
return { allowed: false, reason: `The extracted markup grades untrusted and refuses to render inside the ${input.environment}; every untrusted render routes through the sandboxframe.` };
|
|
11097
11361
|
}
|
|
11362
|
+
function sitenotesreadgate(input) {
|
|
11363
|
+
if (input.grants.includes(input.origin)) return { allowed: true, reason: `The session granted ${input.origin}, so the site notes of the origin read.` };
|
|
11364
|
+
return { allowed: false, reason: `The session never granted ${input.origin}; the site notes of the origin refuse the read.` };
|
|
11365
|
+
}
|
|
11366
|
+
function sitenoteswritegate(input) {
|
|
11367
|
+
if (!input.consent) return { allowed: false, reason: `The site note write for ${input.origin} needs the explicit consent of the user; no note lands without a reviewed write.` };
|
|
11368
|
+
return { allowed: true, reason: `The user consented to the site note write for ${input.origin}; the note keeps its author provenance and its timestamps.` };
|
|
11369
|
+
}
|
|
11370
|
+
function scratchpadscopegate(input) {
|
|
11371
|
+
if (input.taskid !== input.entrytaskid || input.sessionid !== input.entrysessionid) return { allowed: false, reason: `The scratchpad entry belongs to the task ${input.entrytaskid} of the session ${input.entrysessionid}; the task ${input.taskid} of the session ${input.sessionid} never crosses that boundary.` };
|
|
11372
|
+
return { allowed: true, reason: `The scratchpad entry belongs to the task ${input.taskid} of the session ${input.sessionid} that asks for it.` };
|
|
11373
|
+
}
|
|
11374
|
+
function memoryreadscopegate(input) {
|
|
11375
|
+
if (input.phase === "planning" || input.phase === "prompting") return { allowed: true, reason: `The ${input.phase} phase reads the correction and consent memory so the proposal and the prompt carry the prior decisions.` };
|
|
11376
|
+
return { allowed: false, reason: `The ${input.phase} phase reads no correction or consent memory; the history serves the planning and the prompting alone.` };
|
|
11377
|
+
}
|
|
11378
|
+
function semanticrecallscopegate(input) {
|
|
11379
|
+
if (input.origin === void 0) return { allowed: true, reason: `The recall query names no origin, so it ranks the ${input.scope.length} origin${input.scope.length === 1 ? "" : "s"} of the run scope only.` };
|
|
11380
|
+
if (!input.scope.includes(input.origin)) return { allowed: false, reason: `The recall query asks for ${input.origin} while the run scope holds ${input.scope.length > 0 ? input.scope.join(", ") : "no origin"}; a recall across origins outside the run scope refuses.` };
|
|
11381
|
+
return { allowed: true, reason: `The recall query asks for ${input.origin} inside the run scope; the ranking stays scoped.` };
|
|
11382
|
+
}
|
|
11383
|
+
function summarywindowvalid(window) {
|
|
11384
|
+
if (window === void 0) return { allowed: true, reason: "No runsummary window is configured, so the distillation keeps every step with no fixed cap." };
|
|
11385
|
+
if (!Number.isInteger(window) || window < 0) return { allowed: false, reason: "The runsummary window stays a whole number of steps the user chose; no engine cap exists." };
|
|
11386
|
+
return { allowed: true, reason: `The runsummary window of ${window} step${window === 1 ? "" : "s"} stays the user configured choice; no engine cap exists.` };
|
|
11387
|
+
}
|
|
11388
|
+
function sessionretentionvalid(window) {
|
|
11389
|
+
if (window === void 0) return { allowed: true, reason: "No retention window is configured, so the session store keeps every record forever." };
|
|
11390
|
+
if (!Number.isFinite(window) || window <= 0) return { allowed: false, reason: "The retention window stays a positive user value in milliseconds; no engine boundary expires a record." };
|
|
11391
|
+
return { allowed: true, reason: `The retention window of ${window} milliseconds stays the user configured choice.` };
|
|
11392
|
+
}
|
|
11393
|
+
function consentmemoryadvisorygate(input) {
|
|
11394
|
+
if (input.auto) return { allowed: false, reason: `The consent memory never auto grants: the prior decisions of ${input.latest?.origin ?? "the origin"} stay advisory and every grant needs its own prompt.` };
|
|
11395
|
+
if (input.latest !== void 0 && input.latest.decision === "deny") return { allowed: true, reason: `The consent memory holds a prior denial for ${input.latest.origin} with the same weight as a grant; the prompt shows the refusal and the user decides again.` };
|
|
11396
|
+
return { allowed: true, reason: "The consent memory stays advisory; the prompt opens with the prior decisions and the user decides." };
|
|
11397
|
+
}
|
|
11398
|
+
function cancelrungate(input) {
|
|
11399
|
+
if (input.rollbackscope === "none") return { allowed: true, reason: `The cancelrun stops the run with no rollback; the ${input.queuedstepids.length} queued step${input.queuedstepids.length === 1 ? "" : "s"} stay as the run left them and the ${input.executedstepids.length} executed step${input.executedstepids.length === 1 ? "" : "s"} stay in the sealed log.` };
|
|
11400
|
+
return { allowed: true, reason: `The cancelrun rolls the ${input.queuedstepids.length} queued step${input.queuedstepids.length === 1 ? "" : "s"} back${input.queuedstepids.length > 0 ? ` (${input.queuedstepids.join(", ")})` : ""} while the ${input.executedstepids.length} executed step${input.executedstepids.length === 1 ? "" : "s"} stay untouched in the sealed log.` };
|
|
11401
|
+
}
|
|
11402
|
+
function retrydispatchgate(input) {
|
|
11403
|
+
if (!input.reviewed) return { allowed: false, reason: `The retry of the step ${input.stepid} passes only through a new reviewed dispatch; an automatic retry never bypasses the review.` };
|
|
11404
|
+
return { allowed: true, reason: `The retry of the step ${input.stepid} dispatches again through the full consent gate chain: the session, the plan and the origin gates all recheck the step.` };
|
|
11405
|
+
}
|
|
11406
|
+
function paletteactiongate(input) {
|
|
11407
|
+
if (input.action.permission !== void 0 && !input.granted.includes(input.action.permission)) return { allowed: false, reason: `The ${input.action.command} command needs the ${input.action.permission} capability granted before the palette lists it; the palette never offers an action the current capability set refuses.` };
|
|
11408
|
+
if (input.action.session === true && !input.sessionactive) return { allowed: false, reason: `The ${input.action.command} command needs an active browser session before the palette lists it; the palette never offers a run action without its session.` };
|
|
11409
|
+
return { allowed: true, reason: `The ${input.action.command} command rides its granted permissions and lists in the palette.` };
|
|
11410
|
+
}
|
|
11411
|
+
function taskinputproposalgate(input) {
|
|
11412
|
+
if (input.direct) return { allowed: false, reason: "The taskinput never executes a goal directly; every natural language goal routes through the same proposal flow as the api and becomes a reviewed plan first." };
|
|
11413
|
+
if (input.text.trim() === "") return { allowed: false, reason: "The taskinput submission needs its natural language goal; an empty goal never reaches the proposal flow." };
|
|
11414
|
+
if (input.origin.trim() === "") return { allowed: false, reason: "The taskinput submission needs its active origin scope; a goal without an origin never reaches the proposal flow." };
|
|
11415
|
+
return { allowed: true, reason: `The taskinput goal for ${input.origin} rides the same proposal flow as the api: the observation, the capabilities and the plan review all recheck it.` };
|
|
11416
|
+
}
|
|
11417
|
+
function planreviewgate(input) {
|
|
11418
|
+
if (input.state === "approved") return { allowed: true, reason: "The plan already passed its review: the approval is the review of record and the execution proceeds." };
|
|
11419
|
+
if (!input.reviewed) return { allowed: false, reason: "The pending plan has no plancard review yet; every step renders its card with the risk class, the environment and the options before any execution." };
|
|
11420
|
+
return { allowed: true, reason: "The plancard review of the pending plan is open; the resolution of each step stays a distinct human action." };
|
|
11421
|
+
}
|
|
11422
|
+
function stepapprovegate(input) {
|
|
11423
|
+
if (input.stepids.length === 0) return { allowed: false, reason: "A stepapprove resolution names its single step." };
|
|
11424
|
+
if (input.stepids.length > 1) return { allowed: false, reason: `One human action resolves exactly one step; the batch of ${input.stepids.length} steps refuses in full because no batch approval exists.` };
|
|
11425
|
+
if (input.surface === "background") return { allowed: false, reason: `The ${input.resolution} resolution of the step ${input.stepids[0]} needs its distinct human action from a surface; the background never resolves a review on its own.` };
|
|
11426
|
+
if (input.resolution === "edit") return { allowed: true, reason: `The user edits the step ${input.stepids[0]} from the ${input.surface} before approving; the corrected shape rides the plan and the resolution keeps its human provenance.` };
|
|
11427
|
+
return { allowed: true, reason: `The user ${input.resolution === "approve" ? "approved" : "rejected"} the step ${input.stepids[0]} from the ${input.surface}; one distinct human action resolved the step alone.` };
|
|
11428
|
+
}
|
|
11429
|
+
function diffpreviewgate(input) {
|
|
11430
|
+
if (input.risk !== "sensitive") return { allowed: false, reason: `The ${input.risk} step changes no page or browser state; the diffpreview compares the observed before state with the predicted after state of write class steps only.` };
|
|
11431
|
+
return { allowed: true, reason: "The write class step changes page or browser state, so the diffpreview compares its observed before state with its predicted after state." };
|
|
11432
|
+
}
|
|
11433
|
+
function onboardingconsentgate(input) {
|
|
11434
|
+
if (input.consentevents.length === 0) return { allowed: true, reason: "The onboarding completion writes its single consent scoped event; no consent event exists yet." };
|
|
11435
|
+
if (input.consentevents.length === 1) return { allowed: false, reason: `The onboarding already wrote its single consent scoped event ${input.consentevents[0]}; a walkthrough never writes a second one.` };
|
|
11436
|
+
return { allowed: false, reason: `The onboarding found ${input.consentevents.length} consent scoped events; a walkthrough writes exactly one and the extra events refuse.` };
|
|
11437
|
+
}
|
|
11438
|
+
function logbufferboundvalid(bound) {
|
|
11439
|
+
if (bound === void 0) return { allowed: true, reason: "No logstream buffer bound is configured, so the live window keeps every event while the full history stays in memory." };
|
|
11440
|
+
if (!Number.isInteger(bound) || bound <= 0) return { allowed: false, reason: "The logstream buffer bound stays a positive whole number of events the user chose; no engine cap exists." };
|
|
11441
|
+
return { allowed: true, reason: `The logstream buffer bound of ${bound} event${bound === 1 ? "" : "s"} stays the user configured choice; the full history stays in memory.` };
|
|
11442
|
+
}
|
|
11443
|
+
function logstreamegressgate(input) {
|
|
11444
|
+
if (input.entries === 0) return { allowed: false, reason: "The audit excerpt names no event of the logstream; an empty range never copies." };
|
|
11445
|
+
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
|
+
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
|
+
}
|
|
11098
11448
|
|
|
11099
11449
|
// llm.ts
|
|
11100
11450
|
var defaultrefusalmarkers = ["i cannot", "i can't", "i'm unable", "refusal:", "cannot comply"];
|
|
@@ -11455,7 +11805,7 @@ function budgetcheck(input) {
|
|
|
11455
11805
|
}
|
|
11456
11806
|
|
|
11457
11807
|
// version.ts
|
|
11458
|
-
var packageversion = "1.1.
|
|
11808
|
+
var packageversion = "1.1.64";
|
|
11459
11809
|
|
|
11460
11810
|
// types.ts
|
|
11461
11811
|
var protocolversion = packageversion;
|
|
@@ -12554,6 +12904,520 @@ function vaultprompttext(entry, origin) {
|
|
|
12554
12904
|
return `Use the credential ${entry.label} of ${entry.scope} on ${origin}? The value stays behind the vault and no surface ever displays it.`;
|
|
12555
12905
|
}
|
|
12556
12906
|
|
|
12907
|
+
// sessioninterface.ts
|
|
12908
|
+
function textfingerprint(text2) {
|
|
12909
|
+
let hash = 2166136261;
|
|
12910
|
+
for (let index = 0; index < text2.length; index += 1) {
|
|
12911
|
+
hash ^= text2.charCodeAt(index);
|
|
12912
|
+
hash = Math.imul(hash, 16777619) >>> 0;
|
|
12913
|
+
}
|
|
12914
|
+
return hash.toString(16).padStart(8, "0");
|
|
12915
|
+
}
|
|
12916
|
+
function keystreambyte(id, position) {
|
|
12917
|
+
let hash = 2166136261;
|
|
12918
|
+
const source = `${id}:${position}`;
|
|
12919
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
12920
|
+
hash ^= source.charCodeAt(index);
|
|
12921
|
+
hash = Math.imul(hash, 16777619) >>> 0;
|
|
12922
|
+
}
|
|
12923
|
+
return hash & 255;
|
|
12924
|
+
}
|
|
12925
|
+
function sealnotebody(id, body) {
|
|
12926
|
+
const sealed = Array.from(body, (character, index) => String.fromCharCode(character.charCodeAt(0) ^ keystreambyte(id, index))).join("");
|
|
12927
|
+
return `sealed:${btoa(sealed)}`;
|
|
12928
|
+
}
|
|
12929
|
+
function opennotebody(id, sealedbody) {
|
|
12930
|
+
if (!sealedbody.startsWith("sealed:")) return "";
|
|
12931
|
+
try {
|
|
12932
|
+
const sealed = atob(sealedbody.slice("sealed:".length));
|
|
12933
|
+
return Array.from(sealed, (character, index) => String.fromCharCode(character.charCodeAt(0) ^ keystreambyte(id, index))).join("");
|
|
12934
|
+
} catch {
|
|
12935
|
+
return "";
|
|
12936
|
+
}
|
|
12937
|
+
}
|
|
12938
|
+
function sitenoteof(input) {
|
|
12939
|
+
if (input.origin.trim() === "") throw new Error("The site note needs its origin.");
|
|
12940
|
+
if (input.title.trim() === "") throw new Error("The site note needs its title.");
|
|
12941
|
+
if (input.body.trim() === "") throw new Error("The site note needs its body.");
|
|
12942
|
+
const id = input.id ?? randomid();
|
|
12943
|
+
if (input.sensitive === true) return { id, origin: input.origin, title: input.title.trim(), sealedbody: sealnotebody(id, input.body), author: input.author, sensitive: true, createdat: input.now, updatedat: input.now };
|
|
12944
|
+
return { id, origin: input.origin, title: input.title.trim(), body: input.body, author: input.author, sensitive: false, createdat: input.now, updatedat: input.now };
|
|
12945
|
+
}
|
|
12946
|
+
function notebodyof(note) {
|
|
12947
|
+
if (note.sensitive) return note.sealedbody !== void 0 ? opennotebody(note.id, note.sealedbody) : "";
|
|
12948
|
+
return note.body ?? "";
|
|
12949
|
+
}
|
|
12950
|
+
function editnote(note, input) {
|
|
12951
|
+
if (input.title.trim() === "") throw new Error("The site note keeps a non empty title.");
|
|
12952
|
+
if (input.body.trim() === "") throw new Error("The site note keeps a non empty body.");
|
|
12953
|
+
if (note.sensitive) return { ...note, title: input.title.trim(), sealedbody: sealnotebody(note.id, input.body), updatedat: input.now, author: input.author };
|
|
12954
|
+
return { ...note, title: input.title.trim(), body: input.body, updatedat: input.now, author: input.author };
|
|
12955
|
+
}
|
|
12956
|
+
function expirnotes(notes, retention, now) {
|
|
12957
|
+
if (retention === void 0) return notes;
|
|
12958
|
+
return notes.filter((note) => now - note.updatedat < retention);
|
|
12959
|
+
}
|
|
12960
|
+
function scratchentryof(input) {
|
|
12961
|
+
if (input.taskid.trim() === "") throw new Error("The scratchpad entry needs its task.");
|
|
12962
|
+
if (input.text.trim() === "") throw new Error("The scratchpad entry needs its text.");
|
|
12963
|
+
return { id: input.id ?? randomid(), taskid: input.taskid, sessionid: input.sessionid, text: input.text, ...input.stepid !== void 0 && input.stepid.trim() !== "" ? { stepid: input.stepid } : {}, author: input.author, at: input.now };
|
|
12964
|
+
}
|
|
12965
|
+
function scratchpadof(entries, taskid, sessionid) {
|
|
12966
|
+
return entries.filter((entry) => entry.taskid === taskid && entry.sessionid === sessionid);
|
|
12967
|
+
}
|
|
12968
|
+
function prunescratchpad(entries, window, now) {
|
|
12969
|
+
if (window === void 0) return entries;
|
|
12970
|
+
return entries.filter((entry) => now - entry.at < window);
|
|
12971
|
+
}
|
|
12972
|
+
function distillrunsummary(input) {
|
|
12973
|
+
const steps = input.outcomes.map((outcome) => {
|
|
12974
|
+
const step = input.plan.steps.find((candidate) => candidate.id === outcome.stepid);
|
|
12975
|
+
return { stepid: outcome.stepid, kind: step?.kind ?? "unknown", ok: outcome.ok, summary: outcome.summary };
|
|
12976
|
+
});
|
|
12977
|
+
const windowed = input.window !== void 0 && Number.isInteger(input.window) && input.window >= 0 ? steps.slice(Math.max(0, steps.length - input.window)) : steps;
|
|
12978
|
+
const kinds = [...new Set(windowed.map((step) => step.kind))];
|
|
12979
|
+
return { runid: input.plan.id, sessionid: input.sessionid, origins: [...new Set(input.origins)], kinds, steps: windowed, ...input.window !== void 0 && Number.isInteger(input.window) && input.window >= 0 ? { window: input.window } : {}, task: "runsummary", provenance: input.provenance, distilledat: input.now };
|
|
12980
|
+
}
|
|
12981
|
+
function summaryhistoryentry(summary) {
|
|
12982
|
+
return { source: "summary", id: summary.runid, title: `Run summary of ${summary.runid}`, text: `${summary.origins.join(" ")} ${summary.kinds.join(" ")} ${summary.steps.map((step) => step.summary).join(" ")}`, outcome: summary.steps.every((step) => step.ok) ? "completed" : "failed", at: summary.distilledat };
|
|
12983
|
+
}
|
|
12984
|
+
function notehistoryentry(note) {
|
|
12985
|
+
return { source: "note", id: note.id, ...note.origin !== "" ? { origin: note.origin } : {}, title: note.title, text: note.sensitive ? note.title : `${note.title} ${note.body ?? ""}`, at: note.updatedat };
|
|
12986
|
+
}
|
|
12987
|
+
function recallentryof(input) {
|
|
12988
|
+
if (input.text.trim() === "") throw new Error("The recall index entry needs its text.");
|
|
12989
|
+
if (input.stepid.trim() === "" || input.runid.trim() === "") throw new Error("The recall index entry needs its run and step provenance.");
|
|
12990
|
+
const normalized = input.text.trim().replace(/\s+/g, " ");
|
|
12991
|
+
return { fingerprint: textfingerprint(normalized), origin: input.origin, runid: input.runid, stepid: input.stepid, text: normalized, at: input.at };
|
|
12992
|
+
}
|
|
12993
|
+
function addrecallentry(index, entry) {
|
|
12994
|
+
if (index.some((candidate) => candidate.fingerprint === entry.fingerprint && candidate.origin === entry.origin)) return index;
|
|
12995
|
+
return [...index, entry];
|
|
12996
|
+
}
|
|
12997
|
+
function termsof(text2) {
|
|
12998
|
+
return new Set(text2.toLowerCase().split(/[^a-z0-9]+/).filter((term) => term.length > 1));
|
|
12999
|
+
}
|
|
13000
|
+
function rankrecall(index, query, scope) {
|
|
13001
|
+
if (query.text.trim() === "") return [];
|
|
13002
|
+
const terms = termsof(query.text);
|
|
13003
|
+
const scoped = query.origin !== void 0 && query.origin.trim() !== "" ? [query.origin] : scope.origins;
|
|
13004
|
+
const matches = [];
|
|
13005
|
+
for (const entry of index) {
|
|
13006
|
+
if (!scoped.includes(entry.origin)) continue;
|
|
13007
|
+
const entryterms = termsof(entry.text);
|
|
13008
|
+
let shared = 0;
|
|
13009
|
+
for (const term of terms) if (entryterms.has(term)) shared += 1;
|
|
13010
|
+
const union = (/* @__PURE__ */ new Set([...terms, ...entryterms])).size;
|
|
13011
|
+
const score = union === 0 ? 0 : shared / union;
|
|
13012
|
+
if (score <= 0) continue;
|
|
13013
|
+
matches.push({ entry, score, reason: `The extraction of ${entry.origin} shares ${shared} term${shared === 1 ? "" : "s"} with the query at the score ${score.toFixed(3)}; the match carries the run ${entry.runid} and the step ${entry.stepid}.` });
|
|
13014
|
+
}
|
|
13015
|
+
const ranked = matches.sort((one, two) => two.score - one.score);
|
|
13016
|
+
return query.limit !== void 0 && Number.isInteger(query.limit) && query.limit >= 0 ? ranked.slice(0, query.limit) : ranked;
|
|
13017
|
+
}
|
|
13018
|
+
function expirerecallindex(index, window, now) {
|
|
13019
|
+
if (window === void 0) return index;
|
|
13020
|
+
return index.filter((entry) => now - entry.at < window);
|
|
13021
|
+
}
|
|
13022
|
+
function editedcorrectionof(input) {
|
|
13023
|
+
if (input.stepid.trim() === "" || input.kind.trim() === "") throw new Error("The correction needs its step and kind.");
|
|
13024
|
+
if (input.original === input.corrected) throw new Error("The correction needs a changed step shape.");
|
|
13025
|
+
return { id: input.id ?? randomid(), origin: input.origin, kind: input.kind, stepid: input.stepid, source: "edited", original: input.original, corrected: input.corrected, reason: input.reason, at: input.now };
|
|
13026
|
+
}
|
|
13027
|
+
function rejectedcorrectionof(input) {
|
|
13028
|
+
if (input.stepid.trim() === "" || input.reason.trim() === "") throw new Error("The rejected correction needs its step and its rejection reason.");
|
|
13029
|
+
return { id: input.id ?? randomid(), origin: input.origin, kind: input.kind, stepid: input.stepid, source: "rejected", original: input.original, reason: input.reason, at: input.now };
|
|
13030
|
+
}
|
|
13031
|
+
function matchingcorrections(corrections, proposal) {
|
|
13032
|
+
return corrections.filter((entry) => entry.origin === proposal.origin && entry.kind === proposal.kind);
|
|
13033
|
+
}
|
|
13034
|
+
function expirecorrections(corrections, window, now) {
|
|
13035
|
+
if (window === void 0) return corrections;
|
|
13036
|
+
return corrections.filter((entry) => now - entry.at < window);
|
|
13037
|
+
}
|
|
13038
|
+
function consentmemoryof(input) {
|
|
13039
|
+
if (input.origin.trim() === "") throw new Error("The consent memory entry needs its origin.");
|
|
13040
|
+
if (input.boundary.trim() === "") throw new Error("The consent memory entry needs the boundary the prompt named.");
|
|
13041
|
+
return { id: input.id ?? randomid(), origin: input.origin, decision: input.decision, boundary: input.boundary, kinds: [...new Set(input.kinds)], at: input.now, ...input.expiresat !== void 0 ? { expiresat: input.expiresat } : {} };
|
|
13042
|
+
}
|
|
13043
|
+
function consentadvisory(entries, origin, now) {
|
|
13044
|
+
return entries.filter((entry) => entry.origin === origin && (entry.expiresat === void 0 || entry.expiresat > now));
|
|
13045
|
+
}
|
|
13046
|
+
function consentadvisoryverdict(entries, origin, kind) {
|
|
13047
|
+
const matching = entries.filter((entry) => entry.origin === origin && entry.kinds.includes(kind));
|
|
13048
|
+
const latest = matching[matching.length - 1];
|
|
13049
|
+
if (latest === void 0) return { advisory: false, reason: `No prior decision exists for the ${kind} kind on ${origin}; the prompt opens fresh.` };
|
|
13050
|
+
if (latest.decision === "deny") return { advisory: true, reason: `The consent memory holds a prior denial of the ${kind} kind on ${origin} from ${new Date(latest.at).toISOString()}; the denial carries the same weight as a grant and the record stays advisory only.` };
|
|
13051
|
+
return { advisory: true, reason: `The consent memory holds a prior ${latest.decision} of the ${kind} kind on ${origin} with the boundary ${latest.boundary}; the record advises the new prompt and never auto grants.` };
|
|
13052
|
+
}
|
|
13053
|
+
function rollbacksplit(plan, progress) {
|
|
13054
|
+
const executed = progress && progress.planid === plan?.id ? progress.completedsteps : [];
|
|
13055
|
+
const executedset = new Set(executed);
|
|
13056
|
+
const queued = (plan?.steps ?? []).map((step) => step.id).filter((id) => !executedset.has(id));
|
|
13057
|
+
return { executedstepids: executed, queuedstepids: queued };
|
|
13058
|
+
}
|
|
13059
|
+
function rollbackof(plan, progress, preference) {
|
|
13060
|
+
const split = rollbacksplit(plan, progress);
|
|
13061
|
+
if (preference === "none") return { scope: "none", label: `Stop the run ${plan?.id ?? ""} without a rollback; the ${split.queuedstepids.length} queued step${split.queuedstepids.length === 1 ? "" : "s"} stay as the run left them.`, queuedstepids: split.queuedstepids };
|
|
13062
|
+
return { scope: "queued", label: `Cancel the run ${plan?.id ?? ""} and roll its ${split.queuedstepids.length} queued step${split.queuedstepids.length === 1 ? "" : "s"} back${split.queuedstepids.length > 0 ? ` (${split.queuedstepids.join(", ")})` : ""} while the ${split.executedstepids.length} executed step${split.executedstepids.length === 1 ? "" : "s"} stay untouched in the sealed log.`, queuedstepids: split.queuedstepids };
|
|
13063
|
+
}
|
|
13064
|
+
function cancelrunactionof(input) {
|
|
13065
|
+
return { runid: input.runid, sessionid: input.sessionid, rollback: rollbackof(input.plan, input.progress, input.preference) };
|
|
13066
|
+
}
|
|
13067
|
+
function errorsurfaceof(input) {
|
|
13068
|
+
if (input.message.trim() === "") throw new Error("The error surface needs its message in plain language.");
|
|
13069
|
+
return { stepid: input.stepid, runid: input.runid, cause: input.cause, message: input.message, retry: { allowed: input.retryallowed, reason: input.retryreason }, context: input.context, at: input.now };
|
|
13070
|
+
}
|
|
13071
|
+
function classifyfailure(input) {
|
|
13072
|
+
if (input.gatewait) return "gate";
|
|
13073
|
+
if (input.policyrefused) return "policy";
|
|
13074
|
+
if (/\b(network|offline|timeout|timed out|fetch failed|socket|dns|connection)\b/i.test(input.message)) return "network";
|
|
13075
|
+
return "page";
|
|
13076
|
+
}
|
|
13077
|
+
function retryhintof(surface) {
|
|
13078
|
+
if (!surface.retry.allowed) return { allowed: false, reason: `The ${surface.cause} failure of the step ${surface.stepid} refuses the retry: ${surface.retry.reason}` };
|
|
13079
|
+
return { allowed: true, reason: `The ${surface.cause} failure of the step ${surface.stepid} may retry through a new reviewed dispatch; the retry rides the full consent gate chain and never bypasses the review.` };
|
|
13080
|
+
}
|
|
13081
|
+
function sessiongridrows(input) {
|
|
13082
|
+
const rows = [];
|
|
13083
|
+
if (input.session && input.plan && ["pending", "approved"].includes(input.plan.state)) {
|
|
13084
|
+
const split = rollbacksplit(input.plan, input.progress);
|
|
13085
|
+
const held = input.locks.some((lock) => lock.runid === input.plan?.id);
|
|
13086
|
+
const origins = [.../* @__PURE__ */ new Set([input.session.origin, ...input.session.grants ?? []])];
|
|
13087
|
+
const actions = ["cancelrun"];
|
|
13088
|
+
if (input.session.pausedat !== void 0) actions.push("resume");
|
|
13089
|
+
rows.push({ sessionid: input.session.id, runid: input.plan.id, origins, state: "live", outcome: `${split.executedstepids.length} of ${input.plan.steps.length} reviewed steps executed`, steps: input.plan.steps.length, completed: split.executedstepids.length, lock: held ? "held" : "free", tabid: input.session.tabid, updatedat: input.plan.createdat, actions });
|
|
13090
|
+
}
|
|
13091
|
+
for (const log of input.logs) {
|
|
13092
|
+
const summary = input.summaries.find((candidate) => candidate.runid === log.runid);
|
|
13093
|
+
const tabsession = input.tabsessions.find((candidate) => candidate.runid === log.runid);
|
|
13094
|
+
const held = input.locks.some((lock) => lock.runid === log.runid);
|
|
13095
|
+
rows.push({ sessionid: log.sessionid, runid: log.runid, origins: [...new Set(log.entries.map((entry) => entry.origin).filter((origin) => origin !== ""))], state: "saved", outcome: summary !== void 0 ? summary.steps.every((step) => step.ok) ? "completed" : "failed" : log.seal !== void 0 ? "sealed" : "open", steps: summary?.steps.length ?? log.entries.filter((entry) => entry.kind === "step").length, completed: summary?.steps.filter((step) => step.ok).length ?? log.entries.filter((entry) => entry.kind === "step").length, lock: held ? "held" : "free", ...log.seal !== void 0 ? { sealhash: log.seal.sealhash.current } : {}, ...tabsession !== void 0 ? { tabid: tabsession.tabid } : {}, updatedat: log.updatedat, actions: ["reopen"] });
|
|
13096
|
+
}
|
|
13097
|
+
return rows.sort((one, two) => two.updatedat - one.updatedat);
|
|
13098
|
+
}
|
|
13099
|
+
function historyqueryof(value) {
|
|
13100
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
|
|
13101
|
+
const candidate = value;
|
|
13102
|
+
if (typeof candidate.text !== "string" || candidate.text.trim() === "") return void 0;
|
|
13103
|
+
const origin = typeof candidate.origin === "string" && candidate.origin.trim() !== "" ? candidate.origin.trim() : void 0;
|
|
13104
|
+
const from = typeof candidate.from === "number" && Number.isFinite(candidate.from) ? candidate.from : void 0;
|
|
13105
|
+
const to = typeof candidate.to === "number" && Number.isFinite(candidate.to) ? candidate.to : void 0;
|
|
13106
|
+
if (from !== void 0 && to !== void 0 && from > to) return void 0;
|
|
13107
|
+
const outcome = typeof candidate.outcome === "string" && candidate.outcome.trim() !== "" ? candidate.outcome.trim() : void 0;
|
|
13108
|
+
return { text: candidate.text.trim(), ...origin !== void 0 ? { origin } : {}, ...from !== void 0 ? { from } : {}, ...to !== void 0 ? { to } : {}, ...outcome !== void 0 ? { outcome } : {} };
|
|
13109
|
+
}
|
|
13110
|
+
function addhistoryentry(corpus, entry) {
|
|
13111
|
+
return [entry, ...corpus.filter((candidate) => !(candidate.source === entry.source && candidate.id === entry.id))];
|
|
13112
|
+
}
|
|
13113
|
+
function highlightterms(text2, query) {
|
|
13114
|
+
const terms = query.toLowerCase().split(/[^a-z0-9]+/).filter((term) => term.length > 1);
|
|
13115
|
+
const lower = text2.toLowerCase();
|
|
13116
|
+
return [...new Set(terms.filter((term) => lower.includes(term)))];
|
|
13117
|
+
}
|
|
13118
|
+
function historysearch(corpus, query) {
|
|
13119
|
+
const terms = query.text.toLowerCase().split(/[^a-z0-9]+/).filter((term) => term.length > 1);
|
|
13120
|
+
const hits = [];
|
|
13121
|
+
for (const entry of corpus) {
|
|
13122
|
+
if (query.origin !== void 0 && entry.origin !== query.origin) continue;
|
|
13123
|
+
if (query.from !== void 0 && entry.at < query.from) continue;
|
|
13124
|
+
if (query.to !== void 0 && entry.at > query.to) continue;
|
|
13125
|
+
if (query.outcome !== void 0 && entry.outcome !== query.outcome) continue;
|
|
13126
|
+
const haystack = `${entry.title} ${entry.text}`.toLowerCase();
|
|
13127
|
+
const matched = terms.filter((term) => haystack.includes(term));
|
|
13128
|
+
if (matched.length === 0) continue;
|
|
13129
|
+
const position = haystack.indexOf(matched[0] ?? "");
|
|
13130
|
+
const start = Math.max(0, position - 40);
|
|
13131
|
+
const excerpt = `${start > 0 ? "\u2026" : ""}${`${entry.title} ${entry.text}`.slice(start, start + 160)}${start + 160 < `${entry.title} ${entry.text}`.length ? "\u2026" : ""}`;
|
|
13132
|
+
hits.push({ source: entry.source, id: entry.id, title: entry.title, excerpt, highlights: [...new Set(matched)], ...entry.origin !== void 0 ? { origin: entry.origin } : {}, ...entry.outcome !== void 0 ? { outcome: entry.outcome } : {}, at: entry.at });
|
|
13133
|
+
}
|
|
13134
|
+
return hits.sort((one, two) => two.at - one.at);
|
|
13135
|
+
}
|
|
13136
|
+
function emptystatemessage(surface, origin) {
|
|
13137
|
+
if (surface === "historysearch") return "No history matches yet; start with a first query such as an origin, a note title or a kind the runs executed.";
|
|
13138
|
+
if (surface === "sitenotes") return `No site note exists${origin !== void 0 ? ` for ${origin}` : ""} yet; write the first note with a title and a body and the note flow keeps it per origin with its author provenance.`;
|
|
13139
|
+
if (surface === "scratchpad") return "The scratchpad holds no entry yet; the agent appends its per task notes here while the reviewed steps run, and every entry carries its step provenance.";
|
|
13140
|
+
return "No session exists yet; start the first run by describing an objective and reviewing the plan the agent proposes.";
|
|
13141
|
+
}
|
|
13142
|
+
function tabsessionkey(tabid) {
|
|
13143
|
+
return `tabsession:${tabid}`;
|
|
13144
|
+
}
|
|
13145
|
+
function tabsessionrefof(input) {
|
|
13146
|
+
if (!Number.isInteger(input.tabid) || input.tabid < 0) throw new Error("The per tab session reference needs its tab.");
|
|
13147
|
+
if (input.sessionid.trim() === "") throw new Error("The per tab session reference needs its session.");
|
|
13148
|
+
return { tabid: input.tabid, sessionid: input.sessionid, ...input.runid !== void 0 && input.runid.trim() !== "" ? { runid: input.runid } : {}, origin: input.origin, updatedat: input.now };
|
|
13149
|
+
}
|
|
13150
|
+
function sessionbundleof(input) {
|
|
13151
|
+
return { kind: "sessionbundle", notes: input.notes, summaries: input.summaries, corrections: input.corrections, exportedat: input.exportedat };
|
|
13152
|
+
}
|
|
13153
|
+
|
|
13154
|
+
// planreview.ts
|
|
13155
|
+
function plancardsof(input) {
|
|
13156
|
+
return input.plan.steps.map((step) => ({
|
|
13157
|
+
stepid: step.id,
|
|
13158
|
+
kind: step.kind,
|
|
13159
|
+
risk: step.risk,
|
|
13160
|
+
environment: step.environment ?? defaultenvironment(step),
|
|
13161
|
+
options: step.options ?? "",
|
|
13162
|
+
summary: step.summary,
|
|
13163
|
+
corrections: matchingcorrections(input.corrections, { origin: input.plan.origin, kind: step.kind }).map((entry) => ({ id: entry.id, source: entry.source, reason: entry.reason })),
|
|
13164
|
+
editable: input.plan.state === "pending"
|
|
13165
|
+
}));
|
|
13166
|
+
}
|
|
13167
|
+
function plancardgroups(cards) {
|
|
13168
|
+
const order = ["sensitive", "interaction", "read"];
|
|
13169
|
+
return order.map((risk) => ({ risk, cards: cards.filter((card) => card.risk === risk), expanded: risk === "sensitive" })).filter((group) => group.cards.length > 0);
|
|
13170
|
+
}
|
|
13171
|
+
function stepresolutionof(input) {
|
|
13172
|
+
if (input.stepid.trim() === "") throw new Error("The stepapprove resolution needs its step.");
|
|
13173
|
+
if (input.resolution === "edit" && (input.edited ?? "").trim() === "") throw new Error("The edited resolution needs its corrected step shape.");
|
|
13174
|
+
return { stepid: input.stepid, planid: input.planid, origin: input.origin, resolution: input.resolution, surface: input.surface, ...input.edited !== void 0 && input.edited.trim() !== "" ? { edited: input.edited } : {}, at: input.at };
|
|
13175
|
+
}
|
|
13176
|
+
function resolutionlogeventof(resolution) {
|
|
13177
|
+
return {
|
|
13178
|
+
kind: "review",
|
|
13179
|
+
stepid: resolution.stepid,
|
|
13180
|
+
summary: resolution.resolution === "edit" ? `The user edited the step ${resolution.stepid} of the plan ${resolution.planid} from the ${resolution.surface} before approving; the corrected shape rides the plan.` : `The user ${resolution.resolution === "approve" ? "approved" : "rejected"} the step ${resolution.stepid} of the plan ${resolution.planid} from the ${resolution.surface}; one distinct human action resolved the step alone.`
|
|
13181
|
+
};
|
|
13182
|
+
}
|
|
13183
|
+
function resolutionhistoryafter(history, resolution) {
|
|
13184
|
+
return [resolution, ...history];
|
|
13185
|
+
}
|
|
13186
|
+
function maskverdictsof(state, sensitivefields) {
|
|
13187
|
+
const verdicts = {};
|
|
13188
|
+
for (const [field, value] of Object.entries(state)) {
|
|
13189
|
+
if (sensitivefields.includes(field)) verdicts[field] = `The ${field} value stays masked (${value.length} characters) and never renders in the clear.`;
|
|
13190
|
+
}
|
|
13191
|
+
return verdicts;
|
|
13192
|
+
}
|
|
13193
|
+
function diffpreviewof(input) {
|
|
13194
|
+
const changes = [];
|
|
13195
|
+
const fields = [.../* @__PURE__ */ new Set([...Object.keys(input.before), ...Object.keys(input.after)])];
|
|
13196
|
+
for (const field of fields) {
|
|
13197
|
+
const hasbefore = Object.prototype.hasOwnProperty.call(input.before, field);
|
|
13198
|
+
const hasafter = Object.prototype.hasOwnProperty.call(input.after, field);
|
|
13199
|
+
const beforevalue = input.before[field];
|
|
13200
|
+
const aftervalue = input.after[field];
|
|
13201
|
+
if (hasbefore && !hasafter && beforevalue !== void 0) changes.push({ field, kind: "removed", before: beforevalue });
|
|
13202
|
+
else if (!hasbefore && hasafter && aftervalue !== void 0) changes.push({ field, kind: "added", after: aftervalue });
|
|
13203
|
+
else if (hasbefore && hasafter && beforevalue !== void 0 && aftervalue !== void 0 && beforevalue !== aftervalue) changes.push({ field, kind: "changed", before: beforevalue, after: aftervalue });
|
|
13204
|
+
}
|
|
13205
|
+
return { stepid: input.stepid, before: input.before, after: input.after, changes, maskverdicts: input.maskverdicts ?? {}, provenance: input.provenance };
|
|
13206
|
+
}
|
|
13207
|
+
function stepstimelinenodes(input) {
|
|
13208
|
+
const completed = input.progress?.completedsteps ?? [];
|
|
13209
|
+
const outcomes = input.progress?.outcomes ?? [];
|
|
13210
|
+
const environments = input.progress?.environments;
|
|
13211
|
+
const turnarounds = input.progress?.turnarounds;
|
|
13212
|
+
const gatewaits = input.progress?.gatewaits;
|
|
13213
|
+
let activeset = false;
|
|
13214
|
+
let blocked = false;
|
|
13215
|
+
return input.plan.steps.map((step) => {
|
|
13216
|
+
const outcome = [...outcomes].reverse().find((candidate) => candidate.stepid === step.id);
|
|
13217
|
+
const gatewait = gatewaits?.[step.id];
|
|
13218
|
+
let status;
|
|
13219
|
+
if (outcome !== void 0) status = outcome.ok ? "done" : "failed";
|
|
13220
|
+
else if (gatewait !== void 0) status = "waiting";
|
|
13221
|
+
else if (completed.includes(step.id)) status = "done";
|
|
13222
|
+
else if (input.plan.state === "cancelled" || input.plan.state === "expired") status = "halted";
|
|
13223
|
+
else if (input.plan.state === "rejected") status = "halted";
|
|
13224
|
+
else if (input.plan.state === "approved" && !activeset && !blocked) {
|
|
13225
|
+
status = "running";
|
|
13226
|
+
activeset = true;
|
|
13227
|
+
} else status = "pending";
|
|
13228
|
+
if (status === "waiting") blocked = true;
|
|
13229
|
+
const active = status === "running";
|
|
13230
|
+
return {
|
|
13231
|
+
stepid: step.id,
|
|
13232
|
+
kind: step.kind,
|
|
13233
|
+
status,
|
|
13234
|
+
...turnarounds?.[step.id] !== void 0 ? { durationms: turnarounds[step.id] } : {},
|
|
13235
|
+
...environments?.[step.id] !== void 0 ? { environment: environments[step.id] } : step.environment !== void 0 ? { environment: step.environment } : {},
|
|
13236
|
+
active,
|
|
13237
|
+
anchor: `#step-${step.id}`,
|
|
13238
|
+
...outcome !== void 0 ? { resultsummary: outcome.summary } : {}
|
|
13239
|
+
};
|
|
13240
|
+
});
|
|
13241
|
+
}
|
|
13242
|
+
function activetimelineanchor(nodes) {
|
|
13243
|
+
return nodes.find((node) => node.active)?.anchor;
|
|
13244
|
+
}
|
|
13245
|
+
var logstreamgenesis = "0".repeat(64);
|
|
13246
|
+
async function logstreameventof(input) {
|
|
13247
|
+
if (input.summary.trim() === "") throw new Error("The logstream event needs its summary.");
|
|
13248
|
+
const id = randomid();
|
|
13249
|
+
const hash = await entryhashof({ previous: input.previous, entry: { id, runid: "surfaces", kind: "step", summary: input.summary, origin: input.origin, ...input.stepid !== void 0 ? { stepid: input.stepid } : {}, at: input.at } });
|
|
13250
|
+
return { id, level: input.level, source: input.source, origin: input.origin, summary: input.summary, ...input.stepid !== void 0 ? { stepid: input.stepid } : {}, masked: input.masked, maskverdict: input.maskverdict, hash, at: input.at };
|
|
13251
|
+
}
|
|
13252
|
+
function appendlogstreamevent(events, event) {
|
|
13253
|
+
return [...events, event];
|
|
13254
|
+
}
|
|
13255
|
+
function filterlogstream(events, filter) {
|
|
13256
|
+
return events.filter((event) => (filter.level === void 0 || event.level === filter.level) && (filter.origin === void 0 || filter.origin === "" || event.origin === filter.origin) && (filter.stepid === void 0 || filter.stepid === "" || event.stepid === filter.stepid));
|
|
13257
|
+
}
|
|
13258
|
+
function livebufferof(events, bound) {
|
|
13259
|
+
if (bound === void 0) return events;
|
|
13260
|
+
if (!Number.isInteger(bound) || bound <= 0) return events;
|
|
13261
|
+
return events.slice(-bound);
|
|
13262
|
+
}
|
|
13263
|
+
async function verifylogstream(events) {
|
|
13264
|
+
for (let index = 0; index < events.length; index += 1) {
|
|
13265
|
+
const event = events[index];
|
|
13266
|
+
if (event === void 0) continue;
|
|
13267
|
+
const predecessor = events[index - 1];
|
|
13268
|
+
const expectedprevious = index === 0 || predecessor === void 0 ? logstreamgenesis : predecessor.hash.current;
|
|
13269
|
+
if (event.hash.previous !== expectedprevious) return { valid: false, brokenat: index, reason: `The logstream chain breaks at the event ${event.id}: its previous hash does not link to its predecessor.` };
|
|
13270
|
+
const recomputed = await entryhashof({ previous: event.hash.previous, entry: { id: event.id, runid: "surfaces", kind: "step", summary: event.summary, origin: event.origin, ...event.stepid !== void 0 ? { stepid: event.stepid } : {}, at: event.at } });
|
|
13271
|
+
if (recomputed.current !== event.hash.current) return { valid: false, brokenat: index, reason: `The logstream chain breaks at the event ${event.id}: its own hash does not reproduce.` };
|
|
13272
|
+
}
|
|
13273
|
+
return { valid: true, reason: `The logstream chain of ${events.length} event${events.length === 1 ? "" : "s"} verifies link by link.` };
|
|
13274
|
+
}
|
|
13275
|
+
async function auditexcerptof(events, input) {
|
|
13276
|
+
if (input.from < 0 || input.to <= input.from || input.to > events.length) return { ok: false, text: "", reason: `The excerpt range ${input.from} to ${input.to} names no contiguous slice of the ${events.length} event${events.length === 1 ? "" : "s"}.` };
|
|
13277
|
+
const range = events.slice(input.from, input.to);
|
|
13278
|
+
const verification = await verifylogstream(range);
|
|
13279
|
+
if (!verification.valid) return { ok: false, text: "", reason: `The excerpt refuses the copy: ${verification.reason}` };
|
|
13280
|
+
const text2 = range.map((event) => `[${event.at}] ${event.level} ${event.source}${event.stepid !== void 0 ? ` step ${event.stepid}` : ""} ${event.origin} \u2014 ${event.summary}${event.masked ? ` (${event.maskverdict})` : ""}`).join("\n");
|
|
13281
|
+
return { ok: true, text: text2, reason: `The excerpt copied the verified range ${input.from} to ${input.to} of the logstream.` };
|
|
13282
|
+
}
|
|
13283
|
+
function loglevelof(kind) {
|
|
13284
|
+
if (kind === "error") return "error";
|
|
13285
|
+
if (["deny", "revoke", "stop", "quarantine", "phish", "defer", "schema", "expiry"].includes(kind)) return "warn";
|
|
13286
|
+
return "info";
|
|
13287
|
+
}
|
|
13288
|
+
|
|
13289
|
+
// surfaces.ts
|
|
13290
|
+
function surfacepalette() {
|
|
13291
|
+
return [
|
|
13292
|
+
{ id: "starttask", label: "Start task", keywords: ["task", "objective", "run", "goal", "plan"], action: { command: "starttask", surface: "popup" } },
|
|
13293
|
+
{ id: "pauserun", label: "Pause run", keywords: ["pause", "hold", "stop", "run"], action: { command: "pauserun", surface: "popup", session: true } },
|
|
13294
|
+
{ id: "resumerun", label: "Resume run", keywords: ["resume", "continue", "unpause", "run"], action: { command: "resumerun", surface: "popup", session: true } },
|
|
13295
|
+
{ id: "cancelrun", label: "Cancel run", keywords: ["cancel", "stop", "rollback", "queued"], action: { command: "cancelrun", surface: "popup", session: true } },
|
|
13296
|
+
{ id: "resumesession", label: "Resume session", keywords: ["session", "resume", "grid", "reopen"], action: { command: "resumesession", surface: "sidepanel" } },
|
|
13297
|
+
{ id: "stepapprove", label: "Review step", keywords: ["approve", "reject", "edit", "step", "review", "plancard"], action: { command: "stepapprove", surface: "sidepanel", session: true } },
|
|
13298
|
+
{ id: "diffpreview", label: "Preview step diff", keywords: ["diff", "preview", "before", "after", "write"], action: { command: "diffpreview", surface: "sidepanel", session: true } },
|
|
13299
|
+
{ id: "historysearch", label: "Search history", keywords: ["history", "search", "notes", "summaries", "corpus"], action: { command: "historysearch", surface: "dashboardpage" } },
|
|
13300
|
+
{ id: "revokeconsent", label: "Revoke consent", keywords: ["revoke", "consent", "allowlist", "origin", "grant"], action: { command: "revokeconsent", surface: "dashboardpage", session: true } },
|
|
13301
|
+
{ id: "opentransparencypage", label: "Open transparency page", keywords: ["transparency", "grants", "permissions", "diff"], action: { command: "opentransparencypage", surface: "optionspage" } },
|
|
13302
|
+
{ id: "opendashboardpage", label: "Open dashboard", keywords: ["dashboard", "sessions", "runs", "notes", "full"], action: { command: "opendashboardpage", surface: "dashboardpage" } },
|
|
13303
|
+
{ id: "openoptionspage", label: "Open options", keywords: ["options", "settings", "preferences", "configure"], action: { command: "openoptionspage", surface: "optionspage" } },
|
|
13304
|
+
{ id: "copyauditexcerpt", label: "Copy audit excerpt", keywords: ["audit", "excerpt", "copy", "verified", "range"], action: { command: "copyauditexcerpt", surface: "dashboardpage" } },
|
|
13305
|
+
{ id: "replayonboarding", label: "Replay onboarding", keywords: ["onboarding", "tour", "walkthrough", "replay", "first"], action: { command: "replayonboarding", surface: "onboarding" } }
|
|
13306
|
+
];
|
|
13307
|
+
}
|
|
13308
|
+
function palettecommandsof(entries, input) {
|
|
13309
|
+
return entries.filter((entry) => paletteactiongate({ action: entry.action, granted: input.granted, sessionactive: input.sessionactive }).allowed);
|
|
13310
|
+
}
|
|
13311
|
+
function fuzzyentryscore(entry, query) {
|
|
13312
|
+
const text2 = query.trim().toLowerCase();
|
|
13313
|
+
if (text2 === "") return 1;
|
|
13314
|
+
const id = entry.id.toLowerCase();
|
|
13315
|
+
const label = entry.label.toLowerCase();
|
|
13316
|
+
if (id === text2 || label === text2) return 100;
|
|
13317
|
+
let score = 0;
|
|
13318
|
+
if (id.includes(text2)) score += 40;
|
|
13319
|
+
if (label.includes(text2)) score += 30;
|
|
13320
|
+
for (const keyword of entry.keywords) {
|
|
13321
|
+
const lower = keyword.toLowerCase();
|
|
13322
|
+
if (lower === text2) score += 20;
|
|
13323
|
+
else if (lower.includes(text2)) score += 10;
|
|
13324
|
+
}
|
|
13325
|
+
if (score === 0 && text2.length > 1) {
|
|
13326
|
+
for (const haystack of [label, id]) {
|
|
13327
|
+
let cursor = 0;
|
|
13328
|
+
let matched = true;
|
|
13329
|
+
for (const letter of text2) {
|
|
13330
|
+
const found = haystack.indexOf(letter, cursor);
|
|
13331
|
+
if (found === -1) {
|
|
13332
|
+
matched = false;
|
|
13333
|
+
break;
|
|
13334
|
+
}
|
|
13335
|
+
cursor = found + 1;
|
|
13336
|
+
}
|
|
13337
|
+
if (matched) {
|
|
13338
|
+
score += 15;
|
|
13339
|
+
break;
|
|
13340
|
+
}
|
|
13341
|
+
}
|
|
13342
|
+
}
|
|
13343
|
+
return score;
|
|
13344
|
+
}
|
|
13345
|
+
function palettequery(entries, input) {
|
|
13346
|
+
const text2 = input.text.trim();
|
|
13347
|
+
const matches = entries.map((entry) => ({ entry, score: fuzzyentryscore(entry, text2) })).filter((match) => match.score > 0);
|
|
13348
|
+
const lastusedof = (command) => input.usage.find((record2) => record2.command === command)?.lastusedat ?? 0;
|
|
13349
|
+
const countof = (command) => input.usage.find((record2) => record2.command === command)?.count ?? 0;
|
|
13350
|
+
const recentwindow = input.recentwindow;
|
|
13351
|
+
const ranked = matches.sort((left, right) => {
|
|
13352
|
+
if (right.score !== left.score) return right.score - left.score;
|
|
13353
|
+
const leftrecent = recentwindow === void 0 ? 0 : countof(left.entry.action.command) > 0 && lastusedof(left.entry.action.command) >= lastusedof(right.entry.action.command) ? 1 : 0;
|
|
13354
|
+
const rightrecent = recentwindow === void 0 ? 0 : countof(right.entry.action.command) > 0 && lastusedof(right.entry.action.command) >= lastusedof(left.entry.action.command) ? 1 : 0;
|
|
13355
|
+
if (rightrecent !== leftrecent) return rightrecent - leftrecent;
|
|
13356
|
+
return lastusedof(right.entry.action.command) - lastusedof(left.entry.action.command);
|
|
13357
|
+
});
|
|
13358
|
+
return ranked.map((match) => ({ entry: match.entry, score: match.score, reason: match.score >= 100 ? `The query matches the ${match.entry.id} command exactly.` : `The query matches the label or the keywords of the ${match.entry.id} command${countof(match.entry.action.command) > 0 ? ` and its ${countof(match.entry.action.command)} recorded use${countof(match.entry.action.command) === 1 ? "" : "s"} rank it first among equals` : ""}.` }));
|
|
13359
|
+
}
|
|
13360
|
+
function paletteuseafter(usage, command, now) {
|
|
13361
|
+
const existing = usage.find((record2) => record2.command === command);
|
|
13362
|
+
if (existing === void 0) return [{ command, count: 1, lastusedat: now }, ...usage];
|
|
13363
|
+
return usage.map((record2) => record2.command === command ? { ...record2, count: record2.count + 1, lastusedat: now } : record2);
|
|
13364
|
+
}
|
|
13365
|
+
function taskinputof(input) {
|
|
13366
|
+
if (input.text.trim() === "") throw new Error("The taskinput needs its natural language goal.");
|
|
13367
|
+
if (input.origin.trim() === "") throw new Error("The taskinput needs its active origin scope.");
|
|
13368
|
+
return { id: randomid(), text: input.text.trim(), context: input.context ?? "", origin: input.origin.trim(), surface: input.surface, at: input.at };
|
|
13369
|
+
}
|
|
13370
|
+
function taskhistoryafter(history, entry, retention, now) {
|
|
13371
|
+
if (retention === void 0) return [entry, ...history];
|
|
13372
|
+
return [entry, ...history].filter((candidate) => now - candidate.at < retention);
|
|
13373
|
+
}
|
|
13374
|
+
function onboardingsteps() {
|
|
13375
|
+
return [
|
|
13376
|
+
{ 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
|
+
{ 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
|
+
{ 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" }
|
|
13380
|
+
];
|
|
13381
|
+
}
|
|
13382
|
+
function onboardingstart(previous, now) {
|
|
13383
|
+
return { stepscompleted: [], done: false, startedat: now };
|
|
13384
|
+
}
|
|
13385
|
+
function onboardingcomplete(state, stepid, now) {
|
|
13386
|
+
const steps = onboardingsteps();
|
|
13387
|
+
const step = steps.find((candidate) => candidate.id === stepid);
|
|
13388
|
+
if (step === void 0) throw new Error(`The onboarding knows no ${stepid} step.`);
|
|
13389
|
+
const completed = state.stepscompleted.includes(stepid) ? state.stepscompleted : [...state.stepscompleted, stepid];
|
|
13390
|
+
const done = steps.every((candidate) => completed.includes(candidate.id));
|
|
13391
|
+
if (!done) return { state: { ...state, stepscompleted: completed, done: false } };
|
|
13392
|
+
const consentevent = "onboardingconsentgranted";
|
|
13393
|
+
return { state: { stepscompleted: completed, done: true, ...state.startedat !== void 0 ? { startedat: state.startedat } : {}, consentevent, completedat: now }, consentevent };
|
|
13394
|
+
}
|
|
13395
|
+
function broadcastframeof(input) {
|
|
13396
|
+
if (input.summary.trim() === "") throw new Error("The broadcast frame needs its summary.");
|
|
13397
|
+
return { channel: input.channel, surface: input.surface, summary: input.summary, at: input.at };
|
|
13398
|
+
}
|
|
13399
|
+
function broadcastchannelof(kind) {
|
|
13400
|
+
if (["session", "proposal", "approval", "action", "stop", "pause", "resume", "complete", "cancel", "error", "capability"].includes(kind)) return "runstate";
|
|
13401
|
+
if (["notes", "scratchpad", "summary", "recall", "correction", "consentmemory", "search", "vault", "gate", "grant", "revoke", "expiry", "deny"].includes(kind)) return "sessions";
|
|
13402
|
+
if (["configure", "transparency"].includes(kind)) return "settings";
|
|
13403
|
+
return "logstream";
|
|
13404
|
+
}
|
|
13405
|
+
function busrouteaction(action, input) {
|
|
13406
|
+
const entry = surfacepalette().find((candidate) => candidate.action.command === action.command);
|
|
13407
|
+
if (entry === void 0) return { dispatched: false, gate: "commandbus", reason: `The ${action.surface} asked for the unknown ${action.command} command; the bus routes only catalog commands.` };
|
|
13408
|
+
const permission = paletteactiongate({ action: entry.action, granted: input.granted, sessionactive: input.sessionactive });
|
|
13409
|
+
if (!permission.allowed) return { dispatched: false, gate: "paletteactiongate", reason: permission.reason ?? "The command misses its granted permission." };
|
|
13410
|
+
if (action.command === "starttask") {
|
|
13411
|
+
const proposal = taskinputproposalgate({ text: input.text ?? "", origin: input.origin ?? "", direct: false });
|
|
13412
|
+
if (!proposal.allowed) return { dispatched: false, gate: "taskinputproposalgate", reason: proposal.reason ?? "The task submission refuses." };
|
|
13413
|
+
}
|
|
13414
|
+
if (action.command === "stepapprove" || action.command === "diffpreview") {
|
|
13415
|
+
const review = planreviewgate({ reviewed: input.planreviewed, state: input.planstate });
|
|
13416
|
+
if (!review.allowed) return { dispatched: false, gate: "planreviewgate", reason: review.reason ?? "The plan review stays open." };
|
|
13417
|
+
}
|
|
13418
|
+
return { dispatched: true, gate: "commandbus", reason: `The ${action.command} action of the ${action.surface} routed through its policy gates and dispatches.` };
|
|
13419
|
+
}
|
|
13420
|
+
|
|
12557
13421
|
// taskqueue.ts
|
|
12558
13422
|
function emptyqueue(input = {}) {
|
|
12559
13423
|
return { lanes: input.lanes ?? [], priorities: input.priorities ?? [], completionpolicy: input.completionpolicy ?? "all", items: [], claims: [] };
|
|
@@ -13507,6 +14371,9 @@ function logchainreport(input) {
|
|
|
13507
14371
|
function transparencyreport(input) {
|
|
13508
14372
|
return { version: protocolversion, posture: "denydefault", grants: input.grants, windows: input.windows, connectallow: input.connectallow, permdiffs: input.permdiffs, safedefaults: input.safedefaults, vault: input.vault };
|
|
13509
14373
|
}
|
|
14374
|
+
function surfacesnapshot(input) {
|
|
14375
|
+
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
|
+
}
|
|
13510
14377
|
|
|
13511
14378
|
// workfloweditor.ts
|
|
13512
14379
|
var palettecategories = ["actions", "controlflow", "waits", "variables", "triggers"];
|
|
@@ -14218,8 +15085,11 @@ export {
|
|
|
14218
15085
|
acquirelock,
|
|
14219
15086
|
acquirerunlock,
|
|
14220
15087
|
activelayers,
|
|
15088
|
+
activetimelineanchor,
|
|
14221
15089
|
addedge,
|
|
15090
|
+
addhistoryentry,
|
|
14222
15091
|
addnode,
|
|
15092
|
+
addrecallentry,
|
|
14223
15093
|
addusage,
|
|
14224
15094
|
agentbudgetcheck,
|
|
14225
15095
|
agentbudgetvalid,
|
|
@@ -14241,6 +15111,7 @@ export {
|
|
|
14241
15111
|
apikeyconsentgranted,
|
|
14242
15112
|
apireplayspecof,
|
|
14243
15113
|
appendlogentry,
|
|
15114
|
+
appendlogstreamevent,
|
|
14244
15115
|
applycooldown,
|
|
14245
15116
|
applyheaderules,
|
|
14246
15117
|
applylayer,
|
|
@@ -14260,6 +15131,7 @@ export {
|
|
|
14260
15131
|
attachcdpsession,
|
|
14261
15132
|
attachtargetof,
|
|
14262
15133
|
attachtimeline,
|
|
15134
|
+
auditexcerptof,
|
|
14263
15135
|
authconsentgranted,
|
|
14264
15136
|
authorizeurl,
|
|
14265
15137
|
authrefusedmessage,
|
|
@@ -14291,6 +15163,8 @@ export {
|
|
|
14291
15163
|
breakpointbudgetallowed,
|
|
14292
15164
|
breakpointceilingof,
|
|
14293
15165
|
breakpointinputof,
|
|
15166
|
+
broadcastchannelof,
|
|
15167
|
+
broadcastframeof,
|
|
14294
15168
|
broadcastrecipient,
|
|
14295
15169
|
browserpermissions,
|
|
14296
15170
|
bucketboundsvalid,
|
|
@@ -14305,6 +15179,7 @@ export {
|
|
|
14305
15179
|
buildstitchplan,
|
|
14306
15180
|
buildtoolcatalog,
|
|
14307
15181
|
bumprevision,
|
|
15182
|
+
busrouteaction,
|
|
14308
15183
|
callgraphql,
|
|
14309
15184
|
calllocal,
|
|
14310
15185
|
calllogreport,
|
|
@@ -14314,6 +15189,8 @@ export {
|
|
|
14314
15189
|
cancelframes,
|
|
14315
15190
|
cancellederror,
|
|
14316
15191
|
cancelrun,
|
|
15192
|
+
cancelrunactionof,
|
|
15193
|
+
cancelrungate,
|
|
14317
15194
|
canceltask,
|
|
14318
15195
|
canexecute,
|
|
14319
15196
|
capturebody,
|
|
@@ -14348,6 +15225,7 @@ export {
|
|
|
14348
15225
|
claim,
|
|
14349
15226
|
claimheartbeat,
|
|
14350
15227
|
classconsentcovers,
|
|
15228
|
+
classifyfailure,
|
|
14351
15229
|
classifyintent,
|
|
14352
15230
|
closechannel,
|
|
14353
15231
|
closeidlechannels,
|
|
@@ -14369,7 +15247,11 @@ export {
|
|
|
14369
15247
|
connectallowlist,
|
|
14370
15248
|
connectclient,
|
|
14371
15249
|
consensusstate,
|
|
15250
|
+
consentadvisory,
|
|
15251
|
+
consentadvisoryverdict,
|
|
14372
15252
|
consentdurationvalid,
|
|
15253
|
+
consentmemoryadvisorygate,
|
|
15254
|
+
consentmemoryof,
|
|
14373
15255
|
consentmodel,
|
|
14374
15256
|
consentprompttext,
|
|
14375
15257
|
consentwindowgate,
|
|
@@ -14429,6 +15311,8 @@ export {
|
|
|
14429
15311
|
actionrisk as deriveactionrisk,
|
|
14430
15312
|
detachcdpsession,
|
|
14431
15313
|
devicepresetof,
|
|
15314
|
+
diffpreviewgate,
|
|
15315
|
+
diffpreviewof,
|
|
14432
15316
|
diffresponse,
|
|
14433
15317
|
diffreviewgrade,
|
|
14434
15318
|
diffsessionrecords,
|
|
@@ -14436,6 +15320,7 @@ export {
|
|
|
14436
15320
|
disarmkillswitch,
|
|
14437
15321
|
disconnectclient,
|
|
14438
15322
|
dispatchtool,
|
|
15323
|
+
distillrunsummary,
|
|
14439
15324
|
domainkinds,
|
|
14440
15325
|
downloadreport,
|
|
14441
15326
|
draftplan,
|
|
@@ -14443,6 +15328,8 @@ export {
|
|
|
14443
15328
|
dryrunprojection,
|
|
14444
15329
|
dryrunreport,
|
|
14445
15330
|
dryrunworkflow,
|
|
15331
|
+
editedcorrectionof,
|
|
15332
|
+
editnote,
|
|
14446
15333
|
editorsavegate,
|
|
14447
15334
|
editorstate,
|
|
14448
15335
|
editstep,
|
|
@@ -14451,6 +15338,7 @@ export {
|
|
|
14451
15338
|
emptyboard,
|
|
14452
15339
|
emptyconnectallow,
|
|
14453
15340
|
emptyqueue,
|
|
15341
|
+
emptystatemessage,
|
|
14454
15342
|
emugate,
|
|
14455
15343
|
emulationkinds,
|
|
14456
15344
|
emulationreport,
|
|
@@ -14471,6 +15359,7 @@ export {
|
|
|
14471
15359
|
environmentsof,
|
|
14472
15360
|
errorcapture,
|
|
14473
15361
|
errorreportresponse,
|
|
15362
|
+
errorsurfaceof,
|
|
14474
15363
|
escalate,
|
|
14475
15364
|
evaluatecondition,
|
|
14476
15365
|
evaluatetrigger,
|
|
@@ -14484,12 +15373,15 @@ export {
|
|
|
14484
15373
|
expandtemplate,
|
|
14485
15374
|
expireapprovals,
|
|
14486
15375
|
expireconsentwindows,
|
|
15376
|
+
expirecorrections,
|
|
14487
15377
|
expirelayers,
|
|
14488
15378
|
expirelocks,
|
|
14489
15379
|
expireprofilerecords,
|
|
15380
|
+
expirerecallindex,
|
|
14490
15381
|
expirerunlocks,
|
|
14491
15382
|
expiresessions,
|
|
14492
15383
|
expiretokens,
|
|
15384
|
+
expirnotes,
|
|
14493
15385
|
exportcontentreview,
|
|
14494
15386
|
exportlogchain,
|
|
14495
15387
|
exportpresetlibrary,
|
|
@@ -14511,6 +15403,7 @@ export {
|
|
|
14511
15403
|
filteredsessions,
|
|
14512
15404
|
filterentries,
|
|
14513
15405
|
filterexchanges,
|
|
15406
|
+
filterlogstream,
|
|
14514
15407
|
finishrecording,
|
|
14515
15408
|
fixedheadermatch,
|
|
14516
15409
|
flowmetricnames,
|
|
@@ -14545,6 +15438,9 @@ export {
|
|
|
14545
15438
|
heartbeatreport,
|
|
14546
15439
|
heldkeysreport,
|
|
14547
15440
|
hideblackboxedframes,
|
|
15441
|
+
highlightterms,
|
|
15442
|
+
historyqueryof,
|
|
15443
|
+
historysearch,
|
|
14548
15444
|
hostpattern,
|
|
14549
15445
|
htmlqueriesof,
|
|
14550
15446
|
httpframepipeline,
|
|
@@ -14601,6 +15497,7 @@ export {
|
|
|
14601
15497
|
listdue,
|
|
14602
15498
|
listremotestatus,
|
|
14603
15499
|
listtools,
|
|
15500
|
+
livebufferof,
|
|
14604
15501
|
loadworkflow,
|
|
14605
15502
|
localhostbind,
|
|
14606
15503
|
localsensitivegrade,
|
|
@@ -14609,10 +15506,15 @@ export {
|
|
|
14609
15506
|
locationpresetof,
|
|
14610
15507
|
locationrangevalid,
|
|
14611
15508
|
lockkey,
|
|
15509
|
+
logbufferboundvalid,
|
|
14612
15510
|
logchainreport,
|
|
14613
15511
|
logentryof,
|
|
15512
|
+
loglevelof,
|
|
14614
15513
|
loglevels,
|
|
14615
15514
|
logreadgate,
|
|
15515
|
+
logstreamegressgate,
|
|
15516
|
+
logstreameventof,
|
|
15517
|
+
logstreamgenesis,
|
|
14616
15518
|
longtaskcapture,
|
|
14617
15519
|
lookalikedistance,
|
|
14618
15520
|
loopof,
|
|
@@ -14635,6 +15537,8 @@ export {
|
|
|
14635
15537
|
maskstoredvalues,
|
|
14636
15538
|
masktypedvalues,
|
|
14637
15539
|
maskvalue,
|
|
15540
|
+
maskverdictsof,
|
|
15541
|
+
matchingcorrections,
|
|
14638
15542
|
matchmessage,
|
|
14639
15543
|
matchurl,
|
|
14640
15544
|
matchurlpattern,
|
|
@@ -14642,6 +15546,7 @@ export {
|
|
|
14642
15546
|
mediaentries,
|
|
14643
15547
|
mediakinds,
|
|
14644
15548
|
mediareport,
|
|
15549
|
+
memoryreadscopegate,
|
|
14645
15550
|
mergeregions,
|
|
14646
15551
|
mergeresults,
|
|
14647
15552
|
messageegressgrade,
|
|
@@ -14678,6 +15583,8 @@ export {
|
|
|
14678
15583
|
nobatchresolution,
|
|
14679
15584
|
nonceof,
|
|
14680
15585
|
normalizeendpoint,
|
|
15586
|
+
notebodyof,
|
|
15587
|
+
notehistoryentry,
|
|
14681
15588
|
oauthflowof,
|
|
14682
15589
|
observationmodeof,
|
|
14683
15590
|
observationresponse,
|
|
@@ -14685,10 +15592,15 @@ export {
|
|
|
14685
15592
|
offfamilyof,
|
|
14686
15593
|
offloadkinds,
|
|
14687
15594
|
offscreencapabilitygate,
|
|
15595
|
+
onboardingcomplete,
|
|
15596
|
+
onboardingconsentgate,
|
|
15597
|
+
onboardingstart,
|
|
15598
|
+
onboardingsteps,
|
|
14688
15599
|
openchannel,
|
|
14689
15600
|
openconsensus,
|
|
14690
15601
|
openconsentwindow,
|
|
14691
15602
|
opengate,
|
|
15603
|
+
opennotebody,
|
|
14692
15604
|
openoffscreen,
|
|
14693
15605
|
openrun,
|
|
14694
15606
|
openrunlog,
|
|
@@ -14707,8 +15619,12 @@ export {
|
|
|
14707
15619
|
pairexchange,
|
|
14708
15620
|
pairingframes,
|
|
14709
15621
|
pairstates,
|
|
15622
|
+
paletteactiongate,
|
|
14710
15623
|
palettecategories,
|
|
15624
|
+
palettecommandsof,
|
|
14711
15625
|
palettenodes,
|
|
15626
|
+
palettequery,
|
|
15627
|
+
paletteuseafter,
|
|
14712
15628
|
parallelof,
|
|
14713
15629
|
parsecommand,
|
|
14714
15630
|
parsecompletion,
|
|
@@ -14750,9 +15666,12 @@ export {
|
|
|
14750
15666
|
phishverdictof,
|
|
14751
15667
|
ping,
|
|
14752
15668
|
planallowlist,
|
|
15669
|
+
plancardgroups,
|
|
15670
|
+
plancardsof,
|
|
14753
15671
|
plandraftreviewgate,
|
|
14754
15672
|
planlint,
|
|
14755
15673
|
plannersplit,
|
|
15674
|
+
planreviewgate,
|
|
14756
15675
|
pollcursorof,
|
|
14757
15676
|
polldecision,
|
|
14758
15677
|
pollurl,
|
|
@@ -14779,6 +15698,7 @@ export {
|
|
|
14779
15698
|
proxygate,
|
|
14780
15699
|
proxyrouteof,
|
|
14781
15700
|
prunerunstates,
|
|
15701
|
+
prunescratchpad,
|
|
14782
15702
|
publishmessage,
|
|
14783
15703
|
pushscope,
|
|
14784
15704
|
quarantinereport,
|
|
@@ -14787,6 +15707,7 @@ export {
|
|
|
14787
15707
|
queuelanesvalid,
|
|
14788
15708
|
randomid,
|
|
14789
15709
|
rankapis,
|
|
15710
|
+
rankrecall,
|
|
14790
15711
|
ratelimitboundsvalid,
|
|
14791
15712
|
ratelimitbudgetallowed,
|
|
14792
15713
|
ratelimitgate,
|
|
@@ -14798,6 +15719,7 @@ export {
|
|
|
14798
15719
|
readstream,
|
|
14799
15720
|
readverifiedlog,
|
|
14800
15721
|
reattachrun,
|
|
15722
|
+
recallentryof,
|
|
14801
15723
|
receivemessage,
|
|
14802
15724
|
receivemessages,
|
|
14803
15725
|
reconnectwaits,
|
|
@@ -14824,6 +15746,7 @@ export {
|
|
|
14824
15746
|
regionsteps,
|
|
14825
15747
|
regionvalid,
|
|
14826
15748
|
registeragent,
|
|
15749
|
+
rejectedcorrectionof,
|
|
14827
15750
|
rejectioncapture,
|
|
14828
15751
|
relayframe,
|
|
14829
15752
|
releaselock,
|
|
@@ -14849,6 +15772,8 @@ export {
|
|
|
14849
15772
|
requestreview,
|
|
14850
15773
|
requeue,
|
|
14851
15774
|
requireapproval,
|
|
15775
|
+
resolutionhistoryafter,
|
|
15776
|
+
resolutionlogeventof,
|
|
14852
15777
|
resolutionverdict,
|
|
14853
15778
|
resolveapproval,
|
|
14854
15779
|
resolvedrisk,
|
|
@@ -14871,6 +15796,8 @@ export {
|
|
|
14871
15796
|
retireentries,
|
|
14872
15797
|
retireentry,
|
|
14873
15798
|
retryafterof,
|
|
15799
|
+
retrydispatchgate,
|
|
15800
|
+
retryhintof,
|
|
14874
15801
|
revertalllayers,
|
|
14875
15802
|
revertlayer,
|
|
14876
15803
|
revertplanof,
|
|
@@ -14885,6 +15812,8 @@ export {
|
|
|
14885
15812
|
rewritesourcelocation,
|
|
14886
15813
|
roleaddress,
|
|
14887
15814
|
roledefaults,
|
|
15815
|
+
rollbackof,
|
|
15816
|
+
rollbacksplit,
|
|
14888
15817
|
rotatelogs,
|
|
14889
15818
|
rotationruleof,
|
|
14890
15819
|
routeenvironment,
|
|
@@ -14905,6 +15834,7 @@ export {
|
|
|
14905
15834
|
runrepeatuntil,
|
|
14906
15835
|
runreviewgranted,
|
|
14907
15836
|
runstep,
|
|
15837
|
+
runsummarytask,
|
|
14908
15838
|
runtobreakpoint,
|
|
14909
15839
|
runtry,
|
|
14910
15840
|
runurllist,
|
|
@@ -14930,6 +15860,10 @@ export {
|
|
|
14930
15860
|
scopecheck,
|
|
14931
15861
|
scopegate,
|
|
14932
15862
|
scopegrantof,
|
|
15863
|
+
scratchentryof,
|
|
15864
|
+
scratchpadof,
|
|
15865
|
+
scratchpadscopegate,
|
|
15866
|
+
sealnotebody,
|
|
14933
15867
|
sealrunlog,
|
|
14934
15868
|
sealrunstate,
|
|
14935
15869
|
seamweights,
|
|
@@ -14943,6 +15877,7 @@ export {
|
|
|
14943
15877
|
securityreport,
|
|
14944
15878
|
seededrandom,
|
|
14945
15879
|
selectorresponse,
|
|
15880
|
+
semanticrecallscopegate,
|
|
14946
15881
|
sendcdpcommand,
|
|
14947
15882
|
sendfetch,
|
|
14948
15883
|
sendmessage,
|
|
@@ -14958,14 +15893,17 @@ export {
|
|
|
14958
15893
|
servercapabilities,
|
|
14959
15894
|
serverenablementgate,
|
|
14960
15895
|
servermethods,
|
|
15896
|
+
sessionbundleof,
|
|
14961
15897
|
sessionfileversion,
|
|
14962
15898
|
sessionfolderof,
|
|
14963
15899
|
sessionfolderunique,
|
|
15900
|
+
sessiongridrows,
|
|
14964
15901
|
sessionkinds,
|
|
14965
15902
|
sessionmemory,
|
|
14966
15903
|
sessionnameunique,
|
|
14967
15904
|
sessionreport,
|
|
14968
15905
|
sessionrestoregate,
|
|
15906
|
+
sessionretentionvalid,
|
|
14969
15907
|
sessiontabof,
|
|
14970
15908
|
setvariable,
|
|
14971
15909
|
shapesof,
|
|
@@ -14973,6 +15911,9 @@ export {
|
|
|
14973
15911
|
shareworkflow,
|
|
14974
15912
|
shiftentryof,
|
|
14975
15913
|
signalsreport,
|
|
15914
|
+
sitenoteof,
|
|
15915
|
+
sitenotesreadgate,
|
|
15916
|
+
sitenoteswritegate,
|
|
14976
15917
|
snapnode,
|
|
14977
15918
|
snapshotplanof,
|
|
14978
15919
|
snapshotretentionwindow,
|
|
@@ -14991,8 +15932,11 @@ export {
|
|
|
14991
15932
|
starttls,
|
|
14992
15933
|
statusclassof,
|
|
14993
15934
|
steal,
|
|
15935
|
+
stepapprovegate,
|
|
14994
15936
|
stepenvironmentvalid,
|
|
14995
15937
|
stepmodeof,
|
|
15938
|
+
stepresolutionof,
|
|
15939
|
+
stepstimelinenodes,
|
|
14996
15940
|
steptemplateof,
|
|
14997
15941
|
stepwindows,
|
|
14998
15942
|
stopone,
|
|
@@ -15007,6 +15951,11 @@ export {
|
|
|
15007
15951
|
submitreviewgranted,
|
|
15008
15952
|
subscriptionframes,
|
|
15009
15953
|
subscriptionoptionsof,
|
|
15954
|
+
summaryhistoryentry,
|
|
15955
|
+
summaryrequestof,
|
|
15956
|
+
summarywindowvalid,
|
|
15957
|
+
surfacepalette,
|
|
15958
|
+
surfacesnapshot,
|
|
15010
15959
|
swarmcosts,
|
|
15011
15960
|
swarmoverview,
|
|
15012
15961
|
swarmreport,
|
|
@@ -15014,8 +15963,13 @@ export {
|
|
|
15014
15963
|
swarmstatereport,
|
|
15015
15964
|
sweepreviews,
|
|
15016
15965
|
tabreportresponse,
|
|
15966
|
+
tabsessionkey,
|
|
15967
|
+
tabsessionrefof,
|
|
15017
15968
|
targetgate,
|
|
15018
15969
|
taskcounts,
|
|
15970
|
+
taskhistoryafter,
|
|
15971
|
+
taskinputof,
|
|
15972
|
+
taskinputproposalgate,
|
|
15019
15973
|
taskstatechecksum,
|
|
15020
15974
|
taskstateof,
|
|
15021
15975
|
taskstatevalid,
|
|
@@ -15106,6 +16060,7 @@ export {
|
|
|
15106
16060
|
verdictfresh,
|
|
15107
16061
|
verifyauth,
|
|
15108
16062
|
verifylogchain,
|
|
16063
|
+
verifylogstream,
|
|
15109
16064
|
verifytoken,
|
|
15110
16065
|
verifywebhook,
|
|
15111
16066
|
visitmatch,
|