@nuanu-ai/agentbrowse 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/agentpay-stagehand-llm.d.ts +16 -0
- package/dist/agentpay-stagehand-llm.d.ts.map +1 -1
- package/dist/agentpay-stagehand-llm.js +35 -10
- package/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +16 -15
- package/dist/commands/action-acceptance.d.ts +1 -0
- package/dist/commands/action-acceptance.d.ts.map +1 -1
- package/dist/commands/action-acceptance.js +77 -1
- package/dist/commands/extract-snapshot-sanitizer.d.ts +2 -0
- package/dist/commands/extract-snapshot-sanitizer.d.ts.map +1 -0
- package/dist/commands/extract-snapshot-sanitizer.js +65 -0
- package/dist/commands/extract-stagehand-executor.d.ts.map +1 -1
- package/dist/commands/extract-stagehand-executor.js +33 -3
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +29 -0
- package/dist/commands/launch.js +0 -7
- package/dist/commands/observe-projection.d.ts +1 -3
- package/dist/commands/observe-projection.d.ts.map +1 -1
- package/dist/commands/observe-projection.js +110 -3
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +28 -11
- package/dist/playwright-runtime.d.ts +3 -1
- package/dist/playwright-runtime.d.ts.map +1 -1
- package/dist/playwright-runtime.js +42 -2
- package/dist/secrets/fill-ordering.d.ts +1 -2
- package/dist/secrets/fill-ordering.d.ts.map +1 -1
- package/dist/secrets/fill-ordering.js +0 -3
- package/dist/secrets/form-matcher.d.ts.map +1 -1
- package/dist/secrets/form-matcher.js +0 -9
- package/dist/secrets/types.d.ts +0 -9
- package/dist/secrets/types.d.ts.map +1 -1
- package/dist/solver/browser-launcher.d.ts.map +1 -1
- package/dist/solver/browser-launcher.js +492 -55
- package/dist/solver/captcha-detector.d.ts.map +1 -1
- package/dist/solver/captcha-detector.js +187 -12
- package/dist/solver/captcha-runtime.d.ts.map +1 -1
- package/dist/solver/captcha-runtime.js +8 -0
- package/dist/solver/captcha-solver.d.ts +11 -1
- package/dist/solver/captcha-solver.d.ts.map +1 -1
- package/dist/solver/captcha-solver.js +11 -4
- package/dist/solver/turnstile-challenge.d.ts +3 -0
- package/dist/solver/turnstile-challenge.d.ts.map +1 -0
- package/dist/solver/turnstile-challenge.js +173 -0
- package/dist/solver/types.d.ts +10 -8
- package/dist/solver/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/secrets/request-guidance.d.ts +0 -24
- package/dist/secrets/request-guidance.d.ts.map +0 -1
- package/dist/secrets/request-guidance.js +0 -142
|
@@ -1,5 +1,98 @@
|
|
|
1
1
|
import { observedTargetKey } from './observe-semantics.js';
|
|
2
2
|
import { summarizeContext } from './observe-surfaces.js';
|
|
3
|
+
function normalizeClusterText(value) {
|
|
4
|
+
const normalized = value?.replace(/\s+/g, ' ').trim().toLowerCase();
|
|
5
|
+
return normalized ? normalized : undefined;
|
|
6
|
+
}
|
|
7
|
+
function isActionLikeGoalTarget(target) {
|
|
8
|
+
const actions = target.allowedActions ?? [];
|
|
9
|
+
const kind = (target.kind ?? '').trim().toLowerCase();
|
|
10
|
+
const role = (target.role ?? '').trim().toLowerCase();
|
|
11
|
+
const isValueControl = actions.includes('fill') || actions.includes('type') || actions.includes('select');
|
|
12
|
+
if (isValueControl) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return (actions.includes('click') ||
|
|
16
|
+
actions.includes('press') ||
|
|
17
|
+
kind === 'button' ||
|
|
18
|
+
role === 'button' ||
|
|
19
|
+
kind === 'link' ||
|
|
20
|
+
role === 'link');
|
|
21
|
+
}
|
|
22
|
+
function goalActionClusterKey(target) {
|
|
23
|
+
const itemKey = normalizeClusterText(target.context?.item?.label ?? target.context?.item?.text);
|
|
24
|
+
const groupKey = normalizeClusterText(target.context?.group?.label ?? target.context?.group?.text);
|
|
25
|
+
const containerKey = normalizeClusterText(target.context?.container?.label ?? target.context?.container?.text);
|
|
26
|
+
const parts = [
|
|
27
|
+
target.surfaceRef ? `surface:${target.surfaceRef}` : undefined,
|
|
28
|
+
itemKey ? `item:${itemKey}` : undefined,
|
|
29
|
+
groupKey ? `group:${groupKey}` : undefined,
|
|
30
|
+
containerKey ? `container:${containerKey}` : undefined,
|
|
31
|
+
].filter((value) => Boolean(value));
|
|
32
|
+
return parts.length > 0 ? parts.join('|') : undefined;
|
|
33
|
+
}
|
|
34
|
+
function escapeRegExp(value) {
|
|
35
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
36
|
+
}
|
|
37
|
+
function stripSiblingLabels(value, siblingLabels) {
|
|
38
|
+
if (!value) {
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
let sanitized = value;
|
|
42
|
+
for (const label of siblingLabels) {
|
|
43
|
+
if (!label) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
sanitized = sanitized.replace(new RegExp(escapeRegExp(label), 'gi'), ' ');
|
|
47
|
+
}
|
|
48
|
+
const collapsed = sanitized.replace(/\s+[—-]\s+/g, ' ').replace(/\s+/g, ' ').trim();
|
|
49
|
+
return collapsed || undefined;
|
|
50
|
+
}
|
|
51
|
+
function sanitizeGoalTargetContext(target, siblingLabelsByCluster) {
|
|
52
|
+
if (!isActionLikeGoalTarget(target)) {
|
|
53
|
+
return target;
|
|
54
|
+
}
|
|
55
|
+
const clusterKey = goalActionClusterKey(target);
|
|
56
|
+
if (!clusterKey) {
|
|
57
|
+
return target;
|
|
58
|
+
}
|
|
59
|
+
const ownLabel = normalizeClusterText(target.label);
|
|
60
|
+
const siblingLabels = (siblingLabelsByCluster.get(clusterKey) ?? []).filter((label) => label !== ownLabel);
|
|
61
|
+
if (siblingLabels.length === 0 || !target.context) {
|
|
62
|
+
return target;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
...target,
|
|
66
|
+
context: {
|
|
67
|
+
...target.context,
|
|
68
|
+
item: target.context.item
|
|
69
|
+
? {
|
|
70
|
+
...target.context.item,
|
|
71
|
+
text: stripSiblingLabels(target.context.item.text, siblingLabels),
|
|
72
|
+
}
|
|
73
|
+
: target.context.item,
|
|
74
|
+
group: target.context.group
|
|
75
|
+
? {
|
|
76
|
+
...target.context.group,
|
|
77
|
+
text: stripSiblingLabels(target.context.group.text, siblingLabels),
|
|
78
|
+
}
|
|
79
|
+
: target.context.group,
|
|
80
|
+
container: target.context.container
|
|
81
|
+
? {
|
|
82
|
+
...target.context.container,
|
|
83
|
+
text: stripSiblingLabels(target.context.container.text, siblingLabels),
|
|
84
|
+
}
|
|
85
|
+
: target.context.container,
|
|
86
|
+
landmark: target.context.landmark
|
|
87
|
+
? {
|
|
88
|
+
...target.context.landmark,
|
|
89
|
+
text: stripSiblingLabels(target.context.landmark.text, siblingLabels),
|
|
90
|
+
}
|
|
91
|
+
: target.context.landmark,
|
|
92
|
+
hintText: stripSiblingLabels(target.context.hintText, siblingLabels),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
3
96
|
export function compactTargets(targets) {
|
|
4
97
|
return targets.map((target) => ({
|
|
5
98
|
ref: target.ref,
|
|
@@ -36,8 +129,6 @@ export function compactFillableForms(forms) {
|
|
|
36
129
|
fillRef: form.fillRef,
|
|
37
130
|
scopeRef: form.scopeRef,
|
|
38
131
|
purpose: form.purpose,
|
|
39
|
-
recommendedTiming: form.recommendedTiming,
|
|
40
|
-
guidance: form.guidance,
|
|
41
132
|
fields: form.fields.map((field) => ({
|
|
42
133
|
fieldKey: field.fieldKey,
|
|
43
134
|
targetRef: field.targetRef,
|
|
@@ -64,8 +155,24 @@ export function compactSignals(signals) {
|
|
|
64
155
|
}));
|
|
65
156
|
}
|
|
66
157
|
export function buildGoalObserveInventoryCandidates(targets, surfaces) {
|
|
158
|
+
const siblingLabelsByCluster = new Map();
|
|
159
|
+
for (const target of targets) {
|
|
160
|
+
if (!isActionLikeGoalTarget(target)) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const clusterKey = goalActionClusterKey(target);
|
|
164
|
+
const normalizedLabel = normalizeClusterText(target.label);
|
|
165
|
+
if (!clusterKey || !normalizedLabel) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const labels = siblingLabelsByCluster.get(clusterKey) ?? [];
|
|
169
|
+
if (!labels.includes(normalizedLabel)) {
|
|
170
|
+
labels.push(normalizedLabel);
|
|
171
|
+
siblingLabelsByCluster.set(clusterKey, labels);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
67
174
|
const targetCandidates = targets.map((target) => ({
|
|
68
|
-
...target,
|
|
175
|
+
...sanitizeGoalTargetContext(target, siblingLabelsByCluster),
|
|
69
176
|
goalInventoryType: 'target',
|
|
70
177
|
goalTargetKey: observedTargetKey(target),
|
|
71
178
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAgDnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAU/D,eAAO,MAAM,yBAAyB;;;;
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../../src/commands/observe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAgDnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAU/D,eAAO,MAAM,yBAAyB;;;;iBAgQizE,CAAC;gBAAwB,CAAC;;;;;iBAAq7vE,CAAC;gBAAwB,CAAC;;;CAhQ3v0E,CAAC;AACtE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGrC,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyPzF"}
|
package/dist/commands/observe.js
CHANGED
|
@@ -83,18 +83,18 @@ export async function observe(session, instruction) {
|
|
|
83
83
|
const rerankedCandidates = await rerankDomTargetsForGoal(instruction, buildGoalObserveInventoryCandidates(domTargets, surfaceInputs));
|
|
84
84
|
const { targets: goalMatchedTargets, selectedSurfaceIds } = selectTargetsForGoalMatches(domTargets, rerankedCandidates);
|
|
85
85
|
const selectedTargets = prioritizeGoalActionTargets(instruction, expandRerankedFormTargets(domTargets, goalMatchedTargets));
|
|
86
|
+
const persisted = persistObservedSurfacesForPage(session, pageRef, domTargets, {
|
|
87
|
+
allSurfaceInputs: surfaceInputs,
|
|
88
|
+
explicitSurfaceIds: selectedSurfaceIds,
|
|
89
|
+
});
|
|
90
|
+
observedScopes = persisted.observedScopes;
|
|
91
|
+
const surfaceRefMap = persisted.surfaceRefMap;
|
|
92
|
+
const targets = replaceTargetsForPage(session, pageRef, domTargets.map((target) => toDomDescriptor(pageRef, target, surfaceRefMap)));
|
|
93
|
+
reconcileObservedTargetsForPage(session, pageRef, targets);
|
|
94
|
+
attachObservedTargetOwners(domTargets, targets);
|
|
95
|
+
const fillableForms = await persistProtectedFillableFormsForPage(session, pageRef, url, targets, new Date().toISOString());
|
|
86
96
|
if (selectedTargets.length > 0 || selectedSurfaceIds.size > 0) {
|
|
87
|
-
const persisted = persistObservedSurfacesForPage(session, pageRef, domTargets, {
|
|
88
|
-
allSurfaceInputs: surfaceInputs,
|
|
89
|
-
explicitSurfaceIds: selectedSurfaceIds,
|
|
90
|
-
});
|
|
91
|
-
observedScopes = persisted.observedScopes;
|
|
92
|
-
const surfaceRefMap = persisted.surfaceRefMap;
|
|
93
|
-
const targets = replaceTargetsForPage(session, pageRef, domTargets.map((target) => toDomDescriptor(pageRef, target, surfaceRefMap)));
|
|
94
|
-
reconcileObservedTargetsForPage(session, pageRef, targets);
|
|
95
97
|
const explicitScopeRefs = buildExplicitScopeRefs(selectedSurfaceIds, surfaceRefMap);
|
|
96
|
-
attachObservedTargetOwners(domTargets, targets);
|
|
97
|
-
const fillableForms = await persistProtectedFillableFormsForPage(session, pageRef, url, targets, new Date().toISOString());
|
|
98
98
|
const projectedTargets = projectPersistedTargetsForGoal(domTargets, targets, selectedTargets);
|
|
99
99
|
saveSession(session);
|
|
100
100
|
disconnectPlaywright(browser);
|
|
@@ -114,7 +114,24 @@ export async function observe(session, instruction) {
|
|
|
114
114
|
});
|
|
115
115
|
return;
|
|
116
116
|
}
|
|
117
|
-
|
|
117
|
+
saveSession(session);
|
|
118
|
+
disconnectPlaywright(browser);
|
|
119
|
+
browser = null;
|
|
120
|
+
outputJSON({
|
|
121
|
+
success: true,
|
|
122
|
+
pageRef,
|
|
123
|
+
resolvedBy: 'dom-rerank',
|
|
124
|
+
...domRuntimeResolution(),
|
|
125
|
+
scopes: [],
|
|
126
|
+
targets: [],
|
|
127
|
+
signals,
|
|
128
|
+
fillableForms: compactFillableForms(fillableForms),
|
|
129
|
+
metrics: session.runtime?.metrics,
|
|
130
|
+
message: 'No targets matched the requested goal.',
|
|
131
|
+
url,
|
|
132
|
+
title,
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
118
135
|
}
|
|
119
136
|
else {
|
|
120
137
|
stagehandFallbackReason = 'deterministic-observe-empty';
|
|
@@ -26,7 +26,9 @@ export declare function syncLaunchPage(session: BrowseSession, browser: Browser,
|
|
|
26
26
|
targetId?: string;
|
|
27
27
|
}>;
|
|
28
28
|
export declare function resolvePageByRef(browser: Browser, session: BrowseSession, pageRef: string): Promise<Page>;
|
|
29
|
-
export declare function syncSessionPage(session: BrowseSession, pageRef: string, page: Page
|
|
29
|
+
export declare function syncSessionPage(session: BrowseSession, pageRef: string, page: Page, options?: {
|
|
30
|
+
settleTimeoutMs?: number;
|
|
31
|
+
}): Promise<{
|
|
30
32
|
url: string;
|
|
31
33
|
title: string;
|
|
32
34
|
targetId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright-runtime.d.ts","sourceRoot":"","sources":["../src/playwright-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO3D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,CAElD;AAmCD,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"playwright-runtime.d.ts","sourceRoot":"","sources":["../src/playwright-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO3D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,CAElD;AAmCD,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAkJF,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,kBAAkB,CAAC,CAgD7B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgC5D;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB5D"}
|
|
@@ -42,6 +42,15 @@ function isMeaningfulUrl(value) {
|
|
|
42
42
|
function isMeaningfulTitle(value) {
|
|
43
43
|
return Boolean(value?.trim());
|
|
44
44
|
}
|
|
45
|
+
function preferMeaningfulValue(value, fallback, predicate) {
|
|
46
|
+
if (predicate(value)) {
|
|
47
|
+
return value ?? '';
|
|
48
|
+
}
|
|
49
|
+
if (predicate(fallback)) {
|
|
50
|
+
return fallback ?? '';
|
|
51
|
+
}
|
|
52
|
+
return value ?? fallback ?? '';
|
|
53
|
+
}
|
|
45
54
|
function scoreLaunchPageMetadata(metadata, options) {
|
|
46
55
|
const normalizedUrl = normalizeComparableUrl(metadata.url);
|
|
47
56
|
const requestedUrl = normalizeComparableUrl(options.requestedUrl);
|
|
@@ -100,6 +109,37 @@ async function readSessionPageMetadata(session, pageRef, page) {
|
|
|
100
109
|
targetId,
|
|
101
110
|
};
|
|
102
111
|
}
|
|
112
|
+
async function readSettledSessionPageMetadata(session, pageRef, page, options = {}) {
|
|
113
|
+
const existing = session.runtime?.pages[pageRef];
|
|
114
|
+
const deadline = Date.now() + (options.settleTimeoutMs ?? 0);
|
|
115
|
+
let best = null;
|
|
116
|
+
while (Date.now() <= deadline) {
|
|
117
|
+
const metadata = await readSessionPageMetadata(session, pageRef, page);
|
|
118
|
+
const score = (isMeaningfulUrl(metadata.url) ? 100 : 0) +
|
|
119
|
+
(isMeaningfulTitle(metadata.title) ? 20 : 0) +
|
|
120
|
+
(metadata.targetId ? 5 : 0);
|
|
121
|
+
if (!best ||
|
|
122
|
+
score > best.score ||
|
|
123
|
+
(score === best.score && metadata.title.trim().length > best.title.trim().length)) {
|
|
124
|
+
best = { ...metadata, score };
|
|
125
|
+
}
|
|
126
|
+
if (best &&
|
|
127
|
+
isMeaningfulUrl(best.url) &&
|
|
128
|
+
(isMeaningfulTitle(best.title) || best.targetId || Date.now() >= deadline)) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
if (Date.now() >= deadline) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
await sleep(100);
|
|
135
|
+
}
|
|
136
|
+
const metadata = best ?? (await readSessionPageMetadata(session, pageRef, page));
|
|
137
|
+
return {
|
|
138
|
+
url: preferMeaningfulValue(metadata.url, existing?.url, isMeaningfulUrl),
|
|
139
|
+
title: preferMeaningfulValue(metadata.title, existing?.title, isMeaningfulTitle),
|
|
140
|
+
targetId: metadata.targetId ?? existing?.targetId,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
103
143
|
export async function readLaunchPageMetadata(browser, options = {}) {
|
|
104
144
|
const deadline = Date.now() + (options.timeoutMs ?? 2_500);
|
|
105
145
|
let best = null;
|
|
@@ -211,9 +251,9 @@ export async function resolvePageByRef(browser, session, pageRef) {
|
|
|
211
251
|
}
|
|
212
252
|
throw buildPageResolutionError('stale', pageRef);
|
|
213
253
|
}
|
|
214
|
-
export async function syncSessionPage(session, pageRef, page) {
|
|
254
|
+
export async function syncSessionPage(session, pageRef, page, options = {}) {
|
|
215
255
|
ensureRuntimeState(session);
|
|
216
|
-
const { url, title, targetId } = await
|
|
256
|
+
const { url, title, targetId } = await readSettledSessionPageMetadata(session, pageRef, page, options);
|
|
217
257
|
if (session.runtime?.pages[pageRef]) {
|
|
218
258
|
updatePage(session, pageRef, { url, title, targetId });
|
|
219
259
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StoredSecretFieldKey } from './types.js';
|
|
2
2
|
declare function fieldPriority(purpose: string, fieldKey: StoredSecretFieldKey): number;
|
|
3
|
-
export declare function recommendedTimingForProtectedForm(_purpose: string): FillableFormRecommendedTiming;
|
|
4
3
|
export declare function sortProtectedBindingsForExecution<T extends {
|
|
5
4
|
fieldKeys: StoredSecretFieldKey[];
|
|
6
5
|
}>(purpose: string, bindings: ReadonlyArray<T>): T[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-ordering.d.ts","sourceRoot":"","sources":["../../src/secrets/fill-ordering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fill-ordering.d.ts","sourceRoot":"","sources":["../../src/secrets/fill-ordering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA2BvD,iBAAS,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAE9E;AAED,wBAAgB,iCAAiC,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,oBAAoB,EAAE,CAAA;CAAE,EAC/F,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,CAAC,EAAE,CAYL;AAED,eAAO,MAAM,kBAAkB;;CAE9B,CAAC"}
|
|
@@ -24,9 +24,6 @@ const FIELD_PRIORITY_BY_PURPOSE = {
|
|
|
24
24
|
function fieldPriority(purpose, fieldKey) {
|
|
25
25
|
return FIELD_PRIORITY_BY_PURPOSE[purpose]?.[fieldKey] ?? DEFAULT_PRIORITY;
|
|
26
26
|
}
|
|
27
|
-
export function recommendedTimingForProtectedForm(_purpose) {
|
|
28
|
-
return 'late';
|
|
29
|
-
}
|
|
30
27
|
export function sortProtectedBindingsForExecution(purpose, bindings) {
|
|
31
28
|
return bindings
|
|
32
29
|
.map((binding, index) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-matcher.d.ts","sourceRoot":"","sources":["../../src/secrets/form-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAA2B,MAAM,qBAAqB,CAAC;AACrF,OAAO,KAAK,EACV,wBAAwB,EAExB,qBAAqB,EACrB,qBAAqB,EAErB,gBAAgB,EACjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"form-matcher.d.ts","sourceRoot":"","sources":["../../src/secrets/form-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAA2B,MAAM,qBAAqB,CAAC;AACrF,OAAO,KAAK,EACV,wBAAwB,EAExB,qBAAqB,EACrB,qBAAqB,EAErB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAQpB,KAAK,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;AAEhE,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC9C;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAsBD,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW3B,CAAC;AAsCH,iBAAS,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAS3D;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAsC1D;AA6OD,iBAAS,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgBxD;AAED,iBAAS,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,eAAe,EAAE,CAkBvF;AAoFD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAalF;AAED,iBAAS,gBAAgB,CACvB,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GACnF,wBAAwB,EAAE,CA6C5B;AA6KD,wBAAsB,mCAAmC,CACvD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACxC,OAAO,EAAE,qBAAqB,GAAG,IAAI,EACrC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAmD9B;AAED,eAAO,MAAM,iBAAiB;;;;;;;CAO7B,CAAC"}
|
|
@@ -2,9 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { AgentpayStagehandLlmClient } from '../agentpay-stagehand-llm.js';
|
|
3
3
|
import { tryResolveAgentpayGatewayConfig } from '../agentpay-gateway.js';
|
|
4
4
|
import { IDENTITY_FIELD_KEYS, LOGIN_FIELD_KEYS, PAYMENT_CARD_FIELD_KEYS } from './types.js';
|
|
5
|
-
import { recommendedTimingForProtectedForm } from './fill-ordering.js';
|
|
6
5
|
import { normalizeProtectedBindingValueHint, protectedBindingKey, protectedBindingValueHintSchema, } from './protected-bindings.js';
|
|
7
|
-
import { buildFillableFormGuidance } from './request-guidance.js';
|
|
8
6
|
const PROMPT_VALUE_MAX_CHARS = 180;
|
|
9
7
|
const PROMPT_SIGNAL_MAX_CHARS = 220;
|
|
10
8
|
const PROMPT_SIGNAL_MAX_VALUES = 8;
|
|
@@ -583,13 +581,6 @@ export async function matchStoredSecretsToObservedTargets(pageRef, targets, cata
|
|
|
583
581
|
pageRef,
|
|
584
582
|
scopeRef: formScopeRef(planned.fields, targetByRef),
|
|
585
583
|
purpose: kind,
|
|
586
|
-
recommendedTiming: recommendedTimingForProtectedForm(kind),
|
|
587
|
-
guidance: buildFillableFormGuidance({
|
|
588
|
-
purpose: kind,
|
|
589
|
-
recommendedTiming: recommendedTimingForProtectedForm(kind),
|
|
590
|
-
fields: planned.fields,
|
|
591
|
-
targetByRef,
|
|
592
|
-
}),
|
|
593
584
|
fields: planned.fields,
|
|
594
585
|
storedSecretCandidates,
|
|
595
586
|
observedAt: nextObservedAt,
|
package/dist/secrets/types.d.ts
CHANGED
|
@@ -45,12 +45,6 @@ export interface FillableFormFieldBinding {
|
|
|
45
45
|
required?: boolean;
|
|
46
46
|
valueHint?: ProtectedBindingValueHint;
|
|
47
47
|
}
|
|
48
|
-
export interface FillableFormGuidanceHint {
|
|
49
|
-
hint: string;
|
|
50
|
-
why: string;
|
|
51
|
-
recheckWhen?: string;
|
|
52
|
-
evidence: string[];
|
|
53
|
-
}
|
|
54
48
|
export interface FillableFormStoredSecretCandidate {
|
|
55
49
|
storedSecretRef: string;
|
|
56
50
|
kind: StoredSecretKind;
|
|
@@ -61,14 +55,11 @@ export interface FillableFormStoredSecretCandidate {
|
|
|
61
55
|
fieldKeys?: StoredSecretFieldKey[];
|
|
62
56
|
fieldPolicies?: StoredSecretFieldPolicies;
|
|
63
57
|
}
|
|
64
|
-
export type FillableFormRecommendedTiming = 'late';
|
|
65
58
|
export interface PersistedFillableForm {
|
|
66
59
|
fillRef: string;
|
|
67
60
|
pageRef: string;
|
|
68
61
|
scopeRef?: string;
|
|
69
62
|
purpose: string;
|
|
70
|
-
recommendedTiming?: FillableFormRecommendedTiming;
|
|
71
|
-
guidance?: FillableFormGuidanceHint;
|
|
72
63
|
fields: FillableFormFieldBinding[];
|
|
73
64
|
storedSecretCandidates: FillableFormStoredSecretCandidate[];
|
|
74
65
|
observedAt: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/secrets/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,mCAAoC,CAAC;AAClE,eAAO,MAAM,mBAAmB,2HAQtB,CAAC;AACX,eAAO,MAAM,uBAAuB,gEAM1B,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;AAErE,eAAO,MAAM,gCAAgC;;;;CAInC,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAE1F,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,GAAG,cAAc,CAAC;AACzE,eAAO,MAAM,6BAA6B,4DAIhC,CAAC;AACX,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvF,MAAM,MAAM,+BAA+B,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,+BAA+B,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAEpG,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,yBAAyB,CAAC;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,yBAAyB,CAAC;IACzC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,oBAAoB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,yBAAyB,CAAC;CACvC;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/secrets/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../src/solver/browser-launcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAsB,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../src/solver/browser-launcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAsB,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAajF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;AAiBF,wBAAsB,YAAY,CAChC,OAAO,EAAE,WAAW,EACpB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,aAAa,CAAC,CAiExB"}
|