@tangle-network/browser-agent-driver 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/LICENSE +196 -0
  2. package/README.md +149 -0
  3. package/dist/artifacts/composite-sink.d.ts +15 -0
  4. package/dist/artifacts/composite-sink.d.ts.map +1 -0
  5. package/dist/artifacts/composite-sink.js +27 -0
  6. package/dist/artifacts/composite-sink.js.map +1 -0
  7. package/dist/artifacts/filesystem-sink.d.ts +26 -0
  8. package/dist/artifacts/filesystem-sink.d.ts.map +1 -0
  9. package/dist/artifacts/filesystem-sink.js +81 -0
  10. package/dist/artifacts/filesystem-sink.js.map +1 -0
  11. package/dist/artifacts/types.d.ts +97 -0
  12. package/dist/artifacts/types.d.ts.map +1 -0
  13. package/dist/artifacts/types.js +9 -0
  14. package/dist/artifacts/types.js.map +1 -0
  15. package/dist/artifacts/webhook-sink.d.ts +71 -0
  16. package/dist/artifacts/webhook-sink.d.ts.map +1 -0
  17. package/dist/artifacts/webhook-sink.js +117 -0
  18. package/dist/artifacts/webhook-sink.js.map +1 -0
  19. package/dist/brain/index.d.ts +149 -0
  20. package/dist/brain/index.d.ts.map +1 -0
  21. package/dist/brain/index.js +1030 -0
  22. package/dist/brain/index.js.map +1 -0
  23. package/dist/browser-launch.d.ts +27 -0
  24. package/dist/browser-launch.d.ts.map +1 -0
  25. package/dist/browser-launch.js +92 -0
  26. package/dist/browser-launch.js.map +1 -0
  27. package/dist/cli.d.ts +14 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +1035 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/config.d.ts +143 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +205 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/context-budget.d.ts +14 -0
  36. package/dist/context-budget.d.ts.map +1 -0
  37. package/dist/context-budget.js +39 -0
  38. package/dist/context-budget.js.map +1 -0
  39. package/dist/design-audit.d.ts +48 -0
  40. package/dist/design-audit.d.ts.map +1 -0
  41. package/dist/design-audit.js +172 -0
  42. package/dist/design-audit.js.map +1 -0
  43. package/dist/domain-policy.d.ts +4 -0
  44. package/dist/domain-policy.d.ts.map +1 -0
  45. package/dist/domain-policy.js +69 -0
  46. package/dist/domain-policy.js.map +1 -0
  47. package/dist/drivers/block-patterns.d.ts +11 -0
  48. package/dist/drivers/block-patterns.d.ts.map +1 -0
  49. package/dist/drivers/block-patterns.js +123 -0
  50. package/dist/drivers/block-patterns.js.map +1 -0
  51. package/dist/drivers/cdp-page-state.d.ts +22 -0
  52. package/dist/drivers/cdp-page-state.d.ts.map +1 -0
  53. package/dist/drivers/cdp-page-state.js +38 -0
  54. package/dist/drivers/cdp-page-state.js.map +1 -0
  55. package/dist/drivers/cdp-snapshot.d.ts +32 -0
  56. package/dist/drivers/cdp-snapshot.d.ts.map +1 -0
  57. package/dist/drivers/cdp-snapshot.js +120 -0
  58. package/dist/drivers/cdp-snapshot.js.map +1 -0
  59. package/dist/drivers/playwright.d.ts +84 -0
  60. package/dist/drivers/playwright.d.ts.map +1 -0
  61. package/dist/drivers/playwright.js +385 -0
  62. package/dist/drivers/playwright.js.map +1 -0
  63. package/dist/drivers/snapshot.d.ts +134 -0
  64. package/dist/drivers/snapshot.d.ts.map +1 -0
  65. package/dist/drivers/snapshot.js +354 -0
  66. package/dist/drivers/snapshot.js.map +1 -0
  67. package/dist/drivers/types.d.ts +37 -0
  68. package/dist/drivers/types.d.ts.map +1 -0
  69. package/dist/drivers/types.js +5 -0
  70. package/dist/drivers/types.js.map +1 -0
  71. package/dist/env-loader.d.ts +2 -0
  72. package/dist/env-loader.d.ts.map +1 -0
  73. package/dist/env-loader.js +35 -0
  74. package/dist/env-loader.js.map +1 -0
  75. package/dist/formatters/slack.d.ts +37 -0
  76. package/dist/formatters/slack.d.ts.map +1 -0
  77. package/dist/formatters/slack.js +97 -0
  78. package/dist/formatters/slack.js.map +1 -0
  79. package/dist/index.d.ts +60 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +53 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/memory/analyzer.d.ts +67 -0
  84. package/dist/memory/analyzer.d.ts.map +1 -0
  85. package/dist/memory/analyzer.js +265 -0
  86. package/dist/memory/analyzer.js.map +1 -0
  87. package/dist/memory/knowledge.d.ts +55 -0
  88. package/dist/memory/knowledge.d.ts.map +1 -0
  89. package/dist/memory/knowledge.js +115 -0
  90. package/dist/memory/knowledge.js.map +1 -0
  91. package/dist/memory/project-store.d.ts +43 -0
  92. package/dist/memory/project-store.d.ts.map +1 -0
  93. package/dist/memory/project-store.js +119 -0
  94. package/dist/memory/project-store.js.map +1 -0
  95. package/dist/memory/selectors.d.ts +46 -0
  96. package/dist/memory/selectors.d.ts.map +1 -0
  97. package/dist/memory/selectors.js +89 -0
  98. package/dist/memory/selectors.js.map +1 -0
  99. package/dist/memory/store.d.ts +39 -0
  100. package/dist/memory/store.d.ts.map +1 -0
  101. package/dist/memory/store.js +193 -0
  102. package/dist/memory/store.js.map +1 -0
  103. package/dist/model-pricing.d.ts +41 -0
  104. package/dist/model-pricing.d.ts.map +1 -0
  105. package/dist/model-pricing.js +197 -0
  106. package/dist/model-pricing.js.map +1 -0
  107. package/dist/multi-actor.d.ts +108 -0
  108. package/dist/multi-actor.d.ts.map +1 -0
  109. package/dist/multi-actor.js +192 -0
  110. package/dist/multi-actor.js.map +1 -0
  111. package/dist/override-pipeline.d.ts +57 -0
  112. package/dist/override-pipeline.d.ts.map +1 -0
  113. package/dist/override-pipeline.js +26 -0
  114. package/dist/override-pipeline.js.map +1 -0
  115. package/dist/personas.d.ts +19 -0
  116. package/dist/personas.d.ts.map +1 -0
  117. package/dist/personas.js +86 -0
  118. package/dist/personas.js.map +1 -0
  119. package/dist/preview.d.ts +32 -0
  120. package/dist/preview.d.ts.map +1 -0
  121. package/dist/preview.js +138 -0
  122. package/dist/preview.js.map +1 -0
  123. package/dist/provider-defaults.d.ts +6 -0
  124. package/dist/provider-defaults.d.ts.map +1 -0
  125. package/dist/provider-defaults.js +40 -0
  126. package/dist/provider-defaults.js.map +1 -0
  127. package/dist/providers/sandbox-backend.d.ts +22 -0
  128. package/dist/providers/sandbox-backend.d.ts.map +1 -0
  129. package/dist/providers/sandbox-backend.js +259 -0
  130. package/dist/providers/sandbox-backend.js.map +1 -0
  131. package/dist/recovery.d.ts +91 -0
  132. package/dist/recovery.d.ts.map +1 -0
  133. package/dist/recovery.js +500 -0
  134. package/dist/recovery.js.map +1 -0
  135. package/dist/reporters/junit.d.ts +8 -0
  136. package/dist/reporters/junit.d.ts.map +1 -0
  137. package/dist/reporters/junit.js +99 -0
  138. package/dist/reporters/junit.js.map +1 -0
  139. package/dist/run-metrics.d.ts +4 -0
  140. package/dist/run-metrics.d.ts.map +1 -0
  141. package/dist/run-metrics.js +48 -0
  142. package/dist/run-metrics.js.map +1 -0
  143. package/dist/run-state.d.ts +22 -0
  144. package/dist/run-state.d.ts.map +1 -0
  145. package/dist/run-state.js +33 -0
  146. package/dist/run-state.js.map +1 -0
  147. package/dist/runner/goal-verification.d.ts +13 -0
  148. package/dist/runner/goal-verification.d.ts.map +1 -0
  149. package/dist/runner/goal-verification.js +152 -0
  150. package/dist/runner/goal-verification.js.map +1 -0
  151. package/dist/runner/index.d.ts +12 -0
  152. package/dist/runner/index.d.ts.map +1 -0
  153. package/dist/runner/index.js +18 -0
  154. package/dist/runner/index.js.map +1 -0
  155. package/dist/runner/overrides.d.ts +75 -0
  156. package/dist/runner/overrides.d.ts.map +1 -0
  157. package/dist/runner/overrides.js +385 -0
  158. package/dist/runner/overrides.js.map +1 -0
  159. package/dist/runner/page-analysis.d.ts +23 -0
  160. package/dist/runner/page-analysis.d.ts.map +1 -0
  161. package/dist/runner/page-analysis.js +91 -0
  162. package/dist/runner/page-analysis.js.map +1 -0
  163. package/dist/runner/runner.d.ts +66 -0
  164. package/dist/runner/runner.d.ts.map +1 -0
  165. package/dist/runner/runner.js +1314 -0
  166. package/dist/runner/runner.js.map +1 -0
  167. package/dist/runner/scout.d.ts +29 -0
  168. package/dist/runner/scout.d.ts.map +1 -0
  169. package/dist/runner/scout.js +81 -0
  170. package/dist/runner/scout.js.map +1 -0
  171. package/dist/runner/search-guidance.d.ts +31 -0
  172. package/dist/runner/search-guidance.d.ts.map +1 -0
  173. package/dist/runner/search-guidance.js +210 -0
  174. package/dist/runner/search-guidance.js.map +1 -0
  175. package/dist/runner/utils.d.ts +28 -0
  176. package/dist/runner/utils.d.ts.map +1 -0
  177. package/dist/runner/utils.js +119 -0
  178. package/dist/runner/utils.js.map +1 -0
  179. package/dist/runner.d.ts +8 -0
  180. package/dist/runner.d.ts.map +1 -0
  181. package/dist/runner.js +21 -0
  182. package/dist/runner.js.map +1 -0
  183. package/dist/supervisor/critic.d.ts +29 -0
  184. package/dist/supervisor/critic.d.ts.map +1 -0
  185. package/dist/supervisor/critic.js +320 -0
  186. package/dist/supervisor/critic.js.map +1 -0
  187. package/dist/supervisor/policy.d.ts +11 -0
  188. package/dist/supervisor/policy.d.ts.map +1 -0
  189. package/dist/supervisor/policy.js +118 -0
  190. package/dist/supervisor/policy.js.map +1 -0
  191. package/dist/test-report.d.ts +15 -0
  192. package/dist/test-report.d.ts.map +1 -0
  193. package/dist/test-report.js +241 -0
  194. package/dist/test-report.js.map +1 -0
  195. package/dist/test-runner.d.ts +99 -0
  196. package/dist/test-runner.d.ts.map +1 -0
  197. package/dist/test-runner.js +1075 -0
  198. package/dist/test-runner.js.map +1 -0
  199. package/dist/types.d.ts +493 -0
  200. package/dist/types.d.ts.map +1 -0
  201. package/dist/types.js +5 -0
  202. package/dist/types.js.map +1 -0
  203. package/dist/wallet/automation.d.ts +52 -0
  204. package/dist/wallet/automation.d.ts.map +1 -0
  205. package/dist/wallet/automation.js +507 -0
  206. package/dist/wallet/automation.js.map +1 -0
  207. package/package.json +101 -0
  208. package/scripts/postinstall-provider-patches.mjs +52 -0
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Override producers — post-decision action overrides for the runner pipeline.
3
+ */
4
+ import { getVisibleLinkRecommendation, isFirstPartyContentHub, } from './search-guidance.js';
5
+ import { findElementForRef, findLinkRefByExactText, findLinkRefContainingText, requiresSearchWorkflowEvidence, requiresPressReleaseLikeContent, looksLikeSearchResultsPage, } from './utils.js';
6
+ /**
7
+ * Build the ordered list of override producers for the post-decision pipeline.
8
+ * Each producer wraps one of the existing choose* functions and returns a scored
9
+ * OverrideCandidate, or undefined if the override does not apply.
10
+ */
11
+ export function buildOverrideProducers() {
12
+ return [
13
+ // 1. Search query correction (score 50)
14
+ (ctx) => {
15
+ const result = chooseSearchQueryOverride(ctx.state, ctx.goal, ctx.action);
16
+ if (!result)
17
+ return undefined;
18
+ return {
19
+ name: 'searchQueryOverride',
20
+ action: { action: 'type', selector: result.selector, text: result.query },
21
+ expectedEffect: `The search box should contain the exact task query "${result.query}".`,
22
+ feedback: result.feedback,
23
+ score: 50,
24
+ reasoningTag: 'POLICY OVERRIDE',
25
+ };
26
+ },
27
+ // 2. News tab override (score 40)
28
+ (ctx) => {
29
+ const result = chooseSearchResultsNewsTabOverride(ctx.state, ctx.goal, ctx.action);
30
+ if (!result)
31
+ return undefined;
32
+ return {
33
+ name: 'newsTabOverride',
34
+ action: { action: 'click', selector: result.ref },
35
+ expectedEffect: 'The search results page should switch to the News tab or news-filtered results.',
36
+ feedback: result.feedback,
37
+ score: 40,
38
+ reasoningTag: 'POLICY OVERRIDE',
39
+ };
40
+ },
41
+ // 3. News releases hub override (score 38)
42
+ (ctx) => {
43
+ const result = chooseNewsReleasesHubOverride(ctx.state, ctx.goal, ctx.action);
44
+ if (!result)
45
+ return undefined;
46
+ return {
47
+ name: 'newsReleasesHubOverride',
48
+ action: { action: 'click', selector: result.ref },
49
+ expectedEffect: 'The browser should open the News Releases hub page where the site-specific release search is available.',
50
+ feedback: result.feedback,
51
+ score: 38,
52
+ reasoningTag: 'POLICY OVERRIDE',
53
+ };
54
+ },
55
+ // 4. Visible news release result override (score 36)
56
+ (ctx) => {
57
+ const result = chooseVisibleNewsReleaseResultOverride(ctx.state, ctx.goal, ctx.action);
58
+ if (!result)
59
+ return undefined;
60
+ return {
61
+ name: 'visibleNewsReleaseResultOverride',
62
+ action: { action: 'click', selector: result.ref },
63
+ expectedEffect: 'The matching visible release result should open directly from the News Releases hub.',
64
+ feedback: result.feedback,
65
+ score: 36,
66
+ reasoningTag: 'POLICY OVERRIDE',
67
+ };
68
+ },
69
+ // 5. Visible search result override (score 34)
70
+ (ctx) => {
71
+ const result = chooseVisibleSearchResultOverride(ctx.state, ctx.goal, ctx.allowedDomains, ctx.action);
72
+ if (!result)
73
+ return undefined;
74
+ return {
75
+ name: 'visibleSearchResultOverride',
76
+ action: { action: 'click', selector: result.ref },
77
+ expectedEffect: 'The strongest visible search result should open directly.',
78
+ feedback: result.feedback,
79
+ score: 34,
80
+ reasoningTag: 'POLICY OVERRIDE',
81
+ };
82
+ },
83
+ // 6. Visible link override (score = match.score * 3)
84
+ (ctx) => {
85
+ const result = chooseVisibleLinkOverride(ctx.state, ctx.action, ctx.visibleLinkMatch);
86
+ if (!result)
87
+ return undefined;
88
+ return {
89
+ name: 'visibleLinkOverride',
90
+ action: { action: 'click', selector: result.ref },
91
+ expectedEffect: 'URL should change',
92
+ feedback: result.feedback,
93
+ score: (ctx.visibleLinkMatch?.score ?? 10) * 3,
94
+ reasoningTag: 'POLICY OVERRIDE',
95
+ };
96
+ },
97
+ // 7. Scout link override (score = confidence * 30)
98
+ (ctx) => {
99
+ const result = chooseScoutLinkOverride(ctx.state, ctx.action, ctx.scoutLinkRecommendation);
100
+ if (!result)
101
+ return undefined;
102
+ return {
103
+ name: 'scoutLinkOverride',
104
+ action: { action: 'click', selector: result.ref },
105
+ expectedEffect: 'URL should change',
106
+ feedback: result.feedback,
107
+ score: (ctx.scoutLinkRecommendation?.confidence ?? 0.7) * 30,
108
+ reasoningTag: 'SCOUT OVERRIDE',
109
+ };
110
+ },
111
+ // 8. Branch link override (score = confidence * 28)
112
+ (ctx) => {
113
+ const result = chooseBranchLinkOverride(ctx.state, ctx.action, ctx.branchLinkRecommendation);
114
+ if (!result)
115
+ return undefined;
116
+ return {
117
+ name: 'branchLinkOverride',
118
+ action: { action: 'click', selector: result.ref },
119
+ expectedEffect: 'URL should change',
120
+ feedback: result.feedback,
121
+ score: (ctx.branchLinkRecommendation?.confidence ?? 0.72) * 28,
122
+ reasoningTag: 'BRANCH OVERRIDE',
123
+ };
124
+ },
125
+ // 9. AI Tangle partner completion (score 100 — terminal, highest)
126
+ (ctx) => {
127
+ if (!ctx.aiTanglePartnerCompletion)
128
+ return undefined;
129
+ if (ctx.action.action === 'complete' || ctx.action.action === 'abort')
130
+ return undefined;
131
+ return {
132
+ name: 'aiTanglePartnerCompletion',
133
+ action: { action: 'complete', result: ctx.aiTanglePartnerCompletion.result },
134
+ expectedEffect: 'Run should terminate after verifying the partner template page.',
135
+ feedback: ctx.aiTanglePartnerCompletion.feedback,
136
+ score: 100,
137
+ reasoningTag: 'POLICY OVERRIDE',
138
+ };
139
+ },
140
+ // 10. AI Tangle output completion (score 95 — terminal)
141
+ (ctx) => {
142
+ if (!ctx.aiTangleOutputCompletion)
143
+ return undefined;
144
+ if (ctx.action.action === 'complete' || ctx.action.action === 'abort')
145
+ return undefined;
146
+ return {
147
+ name: 'aiTangleOutputCompletion',
148
+ action: { action: 'complete', result: ctx.aiTangleOutputCompletion.result },
149
+ expectedEffect: 'Run should terminate with a verified visible output state.',
150
+ feedback: ctx.aiTangleOutputCompletion.feedback,
151
+ score: 95,
152
+ reasoningTag: 'POLICY OVERRIDE',
153
+ };
154
+ },
155
+ // 11. Expandable list gate (score 20 — lowest)
156
+ (ctx) => {
157
+ const result = chooseExpandableListCompletionOverride(ctx.state, ctx.goal, ctx.action);
158
+ if (!result)
159
+ return undefined;
160
+ return {
161
+ name: 'expandableListGate',
162
+ action: { action: 'click', selector: result.ref },
163
+ expectedEffect: 'The remaining list items should become visible.',
164
+ feedback: result.feedback,
165
+ score: 20,
166
+ reasoningTag: 'POLICY OVERRIDE',
167
+ };
168
+ },
169
+ ];
170
+ }
171
+ export function chooseVisibleLinkOverride(state, action, recommendation) {
172
+ if (!recommendation || recommendation.score < 10)
173
+ return undefined;
174
+ if (!isFirstPartyContentHub(state))
175
+ return undefined;
176
+ if (!isContentHubDetourAction(state, action))
177
+ return undefined;
178
+ if (action.action === 'click' && action.selector === recommendation.ref)
179
+ return undefined;
180
+ if (isStructuralHubAction(state, action))
181
+ return undefined;
182
+ return {
183
+ ref: recommendation.ref,
184
+ feedback: `A high-confidence first-party link is already visible on this page. Do not search again; click ${recommendation.ref} (${recommendation.text}) instead.`,
185
+ };
186
+ }
187
+ export function chooseScoutLinkOverride(state, action, recommendation) {
188
+ if (!recommendation || recommendation.confidence < 0.7)
189
+ return undefined;
190
+ if (action.action === 'click' && action.selector === recommendation.ref)
191
+ return undefined;
192
+ if (!isSearchAction(state, action) && !isContentHubDetourAction(state, action) && !isCandidateClick(state, action)) {
193
+ return undefined;
194
+ }
195
+ return {
196
+ ref: recommendation.ref,
197
+ feedback: `Scout recommendation: click ${recommendation.ref} (${recommendation.text}) instead. ${recommendation.reasoning}`,
198
+ };
199
+ }
200
+ export function chooseBranchLinkOverride(state, action, recommendation) {
201
+ if (!recommendation || recommendation.confidence < 0.72)
202
+ return undefined;
203
+ if (action.action === 'click' && action.selector === recommendation.ref)
204
+ return undefined;
205
+ if (!isSearchAction(state, action) && !isContentHubDetourAction(state, action) && !isCandidateClick(state, action)) {
206
+ return undefined;
207
+ }
208
+ return {
209
+ ref: recommendation.ref,
210
+ feedback: `Bounded branch preview recommends ${recommendation.ref} (${recommendation.text}) instead. ${recommendation.reasoning}`,
211
+ };
212
+ }
213
+ export function buildScoutLinkRecommendationText(recommendation) {
214
+ return [
215
+ 'SCOUT RECOMMENDATION:',
216
+ `Prefer clicking ${recommendation.ref} (${recommendation.text}).`,
217
+ `Scout confidence: ${recommendation.confidence.toFixed(2)}.`,
218
+ `Scout reasoning: ${recommendation.reasoning}`,
219
+ ].join('\n');
220
+ }
221
+ export function buildBranchLinkRecommendationText(recommendation) {
222
+ return [
223
+ 'BOUNDED BRANCH RECOMMENDATION:',
224
+ `Prefer clicking ${recommendation.ref} (${recommendation.text}).`,
225
+ `Branch confidence: ${recommendation.confidence.toFixed(2)}.`,
226
+ `Branch reasoning: ${recommendation.reasoning}`,
227
+ ].join('\n');
228
+ }
229
+ export function chooseSearchResultsNewsTabOverride(state, goal, action) {
230
+ if (!requiresPressReleaseLikeContent(goal))
231
+ return undefined;
232
+ if (!looksLikeSearchResultsPage(state))
233
+ return undefined;
234
+ const newsTabRef = findLinkRefByExactText(state.snapshot, 'News');
235
+ if (!newsTabRef)
236
+ return undefined;
237
+ if (action.action === 'click' && action.selector === newsTabRef)
238
+ return undefined;
239
+ if (!isCandidateClick(state, action) && !isSearchAction(state, action))
240
+ return undefined;
241
+ return {
242
+ ref: newsTabRef,
243
+ feedback: 'For press/news-release tasks on site search results, switch to the visible News tab before opening generic results or topic pages.',
244
+ };
245
+ }
246
+ export function chooseSearchQueryOverride(state, goal, action) {
247
+ if (action.action !== 'type' || !action.selector.startsWith('@'))
248
+ return undefined;
249
+ if (!requiresSearchWorkflowEvidence(goal))
250
+ return undefined;
251
+ const element = findElementForRef(state.snapshot, action.selector)?.toLowerCase() ?? '';
252
+ if (!element.includes('searchbox'))
253
+ return undefined;
254
+ const explicitQuery = Array.from(goal.matchAll(/"([^"]{3,})"/g))
255
+ .map((match) => match[1]?.trim())
256
+ .find(Boolean);
257
+ if (!explicitQuery)
258
+ return undefined;
259
+ if (action.text.trim() === explicitQuery)
260
+ return undefined;
261
+ return {
262
+ selector: action.selector,
263
+ query: explicitQuery,
264
+ feedback: `Use the exact task query "${explicitQuery}" in the site search box instead of reformulating it.`,
265
+ };
266
+ }
267
+ export function chooseNewsReleasesHubOverride(state, goal, action) {
268
+ if (!requiresSearchWorkflowEvidence(goal) || !requiresPressReleaseLikeContent(goal))
269
+ return undefined;
270
+ if (!/\/news-events\/?$/.test(state.url.toLowerCase()))
271
+ return undefined;
272
+ const hubRef = findLinkRefContainingText(state.snapshot, 'All news releases');
273
+ if (!hubRef)
274
+ return undefined;
275
+ if (action.action === 'click' && action.selector === hubRef)
276
+ return undefined;
277
+ if (!isCandidateClick(state, action))
278
+ return undefined;
279
+ return {
280
+ ref: hubRef,
281
+ feedback: 'Open the dedicated News Releases hub before choosing an article so the site-specific release search can prove the first related press release.',
282
+ };
283
+ }
284
+ export function chooseVisibleNewsReleaseResultOverride(state, goal, action) {
285
+ if (!requiresSearchWorkflowEvidence(goal) || !requiresPressReleaseLikeContent(goal))
286
+ return undefined;
287
+ if (!state.url.toLowerCase().includes('/news-events/news-releases'))
288
+ return undefined;
289
+ const explicitQuery = Array.from(goal.matchAll(/"([^"]{3,})"/g))
290
+ .map((match) => match[1]?.trim().toLowerCase())
291
+ .find(Boolean);
292
+ if (!explicitQuery)
293
+ return undefined;
294
+ if (!state.snapshot.toLowerCase().includes(`[value="${explicitQuery}"]`))
295
+ return undefined;
296
+ const recommendation = getVisibleLinkRecommendation(state, goal, ['www.nih.gov']);
297
+ if (!recommendation || recommendation.score < 6)
298
+ return undefined;
299
+ if (/all news releases/i.test(recommendation.text))
300
+ return undefined;
301
+ if (action.action === 'click' && action.selector === recommendation.ref)
302
+ return undefined;
303
+ const shouldOverride = isSearchAction(state, action)
304
+ || action.action === 'press'
305
+ || isCandidateClick(state, action);
306
+ if (!shouldOverride)
307
+ return undefined;
308
+ return {
309
+ ref: recommendation.ref,
310
+ feedback: `A matching news release is already visible for the exact query "${explicitQuery}". Click the visible release instead of re-submitting the search.`,
311
+ };
312
+ }
313
+ export function chooseVisibleSearchResultOverride(state, goal, allowedDomains, action) {
314
+ if (!looksLikeSearchResultsPage(state))
315
+ return undefined;
316
+ const recommendation = getVisibleLinkRecommendation(state, goal, allowedDomains);
317
+ if (!recommendation || recommendation.score < 10)
318
+ return undefined;
319
+ if (action.action === 'click' && action.selector === recommendation.ref)
320
+ return undefined;
321
+ const candidateClick = isCandidateClick(state, action);
322
+ if (!candidateClick && !isSearchAction(state, action))
323
+ return undefined;
324
+ const targetText = candidateClick && action.action === 'click'
325
+ ? (findElementForRef(state.snapshot, action.selector) ?? '').toLowerCase()
326
+ : '';
327
+ const lowerGoal = goal.toLowerCase();
328
+ const wantsProductSearch = lowerGoal.includes('top result')
329
+ || lowerGoal.includes('product search')
330
+ || (lowerGoal.includes('review') && lowerGoal.includes('summary'));
331
+ const chosenLooksDistracting = /\bcustomer services\b|\breviews policy\b|\bhelp\b|\bshopping with us\b/.test(targetText);
332
+ if (!wantsProductSearch && !chosenLooksDistracting)
333
+ return undefined;
334
+ return {
335
+ ref: recommendation.ref,
336
+ feedback: `A stronger visible search result is already present. Click ${recommendation.ref} (${recommendation.text}) instead of the lower-signal search/help link you chose.`,
337
+ };
338
+ }
339
+ export function chooseExpandableListCompletionOverride(state, goal, action) {
340
+ if (action.action !== 'complete')
341
+ return undefined;
342
+ if (!/\blist\b|\bcategories\b|\bcategory\b/.test(goal.toLowerCase()))
343
+ return undefined;
344
+ const lines = state.snapshot.split('\n');
345
+ const topicIndex = lines.findIndex((line) => /\btopic\b/i.test(line));
346
+ if (topicIndex === -1)
347
+ return undefined;
348
+ const window = lines.slice(topicIndex, Math.min(lines.length, topicIndex + 12)).join('\n');
349
+ const match = window.match(/- link "SHOW MORE \((\d+)\)" \[ref=([^\]]+)\]/i);
350
+ if (!match)
351
+ return undefined;
352
+ return {
353
+ ref: `@${match[2]}`,
354
+ feedback: `The requested category list is not fully visible yet. Expand SHOW MORE (${match[1]}) before completing.`,
355
+ };
356
+ }
357
+ function isCandidateClick(state, action) {
358
+ return (action.action === 'click'
359
+ && action.selector.startsWith('@')
360
+ && !!findElementForRef(state.snapshot, action.selector));
361
+ }
362
+ function isSearchAction(state, action) {
363
+ if (!('selector' in action) || !action.selector?.startsWith('@'))
364
+ return false;
365
+ const element = findElementForRef(state.snapshot, action.selector)?.toLowerCase() ?? '';
366
+ return element.includes('searchbox') || element.includes('search');
367
+ }
368
+ function isContentHubDetourAction(state, action) {
369
+ if (isSearchAction(state, action))
370
+ return true;
371
+ if (!('selector' in action) || !action.selector?.startsWith('@'))
372
+ return false;
373
+ const element = findElementForRef(state.snapshot, action.selector)?.toLowerCase() ?? '';
374
+ if (!element)
375
+ return false;
376
+ return (/\b(all news releases|all releases|news releases)\b/.test(element)
377
+ || /\bsearch\b/.test(element));
378
+ }
379
+ function isStructuralHubAction(state, action) {
380
+ if (!('selector' in action) || !action.selector?.startsWith('@'))
381
+ return false;
382
+ const element = findElementForRef(state.snapshot, action.selector)?.toLowerCase() ?? '';
383
+ return /\b(all news releases|all releases)\b/.test(element);
384
+ }
385
+ //# sourceMappingURL=overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/runner/overrides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Page analysis — AI Tangle detection and vision escalation logic.
3
+ */
4
+ import type { AgentConfig, PageState, Scenario, Turn } from '../types.js';
5
+ export declare function detectAiTangleVerifiedOutputState(state: PageState, goal: string): {
6
+ result: string;
7
+ feedback: string;
8
+ } | undefined;
9
+ export declare function detectAiTanglePartnerTemplateVisibleState(state: PageState, goal: string): {
10
+ result: string;
11
+ feedback: string;
12
+ } | undefined;
13
+ export declare function shouldEscalateVision(input: {
14
+ config: AgentConfig;
15
+ state: PageState;
16
+ turns: Turn[];
17
+ scenario: Scenario;
18
+ currentTurn: number;
19
+ maxTurns: number;
20
+ supervisorSignalSeverity: 'none' | 'soft' | 'hard';
21
+ extraContext: string;
22
+ }): boolean;
23
+ //# sourceMappingURL=page-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-analysis.d.ts","sourceRoot":"","sources":["../../src/runner/page-analysis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1E,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAkClD;AAED,wBAAgB,yCAAyC,CACvD,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,GACX;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAsClD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACnD,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAwBV"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Page analysis — AI Tangle detection and vision escalation logic.
3
+ */
4
+ export function detectAiTangleVerifiedOutputState(state, goal) {
5
+ const goalLower = goal.toLowerCase();
6
+ const urlLower = state.url.toLowerCase();
7
+ const snapshotLower = state.snapshot.toLowerCase();
8
+ const requiresVerifiedOutput = goalLower.includes('verified visible output state')
9
+ || goalLower.includes('reach a verified output state')
10
+ || goalLower.includes('usable output');
11
+ if (!requiresVerifiedOutput)
12
+ return undefined;
13
+ if (!urlLower.includes('ai.tangle.tools/chat/'))
14
+ return undefined;
15
+ const hasWorkspaceTabs = snapshotLower.includes('code') && snapshotLower.includes('preview');
16
+ const hasOutputSurface = hasWorkspaceTabs
17
+ || snapshotLower.includes('fresh start')
18
+ || snapshotLower.includes('waiting for files')
19
+ || snapshotLower.includes('fork');
20
+ if (!hasOutputSurface)
21
+ return undefined;
22
+ const visibleCues = [];
23
+ if (hasWorkspaceTabs)
24
+ visibleCues.push('Code/Preview workspace is visible');
25
+ if (snapshotLower.includes('fresh start'))
26
+ visibleCues.push('"Fresh start" output placeholder is visible');
27
+ if (snapshotLower.includes('waiting for files'))
28
+ visibleCues.push('"Waiting for files" status is visible');
29
+ if (snapshotLower.includes('fork'))
30
+ visibleCues.push('a visible Fork control confirms chat output is present');
31
+ const evidence = [`URL: ${state.url}`, ...visibleCues].join('; ');
32
+ return {
33
+ result: `Reached a verified Blueprint output workspace. ${evidence}`,
34
+ feedback: `The main goal is already satisfied: a Blueprint chat workspace with visible output is on screen (${evidence}). Do not open menus or settings. Complete now.`,
35
+ };
36
+ }
37
+ export function detectAiTanglePartnerTemplateVisibleState(state, goal) {
38
+ const goalLower = goal.toLowerCase();
39
+ const urlLower = state.url.toLowerCase();
40
+ const snapshot = state.snapshot;
41
+ const snapshotLower = snapshot.toLowerCase();
42
+ const requiresVisibilityOnly = goalLower.includes('templates are visible')
43
+ || goalLower.includes('verify coinbase templates are visible')
44
+ || goalLower.includes('verify templates are visible');
45
+ if (!requiresVisibilityOnly)
46
+ return undefined;
47
+ if (!urlLower.includes('ai.tangle.tools/partner/'))
48
+ return undefined;
49
+ const templateButtons = Array.from(snapshot.matchAll(/- button "([^"]*View [^"]+ templates[^"]*)" \[ref=([^\]]+)\]/g)).map((match) => ({ text: match[1]?.trim() ?? '', ref: match[2]?.trim() ?? '' }));
50
+ const partnerHeadingMatch = snapshot.match(/- heading "([^"]*Coinbase[^"]*)" \[ref=([^\]]+)\]/i);
51
+ const hasPartnerHeading = Boolean(partnerHeadingMatch);
52
+ if (!hasPartnerHeading || templateButtons.length < 3)
53
+ return undefined;
54
+ const visibleTemplateEvidence = templateButtons
55
+ .slice(0, 5)
56
+ .map((button) => `"${button.text}" [ref=${button.ref}]`)
57
+ .join('; ');
58
+ const headingText = partnerHeadingMatch?.[1]?.trim() ?? 'Coinbase';
59
+ const result = `Verified Coinbase templates are visible on the partner page. ` +
60
+ `URL: ${state.url}; heading: "${headingText}"; visible template buttons: ${visibleTemplateEvidence}.`;
61
+ return {
62
+ result,
63
+ feedback: `The goal is already satisfied on the current partner page: Coinbase template buttons are visibly present under the Coinbase heading. ` +
64
+ `Do not open a template, submit a run, or chase extra actionability proof. Complete now with the visible evidence only.`,
65
+ };
66
+ }
67
+ export function shouldEscalateVision(input) {
68
+ const strategy = input.config.visionStrategy ?? (input.config.vision !== false ? 'always' : 'never');
69
+ if (strategy === 'never')
70
+ return false;
71
+ if (strategy === 'always')
72
+ return true;
73
+ const pageText = `${input.state.url}\n${input.state.title}\n${input.state.snapshot}`.toLowerCase();
74
+ const recentTurns = input.turns.slice(-2);
75
+ const recentError = recentTurns.some((turn) => Boolean(turn.error || turn.verificationFailure));
76
+ const searchLike = /\bsearch\b|\bsearch results\b/.test(pageText);
77
+ const modalLike = /\bdialog\b|\bmodal\b|\boverlay\b|\bmenu\b/.test(pageText);
78
+ const constrainedTask = Array.isArray(input.scenario.allowedDomains) && input.scenario.allowedDomains.length > 0;
79
+ const lowTurns = input.maxTurns - input.currentTurn <= 2;
80
+ const visibleRecommendation = input.extraContext.includes('VISIBLE LINK RECOMMENDATION');
81
+ const repeatedLocation = recentTurns.length >= 2 &&
82
+ recentTurns.every((turn) => turn.state.url === input.state.url);
83
+ const stalledSearch = searchLike && (repeatedLocation || recentError || input.currentTurn >= 6);
84
+ return recentError
85
+ || modalLike
86
+ || lowTurns
87
+ || input.supervisorSignalSeverity !== 'none'
88
+ || stalledSearch
89
+ || (constrainedTask && searchLike && !visibleRecommendation && recentError);
90
+ }
91
+ //# sourceMappingURL=page-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-analysis.js","sourceRoot":"","sources":["../../src/runner/page-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Agent Runner — the main loop with verification, stuck detection, and recovery
3
+ *
4
+ * Loop: observe -> decide -> execute -> verify -> recover (if needed)
5
+ *
6
+ * Key improvements over simple observe-decide-execute:
7
+ * - Post-action verification: checks expectedEffect after each action
8
+ * - Stuck detection: tracks URL + snapshot hash across turns
9
+ * - Recovery strategies: auto-triggered on failure patterns
10
+ * - Plan tracking: detects when the agent repeats the same step
11
+ */
12
+ import type { Driver } from '../drivers/types.js';
13
+ import type { Scenario, AgentConfig, AgentResult, Turn } from '../types.js';
14
+ import type { ProjectStore } from '../memory/project-store.js';
15
+ export interface RunnerOptions {
16
+ driver: Driver;
17
+ config?: AgentConfig;
18
+ /** Called after each turn */
19
+ onTurn?: (turn: Turn) => void;
20
+ /** Called when a first-time phase timing is observed */
21
+ onPhaseTiming?: (phase: 'navigate' | 'observe' | 'decide' | 'execute', durationMs: number) => void;
22
+ /** Reference trajectory to inject into brain context */
23
+ referenceTrajectory?: string;
24
+ /** Project memory store — enables knowledge + selector persistence */
25
+ projectStore?: ProjectStore;
26
+ }
27
+ export declare class AgentRunner {
28
+ private driver;
29
+ private brain;
30
+ private config;
31
+ private onTurn?;
32
+ private onPhaseTiming?;
33
+ private referenceTrajectory?;
34
+ private projectStore?;
35
+ private knowledge?;
36
+ private selectorCache?;
37
+ constructor(options: RunnerOptions);
38
+ run(scenario: Scenario): Promise<AgentResult>;
39
+ private selectFollowUpActions;
40
+ /** Persist knowledge and selector cache to disk */
41
+ private saveMemory;
42
+ /**
43
+ * Verify that an action had the expected effect.
44
+ *
45
+ * Uses a lightweight re-observe to check the page state after an action.
46
+ * IMPORTANT: This calls observe() which resets the refMap. The runner
47
+ * always calls observe() again at the start of the next turn, so this is safe.
48
+ *
49
+ * Checks common patterns:
50
+ * - "URL should contain X" -> check page URL
51
+ * - "element should be visible" -> check snapshot
52
+ * - "text should appear" -> check snapshot
53
+ * - Generic text match -> check if text appears in snapshot
54
+ */
55
+ private verifyEffect;
56
+ private buildSearchResultsScoutFeedback;
57
+ private buildVisibleLinkScoutRecommendation;
58
+ private buildBranchLinkRecommendation;
59
+ private filterScoutCandidatesByAllowedDomains;
60
+ private inspectDisallowedSearchClick;
61
+ private enforceAllowedDomainBoundary;
62
+ private attachDecisionScreenshot;
63
+ }
64
+ /** Convenience function */
65
+ export declare function runAgent(driver: Driver, scenario: Scenario, options?: Omit<RunnerOptions, 'driver'>): Promise<AgentResult>;
66
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAuC,MAAM,aAAa,CAAC;AAIjH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAkC/D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC9B,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACnG,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAuB;IACtC,OAAO,CAAC,aAAa,CAAC,CAAqF;IAC3G,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,SAAS,CAAC,CAAe;IACjC,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,OAAO,EAAE,aAAa;IAU5B,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IA8lCnD,OAAO,CAAC,qBAAqB;IA2B7B,mDAAmD;IACnD,OAAO,CAAC,UAAU;IAWlB;;;;;;;;;;;;OAYG;YACW,YAAY;YA2EZ,+BAA+B;YAgE/B,mCAAmC;YAwCnC,6BAA6B;YAwC7B,qCAAqC;YAoBrC,4BAA4B;YA4B5B,4BAA4B;YAkC5B,wBAAwB;CASvC;AAED,2BAA2B;AAC3B,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,GACtC,OAAO,CAAC,WAAW,CAAC,CAGtB"}