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
|
@@ -47,7 +47,36 @@ export interface CritiqueResult {
|
|
|
47
47
|
error?: string;
|
|
48
48
|
/** Host-reported provider provenance (route, attempts, fallbacks, usage). */
|
|
49
49
|
provider_meta?: Record<string, unknown>;
|
|
50
|
+
/** Tokens the provider reported across every tile it was called for. */
|
|
51
|
+
usage?: CritiqueUsageTotals;
|
|
50
52
|
}
|
|
53
|
+
/** Tokens one provider call spent, as the host's backend reported them.
|
|
54
|
+
* `input_tokens` counts every input token, cached or not. */
|
|
55
|
+
export interface CritiqueUsage {
|
|
56
|
+
input_tokens: number;
|
|
57
|
+
output_tokens: number;
|
|
58
|
+
cache_read_input_tokens?: number;
|
|
59
|
+
cache_write_input_tokens?: number;
|
|
60
|
+
/** Cost at the backend's list price, when the backend reports one. */
|
|
61
|
+
cost_usd?: number;
|
|
62
|
+
}
|
|
63
|
+
/** Usage summed over tiles. A tile whose provider reported nothing counts in
|
|
64
|
+
* `tiles_unreported`, never as zero tokens. */
|
|
65
|
+
export interface CritiqueUsageTotals {
|
|
66
|
+
tiles_reported: number;
|
|
67
|
+
tiles_unreported: number;
|
|
68
|
+
input_tokens: number;
|
|
69
|
+
output_tokens: number;
|
|
70
|
+
cache_read_input_tokens: number;
|
|
71
|
+
cache_write_input_tokens: number;
|
|
72
|
+
/** Present only when every reported tile carried a cost. */
|
|
73
|
+
cost_usd?: number;
|
|
74
|
+
}
|
|
75
|
+
/** Add one call's usage to a tile's running usage (a retried tile reports twice). */
|
|
76
|
+
export declare function addCritiqueUsage(into: CritiqueUsage | undefined, usage: CritiqueUsage): CritiqueUsage;
|
|
77
|
+
export declare function sumCritiqueUsage(perTile: ReadonlyArray<CritiqueUsage | undefined>): CritiqueUsageTotals;
|
|
78
|
+
/** "1,234,567 tokens over 96 tiles (3 unreported), $1.23" for log lines. */
|
|
79
|
+
export declare function formatCritiqueUsage(totals: CritiqueUsageTotals): string;
|
|
51
80
|
/**
|
|
52
81
|
* The host-injected model call. Given one tile and the rubric, return the
|
|
53
82
|
* findings for that tile. Throwing is caught and surfaced as an error finding
|
|
@@ -63,6 +92,9 @@ export type CritiqueProvider = ((input: {
|
|
|
63
92
|
url: string;
|
|
64
93
|
rubric: string;
|
|
65
94
|
tile: CritiqueTile;
|
|
95
|
+
/** Optional sink for the tokens this call spent. A provider that knows its
|
|
96
|
+
* usage calls it once per backend call; callers that omit it lose nothing. */
|
|
97
|
+
reportUsage?: (usage: CritiqueUsage) => void;
|
|
66
98
|
}) => Promise<CritiqueFinding[]>) & {
|
|
67
99
|
concurrency?: number;
|
|
68
100
|
meta?: () => Record<string, unknown> | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"critique.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/critique.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"critique.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/critique.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,55 @@
|
|
|
17
17
|
// false pass. That keeps this portable — the tiling, prompt, and
|
|
18
18
|
// orchestration live here; the model call lives in the host.
|
|
19
19
|
import { PNG } from "pngjs";
|
|
20
|
+
import { PAGE_REVIEW_MAX_TILE_BUDGET } from "./page-review-contracts.js";
|
|
20
21
|
import { bandOversizedRect, bandsCoveringRects, snappedBandRects, } from "./tiling.js";
|
|
22
|
+
/** Add one call's usage to a tile's running usage (a retried tile reports twice). */
|
|
23
|
+
export function addCritiqueUsage(into, usage) {
|
|
24
|
+
const n = (v) => (Number.isFinite(v) ? v : 0);
|
|
25
|
+
const out = {
|
|
26
|
+
input_tokens: n(into?.input_tokens) + n(usage.input_tokens),
|
|
27
|
+
output_tokens: n(into?.output_tokens) + n(usage.output_tokens),
|
|
28
|
+
};
|
|
29
|
+
const read = n(into?.cache_read_input_tokens) + n(usage.cache_read_input_tokens);
|
|
30
|
+
const write = n(into?.cache_write_input_tokens) + n(usage.cache_write_input_tokens);
|
|
31
|
+
if (read > 0)
|
|
32
|
+
out.cache_read_input_tokens = read;
|
|
33
|
+
if (write > 0)
|
|
34
|
+
out.cache_write_input_tokens = write;
|
|
35
|
+
const costKnown = usage.cost_usd !== undefined && (into === undefined || into.cost_usd !== undefined);
|
|
36
|
+
if (costKnown)
|
|
37
|
+
out.cost_usd = n(into?.cost_usd) + n(usage.cost_usd);
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
export function sumCritiqueUsage(perTile) {
|
|
41
|
+
const reported = perTile.filter((u) => u !== undefined);
|
|
42
|
+
const totals = {
|
|
43
|
+
tiles_reported: reported.length,
|
|
44
|
+
tiles_unreported: perTile.length - reported.length,
|
|
45
|
+
input_tokens: 0,
|
|
46
|
+
output_tokens: 0,
|
|
47
|
+
cache_read_input_tokens: 0,
|
|
48
|
+
cache_write_input_tokens: 0,
|
|
49
|
+
};
|
|
50
|
+
for (const u of reported) {
|
|
51
|
+
totals.input_tokens += u.input_tokens;
|
|
52
|
+
totals.output_tokens += u.output_tokens;
|
|
53
|
+
totals.cache_read_input_tokens += u.cache_read_input_tokens ?? 0;
|
|
54
|
+
totals.cache_write_input_tokens += u.cache_write_input_tokens ?? 0;
|
|
55
|
+
}
|
|
56
|
+
if (reported.length > 0 && reported.every((u) => u.cost_usd !== undefined)) {
|
|
57
|
+
totals.cost_usd =
|
|
58
|
+
Math.round(reported.reduce((sum, u) => sum + (u.cost_usd ?? 0), 0) * 1e6) / 1e6;
|
|
59
|
+
}
|
|
60
|
+
return totals;
|
|
61
|
+
}
|
|
62
|
+
/** "1,234,567 tokens over 96 tiles (3 unreported), $1.23" for log lines. */
|
|
63
|
+
export function formatCritiqueUsage(totals) {
|
|
64
|
+
const tokens = (totals.input_tokens + totals.output_tokens).toLocaleString("en-US");
|
|
65
|
+
return (`${tokens} tokens over ${totals.tiles_reported} tile(s)` +
|
|
66
|
+
(totals.tiles_unreported > 0 ? ` (${totals.tiles_unreported} unreported)` : "") +
|
|
67
|
+
(totals.cost_usd !== undefined ? `, $${totals.cost_usd.toFixed(2)} at list price` : ""));
|
|
68
|
+
}
|
|
21
69
|
export const DEFAULT_CRITIQUE_RUBRIC = [
|
|
22
70
|
"You are reviewing one vertical slice of a rendered web page for visual defects.",
|
|
23
71
|
"Report ONLY concrete, visible problems a careful designer would flag:",
|
|
@@ -137,12 +185,13 @@ export function tilesFromFullPage(fullPageBuffer, opts) {
|
|
|
137
185
|
pngBase64: PNG.sync.write(dst).toString("base64"),
|
|
138
186
|
};
|
|
139
187
|
};
|
|
140
|
-
const kept = rects.slice(0, opts.maxTiles);
|
|
188
|
+
const kept = rects.slice(0, Math.min(opts.maxTiles, PAGE_REVIEW_MAX_TILE_BUDGET));
|
|
141
189
|
const tiles = kept.map(cutTile);
|
|
190
|
+
const hitBandCap = Math.min(opts.maxHitBands ?? 50, Math.max(0, PAGE_REVIEW_MAX_TILE_BUDGET - kept.length));
|
|
142
191
|
let hitBands = 0;
|
|
143
192
|
const banding = !(opts.elementRects && opts.elementRects.length > 0);
|
|
144
193
|
if (banding && opts.hitRects && opts.hitRects.length > 0) {
|
|
145
|
-
for (const index of bandsCoveringRects(rects, kept.length, opts.hitRects,
|
|
194
|
+
for (const index of bandsCoveringRects(rects, kept.length, opts.hitRects, hitBandCap)) {
|
|
146
195
|
const band = rects[index];
|
|
147
196
|
if (!band)
|
|
148
197
|
continue;
|
|
@@ -209,10 +258,22 @@ export async function runCritique(args) {
|
|
|
209
258
|
error: "no critiqueProvider injected by the host (see HarneryProgramContext.critiqueProvider)",
|
|
210
259
|
};
|
|
211
260
|
}
|
|
261
|
+
if (tiles.length > PAGE_REVIEW_MAX_TILE_BUDGET) {
|
|
262
|
+
return {
|
|
263
|
+
rule: "critique",
|
|
264
|
+
tiles: tiles.length,
|
|
265
|
+
provider: true,
|
|
266
|
+
findings: [],
|
|
267
|
+
outcome: "skipped",
|
|
268
|
+
error: `${tiles.length} tiles exceed the per-invocation ceiling of ${PAGE_REVIEW_MAX_TILE_BUDGET} ` +
|
|
269
|
+
"vision calls; lower the tile cap",
|
|
270
|
+
};
|
|
271
|
+
}
|
|
212
272
|
// Tiles are judged independently, so run them concurrently (bounded) and
|
|
213
273
|
// reassemble findings in tile order so artifacts stay deterministic.
|
|
214
274
|
const concurrency = Math.max(1, Math.min(provider.concurrency ?? 4, tiles.length || 1));
|
|
215
275
|
const perTile = tiles.map(() => []);
|
|
276
|
+
const perTileUsage = tiles.map(() => undefined);
|
|
216
277
|
let cursor = 0;
|
|
217
278
|
const worker = async () => {
|
|
218
279
|
while (true) {
|
|
@@ -221,7 +282,14 @@ export async function runCritique(args) {
|
|
|
221
282
|
return;
|
|
222
283
|
const tile = tiles[i];
|
|
223
284
|
try {
|
|
224
|
-
const tileFindings = await provider({
|
|
285
|
+
const tileFindings = await provider({
|
|
286
|
+
url,
|
|
287
|
+
rubric,
|
|
288
|
+
tile,
|
|
289
|
+
reportUsage: (usage) => {
|
|
290
|
+
perTileUsage[i] = addCritiqueUsage(perTileUsage[i], usage);
|
|
291
|
+
},
|
|
292
|
+
});
|
|
225
293
|
perTile[i] = tileFindings.map((f) => ({ ...f, tile: tile.index }));
|
|
226
294
|
}
|
|
227
295
|
catch (err) {
|
|
@@ -247,5 +315,6 @@ export async function runCritique(args) {
|
|
|
247
315
|
findings,
|
|
248
316
|
outcome,
|
|
249
317
|
...(meta ? { provider_meta: meta } : {}),
|
|
318
|
+
usage: sumCritiqueUsage(perTileUsage),
|
|
250
319
|
};
|
|
251
320
|
}
|
|
@@ -134,6 +134,8 @@ export interface CrowdResult {
|
|
|
134
134
|
truncated: boolean;
|
|
135
135
|
}
|
|
136
136
|
export interface LayoutLintRequest {
|
|
137
|
+
/** Explicit traversal budget; omission retains each rule's existing limit. */
|
|
138
|
+
scanNodeBudget?: number;
|
|
137
139
|
align: Array<{
|
|
138
140
|
selector: string;
|
|
139
141
|
axis: LayoutAxis;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/geometry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,9 +32,26 @@ export function intersectRects(a, b) {
|
|
|
32
32
|
*/
|
|
33
33
|
export function buildLayoutLintCheck() {
|
|
34
34
|
return (request) => {
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
if (request.scanNodeBudget !== undefined &&
|
|
36
|
+
(!Number.isSafeInteger(request.scanNodeBudget) ||
|
|
37
|
+
request.scanNodeBudget < 1 ||
|
|
38
|
+
request.scanNodeBudget > 100_000)) {
|
|
39
|
+
throw new Error("scanNodeBudget must be an integer from 1 to 100000.");
|
|
40
|
+
}
|
|
41
|
+
const CHILD_LIMIT = request.scanNodeBudget ?? 1_000;
|
|
42
|
+
const TEXT_LIMIT = request.scanNodeBudget ?? 1_000;
|
|
37
43
|
const ISSUE_LIMIT = 100;
|
|
44
|
+
const translationOnly = (transform) => {
|
|
45
|
+
if (!transform || transform === "none")
|
|
46
|
+
return true;
|
|
47
|
+
try {
|
|
48
|
+
const matrix = new DOMMatrixReadOnly(transform);
|
|
49
|
+
return matrix.is2D && matrix.a === 1 && matrix.b === 0 && matrix.c === 0 && matrix.d === 1;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
38
55
|
// Chromium geometry is fractional even when authored CSS is integral.
|
|
39
56
|
// Differences below half a CSS pixel are rasterization noise, not clipping.
|
|
40
57
|
const SUBPIXEL_EPSILON = 0.5;
|
|
@@ -456,15 +473,20 @@ export function buildLayoutLintCheck() {
|
|
|
456
473
|
// are reachable and so are exempt.
|
|
457
474
|
const clipChain = (start, container, seed, seedLabel) => {
|
|
458
475
|
let allowed = { ...seed };
|
|
476
|
+
let supported = true;
|
|
459
477
|
const clippedBy = { x: seedLabel, y: seedLabel };
|
|
460
478
|
const free = { x: false, y: false };
|
|
461
479
|
let current = start;
|
|
462
480
|
while (current && container.contains(current)) {
|
|
463
481
|
const style = getComputedStyle(current);
|
|
464
|
-
if (style.clipPath && style.clipPath !== "none")
|
|
482
|
+
if (style.clipPath && style.clipPath !== "none") {
|
|
465
483
|
unsupported.add(`${labelOf(current)}:clip-path`);
|
|
466
|
-
|
|
484
|
+
supported = false;
|
|
485
|
+
}
|
|
486
|
+
if (!translationOnly(style.transform)) {
|
|
467
487
|
unsupported.add(`${labelOf(current)}:transform`);
|
|
488
|
+
supported = false;
|
|
489
|
+
}
|
|
468
490
|
// The container bounds by default even when it does not CSS-clip,
|
|
469
491
|
// since it is the scope the caller asked about -- but a scroller
|
|
470
492
|
// hands its axis back whether it is the scope or an ancestor.
|
|
@@ -511,7 +533,7 @@ export function buildLayoutLintCheck() {
|
|
|
511
533
|
break;
|
|
512
534
|
current = current.parentElement;
|
|
513
535
|
}
|
|
514
|
-
return { allowed, clippedBy };
|
|
536
|
+
return { allowed, clippedBy, supported };
|
|
515
537
|
};
|
|
516
538
|
const nearestBlockOwner = (node, scope) => {
|
|
517
539
|
let current = node.parentElement;
|
|
@@ -541,6 +563,15 @@ export function buildLayoutLintCheck() {
|
|
|
541
563
|
excluded.push({ index, tag: element.tagName.toLowerCase(), reason: "visually-hidden" });
|
|
542
564
|
return;
|
|
543
565
|
}
|
|
566
|
+
const ownStyle = getComputedStyle(element);
|
|
567
|
+
if (!translationOnly(ownStyle.transform)) {
|
|
568
|
+
unsupported.add(`${labelOf(element)}:transform`);
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
if (ownStyle.clipPath && ownStyle.clipPath !== "none") {
|
|
572
|
+
unsupported.add(`${labelOf(element)}:clip-path`);
|
|
573
|
+
return;
|
|
574
|
+
}
|
|
544
575
|
const rect = element.getBoundingClientRect();
|
|
545
576
|
if (rect.width <= 0 || rect.height <= 0) {
|
|
546
577
|
excluded.push({ index, tag: element.tagName.toLowerCase(), reason: "zero-area" });
|
|
@@ -567,7 +598,8 @@ export function buildLayoutLintCheck() {
|
|
|
567
598
|
seedLabel = labelOf(owner);
|
|
568
599
|
}
|
|
569
600
|
const chain = clipChain(element.parentElement, container, seed, seedLabel);
|
|
570
|
-
|
|
601
|
+
if (chain.supported)
|
|
602
|
+
recordIssue(measure(element, index, false), chain.allowed, chain.clippedBy);
|
|
571
603
|
});
|
|
572
604
|
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);
|
|
573
605
|
let textCount = 0;
|
|
@@ -608,7 +640,7 @@ export function buildLayoutLintCheck() {
|
|
|
608
640
|
let current = owner;
|
|
609
641
|
while (current && container.contains(current)) {
|
|
610
642
|
const transform = getComputedStyle(current).transform;
|
|
611
|
-
if (transform
|
|
643
|
+
if (!translationOnly(transform)) {
|
|
612
644
|
unsupported.add(`${labelOf(current)}:transform`);
|
|
613
645
|
transformed = true;
|
|
614
646
|
break;
|
|
@@ -636,6 +668,8 @@ export function buildLayoutLintCheck() {
|
|
|
636
668
|
seed.width = Math.max(0, seed.right - seed.left);
|
|
637
669
|
}
|
|
638
670
|
const chain = clipChain(owner, container, seed, labelOf(owner));
|
|
671
|
+
if (!chain.supported)
|
|
672
|
+
continue;
|
|
639
673
|
const allowed = chain.allowed;
|
|
640
674
|
const clippedBy = chain.clippedBy;
|
|
641
675
|
const range = document.createRange();
|
|
@@ -659,7 +693,7 @@ export function buildLayoutLintCheck() {
|
|
|
659
693
|
truncated = true;
|
|
660
694
|
// Border radius keeps the rectangular padding-box contract; only shapes
|
|
661
695
|
// the rectangle cannot certify contribute to unsupported geometry.
|
|
662
|
-
const outcome = issues.length > 0 ? "fail" : unsupported.size > 0 ? "unknown" : "pass";
|
|
696
|
+
const outcome = issues.length > 0 ? "fail" : unsupported.size > 0 || truncated ? "unknown" : "pass";
|
|
663
697
|
return {
|
|
664
698
|
rule: "clip",
|
|
665
699
|
selector,
|
|
@@ -749,7 +783,7 @@ export function buildLayoutLintCheck() {
|
|
|
749
783
|
// and badges (radius ≥ half their smaller side) are inline controls, not
|
|
750
784
|
// layout cards, and are excluded too. Plain blocks with no panel chrome
|
|
751
785
|
// and no panel descendants stay out of the peer list.
|
|
752
|
-
const PARENT_LIMIT = 2000;
|
|
786
|
+
const PARENT_LIMIT = request.scanNodeBudget ?? 2000;
|
|
753
787
|
const PANEL_DESCENDANT_LIMIT = 100;
|
|
754
788
|
const OVERLAP_EPS = 1;
|
|
755
789
|
const STRUCTURAL_TAGS = new Set([
|
|
@@ -820,15 +854,19 @@ export function buildLayoutLintCheck() {
|
|
|
820
854
|
return rect.width > 0 && rect.height > 0;
|
|
821
855
|
};
|
|
822
856
|
/** Leaf panel faces that represent a crowd peer (self, or descendants). */
|
|
823
|
-
const collectPanelFaces = (element, selfIsPanel) => {
|
|
857
|
+
const collectPanelFaces = (element, selfIsPanel, onTruncated) => {
|
|
824
858
|
if (selfIsPanel)
|
|
825
859
|
return [measure(element, 0, false)];
|
|
826
860
|
const faces = [];
|
|
827
861
|
const descendants = element.querySelectorAll("*");
|
|
828
|
-
for (let i = 0; i < descendants.length
|
|
862
|
+
for (let i = 0; i < descendants.length; i++) {
|
|
829
863
|
const child = descendants[i];
|
|
830
864
|
if (!child || !isInFlowBox(child) || !isPanel(child))
|
|
831
865
|
continue;
|
|
866
|
+
if (faces.length >= PANEL_DESCENDANT_LIMIT) {
|
|
867
|
+
onTruncated();
|
|
868
|
+
break;
|
|
869
|
+
}
|
|
832
870
|
faces.push(measure(child, faces.length, false));
|
|
833
871
|
}
|
|
834
872
|
return faces;
|
|
@@ -837,15 +875,17 @@ export function buildLayoutLintCheck() {
|
|
|
837
875
|
// leaf panels, or composites that wrap at least one panel. Non-peer
|
|
838
876
|
// siblings (plain prose, arrows, spacers) drop out of the list so two
|
|
839
877
|
// panels separated only by chrome still get a face-to-face check.
|
|
840
|
-
const collectCrowdPeers = (parent) => {
|
|
878
|
+
const collectCrowdPeers = (parent, onTruncated) => {
|
|
841
879
|
const out = [];
|
|
842
880
|
const children = [...parent.children];
|
|
881
|
+
if (children.length > CHILD_LIMIT)
|
|
882
|
+
onTruncated();
|
|
843
883
|
for (let index = 0; index < children.length && index < CHILD_LIMIT; index++) {
|
|
844
884
|
const element = children[index];
|
|
845
885
|
if (!element || !isInFlowBox(element))
|
|
846
886
|
continue;
|
|
847
887
|
const selfIsPanel = isPanel(element);
|
|
848
|
-
const faces = collectPanelFaces(element, selfIsPanel);
|
|
888
|
+
const faces = collectPanelFaces(element, selfIsPanel, onTruncated);
|
|
849
889
|
if (faces.length === 0)
|
|
850
890
|
continue;
|
|
851
891
|
out.push({
|
|
@@ -911,7 +951,9 @@ export function buildLayoutLintCheck() {
|
|
|
911
951
|
const limit = Math.min(parents.length, PARENT_LIMIT);
|
|
912
952
|
for (let p = 0; p < limit; p++) {
|
|
913
953
|
const parent = parents[p];
|
|
914
|
-
const peers = collectCrowdPeers(parent)
|
|
954
|
+
const peers = collectCrowdPeers(parent, () => {
|
|
955
|
+
truncated = true;
|
|
956
|
+
});
|
|
915
957
|
for (let i = 1; i < peers.length; i++) {
|
|
916
958
|
const beforePeer = peers[i - 1];
|
|
917
959
|
const afterPeer = peers[i];
|
|
@@ -942,7 +984,11 @@ export function buildLayoutLintCheck() {
|
|
|
942
984
|
rule: "crowd",
|
|
943
985
|
selector,
|
|
944
986
|
found: true,
|
|
945
|
-
outcome: issues.length > 0
|
|
987
|
+
outcome: issues.length > 0
|
|
988
|
+
? "fail"
|
|
989
|
+
: truncated
|
|
990
|
+
? "unknown"
|
|
991
|
+
: "pass",
|
|
946
992
|
minGapPx,
|
|
947
993
|
issues,
|
|
948
994
|
truncated,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { type AssertOp, type AssertResult, type AssertSpec, buildAssertCheck, parseAssertSpec, } from "./asserts.js";
|
|
2
2
|
export { Browser, type BrowserOptions, BrowserSessionActionError, type BrowserSessionControl, type BrowserSessionInspection, type BrowserSessionLocator, type BrowserSessionNavigation, type BrowserSessionNavigationType, type BrowserSessionScreenshot, type BrowserSessionStatus, type BrowserSessionTab, type ConsoleEvent, type Diagnostics, type FailedRequest, type NavigateResult, type PageErrorEvent, } from "./client.js";
|
|
3
3
|
export type { CheckRect, ContentAnnotationBox, ContentChecksRequest, ContentChecksResult, ContrastHit, ContrastResult, ImageHealthResult, ImageHit, PlaceholderHit, PlaceholderResult, TruncationHit, TruncationResult, } from "./content-checks.js";
|
|
4
|
-
export { bandRects, type CritiqueCoverage, type CritiqueFinding, type CritiqueProvider, type CritiqueResult, type CritiqueTile, DEFAULT_CRITIQUE_RUBRIC, normalizeFindings, runCritique, tilesFromFullPage, } from "./critique.js";
|
|
4
|
+
export { addCritiqueUsage, bandRects, type CritiqueCoverage, type CritiqueFinding, type CritiqueProvider, type CritiqueResult, type CritiqueTile, type CritiqueUsage, type CritiqueUsageTotals, DEFAULT_CRITIQUE_RUBRIC, formatCritiqueUsage, normalizeFindings, runCritique, sumCritiqueUsage, tilesFromFullPage, } from "./critique.js";
|
|
5
5
|
export { captureDevOverlay, type DevOverlayError, type DevOverlayResult, } from "./dev-overlay.js";
|
|
6
6
|
export type { AlignChild, AlignCluster, AlignResult, ClipIssue, ClipResult, CrowdPair, CrowdResult, GapCluster, GapPair, GapResult, LayoutAxis, LayoutElementMeasurement, LayoutExclusion, LayoutLintRequest, LayoutLintResult, LayoutOutcome, LayoutRect, OverlapIssue, OverlapResult, } from "./geometry.js";
|
|
7
7
|
export { buildLayoutLintCheck } from "./geometry.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { buildAssertCheck, parseAssertSpec, } from "./asserts.js";
|
|
2
2
|
export { Browser, BrowserSessionActionError, } from "./client.js";
|
|
3
|
-
export { bandRects, DEFAULT_CRITIQUE_RUBRIC, normalizeFindings, runCritique, tilesFromFullPage, } from "./critique.js";
|
|
3
|
+
export { addCritiqueUsage, bandRects, DEFAULT_CRITIQUE_RUBRIC, formatCritiqueUsage, normalizeFindings, runCritique, sumCritiqueUsage, tilesFromFullPage, } from "./critique.js";
|
|
4
4
|
export { captureDevOverlay, } from "./dev-overlay.js";
|
|
5
5
|
export { buildLayoutLintCheck } from "./geometry.js";
|
|
6
6
|
export { AUTOMATION_DEFAULT_ARGS_TO_DROP, automationDisguiseArgs, installedChromeChannel, installedChromePath, isWSL, wslHeadedLaunchArgs, } from "./launch-args.js";
|
|
@@ -3,7 +3,12 @@ export declare const PAGE_REVIEW_CAPTURE_PLAN_SCHEMA = "harnery-page-review-capt
|
|
|
3
3
|
export declare const PAGE_REVIEW_NATIVE_EVIDENCE_SCHEMA = "harnery-page-review-native-evidence/v2";
|
|
4
4
|
export declare const PAGE_REVIEW_DECISIONS_SCHEMA = "harnery-page-review-decisions/v1";
|
|
5
5
|
export declare const PAGE_REVIEW_DEFAULT_TILE_BUDGET = 96;
|
|
6
|
-
|
|
6
|
+
/** Hard ceiling on vision calls in one critique invocation (a qa-run pack,
|
|
7
|
+
* a review-pack judge, or a browse --check-critique). Each call is a separate
|
|
8
|
+
* model session, so the ceiling bounds what one run can spend whatever the
|
|
9
|
+
* job asks for. Pages that need more bands than this get a sampled review
|
|
10
|
+
* (ADR 0224). */
|
|
11
|
+
export declare const PAGE_REVIEW_MAX_TILE_BUDGET = 160;
|
|
7
12
|
/** Rectangles are native image pixels, never CSS pixels or overview pixels. */
|
|
8
13
|
export interface PageReviewRect {
|
|
9
14
|
x: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-review-contracts.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/page-review-contracts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"page-review-contracts.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/page-review-contracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,9 @@ export const PAGE_REVIEW_CAPTURE_PLAN_SCHEMA = "harnery-page-review-capture-plan
|
|
|
2
2
|
export const PAGE_REVIEW_NATIVE_EVIDENCE_SCHEMA = "harnery-page-review-native-evidence/v2";
|
|
3
3
|
export const PAGE_REVIEW_DECISIONS_SCHEMA = "harnery-page-review-decisions/v1";
|
|
4
4
|
export const PAGE_REVIEW_DEFAULT_TILE_BUDGET = 96;
|
|
5
|
-
|
|
5
|
+
/** Hard ceiling on vision calls in one critique invocation (a qa-run pack,
|
|
6
|
+
* a review-pack judge, or a browse --check-critique). Each call is a separate
|
|
7
|
+
* model session, so the ceiling bounds what one run can spend whatever the
|
|
8
|
+
* job asks for. Pages that need more bands than this get a sampled review
|
|
9
|
+
* (ADR 0224). */
|
|
10
|
+
export const PAGE_REVIEW_MAX_TILE_BUDGET = 160;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CritiqueProvider, type CritiqueUsageTotals } from "./critique.js";
|
|
2
2
|
import { type PageReviewContextRecord, type PageReviewCritiqueRecord } from "./page-review-pack.js";
|
|
3
3
|
import type { CritiqueReusePlan } from "./qa-reuse.js";
|
|
4
4
|
import type { QaRunCritiqueTileTiming } from "./qa-run-contracts.js";
|
|
@@ -43,6 +43,8 @@ export interface JudgePageReviewPackResult {
|
|
|
43
43
|
tiles_reused: number;
|
|
44
44
|
outcome: "pass" | "fail" | "skipped" | "incomplete";
|
|
45
45
|
provider_meta?: Record<string, unknown>;
|
|
46
|
+
/** Tokens summed over the tiles sent to the provider; absent when none were. */
|
|
47
|
+
usage?: CritiqueUsageTotals;
|
|
46
48
|
}
|
|
47
49
|
/**
|
|
48
50
|
* Orientation the provider reads before the rubric: which band this tile is,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-review-judge.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/page-review-judge.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"page-review-judge.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/page-review-judge.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,gBAAgB,EAGrB,KAAK,mBAAmB,EAGzB,MAAM,eAAe,CAAC;AAUvB,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,EAG9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAkB,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf;kCAC8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qEAAqE;IACrE,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,sBAAsB,CAAC;QAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;2EACuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,aAAc,SAAQ,wBAAwB;IAC7D,MAAM,EAAE,uBAAuB,CAAC;IAChC,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,IAAI,CACV,iBAAiB,EACjB,aAAa,GAAG,cAAc,GAAG,gBAAgB,GAAG,cAAc,GAAG,oBAAoB,CAC1F,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,gFAAgF;IAChF,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAUD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA+E1F;AAaD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CAiOpC;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,yBAAyB,GAAG,wBAAwB,EAAE,CAI/F"}
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
// finding (false reviews are allowed, false passes never).
|
|
9
9
|
//
|
|
10
10
|
// Toolkit tier: this module must not import src/core (layering check).
|
|
11
|
+
import { addCritiqueUsage, formatCritiqueUsage, sumCritiqueUsage, } from "./critique.js";
|
|
12
|
+
import { PAGE_REVIEW_MAX_TILE_BUDGET, } from "./page-review-contracts.js";
|
|
11
13
|
import { buildPackNativeEvidence, PAGE_REVIEW_CRITIQUE_SCHEMA, planNativeTileReuse, } from "./page-review-evidence.js";
|
|
12
14
|
import { listPackContexts, readPackContext, readPackTiles, } from "./page-review-pack.js";
|
|
13
15
|
import { loadQaSnapshot } from "./qa-snapshot.js";
|
|
@@ -166,9 +168,21 @@ export async function judgePageReviewPack(options) {
|
|
|
166
168
|
}
|
|
167
169
|
});
|
|
168
170
|
let meta;
|
|
171
|
+
let usage;
|
|
169
172
|
let concurrency = 0;
|
|
170
173
|
const tileTimings = new Array(work.length);
|
|
171
|
-
|
|
174
|
+
// Filled, not sparse: filter() skips holes, which would drop unreported tiles.
|
|
175
|
+
const tileUsage = Array.from({ length: work.length }, () => undefined);
|
|
176
|
+
// Every vision call is a separate model session. A pack above the ceiling
|
|
177
|
+
// (an older pack, or one assembled by hand) is refused whole rather than
|
|
178
|
+
// judged in part, so no flag or pack can turn one judge into hundreds of calls.
|
|
179
|
+
const overCeiling = work.length > PAGE_REVIEW_MAX_TILE_BUDGET
|
|
180
|
+
? `pack needs ${work.length} vision calls, above the per-run ceiling of ` +
|
|
181
|
+
`${PAGE_REVIEW_MAX_TILE_BUDGET}; recapture it with a smaller tile budget`
|
|
182
|
+
: undefined;
|
|
183
|
+
if (overCeiling)
|
|
184
|
+
log(`judge: refused — ${overCeiling}`);
|
|
185
|
+
if (provider && work.length > 0 && !overCeiling) {
|
|
172
186
|
concurrency = Math.max(1, Math.min(options.concurrency ?? provider.concurrency ?? 4, work.length));
|
|
173
187
|
log(`judge: ${work.length} tile(s) across ${records.length} context(s), pool ${concurrency}`);
|
|
174
188
|
let cursor = 0;
|
|
@@ -187,7 +201,14 @@ export async function judgePageReviewPack(options) {
|
|
|
187
201
|
const tileStarted = performance.now();
|
|
188
202
|
let tileOutcome = "passed";
|
|
189
203
|
try {
|
|
190
|
-
const found = await provider({
|
|
204
|
+
const found = await provider({
|
|
205
|
+
url: item.url,
|
|
206
|
+
rubric: item.rubric,
|
|
207
|
+
tile: item.tile,
|
|
208
|
+
reportUsage: (usage) => {
|
|
209
|
+
tileUsage[i] = addCritiqueUsage(tileUsage[i], usage);
|
|
210
|
+
},
|
|
211
|
+
});
|
|
191
212
|
for (const finding of found) {
|
|
192
213
|
entry.findings.push({ ...finding, tile: item.tile.index, tile_id: item.tile.id });
|
|
193
214
|
}
|
|
@@ -208,12 +229,16 @@ export async function judgePageReviewPack(options) {
|
|
|
208
229
|
tile_id: item.tile.id,
|
|
209
230
|
duration_ms: Math.max(0, Math.round(performance.now() - tileStarted)),
|
|
210
231
|
outcome: tileOutcome,
|
|
232
|
+
...(tileUsage[i] ? { usage: tileUsage[i] } : {}),
|
|
211
233
|
};
|
|
212
234
|
}
|
|
213
235
|
}
|
|
214
236
|
};
|
|
215
237
|
await Promise.all(Array.from({ length: concurrency }, () => worker()));
|
|
216
238
|
meta = provider.meta?.();
|
|
239
|
+
// Only tiles the pool reached count; an unreached tile spent nothing.
|
|
240
|
+
usage = sumCritiqueUsage(tileUsage.filter((_, index) => tileTimings[index] !== undefined));
|
|
241
|
+
log(`judge: ${formatCritiqueUsage(usage)}`);
|
|
217
242
|
}
|
|
218
243
|
else if (provider) {
|
|
219
244
|
meta = provider.meta?.();
|
|
@@ -225,11 +250,13 @@ export async function judgePageReviewPack(options) {
|
|
|
225
250
|
const unjudged = entry.review.filter((tile) => !entry.judged.has(tile.id)).length;
|
|
226
251
|
const outcome = !provider
|
|
227
252
|
? "skipped"
|
|
228
|
-
:
|
|
229
|
-
? "
|
|
230
|
-
:
|
|
231
|
-
? "
|
|
232
|
-
:
|
|
253
|
+
: overCeiling
|
|
254
|
+
? "incomplete"
|
|
255
|
+
: findings.some((f) => f.severity === "high")
|
|
256
|
+
? "fail"
|
|
257
|
+
: unjudged > 0 || entry.record.capture_incomplete
|
|
258
|
+
? "incomplete"
|
|
259
|
+
: "pass";
|
|
233
260
|
return {
|
|
234
261
|
context_id: entry.record.id,
|
|
235
262
|
provider: provider ? label : "none",
|
|
@@ -240,11 +267,13 @@ export async function judgePageReviewPack(options) {
|
|
|
240
267
|
outcome,
|
|
241
268
|
findings,
|
|
242
269
|
coverage: entry.record.coverage,
|
|
243
|
-
...(provider
|
|
244
|
-
? {
|
|
245
|
-
: {
|
|
270
|
+
...(!provider
|
|
271
|
+
? {
|
|
246
272
|
error: "no critiqueProvider injected by the host (see HarneryProgramContext.critiqueProvider)",
|
|
247
|
-
}
|
|
273
|
+
}
|
|
274
|
+
: overCeiling
|
|
275
|
+
? { error: overCeiling }
|
|
276
|
+
: {}),
|
|
248
277
|
record: entry.record,
|
|
249
278
|
evidence: {
|
|
250
279
|
schema: PAGE_REVIEW_CRITIQUE_SCHEMA,
|
|
@@ -283,6 +312,7 @@ export async function judgePageReviewPack(options) {
|
|
|
283
312
|
tiles_reused: tilesReused,
|
|
284
313
|
outcome,
|
|
285
314
|
...(meta ? { provider_meta: meta } : {}),
|
|
315
|
+
...(usage ? { usage } : {}),
|
|
286
316
|
};
|
|
287
317
|
}
|
|
288
318
|
/** Strip the in-memory `record` so the result can be written into the pack. */
|
|
@@ -274,6 +274,9 @@ export interface PageReviewCritiqueRecord {
|
|
|
274
274
|
tile_id: string;
|
|
275
275
|
}>;
|
|
276
276
|
coverage: CritiqueCoverage;
|
|
277
|
+
/** Set by a signoff whose complete review would exceed the per-run tile
|
|
278
|
+
* ceiling: the capped coverage is the accepted, sampled review (ADR 0224). */
|
|
279
|
+
coverage_mode?: "sampled";
|
|
277
280
|
error?: string;
|
|
278
281
|
evidence?: {
|
|
279
282
|
schema: string;
|