pi-agent-browser-native 0.2.48 → 0.2.50

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 (189) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/README.md +21 -11
  3. package/dist/extensions/agent-browser/index.js +808 -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 +669 -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 +363 -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 +956 -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 +855 -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/ARCHITECTURE.md +5 -5
  95. package/docs/COMMAND_REFERENCE.md +4 -4
  96. package/docs/RELEASE.md +22 -11
  97. package/docs/REQUIREMENTS.md +1 -1
  98. package/docs/SUPPORT_MATRIX.md +5 -4
  99. package/docs/TOOL_CONTRACT.md +1 -1
  100. package/package.json +9 -5
  101. package/scripts/config.mjs +14 -20
  102. package/scripts/doctor.mjs +8 -7
  103. package/extensions/agent-browser/index.ts +0 -961
  104. package/extensions/agent-browser/lib/argv-descriptor.ts +0 -90
  105. package/extensions/agent-browser/lib/argv-grammar.ts +0 -128
  106. package/extensions/agent-browser/lib/bash-guard.ts +0 -205
  107. package/extensions/agent-browser/lib/command-policy.ts +0 -71
  108. package/extensions/agent-browser/lib/command-taxonomy.ts +0 -336
  109. package/extensions/agent-browser/lib/config-policy.js +0 -690
  110. package/extensions/agent-browser/lib/config.ts +0 -211
  111. package/extensions/agent-browser/lib/electron/cdp.ts +0 -69
  112. package/extensions/agent-browser/lib/electron/cleanup.ts +0 -235
  113. package/extensions/agent-browser/lib/electron/discovery.ts +0 -710
  114. package/extensions/agent-browser/lib/electron/launch.ts +0 -499
  115. package/extensions/agent-browser/lib/executable-path.ts +0 -19
  116. package/extensions/agent-browser/lib/fs-utils.ts +0 -18
  117. package/extensions/agent-browser/lib/input-modes/electron.ts +0 -170
  118. package/extensions/agent-browser/lib/input-modes/job.ts +0 -527
  119. package/extensions/agent-browser/lib/input-modes/lookups.ts +0 -447
  120. package/extensions/agent-browser/lib/input-modes/params.ts +0 -205
  121. package/extensions/agent-browser/lib/input-modes/semantic-action.ts +0 -127
  122. package/extensions/agent-browser/lib/input-modes/shared.ts +0 -46
  123. package/extensions/agent-browser/lib/input-modes/types.ts +0 -225
  124. package/extensions/agent-browser/lib/input-modes.ts +0 -45
  125. package/extensions/agent-browser/lib/json-schema.ts +0 -73
  126. package/extensions/agent-browser/lib/launch-scoped-flags.ts +0 -67
  127. package/extensions/agent-browser/lib/navigation-policy.ts +0 -95
  128. package/extensions/agent-browser/lib/orchestration/batch-stdin.ts +0 -65
  129. package/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.ts +0 -44
  130. package/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.ts +0 -280
  131. package/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.ts +0 -914
  132. package/extensions/agent-browser/lib/orchestration/browser-run/final-result.ts +0 -521
  133. package/extensions/agent-browser/lib/orchestration/browser-run/index.ts +0 -53
  134. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/direct-anchor-download.ts +0 -158
  135. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.ts +0 -116
  136. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.ts +0 -147
  137. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.ts +0 -183
  138. package/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.ts +0 -58
  139. package/extensions/agent-browser/lib/orchestration/browser-run/prepare.ts +0 -847
  140. package/extensions/agent-browser/lib/orchestration/browser-run/process-output.ts +0 -559
  141. package/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.ts +0 -47
  142. package/extensions/agent-browser/lib/orchestration/browser-run/session-artifacts.ts +0 -8
  143. package/extensions/agent-browser/lib/orchestration/browser-run/session-state.ts +0 -868
  144. package/extensions/agent-browser/lib/orchestration/browser-run/types.ts +0 -565
  145. package/extensions/agent-browser/lib/orchestration/electron-host/index.ts +0 -855
  146. package/extensions/agent-browser/lib/orchestration/input-plan.ts +0 -375
  147. package/extensions/agent-browser/lib/orchestration/output-file.ts +0 -86
  148. package/extensions/agent-browser/lib/pi-tool-rendering.ts +0 -267
  149. package/extensions/agent-browser/lib/playbook.ts +0 -142
  150. package/extensions/agent-browser/lib/process.ts +0 -516
  151. package/extensions/agent-browser/lib/prompt-policy.ts +0 -105
  152. package/extensions/agent-browser/lib/results/action-recommendations.ts +0 -264
  153. package/extensions/agent-browser/lib/results/artifact-manifest.ts +0 -111
  154. package/extensions/agent-browser/lib/results/categories.ts +0 -106
  155. package/extensions/agent-browser/lib/results/confirmation.ts +0 -76
  156. package/extensions/agent-browser/lib/results/contracts.ts +0 -241
  157. package/extensions/agent-browser/lib/results/editable-ref-evidence.ts +0 -72
  158. package/extensions/agent-browser/lib/results/envelope.ts +0 -195
  159. package/extensions/agent-browser/lib/results/network-routes.ts +0 -83
  160. package/extensions/agent-browser/lib/results/network.ts +0 -78
  161. package/extensions/agent-browser/lib/results/next-actions.ts +0 -117
  162. package/extensions/agent-browser/lib/results/presentation/artifacts.ts +0 -588
  163. package/extensions/agent-browser/lib/results/presentation/batch.ts +0 -450
  164. package/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.ts +0 -67
  165. package/extensions/agent-browser/lib/results/presentation/common.ts +0 -53
  166. package/extensions/agent-browser/lib/results/presentation/content.ts +0 -36
  167. package/extensions/agent-browser/lib/results/presentation/diagnostics.ts +0 -923
  168. package/extensions/agent-browser/lib/results/presentation/errors.ts +0 -227
  169. package/extensions/agent-browser/lib/results/presentation/large-output.ts +0 -182
  170. package/extensions/agent-browser/lib/results/presentation/navigation.ts +0 -184
  171. package/extensions/agent-browser/lib/results/presentation/registry.ts +0 -242
  172. package/extensions/agent-browser/lib/results/presentation/semantic-action.ts +0 -131
  173. package/extensions/agent-browser/lib/results/presentation/skills.ts +0 -143
  174. package/extensions/agent-browser/lib/results/presentation.ts +0 -257
  175. package/extensions/agent-browser/lib/results/recovery-actions.ts +0 -139
  176. package/extensions/agent-browser/lib/results/recovery-next-actions.ts +0 -71
  177. package/extensions/agent-browser/lib/results/selector-recovery.ts +0 -320
  178. package/extensions/agent-browser/lib/results/snapshot-high-value-controls.ts +0 -273
  179. package/extensions/agent-browser/lib/results/snapshot-refs.ts +0 -100
  180. package/extensions/agent-browser/lib/results/snapshot-segments.ts +0 -366
  181. package/extensions/agent-browser/lib/results/snapshot-spill.ts +0 -63
  182. package/extensions/agent-browser/lib/results/snapshot.ts +0 -329
  183. package/extensions/agent-browser/lib/results/text.ts +0 -40
  184. package/extensions/agent-browser/lib/runtime.ts +0 -988
  185. package/extensions/agent-browser/lib/session-page-state.ts +0 -512
  186. package/extensions/agent-browser/lib/string-enum-schema.ts +0 -20
  187. package/extensions/agent-browser/lib/temp.ts +0 -577
  188. package/extensions/agent-browser/lib/web-search.ts +0 -728
  189. /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";