harnery 0.45.2 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.d.ts +13 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commands/admission.d.ts.map +1 -1
- package/dist/commands/admission.js +214 -27
- package/dist/commands/agents.d.ts +4 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +102 -25
- package/dist/commands/browse.d.ts +3 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +172 -8
- package/dist/commands/fetch.js +1 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +8 -2
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +40 -0
- package/dist/commands/qa-run.d.ts.map +1 -1
- package/dist/commands/qa-run.js +4 -3
- package/dist/commands/review-pack.d.ts.map +1 -1
- package/dist/commands/review-pack.js +33 -6
- package/dist/core/agents/index.d.ts +1 -0
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +1 -0
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +11 -4
- package/dist/core/agents/render/session-context.d.ts +0 -6
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +1 -6
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +12 -4
- package/dist/core/agents/state/heartbeat-reader.d.ts +3 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.d.ts +3 -1
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +6 -2
- package/dist/core/agents/state/parent-reference-contract.d.ts +16 -0
- package/dist/core/agents/state/parent-reference-contract.d.ts.map +1 -0
- package/dist/core/agents/state/parent-reference-contract.js +1 -0
- package/dist/core/agents/state/parent-reference.d.ts +18 -0
- package/dist/core/agents/state/parent-reference.d.ts.map +1 -0
- package/dist/core/agents/state/parent-reference.js +119 -0
- package/dist/core/config.d.ts +39 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +63 -0
- package/dist/core/diagnostics/path-identity.d.ts +1 -1
- package/dist/core/diagnostics/path-identity.d.ts.map +1 -1
- package/dist/core/diagnostics/path-identity.js +51 -6
- package/dist/core/events/v3/canonical.js +43 -14
- package/dist/core/events/v3/index.d.ts +1 -1
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +1 -1
- package/dist/core/events/v3/producers/recorder.d.ts +34 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +117 -13
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +53 -13
- package/dist/core/events/v3/validate.d.ts.map +1 -1
- package/dist/core/events/v3/validate.js +36 -1
- package/dist/core/hooks/adapter/native-parent.d.ts +23 -0
- package/dist/core/hooks/adapter/native-parent.d.ts.map +1 -0
- package/dist/core/hooks/adapter/native-parent.js +91 -0
- package/dist/core/hooks/cli.js +79 -4
- package/dist/core/hooks/resolve/owner.d.ts +0 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +0 -23
- package/dist/core/hooks/shell-admission.d.ts +84 -0
- package/dist/core/hooks/shell-admission.d.ts.map +1 -0
- package/dist/core/hooks/shell-admission.js +622 -0
- package/dist/core/hooks/shell-commit-tree.d.ts +2 -0
- package/dist/core/hooks/shell-commit-tree.d.ts.map +1 -0
- package/dist/core/hooks/shell-commit-tree.js +104 -0
- package/dist/core/inbox/contract.d.ts +12 -0
- package/dist/core/inbox/contract.d.ts.map +1 -1
- package/dist/core/inbox/contract.js +16 -0
- package/dist/core/inbox/peer-messages.d.ts +41 -16
- package/dist/core/inbox/peer-messages.d.ts.map +1 -1
- package/dist/core/inbox/peer-messages.js +372 -15
- package/dist/core/inbox/service.d.ts +8 -1
- package/dist/core/inbox/service.d.ts.map +1 -1
- package/dist/core/inbox/service.js +83 -3
- package/dist/core/inbox/targets.d.ts +17 -3
- package/dist/core/inbox/targets.d.ts.map +1 -1
- package/dist/core/inbox/targets.js +77 -2
- package/dist/core/presence/git.d.ts +18 -12
- package/dist/core/presence/git.d.ts.map +1 -1
- package/dist/core/presence/git.js +32 -38
- package/dist/core/presence/index.d.ts +2 -2
- package/dist/core/presence/index.d.ts.map +1 -1
- package/dist/core/presence/index.js +8 -6
- package/dist/core/presence/mail.d.ts +133 -0
- package/dist/core/presence/mail.d.ts.map +1 -0
- package/dist/core/presence/mail.js +464 -0
- package/dist/core/semantic/contract.d.ts +5 -5
- package/dist/core/storage/modes.d.ts +4 -0
- package/dist/core/storage/modes.d.ts.map +1 -1
- package/dist/core/storage/modes.js +4 -0
- package/dist/core/storage/segments.d.ts.map +1 -1
- package/dist/core/storage/segments.js +5 -4
- package/dist/lib/admission-history.d.ts +96 -0
- package/dist/lib/admission-history.d.ts.map +1 -0
- package/dist/lib/admission-history.js +196 -0
- package/dist/lib/admission.d.ts +56 -7
- package/dist/lib/admission.d.ts.map +1 -1
- package/dist/lib/admission.js +161 -19
- package/dist/lib/browser/client.d.ts +18 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +100 -12
- package/dist/lib/browser/content-checks.d.ts +3 -1
- package/dist/lib/browser/content-checks.d.ts.map +1 -1
- package/dist/lib/browser/content-checks.js +10 -2
- package/dist/lib/browser/critique.d.ts +32 -0
- package/dist/lib/browser/critique.d.ts.map +1 -1
- package/dist/lib/browser/critique.js +72 -3
- package/dist/lib/browser/geometry.d.ts +2 -0
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +61 -15
- package/dist/lib/browser/index.d.ts +1 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +1 -1
- package/dist/lib/browser/page-review-contracts.d.ts +6 -1
- package/dist/lib/browser/page-review-contracts.d.ts.map +1 -1
- package/dist/lib/browser/page-review-contracts.js +6 -1
- package/dist/lib/browser/page-review-judge.d.ts +3 -1
- package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
- package/dist/lib/browser/page-review-judge.js +41 -11
- package/dist/lib/browser/page-review-pack.d.ts +3 -0
- package/dist/lib/browser/page-review-pack.d.ts.map +1 -1
- package/dist/lib/browser/page-review-pack.js +5 -2
- package/dist/lib/browser/qa-run-contracts.d.ts +11 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
- package/dist/lib/browser/qa-run-contracts.js +11 -4
- package/dist/lib/browser/qa-run.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.js +73 -16
- package/dist/lib/browser/runts.d.ts +4 -2
- package/dist/lib/browser/runts.d.ts.map +1 -1
- package/dist/lib/browser/runts.js +84 -33
- package/dist/lib/browser/windows-chrome.d.ts +14 -0
- package/dist/lib/browser/windows-chrome.d.ts.map +1 -1
- package/dist/lib/browser/windows-chrome.js +42 -0
- package/dist/lib/browser/windows-login-sync.d.ts +110 -0
- package/dist/lib/browser/windows-login-sync.d.ts.map +1 -0
- package/dist/lib/browser/windows-login-sync.js +171 -0
- package/dist/lib/cookies/client.d.ts +30 -5
- package/dist/lib/cookies/client.d.ts.map +1 -1
- package/dist/lib/cookies/client.js +55 -10
- package/dist/lib/cookies/index.d.ts +1 -1
- package/dist/lib/cookies/index.d.ts.map +1 -1
- package/dist/lib/cookies/index.js +1 -1
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +41 -2
- package/dist/lib/durable-job.d.ts +8 -0
- package/dist/lib/durable-job.d.ts.map +1 -1
- package/dist/lib/durable-job.js +10 -0
- package/dist/lib/http/client.d.ts +9 -8
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +44 -2
- package/dist/lib/instructions/templates.js +4 -4
- package/package.json +2 -2
- package/src/commander.ts +13 -0
- package/src/commands/admission.ts +272 -29
- package/src/commands/agents.ts +132 -27
- package/src/commands/browse.ts +208 -6
- package/src/commands/fetch.ts +1 -0
- package/src/commands/ledger-v3.ts +8 -2
- package/src/commands/presence.ts +49 -0
- package/src/commands/qa-run.ts +4 -3
- package/src/commands/review-pack.ts +41 -5
- package/src/core/agents/index.ts +6 -0
- package/src/core/agents/live-authority-v3.ts +11 -4
- package/src/core/agents/render/session-context.ts +1 -7
- package/src/core/agents/session-events.ts +18 -3
- package/src/core/agents/state/heartbeat-reader.ts +3 -0
- package/src/core/agents/state/live-coordination-view.ts +13 -6
- package/src/core/agents/state/parent-reference-contract.ts +14 -0
- package/src/core/agents/state/parent-reference.ts +179 -0
- package/src/core/config.ts +85 -0
- package/src/core/diagnostics/path-identity.ts +52 -6
- package/src/core/events/v3/canonical.ts +46 -13
- package/src/core/events/v3/index.ts +3 -0
- package/src/core/events/v3/producers/recorder.ts +151 -13
- package/src/core/events/v3/reader.ts +55 -11
- package/src/core/events/v3/validate.ts +42 -1
- package/src/core/hooks/adapter/native-parent.ts +109 -0
- package/src/core/hooks/cli.ts +83 -4
- package/src/core/hooks/resolve/owner.ts +0 -23
- package/src/core/hooks/shell-admission.ts +634 -0
- package/src/core/hooks/shell-commit-tree.ts +102 -0
- package/src/core/inbox/contract.ts +18 -0
- package/src/core/inbox/peer-messages.ts +501 -15
- package/src/core/inbox/service.ts +108 -3
- package/src/core/inbox/targets.ts +94 -3
- package/src/core/presence/git.ts +45 -37
- package/src/core/presence/index.ts +16 -8
- package/src/core/presence/mail.ts +620 -0
- package/src/core/storage/modes.ts +6 -0
- package/src/core/storage/segments.ts +5 -4
- package/src/lib/admission-history.ts +267 -0
- package/src/lib/admission.ts +217 -19
- package/src/lib/browser/client.ts +147 -35
- package/src/lib/browser/content-checks.ts +14 -3
- package/src/lib/browser/critique.ts +113 -3
- package/src/lib/browser/geometry.ts +63 -14
- package/src/lib/browser/index.ts +5 -0
- package/src/lib/browser/page-review-contracts.ts +6 -1
- package/src/lib/browser/page-review-judge.ts +58 -13
- package/src/lib/browser/page-review-pack.ts +13 -2
- package/src/lib/browser/qa-run-contracts.ts +30 -4
- package/src/lib/browser/qa-run.ts +78 -17
- package/src/lib/browser/runts.ts +85 -37
- package/src/lib/browser/windows-chrome.ts +50 -0
- package/src/lib/browser/windows-login-sync.ts +275 -0
- package/src/lib/cookies/client.ts +62 -10
- package/src/lib/cookies/index.ts +3 -0
- package/src/lib/docs-metadata-sync.ts +44 -2
- package/src/lib/durable-job.ts +15 -0
- package/src/lib/http/client.ts +63 -1
- package/src/lib/instructions/templates.ts +4 -4
package/dist/lib/admission.js
CHANGED
|
@@ -18,11 +18,15 @@
|
|
|
18
18
|
// file; process death leaves a dead-PID file for the next participant to
|
|
19
19
|
// prune.
|
|
20
20
|
//
|
|
21
|
+
// Every ticket that ends (released, timed out, or pruned after its process
|
|
22
|
+
// died) appends one record to the admission history (admission-history.ts).
|
|
23
|
+
//
|
|
21
24
|
// Toolkit tier: this module must not import src/core (layering check).
|
|
22
25
|
import { randomUUID } from "node:crypto";
|
|
23
26
|
import { mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
24
27
|
import { tmpdir } from "node:os";
|
|
25
28
|
import { join } from "node:path";
|
|
29
|
+
import { ADMISSION_HISTORY_SCHEMA_VERSION, appendAdmissionHistory, resolveAdmissionHistoryDir, } from "./admission-history.js";
|
|
26
30
|
import { coordEnv } from "./env.js";
|
|
27
31
|
export class AdmissionTimeoutError extends Error {
|
|
28
32
|
holders;
|
|
@@ -73,10 +77,7 @@ function writeEntry(dir, name, entry) {
|
|
|
73
77
|
writeFileSync(tmp, `${JSON.stringify(entry, null, 2)}\n`);
|
|
74
78
|
renameSync(tmp, join(dir, name));
|
|
75
79
|
}
|
|
76
|
-
|
|
77
|
-
* and torn files as a side effect. Every participant prunes, so a crashed
|
|
78
|
-
* holder's slot frees as soon as anyone else looks. */
|
|
79
|
-
function listLive(dir, ttlMs) {
|
|
80
|
+
function listLive(dir, ttlMs, onPrune) {
|
|
80
81
|
let names;
|
|
81
82
|
try {
|
|
82
83
|
names = readdirSync(dir)
|
|
@@ -101,6 +102,13 @@ function listLive(dir, ttlMs) {
|
|
|
101
102
|
label: typeof record.label === "string" ? record.label : "",
|
|
102
103
|
created_at: record.created_at,
|
|
103
104
|
...(typeof record.acquired_at === "string" ? { acquired_at: record.acquired_at } : {}),
|
|
105
|
+
...(typeof record.cwd === "string" ? { cwd: record.cwd } : {}),
|
|
106
|
+
...(typeof record.capacity === "number" ? { capacity: record.capacity } : {}),
|
|
107
|
+
...(Array.isArray(record.waited_behind)
|
|
108
|
+
? {
|
|
109
|
+
waited_behind: record.waited_behind.filter((label) => typeof label === "string"),
|
|
110
|
+
}
|
|
111
|
+
: {}),
|
|
104
112
|
};
|
|
105
113
|
}
|
|
106
114
|
}
|
|
@@ -124,19 +132,54 @@ function listLive(dir, ttlMs) {
|
|
|
124
132
|
continue;
|
|
125
133
|
}
|
|
126
134
|
const age = now - Date.parse(entry.created_at);
|
|
127
|
-
|
|
135
|
+
const dead = !pidAlive(entry.pid);
|
|
136
|
+
if (dead || Number.isNaN(age) || age > ttlMs) {
|
|
137
|
+
let pruned = false;
|
|
128
138
|
try {
|
|
129
139
|
unlinkSync(path);
|
|
140
|
+
pruned = true;
|
|
130
141
|
}
|
|
131
142
|
catch {
|
|
132
|
-
// a peer pruned it first
|
|
143
|
+
// a peer pruned it first, and records it
|
|
133
144
|
}
|
|
145
|
+
if (pruned)
|
|
146
|
+
onPrune?.(entry, dead ? "abandoned" : "expired");
|
|
134
147
|
continue;
|
|
135
148
|
}
|
|
136
149
|
live.push({ name, entry });
|
|
137
150
|
}
|
|
138
151
|
return live;
|
|
139
152
|
}
|
|
153
|
+
function historyDirFor(config) {
|
|
154
|
+
return config.historyDir !== undefined
|
|
155
|
+
? config.historyDir
|
|
156
|
+
: resolveAdmissionHistoryDir(config.dir);
|
|
157
|
+
}
|
|
158
|
+
/** Record an entry a participant pruned because its process died or it expired. */
|
|
159
|
+
function recordPruned(historyDir, resource, entry, reason) {
|
|
160
|
+
if (!historyDir)
|
|
161
|
+
return;
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
const enqueuedMs = Date.parse(entry.created_at);
|
|
164
|
+
const acquiredMs = entry.acquired_at ? Date.parse(entry.acquired_at) : Number.NaN;
|
|
165
|
+
appendAdmissionHistory(historyDir, {
|
|
166
|
+
v: ADMISSION_HISTORY_SCHEMA_VERSION,
|
|
167
|
+
resource,
|
|
168
|
+
label: entry.label,
|
|
169
|
+
pid: entry.pid,
|
|
170
|
+
...(entry.cwd ? { cwd: entry.cwd } : {}),
|
|
171
|
+
...(entry.capacity !== undefined ? { capacity: entry.capacity } : {}),
|
|
172
|
+
outcome: reason,
|
|
173
|
+
enqueued_at: entry.created_at,
|
|
174
|
+
...(entry.acquired_at ? { acquired_at: entry.acquired_at } : {}),
|
|
175
|
+
ended_at: new Date(now).toISOString(),
|
|
176
|
+
wait_ms: Number.isNaN(enqueuedMs)
|
|
177
|
+
? 0
|
|
178
|
+
: Math.max(0, (Number.isNaN(acquiredMs) ? now : acquiredMs) - enqueuedMs),
|
|
179
|
+
...(Number.isNaN(acquiredMs) ? {} : { hold_ms: Math.max(0, now - acquiredMs) }),
|
|
180
|
+
...(entry.waited_behind?.length ? { waited_behind: entry.waited_behind } : {}),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
140
183
|
function sleep(ms) {
|
|
141
184
|
return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));
|
|
142
185
|
}
|
|
@@ -155,19 +198,25 @@ export async function acquireAdmission(config, options) {
|
|
|
155
198
|
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
156
199
|
const tickets = ticketsDir(config);
|
|
157
200
|
const held = heldDir(config);
|
|
201
|
+
const historyDir = historyDirFor(config);
|
|
202
|
+
const onPrune = (entry, reason) => recordPruned(historyDir, config.resource, entry, reason);
|
|
158
203
|
const myEntry = {
|
|
159
204
|
pid: process.pid,
|
|
160
205
|
label: options.label,
|
|
161
206
|
created_at: new Date().toISOString(),
|
|
207
|
+
cwd: process.cwd(),
|
|
208
|
+
capacity: config.capacity,
|
|
162
209
|
};
|
|
210
|
+
let waitedBehind;
|
|
211
|
+
const pressureWait = options.pressureWaitMs ? { pressure_wait_ms: options.pressureWaitMs } : {};
|
|
163
212
|
const myName = `${String(Date.now()).padStart(13, "0")}-${process.pid}-${randomUUID().slice(0, 8)}.json`;
|
|
164
213
|
writeEntry(tickets, myName, myEntry);
|
|
165
214
|
const startedWaiting = Date.now();
|
|
166
215
|
const deadline = startedWaiting + timeoutMs;
|
|
167
216
|
try {
|
|
168
217
|
while (true) {
|
|
169
|
-
const liveHeld = listLive(held, ttlMs);
|
|
170
|
-
const liveTickets = listLive(tickets, ttlMs);
|
|
218
|
+
const liveHeld = listLive(held, ttlMs, onPrune);
|
|
219
|
+
const liveTickets = listLive(tickets, ttlMs, onPrune);
|
|
171
220
|
const myIndex = liveTickets.findIndex((ticket) => ticket.name === myName);
|
|
172
221
|
if (myIndex === -1) {
|
|
173
222
|
// Pruned by a peer (should not happen while we are alive) or lost to
|
|
@@ -183,7 +232,7 @@ export async function acquireAdmission(config, options) {
|
|
|
183
232
|
// between two waiters' listings. Lexical order (= enqueue order)
|
|
184
233
|
// decides who stays; the loser rejoins the queue with its original
|
|
185
234
|
// priority because the filename keeps its enqueue timestamp.
|
|
186
|
-
const heldNow = listLive(held, ttlMs);
|
|
235
|
+
const heldNow = listLive(held, ttlMs, onPrune);
|
|
187
236
|
if (heldNow.length > config.capacity) {
|
|
188
237
|
const keepers = new Set(heldNow.slice(0, config.capacity).map((holderEntry) => holderEntry.name));
|
|
189
238
|
if (!keepers.has(myName)) {
|
|
@@ -192,12 +241,14 @@ export async function acquireAdmission(config, options) {
|
|
|
192
241
|
continue;
|
|
193
242
|
}
|
|
194
243
|
}
|
|
195
|
-
|
|
244
|
+
const acquiredAt = new Date();
|
|
245
|
+
writeEntry(held, myName, { ...myEntry, acquired_at: acquiredAt.toISOString() });
|
|
246
|
+
const waitedMs = acquiredAt.getTime() - startedWaiting;
|
|
196
247
|
let released = false;
|
|
197
248
|
return {
|
|
198
249
|
entry: myName,
|
|
199
|
-
waitedMs
|
|
200
|
-
release: () => {
|
|
250
|
+
waitedMs,
|
|
251
|
+
release: (result) => {
|
|
201
252
|
if (released)
|
|
202
253
|
return;
|
|
203
254
|
released = true;
|
|
@@ -207,14 +258,55 @@ export async function acquireAdmission(config, options) {
|
|
|
207
258
|
catch {
|
|
208
259
|
// already pruned
|
|
209
260
|
}
|
|
261
|
+
const endedAt = new Date();
|
|
262
|
+
appendAdmissionHistory(historyDir, {
|
|
263
|
+
v: ADMISSION_HISTORY_SCHEMA_VERSION,
|
|
264
|
+
resource: config.resource,
|
|
265
|
+
label: myEntry.label,
|
|
266
|
+
pid: myEntry.pid,
|
|
267
|
+
...(myEntry.cwd ? { cwd: myEntry.cwd } : {}),
|
|
268
|
+
capacity: config.capacity,
|
|
269
|
+
outcome: "released",
|
|
270
|
+
enqueued_at: myEntry.created_at,
|
|
271
|
+
acquired_at: acquiredAt.toISOString(),
|
|
272
|
+
ended_at: endedAt.toISOString(),
|
|
273
|
+
wait_ms: waitedMs,
|
|
274
|
+
hold_ms: endedAt.getTime() - acquiredAt.getTime(),
|
|
275
|
+
...(waitedBehind?.length ? { waited_behind: waitedBehind } : {}),
|
|
276
|
+
...pressureWait,
|
|
277
|
+
...(result?.exitCode !== undefined ? { exit_code: result.exitCode } : {}),
|
|
278
|
+
...(result?.signal !== undefined ? { signal: result.signal } : {}),
|
|
279
|
+
});
|
|
210
280
|
},
|
|
211
281
|
};
|
|
212
282
|
}
|
|
283
|
+
if (waitedBehind === undefined) {
|
|
284
|
+
// Persist who this ticket waits behind, so the record survives even
|
|
285
|
+
// if this process dies in the queue and a peer prunes the ticket.
|
|
286
|
+
waitedBehind = liveHeld.map((holderEntry) => holderEntry.entry.label);
|
|
287
|
+
myEntry.waited_behind = waitedBehind;
|
|
288
|
+
writeEntry(tickets, myName, myEntry);
|
|
289
|
+
}
|
|
213
290
|
options.onWait?.({
|
|
214
291
|
position: myIndex + 1,
|
|
215
292
|
holders: liveHeld.map((holderEntry) => holderEntry.entry),
|
|
216
293
|
});
|
|
217
294
|
if (Date.now() >= deadline) {
|
|
295
|
+
const endedAt = new Date();
|
|
296
|
+
appendAdmissionHistory(historyDir, {
|
|
297
|
+
v: ADMISSION_HISTORY_SCHEMA_VERSION,
|
|
298
|
+
resource: config.resource,
|
|
299
|
+
label: myEntry.label,
|
|
300
|
+
pid: myEntry.pid,
|
|
301
|
+
...(myEntry.cwd ? { cwd: myEntry.cwd } : {}),
|
|
302
|
+
capacity: config.capacity,
|
|
303
|
+
outcome: "timeout",
|
|
304
|
+
enqueued_at: myEntry.created_at,
|
|
305
|
+
ended_at: endedAt.toISOString(),
|
|
306
|
+
wait_ms: endedAt.getTime() - startedWaiting,
|
|
307
|
+
...(waitedBehind?.length ? { waited_behind: waitedBehind } : {}),
|
|
308
|
+
...pressureWait,
|
|
309
|
+
});
|
|
218
310
|
throw new AdmissionTimeoutError(config.resource, timeoutMs, liveHeld.map((holderEntry) => holderEntry.entry));
|
|
219
311
|
}
|
|
220
312
|
await sleep(pollMs);
|
|
@@ -235,20 +327,70 @@ export async function acquireAdmission(config, options) {
|
|
|
235
327
|
export function admissionStatus(config) {
|
|
236
328
|
const ttlMs = config.ttlMs ?? DEFAULT_TTL_MS;
|
|
237
329
|
const full = { ...config, capacity: 1 };
|
|
330
|
+
const historyDir = historyDirFor(config);
|
|
331
|
+
const onPrune = (entry, reason) => recordPruned(historyDir, config.resource, entry, reason);
|
|
238
332
|
return {
|
|
239
333
|
resource: config.resource,
|
|
240
|
-
holders: listLive(heldDir(full), ttlMs).map((holderEntry) => holderEntry.entry),
|
|
241
|
-
waiters: listLive(ticketsDir(full), ttlMs).map((ticket) => ticket.entry),
|
|
334
|
+
holders: listLive(heldDir(full), ttlMs, onPrune).map((holderEntry) => holderEntry.entry),
|
|
335
|
+
waiters: listLive(ticketsDir(full), ttlMs, onPrune).map((ticket) => ticket.entry),
|
|
242
336
|
};
|
|
243
337
|
}
|
|
244
338
|
/**
|
|
245
|
-
* Base directory for admission queue state.
|
|
246
|
-
* is correct
|
|
247
|
-
* HARNERY_ADMISSION_DIR. Host CLIs and harn commands must share
|
|
248
|
-
* so they join the same machine-wide queues.
|
|
339
|
+
* Base directory for admission queue state. The temp directory clears on
|
|
340
|
+
* reboot, which is correct: stale queue state must not outlive the boot.
|
|
341
|
+
* Override with HARNERY_ADMISSION_DIR. Host CLIs and harn commands must share
|
|
342
|
+
* this helper so they join the same machine-wide queues.
|
|
343
|
+
*
|
|
344
|
+
* On POSIX the default is the literal /tmp, not os.tmpdir(): agent sandboxes
|
|
345
|
+
* often set a private TMPDIR per session, and a queue under it would admit
|
|
346
|
+
* every session on its own.
|
|
249
347
|
*/
|
|
250
348
|
export function admissionBaseDir() {
|
|
251
|
-
return coordEnv("ADMISSION_DIR") ??
|
|
349
|
+
return (coordEnv("ADMISSION_DIR") ??
|
|
350
|
+
(process.platform === "win32" ? join(tmpdir(), "harnery-admission") : "/tmp/harnery-admission"));
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Linux memory pressure: the `full avg10` figure from /proc/pressure/memory,
|
|
354
|
+
* the share of the last ten seconds in which every runnable task stalled on
|
|
355
|
+
* memory. Undefined where pressure stall information is unavailable.
|
|
356
|
+
*/
|
|
357
|
+
export function memoryPressureFullAvg10() {
|
|
358
|
+
try {
|
|
359
|
+
const line = readFileSync("/proc/pressure/memory", "utf8")
|
|
360
|
+
.split("\n")
|
|
361
|
+
.find((candidate) => candidate.startsWith("full"));
|
|
362
|
+
const match = line ? /avg10=([0-9.]+)/.exec(line) : null;
|
|
363
|
+
return match?.[1] !== undefined ? Number(match[1]) : undefined;
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Wait, holding no slot, while the machine is already stalling on memory, so
|
|
371
|
+
* a heavy job does not start into a storm. Never blocks forever: after
|
|
372
|
+
* maxWaitMs it returns and the caller starts anyway. Returns the time waited.
|
|
373
|
+
*/
|
|
374
|
+
export async function waitForMemoryPressure(options) {
|
|
375
|
+
const read = options.read ?? memoryPressureFullAvg10;
|
|
376
|
+
const pollMs = options.pollMs ?? 5_000;
|
|
377
|
+
const started = Date.now();
|
|
378
|
+
let announced = false;
|
|
379
|
+
while (true) {
|
|
380
|
+
const pressure = read();
|
|
381
|
+
if (pressure === undefined || pressure <= options.threshold)
|
|
382
|
+
return Date.now() - started;
|
|
383
|
+
const waitedMs = Date.now() - started;
|
|
384
|
+
if (waitedMs + pollMs > options.maxWaitMs) {
|
|
385
|
+
options.onWait?.({ pressure, waitedMs, gaveUp: true });
|
|
386
|
+
return waitedMs;
|
|
387
|
+
}
|
|
388
|
+
if (!announced) {
|
|
389
|
+
announced = true;
|
|
390
|
+
options.onWait?.({ pressure, waitedMs, gaveUp: false });
|
|
391
|
+
}
|
|
392
|
+
await sleep(pollMs);
|
|
393
|
+
}
|
|
252
394
|
}
|
|
253
395
|
/** Resources present under an admission base directory. */
|
|
254
396
|
export function listAdmissionResources(dir) {
|
|
@@ -113,7 +113,19 @@ export interface BrowserOptions {
|
|
|
113
113
|
username?: string;
|
|
114
114
|
password?: string;
|
|
115
115
|
};
|
|
116
|
+
/**
|
|
117
|
+
* Inspect the live cookies of the browser context. Runs before each request
|
|
118
|
+
* is sent, after each response, and once more at close. If it throws, the
|
|
119
|
+
* request is cancelled, the context closes without saving cookies to the
|
|
120
|
+
* jar, and the error is kept as `cookieGuardFault` for the caller to report.
|
|
121
|
+
*/
|
|
122
|
+
cookieGuard?: CookieGuard;
|
|
116
123
|
}
|
|
124
|
+
export type CookieGuardPhase = "request" | "response" | "close";
|
|
125
|
+
export type CookieGuard = (cookies: readonly PWCookie[], event: {
|
|
126
|
+
phase: CookieGuardPhase;
|
|
127
|
+
url: string | null;
|
|
128
|
+
}) => void | Promise<void>;
|
|
117
129
|
export interface NavigateResult {
|
|
118
130
|
url: string;
|
|
119
131
|
title: string;
|
|
@@ -547,6 +559,7 @@ export declare class Browser {
|
|
|
547
559
|
checkRunts(opts?: {
|
|
548
560
|
scope?: string | null;
|
|
549
561
|
minChars?: number;
|
|
562
|
+
maxFindings?: number;
|
|
550
563
|
}): Promise<RuntsResult>;
|
|
551
564
|
/** Inject annotation overlays for runt hits. Used before screenshot. */
|
|
552
565
|
annotateRunts(result: RuntsResult): Promise<void>;
|
|
@@ -592,6 +605,11 @@ export declare class Browser {
|
|
|
592
605
|
* `navigate()`.
|
|
593
606
|
*/
|
|
594
607
|
addInitScript(script: string): Promise<void>;
|
|
608
|
+
/** The error a `cookieGuard` threw, once it has stopped the session. */
|
|
609
|
+
get cookieGuardFault(): unknown;
|
|
610
|
+
private cookieFault;
|
|
611
|
+
/** Run the cookie guard; on a throw, record it, tear the context down, and rethrow. */
|
|
612
|
+
private guardCookies;
|
|
595
613
|
/** Snapshot all cookies in the live persistent context. */
|
|
596
614
|
cookies(): Promise<PWCookie[]>;
|
|
597
615
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { dirname, resolve } from "node:path";
|
|
4
4
|
import axe from "axe-core";
|
|
5
5
|
import { chromium, } from "playwright";
|
|
6
|
-
import { CookieStoreParseError, } from "../cookies/index.js";
|
|
6
|
+
import { CookieStoreParseError, violatesCookiePrefix, } from "../cookies/index.js";
|
|
7
7
|
import { PaceGate, pacePolicyFromEnv } from "../pace/index.js";
|
|
8
8
|
import { buildAssertCheck } from "./asserts.js";
|
|
9
9
|
import { stitchPngRows } from "./capture-fidelity.js";
|
|
@@ -149,15 +149,35 @@ export class Browser {
|
|
|
149
149
|
: undefined;
|
|
150
150
|
if (identity)
|
|
151
151
|
await this.context.addInitScript(installDocumentIdentity, identity);
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
// The jar's domain field is the delivery rule: a dotless domain is
|
|
153
|
+
// host-only, which Chromium honors for exactly that host. A cookie that
|
|
154
|
+
// breaks its name prefix would make Chromium reject the whole batch, so
|
|
155
|
+
// it is left out rather than aborting the session.
|
|
156
|
+
const injectable = jarCookies.filter((cookie) => !violatesCookiePrefix(cookie));
|
|
157
|
+
if (injectable.length > 0) {
|
|
158
|
+
await this.context.addCookies(injectable.map(toPWCookie));
|
|
154
159
|
}
|
|
155
160
|
// Gate actual document requests, including links, forms, script navigation,
|
|
156
161
|
// and the first request of a popup. Method-level waits miss those loads.
|
|
157
162
|
// Redirect hops are part of the original load, not additional reservations.
|
|
158
163
|
const headersCb = this.opts.extraHeaders;
|
|
159
|
-
|
|
164
|
+
const cookieGuard = this.opts.cookieGuard;
|
|
165
|
+
if (cookieGuard) {
|
|
166
|
+
this.context.on("response", (response) => {
|
|
167
|
+
void this.guardCookies("response", response.url()).catch(() => undefined);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
if (this.getPaceGate()?.policy.enabled || headersCb || this.opts.userAgent || cookieGuard) {
|
|
160
171
|
await this.context.route("**/*", async (route, request) => {
|
|
172
|
+
if (cookieGuard) {
|
|
173
|
+
try {
|
|
174
|
+
await this.guardCookies("request", request.url());
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
await route.abort("failed").catch(() => undefined);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
161
181
|
let mainDocument = false;
|
|
162
182
|
if (request.isNavigationRequest() && !request.redirectedFrom()) {
|
|
163
183
|
try {
|
|
@@ -543,8 +563,12 @@ export class Browser {
|
|
|
543
563
|
if (!(rect.width > 0) || !(rect.height > 0)) {
|
|
544
564
|
throw new Error(`captureRegionByScroll: rect must have a positive size (got ${rect.width}×${rect.height})`);
|
|
545
565
|
}
|
|
546
|
-
const settle = (top) => page.evaluate(async (target) => {
|
|
547
|
-
window.scrollTo({
|
|
566
|
+
const settle = (top, left) => page.evaluate(async (target) => {
|
|
567
|
+
window.scrollTo({
|
|
568
|
+
left: target.left ?? window.scrollX,
|
|
569
|
+
top: target.top,
|
|
570
|
+
behavior: "instant",
|
|
571
|
+
});
|
|
548
572
|
const frame = () => new Promise((r) => requestAnimationFrame(() => r()));
|
|
549
573
|
let last = Number.NaN;
|
|
550
574
|
for (let i = 0; i < 8; i++) {
|
|
@@ -560,7 +584,7 @@ export class Browser {
|
|
|
560
584
|
innerWidth: window.innerWidth,
|
|
561
585
|
innerHeight: window.innerHeight,
|
|
562
586
|
};
|
|
563
|
-
}, top);
|
|
587
|
+
}, { top, left });
|
|
564
588
|
const original = await page.evaluate(() => ({ x: window.scrollX, y: window.scrollY }));
|
|
565
589
|
const captures = [];
|
|
566
590
|
// Viewport-pinned candidates, measured at scroll 0 so each later capture
|
|
@@ -596,6 +620,7 @@ export class Browser {
|
|
|
596
620
|
priorOpacityPriority: el.style.getPropertyPriority("opacity"),
|
|
597
621
|
priorTransition: el.style.getPropertyValue("transition"),
|
|
598
622
|
priorTransitionPriority: el.style.getPropertyPriority("transition"),
|
|
623
|
+
priorStyle: el.getAttribute("style"),
|
|
599
624
|
});
|
|
600
625
|
}
|
|
601
626
|
return out;
|
|
@@ -603,12 +628,27 @@ export class Browser {
|
|
|
603
628
|
const syncPinned = (mode) => page.evaluate(async ([entries, action]) => {
|
|
604
629
|
for (const entry of entries) {
|
|
605
630
|
const restore = () => {
|
|
631
|
+
if (entry.appliedStyle === undefined)
|
|
632
|
+
return;
|
|
633
|
+
const unchanged = entry.el.getAttribute("style") === entry.appliedStyle;
|
|
606
634
|
// Restore opacity while transitions are still disabled. Restoring both
|
|
607
635
|
// declarations in one style flush starts a new fade from zero.
|
|
608
|
-
entry.el.style.
|
|
609
|
-
|
|
636
|
+
if (entry.el.style.getPropertyValue("opacity") === "0" &&
|
|
637
|
+
entry.el.style.getPropertyPriority("opacity") === "important")
|
|
638
|
+
entry.el.style.setProperty("opacity", entry.priorOpacity, entry.priorOpacityPriority);
|
|
610
639
|
void getComputedStyle(entry.el).opacity;
|
|
611
|
-
entry.el.style.
|
|
640
|
+
if (entry.el.style.getPropertyValue("transition") === "none" &&
|
|
641
|
+
entry.el.style.getPropertyPriority("transition") === "important")
|
|
642
|
+
entry.el.style.setProperty("transition", entry.priorTransition, entry.priorTransitionPriority);
|
|
643
|
+
// Preserve the exact original attribute, including its absence. Do
|
|
644
|
+
// not replace styles changed by the page while our override was active.
|
|
645
|
+
if (unchanged) {
|
|
646
|
+
if (entry.priorStyle === null)
|
|
647
|
+
entry.el.removeAttribute("style");
|
|
648
|
+
else
|
|
649
|
+
entry.el.setAttribute("style", entry.priorStyle);
|
|
650
|
+
}
|
|
651
|
+
entry.appliedStyle = undefined;
|
|
612
652
|
};
|
|
613
653
|
if (action === "restore") {
|
|
614
654
|
restore();
|
|
@@ -616,8 +656,19 @@ export class Browser {
|
|
|
616
656
|
}
|
|
617
657
|
const now = entry.el.getBoundingClientRect().top + window.scrollY;
|
|
618
658
|
if (Math.abs(now - entry.top) > 1) {
|
|
659
|
+
if (entry.appliedStyle !== undefined) {
|
|
660
|
+
if (entry.el.getAttribute("style") !== entry.appliedStyle)
|
|
661
|
+
throw new Error("Pinned styles changed during native capture; source is unstable.");
|
|
662
|
+
continue;
|
|
663
|
+
}
|
|
664
|
+
entry.priorStyle = entry.el.getAttribute("style");
|
|
665
|
+
entry.priorOpacity = entry.el.style.getPropertyValue("opacity");
|
|
666
|
+
entry.priorOpacityPriority = entry.el.style.getPropertyPriority("opacity");
|
|
667
|
+
entry.priorTransition = entry.el.style.getPropertyValue("transition");
|
|
668
|
+
entry.priorTransitionPriority = entry.el.style.getPropertyPriority("transition");
|
|
619
669
|
entry.el.style.setProperty("transition", "none", "important");
|
|
620
670
|
entry.el.style.setProperty("opacity", "0", "important");
|
|
671
|
+
entry.appliedStyle = entry.el.getAttribute("style");
|
|
621
672
|
}
|
|
622
673
|
else {
|
|
623
674
|
restore();
|
|
@@ -668,7 +719,8 @@ export class Browser {
|
|
|
668
719
|
}
|
|
669
720
|
finally {
|
|
670
721
|
await pinned.dispose();
|
|
671
|
-
await
|
|
722
|
+
await settle(original.y, original.x);
|
|
723
|
+
await this.waitForReviewReady();
|
|
672
724
|
}
|
|
673
725
|
}
|
|
674
726
|
return captures;
|
|
@@ -1446,9 +1498,14 @@ export class Browser {
|
|
|
1446
1498
|
* of the last line is deliberately NOT the signal; see runts.ts).
|
|
1447
1499
|
*/
|
|
1448
1500
|
async checkRunts(opts = {}) {
|
|
1501
|
+
const maxFindings = opts.maxFindings === undefined ? 50 : opts.maxFindings;
|
|
1502
|
+
if (!Number.isInteger(maxFindings) || maxFindings < 1 || maxFindings > 5000) {
|
|
1503
|
+
throw new Error("maxFindings must be an integer from 1 to 5000.");
|
|
1504
|
+
}
|
|
1449
1505
|
return await this.currentPage.evaluate(buildRuntsCheck(), {
|
|
1450
1506
|
scope: opts.scope ?? null,
|
|
1451
1507
|
minChars: opts.minChars ?? 40,
|
|
1508
|
+
maxFindings,
|
|
1452
1509
|
});
|
|
1453
1510
|
}
|
|
1454
1511
|
/** Inject annotation overlays for runt hits. Used before screenshot. */
|
|
@@ -1531,6 +1588,29 @@ export class Browser {
|
|
|
1531
1588
|
throw new Error("Browser not opened. Call open() first.");
|
|
1532
1589
|
await this.context.addInitScript(script);
|
|
1533
1590
|
}
|
|
1591
|
+
/** The error a `cookieGuard` threw, once it has stopped the session. */
|
|
1592
|
+
get cookieGuardFault() {
|
|
1593
|
+
return this.cookieFault;
|
|
1594
|
+
}
|
|
1595
|
+
cookieFault;
|
|
1596
|
+
/** Run the cookie guard; on a throw, record it, tear the context down, and rethrow. */
|
|
1597
|
+
async guardCookies(phase, url) {
|
|
1598
|
+
const guard = this.opts.cookieGuard;
|
|
1599
|
+
const context = this.context;
|
|
1600
|
+
if (!guard || !context || this.cookieFault) {
|
|
1601
|
+
if (this.cookieFault)
|
|
1602
|
+
throw this.cookieFault;
|
|
1603
|
+
return;
|
|
1604
|
+
}
|
|
1605
|
+
try {
|
|
1606
|
+
await guard(await context.cookies(), { phase, url });
|
|
1607
|
+
}
|
|
1608
|
+
catch (error) {
|
|
1609
|
+
this.cookieFault ??= error;
|
|
1610
|
+
await this.close();
|
|
1611
|
+
throw error;
|
|
1612
|
+
}
|
|
1613
|
+
}
|
|
1534
1614
|
/** Snapshot all cookies in the live persistent context. */
|
|
1535
1615
|
async cookies() {
|
|
1536
1616
|
if (!this.context)
|
|
@@ -1544,7 +1624,15 @@ export class Browser {
|
|
|
1544
1624
|
async close() {
|
|
1545
1625
|
if (!this.context)
|
|
1546
1626
|
return;
|
|
1547
|
-
if (this.opts.
|
|
1627
|
+
if (this.opts.cookieGuard && !this.cookieFault) {
|
|
1628
|
+
try {
|
|
1629
|
+
await this.guardCookies("close", null);
|
|
1630
|
+
}
|
|
1631
|
+
catch {
|
|
1632
|
+
return;
|
|
1633
|
+
}
|
|
1634
|
+
}
|
|
1635
|
+
if (this.opts.jar && !this.cookieFault) {
|
|
1548
1636
|
try {
|
|
1549
1637
|
const live = await this.context.cookies();
|
|
1550
1638
|
this.opts.jar.merge(live.map(toJarCookie));
|
|
@@ -14,7 +14,7 @@ export interface PlaceholderHit {
|
|
|
14
14
|
export interface PlaceholderResult {
|
|
15
15
|
rule: "placeholder";
|
|
16
16
|
found: boolean;
|
|
17
|
-
outcome: "pass" | "fail";
|
|
17
|
+
outcome: "pass" | "fail" | "unknown";
|
|
18
18
|
scanned: number;
|
|
19
19
|
truncated: boolean;
|
|
20
20
|
hits: PlaceholderHit[];
|
|
@@ -74,6 +74,8 @@ export interface ContrastResult {
|
|
|
74
74
|
hits: ContrastHit[];
|
|
75
75
|
}
|
|
76
76
|
export interface ContentChecksRequest {
|
|
77
|
+
/** Explicit traversal budget; omission retains the existing node cap. */
|
|
78
|
+
scanNodeBudget?: number;
|
|
77
79
|
placeholder: {
|
|
78
80
|
scope: string | null;
|
|
79
81
|
} | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-checks.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/content-checks.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,KAAK,GAAG,eAAe,CAAC;IACvF,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;CACjB;AACD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"content-checks.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/content-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,13 @@
|
|
|
20
20
|
// module-scope closures, which is why the helpers are nested.
|
|
21
21
|
export function buildContentChecks() {
|
|
22
22
|
return (request) => {
|
|
23
|
-
|
|
23
|
+
if (request.scanNodeBudget !== undefined &&
|
|
24
|
+
(!Number.isSafeInteger(request.scanNodeBudget) ||
|
|
25
|
+
request.scanNodeBudget < 1 ||
|
|
26
|
+
request.scanNodeBudget > 100_000)) {
|
|
27
|
+
throw new Error("scanNodeBudget must be an integer from 1 to 100000.");
|
|
28
|
+
}
|
|
29
|
+
const NODE_CAP = request.scanNodeBudget ?? 6000;
|
|
24
30
|
const HIT_CAP = 100;
|
|
25
31
|
const sx = window.scrollX;
|
|
26
32
|
const sy = window.scrollY;
|
|
@@ -137,6 +143,8 @@ export function buildContentChecks() {
|
|
|
137
143
|
// when the trimmed text of a leaf element is exactly the tell).
|
|
138
144
|
if (hits.length < HIT_CAP) {
|
|
139
145
|
const leaves = root.querySelectorAll("*");
|
|
146
|
+
if (leaves.length > NODE_CAP)
|
|
147
|
+
truncated = true;
|
|
140
148
|
for (let i = 0; i < leaves.length && i < NODE_CAP; i++) {
|
|
141
149
|
const el = leaves[i];
|
|
142
150
|
if (!el || el.children.length > 0)
|
|
@@ -164,7 +172,7 @@ export function buildContentChecks() {
|
|
|
164
172
|
placeholder = {
|
|
165
173
|
rule: "placeholder",
|
|
166
174
|
found: root !== null,
|
|
167
|
-
outcome: root
|
|
175
|
+
outcome: !root || hits.length > 0 ? "fail" : truncated ? "unknown" : "pass",
|
|
168
176
|
scanned,
|
|
169
177
|
truncated,
|
|
170
178
|
hits,
|