pi-agent-browser-native 0.2.48 → 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.
Files changed (185) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +16 -6
  3. package/dist/extensions/agent-browser/index.js +785 -0
  4. package/dist/extensions/agent-browser/lib/argv-descriptor.js +71 -0
  5. package/dist/extensions/agent-browser/lib/argv-grammar.js +121 -0
  6. package/dist/extensions/agent-browser/lib/bash-guard.js +190 -0
  7. package/dist/extensions/agent-browser/lib/command-policy.js +85 -0
  8. package/dist/extensions/agent-browser/lib/command-taxonomy.js +302 -0
  9. package/dist/extensions/agent-browser/lib/config-policy.js +686 -0
  10. package/dist/extensions/agent-browser/lib/config.js +122 -0
  11. package/dist/extensions/agent-browser/lib/electron/cdp.js +51 -0
  12. package/dist/extensions/agent-browser/lib/electron/cleanup.js +212 -0
  13. package/dist/extensions/agent-browser/lib/electron/discovery.js +633 -0
  14. package/dist/extensions/agent-browser/lib/electron/launch.js +351 -0
  15. package/{extensions/agent-browser/lib/electron/text.ts → dist/extensions/agent-browser/lib/electron/text.js} +5 -5
  16. package/dist/extensions/agent-browser/lib/executable-path.js +20 -0
  17. package/dist/extensions/agent-browser/lib/fs-utils.js +18 -0
  18. package/dist/extensions/agent-browser/lib/input-modes/electron.js +165 -0
  19. package/dist/extensions/agent-browser/lib/input-modes/job.js +519 -0
  20. package/dist/extensions/agent-browser/lib/input-modes/lookups.js +440 -0
  21. package/dist/extensions/agent-browser/lib/input-modes/params.js +164 -0
  22. package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +119 -0
  23. package/dist/extensions/agent-browser/lib/input-modes/shared.js +42 -0
  24. package/dist/extensions/agent-browser/lib/input-modes/types.js +21 -0
  25. package/dist/extensions/agent-browser/lib/input-modes.js +10 -0
  26. package/dist/extensions/agent-browser/lib/json-schema.js +58 -0
  27. package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +59 -0
  28. package/dist/extensions/agent-browser/lib/navigation-policy.js +83 -0
  29. package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +62 -0
  30. package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +39 -0
  31. package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +276 -0
  32. package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +909 -0
  33. package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +443 -0
  34. package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +47 -0
  35. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/direct-anchor-download.js +141 -0
  36. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +108 -0
  37. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +112 -0
  38. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +158 -0
  39. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +54 -0
  40. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +762 -0
  41. package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +491 -0
  42. package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +40 -0
  43. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-artifacts.js +5 -0
  44. package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +731 -0
  45. package/dist/extensions/agent-browser/lib/orchestration/browser-run/types.js +1 -0
  46. package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +718 -0
  47. package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +247 -0
  48. package/dist/extensions/agent-browser/lib/orchestration/output-file.js +68 -0
  49. package/{extensions/agent-browser/lib/parsing.ts → dist/extensions/agent-browser/lib/parsing.js} +12 -11
  50. package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +241 -0
  51. package/dist/extensions/agent-browser/lib/playbook.js +121 -0
  52. package/dist/extensions/agent-browser/lib/process.js +448 -0
  53. package/dist/extensions/agent-browser/lib/prompt-policy.js +91 -0
  54. package/dist/extensions/agent-browser/lib/results/action-recommendations.js +220 -0
  55. package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +111 -0
  56. package/{extensions/agent-browser/lib/results/artifact-state.ts → dist/extensions/agent-browser/lib/results/artifact-state.js} +4 -8
  57. package/dist/extensions/agent-browser/lib/results/categories.js +76 -0
  58. package/dist/extensions/agent-browser/lib/results/confirmation.js +63 -0
  59. package/dist/extensions/agent-browser/lib/results/contracts.js +8 -0
  60. package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +74 -0
  61. package/dist/extensions/agent-browser/lib/results/envelope.js +166 -0
  62. package/dist/extensions/agent-browser/lib/results/network-routes.js +92 -0
  63. package/dist/extensions/agent-browser/lib/results/network.js +73 -0
  64. package/dist/extensions/agent-browser/lib/results/next-actions.js +72 -0
  65. package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +515 -0
  66. package/dist/extensions/agent-browser/lib/results/presentation/batch.js +397 -0
  67. package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +55 -0
  68. package/dist/extensions/agent-browser/lib/results/presentation/common.js +46 -0
  69. package/dist/extensions/agent-browser/lib/results/presentation/content.js +24 -0
  70. package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +960 -0
  71. package/dist/extensions/agent-browser/lib/results/presentation/errors.js +205 -0
  72. package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +134 -0
  73. package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +159 -0
  74. package/dist/extensions/agent-browser/lib/results/presentation/registry.js +216 -0
  75. package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +104 -0
  76. package/dist/extensions/agent-browser/lib/results/presentation/skills.js +152 -0
  77. package/dist/extensions/agent-browser/lib/results/presentation.js +177 -0
  78. package/dist/extensions/agent-browser/lib/results/recovery-actions.js +107 -0
  79. package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +50 -0
  80. package/dist/extensions/agent-browser/lib/results/selector-recovery.js +225 -0
  81. package/{extensions/agent-browser/lib/results/shared.ts → dist/extensions/agent-browser/lib/results/shared.js} +0 -1
  82. package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +208 -0
  83. package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +78 -0
  84. package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +331 -0
  85. package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +40 -0
  86. package/dist/extensions/agent-browser/lib/results/snapshot.js +264 -0
  87. package/dist/extensions/agent-browser/lib/results/text.js +40 -0
  88. package/{extensions/agent-browser/lib/results.ts → dist/extensions/agent-browser/lib/results.js} +2 -32
  89. package/dist/extensions/agent-browser/lib/runtime.js +816 -0
  90. package/dist/extensions/agent-browser/lib/session-page-state.js +411 -0
  91. package/dist/extensions/agent-browser/lib/string-enum-schema.js +13 -0
  92. package/dist/extensions/agent-browser/lib/temp.js +498 -0
  93. package/dist/extensions/agent-browser/lib/web-search.js +562 -0
  94. package/docs/RELEASE.md +22 -11
  95. package/docs/SUPPORT_MATRIX.md +4 -3
  96. package/package.json +9 -5
  97. package/scripts/config.mjs +8 -2
  98. package/scripts/doctor.mjs +8 -7
  99. package/extensions/agent-browser/index.ts +0 -961
  100. package/extensions/agent-browser/lib/argv-descriptor.ts +0 -90
  101. package/extensions/agent-browser/lib/argv-grammar.ts +0 -128
  102. package/extensions/agent-browser/lib/bash-guard.ts +0 -205
  103. package/extensions/agent-browser/lib/command-policy.ts +0 -71
  104. package/extensions/agent-browser/lib/command-taxonomy.ts +0 -336
  105. package/extensions/agent-browser/lib/config-policy.js +0 -690
  106. package/extensions/agent-browser/lib/config.ts +0 -211
  107. package/extensions/agent-browser/lib/electron/cdp.ts +0 -69
  108. package/extensions/agent-browser/lib/electron/cleanup.ts +0 -235
  109. package/extensions/agent-browser/lib/electron/discovery.ts +0 -710
  110. package/extensions/agent-browser/lib/electron/launch.ts +0 -499
  111. package/extensions/agent-browser/lib/executable-path.ts +0 -19
  112. package/extensions/agent-browser/lib/fs-utils.ts +0 -18
  113. package/extensions/agent-browser/lib/input-modes/electron.ts +0 -170
  114. package/extensions/agent-browser/lib/input-modes/job.ts +0 -527
  115. package/extensions/agent-browser/lib/input-modes/lookups.ts +0 -447
  116. package/extensions/agent-browser/lib/input-modes/params.ts +0 -205
  117. package/extensions/agent-browser/lib/input-modes/semantic-action.ts +0 -127
  118. package/extensions/agent-browser/lib/input-modes/shared.ts +0 -46
  119. package/extensions/agent-browser/lib/input-modes/types.ts +0 -225
  120. package/extensions/agent-browser/lib/input-modes.ts +0 -45
  121. package/extensions/agent-browser/lib/json-schema.ts +0 -73
  122. package/extensions/agent-browser/lib/launch-scoped-flags.ts +0 -67
  123. package/extensions/agent-browser/lib/navigation-policy.ts +0 -95
  124. package/extensions/agent-browser/lib/orchestration/batch-stdin.ts +0 -65
  125. package/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.ts +0 -44
  126. package/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.ts +0 -280
  127. package/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.ts +0 -914
  128. package/extensions/agent-browser/lib/orchestration/browser-run/final-result.ts +0 -521
  129. package/extensions/agent-browser/lib/orchestration/browser-run/index.ts +0 -53
  130. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/direct-anchor-download.ts +0 -158
  131. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.ts +0 -116
  132. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.ts +0 -147
  133. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.ts +0 -183
  134. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.ts +0 -58
  135. package/extensions/agent-browser/lib/orchestration/browser-run/prepare.ts +0 -847
  136. package/extensions/agent-browser/lib/orchestration/browser-run/process-output.ts +0 -559
  137. package/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.ts +0 -47
  138. package/extensions/agent-browser/lib/orchestration/browser-run/session-artifacts.ts +0 -8
  139. package/extensions/agent-browser/lib/orchestration/browser-run/session-state.ts +0 -868
  140. package/extensions/agent-browser/lib/orchestration/browser-run/types.ts +0 -565
  141. package/extensions/agent-browser/lib/orchestration/electron-host/index.ts +0 -855
  142. package/extensions/agent-browser/lib/orchestration/input-plan.ts +0 -375
  143. package/extensions/agent-browser/lib/orchestration/output-file.ts +0 -86
  144. package/extensions/agent-browser/lib/pi-tool-rendering.ts +0 -267
  145. package/extensions/agent-browser/lib/playbook.ts +0 -142
  146. package/extensions/agent-browser/lib/process.ts +0 -516
  147. package/extensions/agent-browser/lib/prompt-policy.ts +0 -105
  148. package/extensions/agent-browser/lib/results/action-recommendations.ts +0 -264
  149. package/extensions/agent-browser/lib/results/artifact-manifest.ts +0 -111
  150. package/extensions/agent-browser/lib/results/categories.ts +0 -106
  151. package/extensions/agent-browser/lib/results/confirmation.ts +0 -76
  152. package/extensions/agent-browser/lib/results/contracts.ts +0 -241
  153. package/extensions/agent-browser/lib/results/editable-ref-evidence.ts +0 -72
  154. package/extensions/agent-browser/lib/results/envelope.ts +0 -195
  155. package/extensions/agent-browser/lib/results/network-routes.ts +0 -83
  156. package/extensions/agent-browser/lib/results/network.ts +0 -78
  157. package/extensions/agent-browser/lib/results/next-actions.ts +0 -117
  158. package/extensions/agent-browser/lib/results/presentation/artifacts.ts +0 -588
  159. package/extensions/agent-browser/lib/results/presentation/batch.ts +0 -450
  160. package/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.ts +0 -67
  161. package/extensions/agent-browser/lib/results/presentation/common.ts +0 -53
  162. package/extensions/agent-browser/lib/results/presentation/content.ts +0 -36
  163. package/extensions/agent-browser/lib/results/presentation/diagnostics.ts +0 -923
  164. package/extensions/agent-browser/lib/results/presentation/errors.ts +0 -227
  165. package/extensions/agent-browser/lib/results/presentation/large-output.ts +0 -182
  166. package/extensions/agent-browser/lib/results/presentation/navigation.ts +0 -184
  167. package/extensions/agent-browser/lib/results/presentation/registry.ts +0 -242
  168. package/extensions/agent-browser/lib/results/presentation/semantic-action.ts +0 -131
  169. package/extensions/agent-browser/lib/results/presentation/skills.ts +0 -143
  170. package/extensions/agent-browser/lib/results/presentation.ts +0 -257
  171. package/extensions/agent-browser/lib/results/recovery-actions.ts +0 -139
  172. package/extensions/agent-browser/lib/results/recovery-next-actions.ts +0 -71
  173. package/extensions/agent-browser/lib/results/selector-recovery.ts +0 -320
  174. package/extensions/agent-browser/lib/results/snapshot-high-value-controls.ts +0 -273
  175. package/extensions/agent-browser/lib/results/snapshot-refs.ts +0 -100
  176. package/extensions/agent-browser/lib/results/snapshot-segments.ts +0 -366
  177. package/extensions/agent-browser/lib/results/snapshot-spill.ts +0 -63
  178. package/extensions/agent-browser/lib/results/snapshot.ts +0 -329
  179. package/extensions/agent-browser/lib/results/text.ts +0 -40
  180. package/extensions/agent-browser/lib/runtime.ts +0 -988
  181. package/extensions/agent-browser/lib/session-page-state.ts +0 -512
  182. package/extensions/agent-browser/lib/string-enum-schema.ts +0 -20
  183. package/extensions/agent-browser/lib/temp.ts +0 -577
  184. package/extensions/agent-browser/lib/web-search.ts +0 -728
  185. /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
+ }
@@ -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";