pi-agent-browser-native 0.2.47 → 0.2.49
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/CHANGELOG.md +63 -19
- package/README.md +52 -19
- package/dist/extensions/agent-browser/index.js +785 -0
- package/dist/extensions/agent-browser/lib/argv-descriptor.js +71 -0
- package/dist/extensions/agent-browser/lib/argv-grammar.js +121 -0
- package/dist/extensions/agent-browser/lib/bash-guard.js +190 -0
- package/dist/extensions/agent-browser/lib/command-policy.js +85 -0
- package/dist/extensions/agent-browser/lib/command-taxonomy.js +302 -0
- package/dist/extensions/agent-browser/lib/config-policy.js +686 -0
- package/dist/extensions/agent-browser/lib/config.js +122 -0
- package/dist/extensions/agent-browser/lib/electron/cdp.js +51 -0
- package/dist/extensions/agent-browser/lib/electron/cleanup.js +212 -0
- package/dist/extensions/agent-browser/lib/electron/discovery.js +633 -0
- package/dist/extensions/agent-browser/lib/electron/launch.js +351 -0
- package/{extensions/agent-browser/lib/electron/text.ts → dist/extensions/agent-browser/lib/electron/text.js} +5 -5
- package/dist/extensions/agent-browser/lib/executable-path.js +20 -0
- package/dist/extensions/agent-browser/lib/fs-utils.js +18 -0
- package/dist/extensions/agent-browser/lib/input-modes/electron.js +165 -0
- package/dist/extensions/agent-browser/lib/input-modes/job.js +519 -0
- package/dist/extensions/agent-browser/lib/input-modes/lookups.js +440 -0
- package/dist/extensions/agent-browser/lib/input-modes/params.js +164 -0
- package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +119 -0
- package/dist/extensions/agent-browser/lib/input-modes/shared.js +42 -0
- package/dist/extensions/agent-browser/lib/input-modes/types.js +21 -0
- package/dist/extensions/agent-browser/lib/input-modes.js +10 -0
- package/dist/extensions/agent-browser/lib/json-schema.js +58 -0
- package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +59 -0
- package/dist/extensions/agent-browser/lib/navigation-policy.js +83 -0
- package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +62 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +39 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +276 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +909 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +443 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +47 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/direct-anchor-download.js +141 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +108 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +112 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +158 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +54 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +762 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +491 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +40 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-artifacts.js +5 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +731 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/types.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +718 -0
- package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +247 -0
- package/dist/extensions/agent-browser/lib/orchestration/output-file.js +68 -0
- package/{extensions/agent-browser/lib/parsing.ts → dist/extensions/agent-browser/lib/parsing.js} +12 -11
- package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +241 -0
- package/dist/extensions/agent-browser/lib/playbook.js +121 -0
- package/dist/extensions/agent-browser/lib/process.js +448 -0
- package/dist/extensions/agent-browser/lib/prompt-policy.js +91 -0
- package/dist/extensions/agent-browser/lib/results/action-recommendations.js +220 -0
- package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +111 -0
- package/{extensions/agent-browser/lib/results/artifact-state.ts → dist/extensions/agent-browser/lib/results/artifact-state.js} +4 -8
- package/dist/extensions/agent-browser/lib/results/categories.js +76 -0
- package/dist/extensions/agent-browser/lib/results/confirmation.js +63 -0
- package/dist/extensions/agent-browser/lib/results/contracts.js +8 -0
- package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +74 -0
- package/dist/extensions/agent-browser/lib/results/envelope.js +166 -0
- package/dist/extensions/agent-browser/lib/results/network-routes.js +92 -0
- package/dist/extensions/agent-browser/lib/results/network.js +73 -0
- package/dist/extensions/agent-browser/lib/results/next-actions.js +72 -0
- package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +515 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch.js +397 -0
- package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +55 -0
- package/dist/extensions/agent-browser/lib/results/presentation/common.js +46 -0
- package/dist/extensions/agent-browser/lib/results/presentation/content.js +24 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +960 -0
- package/dist/extensions/agent-browser/lib/results/presentation/errors.js +205 -0
- package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +134 -0
- package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +159 -0
- package/dist/extensions/agent-browser/lib/results/presentation/registry.js +216 -0
- package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +104 -0
- package/dist/extensions/agent-browser/lib/results/presentation/skills.js +152 -0
- package/dist/extensions/agent-browser/lib/results/presentation.js +177 -0
- package/dist/extensions/agent-browser/lib/results/recovery-actions.js +107 -0
- package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +50 -0
- package/dist/extensions/agent-browser/lib/results/selector-recovery.js +225 -0
- package/{extensions/agent-browser/lib/results/shared.ts → dist/extensions/agent-browser/lib/results/shared.js} +0 -1
- package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +208 -0
- package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +78 -0
- package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +331 -0
- package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +40 -0
- package/dist/extensions/agent-browser/lib/results/snapshot.js +264 -0
- package/dist/extensions/agent-browser/lib/results/text.js +40 -0
- package/{extensions/agent-browser/lib/results.ts → dist/extensions/agent-browser/lib/results.js} +2 -32
- package/dist/extensions/agent-browser/lib/runtime.js +816 -0
- package/dist/extensions/agent-browser/lib/session-page-state.js +411 -0
- package/dist/extensions/agent-browser/lib/string-enum-schema.js +13 -0
- package/dist/extensions/agent-browser/lib/temp.js +498 -0
- package/dist/extensions/agent-browser/lib/web-search.js +562 -0
- package/docs/ARCHITECTURE.md +10 -10
- package/docs/COMMAND_REFERENCE.md +35 -21
- package/docs/ELECTRON.md +3 -3
- package/docs/RELEASE.md +46 -26
- package/docs/REQUIREMENTS.md +1 -1
- package/docs/SUPPORT_MATRIX.md +35 -106
- package/docs/TOOL_CONTRACT.md +23 -21
- package/package.json +12 -8
- package/scripts/agent-browser-capability-baseline.mjs +6 -3
- package/scripts/config.mjs +8 -2
- package/scripts/doctor.mjs +19 -17
- package/scripts/platform-smoke.mjs +1 -1
- package/extensions/agent-browser/index.ts +0 -952
- package/extensions/agent-browser/lib/argv-descriptor.ts +0 -90
- package/extensions/agent-browser/lib/argv-grammar.ts +0 -128
- package/extensions/agent-browser/lib/bash-guard.ts +0 -205
- package/extensions/agent-browser/lib/command-policy.ts +0 -71
- package/extensions/agent-browser/lib/command-taxonomy.ts +0 -336
- package/extensions/agent-browser/lib/config-policy.js +0 -690
- package/extensions/agent-browser/lib/config.ts +0 -209
- package/extensions/agent-browser/lib/electron/cdp.ts +0 -69
- package/extensions/agent-browser/lib/electron/cleanup.ts +0 -235
- package/extensions/agent-browser/lib/electron/discovery.ts +0 -710
- package/extensions/agent-browser/lib/electron/launch.ts +0 -499
- package/extensions/agent-browser/lib/executable-path.ts +0 -19
- package/extensions/agent-browser/lib/fs-utils.ts +0 -18
- package/extensions/agent-browser/lib/input-modes/electron.ts +0 -170
- package/extensions/agent-browser/lib/input-modes/job.ts +0 -451
- package/extensions/agent-browser/lib/input-modes/lookups.ts +0 -447
- package/extensions/agent-browser/lib/input-modes/params.ts +0 -205
- package/extensions/agent-browser/lib/input-modes/semantic-action.ts +0 -127
- package/extensions/agent-browser/lib/input-modes/shared.ts +0 -46
- package/extensions/agent-browser/lib/input-modes/types.ts +0 -225
- package/extensions/agent-browser/lib/input-modes.ts +0 -45
- package/extensions/agent-browser/lib/json-schema.ts +0 -73
- package/extensions/agent-browser/lib/launch-scoped-flags.ts +0 -67
- package/extensions/agent-browser/lib/navigation-policy.ts +0 -95
- package/extensions/agent-browser/lib/orchestration/batch-stdin.ts +0 -65
- package/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.ts +0 -257
- package/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.ts +0 -912
- package/extensions/agent-browser/lib/orchestration/browser-run/final-result.ts +0 -512
- package/extensions/agent-browser/lib/orchestration/browser-run/index.ts +0 -53
- package/extensions/agent-browser/lib/orchestration/browser-run/prepare.ts +0 -1481
- package/extensions/agent-browser/lib/orchestration/browser-run/process-output.ts +0 -564
- package/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.ts +0 -47
- package/extensions/agent-browser/lib/orchestration/browser-run/session-state.ts +0 -868
- package/extensions/agent-browser/lib/orchestration/browser-run/types.ts +0 -564
- package/extensions/agent-browser/lib/orchestration/electron-host/index.ts +0 -855
- package/extensions/agent-browser/lib/orchestration/input-plan.ts +0 -375
- package/extensions/agent-browser/lib/orchestration/output-file.ts +0 -86
- package/extensions/agent-browser/lib/pi-tool-rendering.ts +0 -252
- package/extensions/agent-browser/lib/playbook.ts +0 -142
- package/extensions/agent-browser/lib/process.ts +0 -516
- package/extensions/agent-browser/lib/prompt-policy.ts +0 -105
- package/extensions/agent-browser/lib/results/action-recommendations.ts +0 -264
- package/extensions/agent-browser/lib/results/artifact-manifest.ts +0 -111
- package/extensions/agent-browser/lib/results/categories.ts +0 -106
- package/extensions/agent-browser/lib/results/confirmation.ts +0 -76
- package/extensions/agent-browser/lib/results/contracts.ts +0 -241
- package/extensions/agent-browser/lib/results/editable-ref-evidence.ts +0 -72
- package/extensions/agent-browser/lib/results/envelope.ts +0 -195
- package/extensions/agent-browser/lib/results/network-routes.ts +0 -83
- package/extensions/agent-browser/lib/results/network.ts +0 -78
- package/extensions/agent-browser/lib/results/next-actions.ts +0 -117
- package/extensions/agent-browser/lib/results/presentation/artifacts.ts +0 -588
- package/extensions/agent-browser/lib/results/presentation/batch.ts +0 -450
- package/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.ts +0 -67
- package/extensions/agent-browser/lib/results/presentation/common.ts +0 -53
- package/extensions/agent-browser/lib/results/presentation/content.ts +0 -36
- package/extensions/agent-browser/lib/results/presentation/diagnostics.ts +0 -923
- package/extensions/agent-browser/lib/results/presentation/errors.ts +0 -227
- package/extensions/agent-browser/lib/results/presentation/large-output.ts +0 -182
- package/extensions/agent-browser/lib/results/presentation/navigation.ts +0 -184
- package/extensions/agent-browser/lib/results/presentation/registry.ts +0 -242
- package/extensions/agent-browser/lib/results/presentation/semantic-action.ts +0 -131
- package/extensions/agent-browser/lib/results/presentation/skills.ts +0 -143
- package/extensions/agent-browser/lib/results/presentation.ts +0 -257
- package/extensions/agent-browser/lib/results/recovery-actions.ts +0 -139
- package/extensions/agent-browser/lib/results/recovery-next-actions.ts +0 -71
- package/extensions/agent-browser/lib/results/selector-recovery.ts +0 -320
- package/extensions/agent-browser/lib/results/snapshot-high-value-controls.ts +0 -273
- package/extensions/agent-browser/lib/results/snapshot-refs.ts +0 -100
- package/extensions/agent-browser/lib/results/snapshot-segments.ts +0 -366
- package/extensions/agent-browser/lib/results/snapshot-spill.ts +0 -63
- package/extensions/agent-browser/lib/results/snapshot.ts +0 -329
- package/extensions/agent-browser/lib/results/text.ts +0 -40
- package/extensions/agent-browser/lib/runtime.ts +0 -988
- package/extensions/agent-browser/lib/session-page-state.ts +0 -512
- package/extensions/agent-browser/lib/string-enum-schema.ts +0 -20
- package/extensions/agent-browser/lib/temp.ts +0 -577
- package/extensions/agent-browser/lib/web-search.ts +0 -721
- /package/{extensions/agent-browser/lib/orchestration/browser-run.ts → dist/extensions/agent-browser/lib/orchestration/browser-run.js} +0 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purpose: Compact large agent-browser snapshots into actionable pi-facing previews while preserving access to the raw payload when budgets allow.
|
|
3
|
+
* Responsibilities: Parse the current raw snapshot text format, detect when structured parsing is trustworthy, derive primary/additional content sections, rank high-value refs, and fall back to raw-outline previews when the upstream snapshot text format is unfamiliar.
|
|
4
|
+
* Scope: Snapshot-specific rendering only; generic envelope parsing, non-snapshot summaries, and image attachment live in neighboring modules.
|
|
5
|
+
* Usage: Imported by the focused presentation module for snapshot content and summary rendering.
|
|
6
|
+
* Invariants/Assumptions: Snapshot compaction should stay helpful even if upstream snapshot text formatting shifts, so structured parsing is best-effort and always has a resilient raw-outline fallback.
|
|
7
|
+
*/
|
|
8
|
+
import { isRecord } from "../parsing.js";
|
|
9
|
+
import { isHighValueControlEntry, selectHighValueControlEntries } from "./snapshot-high-value-controls.js";
|
|
10
|
+
import { buildFallbackSnapshotOutline, buildRefLineOrderMap, buildSegmentPreview, buildSnapshotSegments, canUseStructuredSnapshotPreview, chooseAdditionalSegments, choosePrimarySegment, getMeaningfulSegmentLines, getSnapshotRolePriority, isChromeSectionName, isNoiseName, parseSnapshotLines, } from "./snapshot-segments.js";
|
|
11
|
+
import { applySnapshotArtifactManifest, writeSnapshotSpillFile } from "./snapshot-spill.js";
|
|
12
|
+
import { enrichSnapshotRefEntries, getSnapshotRefEntries, } from "./snapshot-refs.js";
|
|
13
|
+
import { compareRefIds, countLines, truncateText } from "./text.js";
|
|
14
|
+
const SNAPSHOT_INLINE_MAX_CHARS = 6_000;
|
|
15
|
+
const SNAPSHOT_INLINE_MAX_LINES = 80;
|
|
16
|
+
const SNAPSHOT_INLINE_MAX_REFS = 60;
|
|
17
|
+
const SNAPSHOT_PRIMARY_PREVIEW_LINES = 8;
|
|
18
|
+
const SNAPSHOT_SECTION_PREVIEW_LINES = 2;
|
|
19
|
+
const SNAPSHOT_KEY_REF_MAX_LINES = 8;
|
|
20
|
+
const SNAPSHOT_OTHER_REF_MAX_LINES = 4;
|
|
21
|
+
const SNAPSHOT_HIGH_VALUE_REF_MAX_LINES = 10;
|
|
22
|
+
const SNAPSHOT_ROLE_COUNT_MAX_ENTRIES = 4;
|
|
23
|
+
const SNAPSHOT_NAME_MAX_CHARS = 96;
|
|
24
|
+
function getSnapshotText(data) {
|
|
25
|
+
return typeof data.snapshot === "string" ? data.snapshot : undefined;
|
|
26
|
+
}
|
|
27
|
+
function getSnapshotOrigin(data) {
|
|
28
|
+
return typeof data.origin === "string" ? data.origin : "(unknown origin)";
|
|
29
|
+
}
|
|
30
|
+
function getSnapshotRoleCounts(refEntries) {
|
|
31
|
+
const counts = {};
|
|
32
|
+
for (const entry of refEntries) {
|
|
33
|
+
counts[entry.role] = (counts[entry.role] ?? 0) + 1;
|
|
34
|
+
}
|
|
35
|
+
return counts;
|
|
36
|
+
}
|
|
37
|
+
function formatRoleCounts(roleCounts) {
|
|
38
|
+
const entries = Object.entries(roleCounts);
|
|
39
|
+
if (entries.length === 0)
|
|
40
|
+
return undefined;
|
|
41
|
+
const ordered = entries.sort((left, right) => {
|
|
42
|
+
if (right[1] !== left[1])
|
|
43
|
+
return right[1] - left[1];
|
|
44
|
+
return getSnapshotRolePriority(left[0]) - getSnapshotRolePriority(right[0]);
|
|
45
|
+
});
|
|
46
|
+
const visibleEntries = ordered.slice(0, SNAPSHOT_ROLE_COUNT_MAX_ENTRIES).map(([role, count]) => `${role} ${count}`);
|
|
47
|
+
const omittedEntries = Math.max(0, ordered.length - visibleEntries.length);
|
|
48
|
+
if (omittedEntries > 0) {
|
|
49
|
+
visibleEntries.push(`+${omittedEntries} more`);
|
|
50
|
+
}
|
|
51
|
+
return visibleEntries.join(", ");
|
|
52
|
+
}
|
|
53
|
+
function rankRefEntries(refEntries, previewRefIds, focusRefIds, lineOrderByRef) {
|
|
54
|
+
return [...refEntries].sort((left, right) => {
|
|
55
|
+
const leftBucket = previewRefIds.has(left.id) ? 0 : focusRefIds.has(left.id) ? 1 : 2;
|
|
56
|
+
const rightBucket = previewRefIds.has(right.id) ? 0 : focusRefIds.has(right.id) ? 1 : 2;
|
|
57
|
+
if (leftBucket !== rightBucket)
|
|
58
|
+
return leftBucket - rightBucket;
|
|
59
|
+
const rolePriority = getSnapshotRolePriority(left.role) - getSnapshotRolePriority(right.role);
|
|
60
|
+
if (rolePriority !== 0)
|
|
61
|
+
return rolePriority;
|
|
62
|
+
const leftHasName = left.name.length > 0 ? 0 : 1;
|
|
63
|
+
const rightHasName = right.name.length > 0 ? 0 : 1;
|
|
64
|
+
if (leftHasName !== rightHasName)
|
|
65
|
+
return leftHasName - rightHasName;
|
|
66
|
+
const leftLineOrder = lineOrderByRef.get(left.id) ?? Number.MAX_SAFE_INTEGER;
|
|
67
|
+
const rightLineOrder = lineOrderByRef.get(right.id) ?? Number.MAX_SAFE_INTEGER;
|
|
68
|
+
if (leftLineOrder !== rightLineOrder)
|
|
69
|
+
return leftLineOrder - rightLineOrder;
|
|
70
|
+
return compareRefIds(left.id, right.id);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function formatCompactRef(entry) {
|
|
74
|
+
const suffix = entry.name.length > 0 ? ` "${truncateText(entry.name, SNAPSHOT_NAME_MAX_CHARS)}"` : "";
|
|
75
|
+
return `- ${entry.id} ${entry.role}${suffix}`;
|
|
76
|
+
}
|
|
77
|
+
function shouldCompactSnapshot(rawText, data) {
|
|
78
|
+
const snapshot = getSnapshotText(data) ?? "";
|
|
79
|
+
const refEntries = getSnapshotRefEntries(data);
|
|
80
|
+
return (rawText.length > SNAPSHOT_INLINE_MAX_CHARS ||
|
|
81
|
+
countLines(snapshot) > SNAPSHOT_INLINE_MAX_LINES ||
|
|
82
|
+
refEntries.length > SNAPSHOT_INLINE_MAX_REFS);
|
|
83
|
+
}
|
|
84
|
+
export function formatSnapshotSummary(data) {
|
|
85
|
+
const origin = typeof data.origin === "string" ? data.origin : "page";
|
|
86
|
+
const refs = isRecord(data.refs) ? Object.keys(data.refs).length : 0;
|
|
87
|
+
return `Snapshot: ${refs} refs on ${origin}`;
|
|
88
|
+
}
|
|
89
|
+
export function formatRawSnapshotText(data) {
|
|
90
|
+
const origin = getSnapshotOrigin(data);
|
|
91
|
+
const refs = isRecord(data.refs) ? Object.keys(data.refs).length : 0;
|
|
92
|
+
const snapshot = getSnapshotText(data);
|
|
93
|
+
if (!snapshot) {
|
|
94
|
+
return `Origin: ${origin}\nRefs: ${refs}\n\n(no interactive elements)`;
|
|
95
|
+
}
|
|
96
|
+
return `Origin: ${origin}\nRefs: ${refs}\n\n${snapshot}`;
|
|
97
|
+
}
|
|
98
|
+
export async function buildSnapshotPresentation(data, persistentArtifactStore = undefined, artifactManifest = undefined) {
|
|
99
|
+
const summary = formatSnapshotSummary(data);
|
|
100
|
+
const rawText = formatRawSnapshotText(data);
|
|
101
|
+
if (!shouldCompactSnapshot(rawText, data)) {
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: "text", text: rawText }],
|
|
104
|
+
data,
|
|
105
|
+
summary,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
let fullOutputPath;
|
|
109
|
+
let spill;
|
|
110
|
+
let spillErrorText;
|
|
111
|
+
try {
|
|
112
|
+
spill = await writeSnapshotSpillFile(data, persistentArtifactStore);
|
|
113
|
+
fullOutputPath = spill.path;
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
spillErrorText = error instanceof Error ? error.message : String(error);
|
|
117
|
+
}
|
|
118
|
+
const snapshot = getSnapshotText(data) ?? "(no interactive elements)";
|
|
119
|
+
const snapshotLines = parseSnapshotLines(snapshot);
|
|
120
|
+
const refEntries = enrichSnapshotRefEntries(getSnapshotRefEntries(data), snapshotLines);
|
|
121
|
+
const roleCounts = getSnapshotRoleCounts(refEntries);
|
|
122
|
+
const roleCountsText = formatRoleCounts(roleCounts);
|
|
123
|
+
const useStructuredPreview = canUseStructuredSnapshotPreview(snapshotLines, refEntries);
|
|
124
|
+
const snapshotSegments = useStructuredPreview ? buildSnapshotSegments(snapshotLines) : [];
|
|
125
|
+
const primarySegment = useStructuredPreview ? choosePrimarySegment(snapshotSegments) : undefined;
|
|
126
|
+
const additionalSegments = useStructuredPreview ? chooseAdditionalSegments(snapshotSegments, primarySegment) : [];
|
|
127
|
+
const additionalSegmentCount = useStructuredPreview && primarySegment ? Math.max(0, snapshotSegments.length - 1) : 0;
|
|
128
|
+
const omittedAdditionalSectionCount = Math.max(0, additionalSegmentCount - additionalSegments.length);
|
|
129
|
+
const primaryPreview = primarySegment ? buildSegmentPreview(primarySegment, SNAPSHOT_PRIMARY_PREVIEW_LINES) : undefined;
|
|
130
|
+
const additionalPreviews = additionalSegments
|
|
131
|
+
.map((segment) => ({
|
|
132
|
+
preview: buildSegmentPreview(segment, SNAPSHOT_SECTION_PREVIEW_LINES),
|
|
133
|
+
segment,
|
|
134
|
+
}))
|
|
135
|
+
.filter(({ preview }) => preview.lines.length > 0);
|
|
136
|
+
const fallbackPreview = !useStructuredPreview || !primaryPreview || primaryPreview.lines.length === 0 ? buildFallbackSnapshotOutline(snapshotLines) : undefined;
|
|
137
|
+
const previewRefIds = new Set([
|
|
138
|
+
...(primaryPreview?.refIds ?? []),
|
|
139
|
+
...additionalPreviews.flatMap(({ preview }) => preview.refIds),
|
|
140
|
+
...(fallbackPreview?.refIds ?? []),
|
|
141
|
+
]);
|
|
142
|
+
const focusRefIds = new Set([
|
|
143
|
+
...(useStructuredPreview && primarySegment
|
|
144
|
+
? getMeaningfulSegmentLines(primarySegment).flatMap((line) => (line.ref ? [line.ref] : []))
|
|
145
|
+
: []),
|
|
146
|
+
...(useStructuredPreview
|
|
147
|
+
? additionalSegments.flatMap((segment) => getMeaningfulSegmentLines(segment).flatMap((line) => (line.ref ? [line.ref] : [])))
|
|
148
|
+
: []),
|
|
149
|
+
...(fallbackPreview?.refIds ?? []),
|
|
150
|
+
]);
|
|
151
|
+
const lineOrderByRef = useStructuredPreview ? buildRefLineOrderMap(snapshotLines) : new Map();
|
|
152
|
+
const rankedRefEntries = rankRefEntries(refEntries, previewRefIds, focusRefIds, lineOrderByRef);
|
|
153
|
+
const visibleRankedRefEntries = rankedRefEntries.filter((entry) => !isNoiseName(entry.name) && !isChromeSectionName(entry.name) && !(entry.role === "heading" && entry.name.length <= 2));
|
|
154
|
+
const keyRefEntries = visibleRankedRefEntries.slice(0, SNAPSHOT_KEY_REF_MAX_LINES);
|
|
155
|
+
const keyRefIdSet = new Set(keyRefEntries.map((entry) => entry.id));
|
|
156
|
+
const otherRefEntries = visibleRankedRefEntries
|
|
157
|
+
.filter((entry) => !keyRefIdSet.has(entry.id))
|
|
158
|
+
.slice(0, SNAPSHOT_OTHER_REF_MAX_LINES);
|
|
159
|
+
const displayedRefIdSet = new Set([...keyRefEntries, ...otherRefEntries].map((entry) => entry.id));
|
|
160
|
+
const omittedRefEntries = visibleRankedRefEntries.filter((entry) => !displayedRefIdSet.has(entry.id));
|
|
161
|
+
const highValueControlEntries = omittedRefEntries.filter((entry) => isHighValueControlEntry(entry) && !isNoiseName(entry.name) && !isChromeSectionName(entry.name));
|
|
162
|
+
const visibleHighValueControlEntries = selectHighValueControlEntries(highValueControlEntries, SNAPSHOT_HIGH_VALUE_REF_MAX_LINES);
|
|
163
|
+
const omittedHighValueControls = Math.max(0, highValueControlEntries.length - visibleHighValueControlEntries.length);
|
|
164
|
+
const omittedNonHighlightedRefs = Math.max(0, omittedRefEntries.length - highValueControlEntries.length);
|
|
165
|
+
const origin = getSnapshotOrigin(data);
|
|
166
|
+
const lines = [
|
|
167
|
+
`Origin: ${origin}`,
|
|
168
|
+
`Refs: ${refEntries.length}`,
|
|
169
|
+
...(roleCountsText ? [`Top roles: ${roleCountsText}`] : []),
|
|
170
|
+
"",
|
|
171
|
+
"Compact snapshot view.",
|
|
172
|
+
"Viewport note: compact snapshots are DOM/signal-prioritized, not guaranteed to start with the currently scrolled viewport; use the full raw snapshot, a screenshot, or listed high-value refs when viewport context matters.",
|
|
173
|
+
];
|
|
174
|
+
if (fallbackPreview) {
|
|
175
|
+
lines.push("", "Compact outline:", ...(fallbackPreview.lines.length > 0 ? fallbackPreview.lines : ["(no interactive elements)"]));
|
|
176
|
+
if (fallbackPreview.omittedCount > 0) {
|
|
177
|
+
lines.push(`- ... (${fallbackPreview.omittedCount} additional snapshot lines omitted; ${fullOutputPath ? `full output path: ${fullOutputPath}` : "the full raw snapshot was omitted"})`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
lines.push("", "Primary content:", ...(primaryPreview?.lines ?? ["(no interactive elements)"]));
|
|
182
|
+
if ((primaryPreview?.omittedCount ?? 0) > 0) {
|
|
183
|
+
lines.push(`- ... (${primaryPreview?.omittedCount} more lines in this section)`);
|
|
184
|
+
}
|
|
185
|
+
if (additionalPreviews.length > 0) {
|
|
186
|
+
lines.push("", "Additional sections:");
|
|
187
|
+
additionalPreviews.forEach(({ preview }, index) => {
|
|
188
|
+
if (index > 0)
|
|
189
|
+
lines.push("");
|
|
190
|
+
lines.push(...preview.lines);
|
|
191
|
+
if (preview.omittedCount > 0) {
|
|
192
|
+
lines.push(`- ... (${preview.omittedCount} more lines in this section)`);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
if (omittedAdditionalSectionCount > 0) {
|
|
196
|
+
lines.push(`- ... (${omittedAdditionalSectionCount} more sections omitted)`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
lines.push("", "Key refs:", ...(keyRefEntries.length > 0 ? keyRefEntries.map(formatCompactRef) : ["(no refs)"]));
|
|
201
|
+
if (otherRefEntries.length > 0) {
|
|
202
|
+
lines.push("", "Other refs:", ...otherRefEntries.map(formatCompactRef));
|
|
203
|
+
}
|
|
204
|
+
if (omittedNonHighlightedRefs > 0) {
|
|
205
|
+
lines.push(`- ... (${omittedNonHighlightedRefs} additional refs omitted)`);
|
|
206
|
+
}
|
|
207
|
+
if (visibleHighValueControlEntries.length > 0) {
|
|
208
|
+
lines.push("", "Omitted high-value controls:", ...visibleHighValueControlEntries.map(formatCompactRef));
|
|
209
|
+
if (omittedHighValueControls > 0) {
|
|
210
|
+
lines.push(`- ... (${omittedHighValueControls} additional high-value controls omitted)`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
lines.push("", fullOutputPath
|
|
214
|
+
? `Full raw snapshot path: ${fullOutputPath}`
|
|
215
|
+
: `Full raw snapshot unavailable: ${spillErrorText ?? "temp spill file could not be created."}`);
|
|
216
|
+
const manifestFields = applySnapshotArtifactManifest({
|
|
217
|
+
baseManifest: artifactManifest,
|
|
218
|
+
command: "snapshot",
|
|
219
|
+
fullOutputPath,
|
|
220
|
+
spill,
|
|
221
|
+
});
|
|
222
|
+
if (manifestFields.artifactRetentionSummary) {
|
|
223
|
+
lines.push("", manifestFields.artifactRetentionSummary);
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
...manifestFields,
|
|
227
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
228
|
+
data: {
|
|
229
|
+
compacted: true,
|
|
230
|
+
fullOutputPath,
|
|
231
|
+
origin,
|
|
232
|
+
previewMode: fallbackPreview ? "outline" : "structured",
|
|
233
|
+
viewportOrdering: "dom-signal-prioritized",
|
|
234
|
+
spillError: spillErrorText,
|
|
235
|
+
previewRefIds: [...previewRefIds],
|
|
236
|
+
highValueControlRefIds: visibleHighValueControlEntries.map((entry) => entry.id),
|
|
237
|
+
additionalSectionsOmitted: omittedAdditionalSectionCount,
|
|
238
|
+
previewSections: [
|
|
239
|
+
...(primarySegment
|
|
240
|
+
? [
|
|
241
|
+
{
|
|
242
|
+
linesShown: primaryPreview?.lines.length ?? 0,
|
|
243
|
+
omittedLines: primaryPreview?.omittedCount ?? 0,
|
|
244
|
+
role: primarySegment.root.role,
|
|
245
|
+
title: primarySegment.root.name,
|
|
246
|
+
},
|
|
247
|
+
]
|
|
248
|
+
: []),
|
|
249
|
+
...additionalPreviews.map(({ preview, segment }) => ({
|
|
250
|
+
linesShown: preview.lines.length,
|
|
251
|
+
omittedLines: preview.omittedCount,
|
|
252
|
+
role: segment.root.role,
|
|
253
|
+
title: segment.root.name,
|
|
254
|
+
})),
|
|
255
|
+
],
|
|
256
|
+
refCount: refEntries.length,
|
|
257
|
+
roleCounts,
|
|
258
|
+
snapshotLineCount: countLines(snapshot),
|
|
259
|
+
structuredPreviewUsed: !fallbackPreview,
|
|
260
|
+
},
|
|
261
|
+
fullOutputPath,
|
|
262
|
+
summary: `${summary} (compact)`,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purpose: Hold tiny text and ref-id helpers shared by result renderers.
|
|
3
|
+
* Responsibilities: Convert unknown values to text, count lines, normalize whitespace, truncate labels, and sort ref ids naturally.
|
|
4
|
+
* Scope: Generic pure utilities only; no agent-browser command policy belongs here.
|
|
5
|
+
* Usage: Imported by envelope, presentation, snapshot, and diagnostic helpers.
|
|
6
|
+
* Invariants/Assumptions: Helpers are deterministic and side-effect free.
|
|
7
|
+
*/
|
|
8
|
+
export function stringifyUnknown(value) {
|
|
9
|
+
if (typeof value === "string")
|
|
10
|
+
return value;
|
|
11
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
12
|
+
return String(value);
|
|
13
|
+
if (value === null || value === undefined)
|
|
14
|
+
return "";
|
|
15
|
+
try {
|
|
16
|
+
return JSON.stringify(value, null, 2);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return String(value);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function countLines(text) {
|
|
23
|
+
return text.length === 0 ? 0 : text.split("\n").length;
|
|
24
|
+
}
|
|
25
|
+
export function normalizeWhitespace(text) {
|
|
26
|
+
return text.replace(/\s+/g, " ").trim();
|
|
27
|
+
}
|
|
28
|
+
export function truncateText(text, maxChars) {
|
|
29
|
+
if (text.length <= maxChars)
|
|
30
|
+
return text;
|
|
31
|
+
return `${text.slice(0, Math.max(1, maxChars - 1))}…`;
|
|
32
|
+
}
|
|
33
|
+
export function compareRefIds(left, right) {
|
|
34
|
+
const leftMatch = left.match(/^(?:[a-zA-Z]+)?(\d+)$/);
|
|
35
|
+
const rightMatch = right.match(/^(?:[a-zA-Z]+)?(\d+)$/);
|
|
36
|
+
if (leftMatch && rightMatch) {
|
|
37
|
+
return Number(leftMatch[1]) - Number(rightMatch[1]);
|
|
38
|
+
}
|
|
39
|
+
return left.localeCompare(right);
|
|
40
|
+
}
|
package/{extensions/agent-browser/lib/results.ts → dist/extensions/agent-browser/lib/results.js}
RENAMED
|
@@ -5,40 +5,10 @@
|
|
|
5
5
|
* Usage: Imported by the extension entrypoint after upstream `agent-browser` execution completes.
|
|
6
6
|
* Invariants/Assumptions: Public exports remain stable even as result-rendering internals are split into narrower modules.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
8
|
export { getAgentBrowserErrorText, parseAgentBrowserEnvelope } from "./results/envelope.js";
|
|
10
9
|
export { buildToolPresentation } from "./results/presentation.js";
|
|
11
10
|
export { applyNetworkRouteRecords, buildNetworkRouteDiagnostics } from "./results/network-routes.js";
|
|
12
|
-
export {
|
|
13
|
-
buildAgentBrowserResultCategoryDetails,
|
|
14
|
-
classifyAgentBrowserFailureCategory,
|
|
15
|
-
classifyAgentBrowserSuccessCategory,
|
|
16
|
-
} from "./results/categories.js";
|
|
11
|
+
export { buildAgentBrowserResultCategoryDetails, classifyAgentBrowserFailureCategory, classifyAgentBrowserSuccessCategory, } from "./results/categories.js";
|
|
17
12
|
export { buildAgentBrowserNextActions } from "./results/action-recommendations.js";
|
|
18
13
|
export { compareRefIds } from "./results/text.js";
|
|
19
|
-
export {
|
|
20
|
-
AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS,
|
|
21
|
-
AGENT_BROWSER_RICH_INPUT_RECOVERY_NEXT_ACTION_IDS,
|
|
22
|
-
getAgentBrowserRichInputRecoveryNextActionId,
|
|
23
|
-
getAgentBrowserRichInputRecoveryNextActionIds,
|
|
24
|
-
} from "./results/recovery-actions.js";
|
|
25
|
-
export type {
|
|
26
|
-
AgentBrowserBatchResult,
|
|
27
|
-
AgentBrowserEnvelope,
|
|
28
|
-
AgentBrowserFailureCategory,
|
|
29
|
-
AgentBrowserNextAction,
|
|
30
|
-
AgentBrowserPageChangeSummary,
|
|
31
|
-
AgentBrowserResultCategory,
|
|
32
|
-
AgentBrowserResultCategoryDetails,
|
|
33
|
-
AgentBrowserSuccessCategory,
|
|
34
|
-
NetworkRouteDiagnostic,
|
|
35
|
-
NetworkRouteRecord,
|
|
36
|
-
FileArtifactKind,
|
|
37
|
-
FileArtifactMetadata,
|
|
38
|
-
ToolPresentation,
|
|
39
|
-
} from "./results/contracts.js";
|
|
40
|
-
export type {
|
|
41
|
-
AgentBrowserRecoveryContext,
|
|
42
|
-
AgentBrowserRecoveryKind,
|
|
43
|
-
AgentBrowserRichInputRecoveryNextActionKind,
|
|
44
|
-
} from "./results/recovery-actions.js";
|
|
14
|
+
export { AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS, AGENT_BROWSER_RICH_INPUT_RECOVERY_NEXT_ACTION_IDS, getAgentBrowserRichInputRecoveryNextActionId, getAgentBrowserRichInputRecoveryNextActionIds, } from "./results/recovery-actions.js";
|