@nuanu-ai/agentbrowse 0.2.13 → 0.2.15
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/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +16 -6
- 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 +42 -2
- package/dist/commands/action-result-resolution.d.ts +17 -0
- package/dist/commands/action-result-resolution.d.ts.map +1 -0
- package/dist/commands/action-result-resolution.js +95 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +171 -12
- package/dist/commands/observe-persistence.d.ts +1 -0
- package/dist/commands/observe-persistence.d.ts.map +1 -1
- package/dist/commands/observe-persistence.js +52 -1
- package/dist/commands/observe-projection.d.ts +27 -2
- package/dist/commands/observe-projection.d.ts.map +1 -1
- package/dist/commands/observe-projection.js +80 -7
- package/dist/commands/observe-semantics.d.ts.map +1 -1
- package/dist/commands/observe-semantics.js +13 -2
- package/dist/commands/observe-surfaces.d.ts +1 -0
- package/dist/commands/observe-surfaces.d.ts.map +1 -1
- package/dist/commands/observe-surfaces.js +65 -0
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +22 -9
- package/dist/commands/observe.test-harness.d.ts +1 -0
- package/dist/commands/observe.test-harness.d.ts.map +1 -1
- package/dist/commands/observe.test-harness.js +53 -16
- package/dist/commands/semantic-observe.d.ts +2 -0
- package/dist/commands/semantic-observe.d.ts.map +1 -1
- package/dist/commands/semantic-observe.js +4 -0
- package/dist/runtime-state.d.ts +3 -0
- package/dist/runtime-state.d.ts.map +1 -1
- package/dist/runtime-state.js +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../../src/commands/act.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAoCnD,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAqHxF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,CAAC;AAoV7B,wBAAsB,GAAG,CACvB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAioBf"}
|
package/dist/commands/act.js
CHANGED
|
@@ -7,6 +7,7 @@ import { outputContractFailure, outputFailure, outputJSON } from '../output.js';
|
|
|
7
7
|
import { capturePageObservation, captureLocatorContextHash, captureLocatorState, createAcceptanceProbe, diagnoseNoObservableProgress, locatorStateChanged, pageObservationChanged, rankLocatorCandidates, shouldVerifyObservableProgress, waitForAcceptanceProbe, } from './action-acceptance.js';
|
|
8
8
|
import { captureActionFailureArtifacts, startActionTrace } from './action-artifacts.js';
|
|
9
9
|
import { buildLocator, resolveLocatorRoot } from './action-fallbacks.js';
|
|
10
|
+
import { resolveSubmitResult } from './action-result-resolution.js';
|
|
10
11
|
import { projectActionValue } from './action-value-projection.js';
|
|
11
12
|
import { applyActionWithFallbacks } from './action-executor.js';
|
|
12
13
|
import { BROWSE_ACTIONS, isBrowseAction } from './browse-actions.js';
|
|
@@ -719,13 +720,22 @@ export async function act(session, targetRef, action, value) {
|
|
|
719
720
|
throw new Error(`action_postcondition_failed:${finalProgressProbe.policy}`);
|
|
720
721
|
}
|
|
721
722
|
else if (!accepted && finalProgressProbe.policy === 'submit') {
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
723
|
+
const submitResolution = await resolveSubmitResult(finalProgressProbe, afterPageObservation);
|
|
724
|
+
if (submitResolution.acceptAsProgress) {
|
|
725
|
+
attempts.push(`submit-resolution:${submitResolution.finalVerdict}`);
|
|
726
|
+
if (submitResolution.claims.some((claim) => claim.kind === 'soft_result_candidate')) {
|
|
727
|
+
attempts.push('submit-resolution:soft-result-candidate');
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
attempts.push(`acceptance.failed:${finalProgressProbe.policy}`);
|
|
732
|
+
attempts.push('no-progress.detected');
|
|
733
|
+
noProgressDiagnosis = await diagnoseNoObservableProgress(page, finalProgressProbe.locator);
|
|
734
|
+
if (noProgressDiagnosis) {
|
|
735
|
+
attempts.push(`no-progress.diagnosis:${noProgressDiagnosis.kind}`);
|
|
736
|
+
}
|
|
737
|
+
throw new Error('no_observable_progress');
|
|
727
738
|
}
|
|
728
|
-
throw new Error('no_observable_progress');
|
|
729
739
|
}
|
|
730
740
|
else if (!accepted) {
|
|
731
741
|
const afterLocatorObservation = finalProgressProbe.trackedStateKeys.length > 0
|
|
@@ -10,6 +10,7 @@ export type PageObservation = {
|
|
|
10
10
|
contentHash: string | null;
|
|
11
11
|
structureHash: string | null;
|
|
12
12
|
submitSignalHash: string | null;
|
|
13
|
+
resultSignalHash: string | null;
|
|
13
14
|
validationBlockerCount: number;
|
|
14
15
|
};
|
|
15
16
|
type TargetStateKey = 'selected' | 'checked' | 'expanded' | 'pressed' | 'current' | 'focused';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"action-acceptance.d.ts","sourceRoot":"","sources":["../../src/commands/action-acceptance.ts"],"names":[],"mappings":"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"}
|
|
@@ -405,6 +405,7 @@ const PAGE_OBSERVATION_SCRIPT = String.raw `(() => {
|
|
|
405
405
|
content: '',
|
|
406
406
|
structure: '',
|
|
407
407
|
submitSignals: '',
|
|
408
|
+
resultSignals: '',
|
|
408
409
|
validationBlockerCount: 0,
|
|
409
410
|
};
|
|
410
411
|
}
|
|
@@ -421,11 +422,47 @@ const PAGE_OBSERVATION_SCRIPT = String.raw `(() => {
|
|
|
421
422
|
const frames = frameSummary();
|
|
422
423
|
const headings = headingSummary();
|
|
423
424
|
const processing = processingSummary();
|
|
425
|
+
const resultSignals = (() => {
|
|
426
|
+
const selectors = [
|
|
427
|
+
'[role="alert"]',
|
|
428
|
+
'[aria-live="assertive"]',
|
|
429
|
+
'[role="dialog"]',
|
|
430
|
+
'[aria-modal="true"]',
|
|
431
|
+
];
|
|
432
|
+
const items = [];
|
|
433
|
+
|
|
434
|
+
for (const element of Array.from(document.querySelectorAll(selectors.join(', ')))) {
|
|
435
|
+
if (!(element instanceof HTMLElement) || !isVisible(element)) {
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
if (element.matches('[aria-busy="true"], [role="progressbar"]')) {
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const role = element.getAttribute('role') || '';
|
|
444
|
+
const label =
|
|
445
|
+
normalizeText(element.getAttribute('aria-label')) ||
|
|
446
|
+
normalizeText(element.id) ||
|
|
447
|
+
sampleText(normalizeText(element.textContent || ''), 160);
|
|
448
|
+
if (!label) {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
items.push([role || 'live', label].join(':'));
|
|
453
|
+
if (items.length >= 20) {
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return items.join('|');
|
|
459
|
+
})();
|
|
424
460
|
const validation = validationSummary();
|
|
425
461
|
return {
|
|
426
462
|
content: [attrs, text, controls, dialogs, frames].join('\n'),
|
|
427
463
|
structure: [attrs, stableControls, dialogs, frames, headings].join('\n'),
|
|
428
464
|
submitSignals: [processing, dialogs, frames, headings, stableControls].join('\n'),
|
|
465
|
+
resultSignals,
|
|
429
466
|
validationBlockerCount: validation ? validation.split('|').length : 0,
|
|
430
467
|
};
|
|
431
468
|
})()`;
|
|
@@ -740,6 +777,7 @@ export async function capturePageObservation(page) {
|
|
|
740
777
|
const contentSnapshot = typeof snapshot === 'string' ? snapshot : (snapshot?.content ?? '');
|
|
741
778
|
const structureSnapshot = typeof snapshot === 'string' ? '' : (snapshot?.structure ?? '');
|
|
742
779
|
const submitSignalSnapshot = typeof snapshot === 'string' ? '' : (snapshot?.submitSignals ?? '');
|
|
780
|
+
const resultSignalSnapshot = typeof snapshot === 'string' ? '' : (snapshot?.resultSignals ?? '');
|
|
743
781
|
const validationBlockerCount = typeof snapshot === 'string'
|
|
744
782
|
? 0
|
|
745
783
|
: typeof snapshot?.validationBlockerCount === 'number'
|
|
@@ -751,6 +789,7 @@ export async function capturePageObservation(page) {
|
|
|
751
789
|
contentHash: contentSnapshot ? hashText(contentSnapshot) : null,
|
|
752
790
|
structureHash: structureSnapshot ? hashText(structureSnapshot) : null,
|
|
753
791
|
submitSignalHash: submitSignalSnapshot ? hashText(submitSignalSnapshot) : null,
|
|
792
|
+
resultSignalHash: resultSignalSnapshot ? hashText(resultSignalSnapshot) : null,
|
|
754
793
|
validationBlockerCount,
|
|
755
794
|
};
|
|
756
795
|
}
|
|
@@ -1328,8 +1367,9 @@ export async function createAcceptanceProbe(args) {
|
|
|
1328
1367
|
? await captureLocatorValue(ownerLocator)
|
|
1329
1368
|
: null;
|
|
1330
1369
|
const beforeSurfaceContextHash = surfaceLocator &&
|
|
1331
|
-
target.structure?.family === 'structured-grid' &&
|
|
1332
|
-
|
|
1370
|
+
((target.structure?.family === 'structured-grid' &&
|
|
1371
|
+
(policy === 'selection' || policy === 'date-selection')) ||
|
|
1372
|
+
policy === 'submit')
|
|
1333
1373
|
? await captureLocatorContextHash(surfaceLocator)
|
|
1334
1374
|
: null;
|
|
1335
1375
|
const comparableValueType = comparableValueTypeForTarget(target);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AcceptanceProbe, type PageObservation } from './action-acceptance.js';
|
|
2
|
+
export type SubmitResultClaimKind = 'hard_result' | 'hard_blocker' | 'soft_result_candidate' | 'noisy_change';
|
|
3
|
+
export type SubmitResultClaim = {
|
|
4
|
+
kind: SubmitResultClaimKind;
|
|
5
|
+
source: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
ownerScopeRef?: string;
|
|
8
|
+
};
|
|
9
|
+
export type SubmitResultResolution = {
|
|
10
|
+
finalVerdict: 'outcome' | 'blocked' | 'none';
|
|
11
|
+
claims: SubmitResultClaim[];
|
|
12
|
+
decisiveClaims: SubmitResultClaim[];
|
|
13
|
+
acceptAsProgress: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare function reduceSubmitResultClaims(claims: ReadonlyArray<SubmitResultClaim>): Omit<SubmitResultResolution, 'claims' | 'acceptAsProgress'>;
|
|
16
|
+
export declare function resolveSubmitResult(probe: AcceptanceProbe, afterPageObservation: PageObservation | null): Promise<SubmitResultResolution>;
|
|
17
|
+
//# sourceMappingURL=action-result-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-result-resolution.d.ts","sourceRoot":"","sources":["../../src/commands/action-result-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG/G,MAAM,MAAM,qBAAqB,GAC7B,aAAa,GACb,cAAc,GACd,uBAAuB,GACvB,cAAc,CAAC;AAEnB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7C,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACvC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,kBAAkB,CAAC,CAqB7D;AAiBD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,eAAe,EACtB,oBAAoB,EAAE,eAAe,GAAG,IAAI,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAsEjC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { captureLocatorContextHash } from './action-acceptance.js';
|
|
2
|
+
import { resolveSurfaceScopeRoot } from './target-resolution.js';
|
|
3
|
+
export function reduceSubmitResultClaims(claims) {
|
|
4
|
+
const hardBlockers = claims.filter((claim) => claim.kind === 'hard_blocker');
|
|
5
|
+
if (hardBlockers.length > 0) {
|
|
6
|
+
return {
|
|
7
|
+
finalVerdict: 'blocked',
|
|
8
|
+
decisiveClaims: hardBlockers,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
const hardResults = claims.filter((claim) => claim.kind === 'hard_result');
|
|
12
|
+
if (hardResults.length > 0) {
|
|
13
|
+
return {
|
|
14
|
+
finalVerdict: 'outcome',
|
|
15
|
+
decisiveClaims: hardResults,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
finalVerdict: 'none',
|
|
20
|
+
decisiveClaims: [],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function captureAfterSurfaceContextHash(probe) {
|
|
24
|
+
if (probe.surface) {
|
|
25
|
+
const liveSurfaceLocator = await resolveSurfaceScopeRoot(probe.page, probe.surface).catch(() => null);
|
|
26
|
+
if (liveSurfaceLocator) {
|
|
27
|
+
return captureLocatorContextHash(liveSurfaceLocator).catch(() => null);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (probe.surfaceLocator) {
|
|
31
|
+
return captureLocatorContextHash(probe.surfaceLocator).catch(() => null);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
export async function resolveSubmitResult(probe, afterPageObservation) {
|
|
36
|
+
const beforePageObservation = probe.beforePage;
|
|
37
|
+
const claims = [];
|
|
38
|
+
if (!beforePageObservation || !afterPageObservation) {
|
|
39
|
+
return {
|
|
40
|
+
finalVerdict: 'none',
|
|
41
|
+
claims,
|
|
42
|
+
decisiveClaims: [],
|
|
43
|
+
acceptAsProgress: false,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (afterPageObservation.validationBlockerCount > beforePageObservation.validationBlockerCount) {
|
|
47
|
+
claims.push({
|
|
48
|
+
kind: 'hard_blocker',
|
|
49
|
+
source: 'validation',
|
|
50
|
+
reason: 'Validation blockers increased after submit.',
|
|
51
|
+
ownerScopeRef: probe.surface?.ref,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (beforePageObservation.url !== afterPageObservation.url ||
|
|
55
|
+
beforePageObservation.title !== afterPageObservation.title) {
|
|
56
|
+
claims.push({
|
|
57
|
+
kind: 'hard_result',
|
|
58
|
+
source: 'navigation',
|
|
59
|
+
reason: 'Page identity changed after submit.',
|
|
60
|
+
ownerScopeRef: probe.surface?.ref,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const resultSignalChanged = beforePageObservation.resultSignalHash !== afterPageObservation.resultSignalHash &&
|
|
64
|
+
afterPageObservation.resultSignalHash !== null;
|
|
65
|
+
const afterSurfaceContextHash = await captureAfterSurfaceContextHash(probe);
|
|
66
|
+
const ownerScopeChanged = probe.beforeSurfaceContextHash !== null &&
|
|
67
|
+
afterSurfaceContextHash !== null &&
|
|
68
|
+
probe.beforeSurfaceContextHash !== afterSurfaceContextHash;
|
|
69
|
+
if (resultSignalChanged) {
|
|
70
|
+
claims.push({
|
|
71
|
+
kind: 'soft_result_candidate',
|
|
72
|
+
source: ownerScopeChanged ? 'owner-scope' : 'page-signal',
|
|
73
|
+
reason: ownerScopeChanged
|
|
74
|
+
? 'Owner-scope result-bearing signal appeared after submit.'
|
|
75
|
+
: 'A result-bearing signal appeared after submit.',
|
|
76
|
+
ownerScopeRef: probe.surface?.ref,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (ownerScopeChanged) {
|
|
80
|
+
claims.push({
|
|
81
|
+
kind: 'noisy_change',
|
|
82
|
+
source: 'owner-scope',
|
|
83
|
+
reason: 'Owner scope changed after submit without a result-bearing signal.',
|
|
84
|
+
ownerScopeRef: probe.surface?.ref,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const reduced = reduceSubmitResultClaims(claims);
|
|
88
|
+
return {
|
|
89
|
+
...reduced,
|
|
90
|
+
claims,
|
|
91
|
+
acceptAsProgress: reduced.finalVerdict === 'outcome' ||
|
|
92
|
+
(reduced.finalVerdict === 'none' &&
|
|
93
|
+
claims.some((claim) => claim.kind === 'soft_result_candidate')),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/observe-inventory.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"observe-inventory.d.ts","sourceRoot":"","sources":["../../src/commands/observe-inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAc7B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,YAAY,CAAC,EAAE,uBAAuB,CAAC;IACvC,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACvC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;CACpD,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/C,CAAC;AAsJF,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,wBAAwB,CAAC,CAuBnC;AAkHD,iBAAS,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI,CAElF;AAED,iBAAe,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAOxF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAyBA;AAED,iBAAe,6BAA6B,CAC1C,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,0BAA0B,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6qE9B;AAED,iBAAe,8BAA8B,CAC3C,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA8L/B;AAyOD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IACJ,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,KAAK,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,EACD,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqD9B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IACJ,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9C,SAAS,CAAC,EAAE,MAAM,KAAK,CAAC;CACzB,GACA,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsD/B;AAED,eAAO,MAAM,yBAAyB;;;;CAIrC,CAAC;AAEF,eAAO,MAAM,yBAAyB;;;;;CAKrC,CAAC"}
|
|
@@ -1640,8 +1640,86 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
1640
1640
|
};
|
|
1641
1641
|
};
|
|
1642
1642
|
|
|
1643
|
+
const modalBackdropAncestorOf = (surface) => {
|
|
1644
|
+
let current = surface?.parentElement;
|
|
1645
|
+
let depth = 0;
|
|
1646
|
+
while (current && depth < 6) {
|
|
1647
|
+
if (isHTMLElementNode(current) && isVisible(current)) {
|
|
1648
|
+
const style = window.getComputedStyle(current);
|
|
1649
|
+
const position = (style.position || '').toLowerCase();
|
|
1650
|
+
const rect = current.getBoundingClientRect();
|
|
1651
|
+
const viewportArea = Math.max(window.innerWidth * window.innerHeight, 1);
|
|
1652
|
+
const coverage = (rect.width * rect.height) / viewportArea;
|
|
1653
|
+
if (
|
|
1654
|
+
position === 'fixed' &&
|
|
1655
|
+
coverage > 0.45 &&
|
|
1656
|
+
(style.backgroundColor &&
|
|
1657
|
+
style.backgroundColor !== 'transparent' &&
|
|
1658
|
+
style.backgroundColor !== 'rgba(0, 0, 0, 0)')
|
|
1659
|
+
) {
|
|
1660
|
+
return current;
|
|
1661
|
+
}
|
|
1662
|
+
}
|
|
1663
|
+
|
|
1664
|
+
current = current.parentElement;
|
|
1665
|
+
depth += 1;
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
return undefined;
|
|
1669
|
+
};
|
|
1670
|
+
|
|
1671
|
+
const surfacePositionTraitsOf = (surface) => {
|
|
1672
|
+
if (!isHTMLElementNode(surface) || !isVisible(surface)) return undefined;
|
|
1673
|
+
|
|
1674
|
+
const style = window.getComputedStyle(surface);
|
|
1675
|
+
const position = (style.position || '').toLowerCase();
|
|
1676
|
+
const rect = surface.getBoundingClientRect();
|
|
1677
|
+
const interactiveCount = visibleInteractiveDescendantCountOf(surface);
|
|
1678
|
+
const viewportArea = Math.max(window.innerWidth * window.innerHeight, 1);
|
|
1679
|
+
const coverage = (rect.width * rect.height) / viewportArea;
|
|
1680
|
+
const zIndexValue = Number(style.zIndex || '0');
|
|
1681
|
+
const hasCardChrome =
|
|
1682
|
+
style.boxShadow !== 'none' ||
|
|
1683
|
+
parseFloat(style.borderTopWidth || '0') > 0 ||
|
|
1684
|
+
parseFloat(style.borderRightWidth || '0') > 0 ||
|
|
1685
|
+
parseFloat(style.borderBottomWidth || '0') > 0 ||
|
|
1686
|
+
parseFloat(style.borderLeftWidth || '0') > 0 ||
|
|
1687
|
+
(style.backgroundColor &&
|
|
1688
|
+
style.backgroundColor !== 'transparent' &&
|
|
1689
|
+
style.backgroundColor !== 'rgba(0, 0, 0, 0)');
|
|
1690
|
+
|
|
1691
|
+
if (rect.width < 180 || rect.height < 72 || interactiveCount < 1 || coverage > 0.45) {
|
|
1692
|
+
return undefined;
|
|
1693
|
+
}
|
|
1694
|
+
|
|
1695
|
+
if (position === 'fixed') {
|
|
1696
|
+
return { kind: 'floating-panel', priority: 92 };
|
|
1697
|
+
}
|
|
1698
|
+
|
|
1699
|
+
if (position === 'sticky') {
|
|
1700
|
+
return { kind: 'sticky-panel', priority: 88 };
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
if (position === 'absolute' && hasCardChrome && zIndexValue > 0) {
|
|
1704
|
+
return { kind: 'floating-panel', priority: 82 };
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
if (
|
|
1708
|
+
hasCardChrome &&
|
|
1709
|
+
coverage <= 0.35 &&
|
|
1710
|
+
interactiveCount >= 1 &&
|
|
1711
|
+
modalBackdropAncestorOf(surface)
|
|
1712
|
+
) {
|
|
1713
|
+
return { kind: 'floating-panel', priority: 90 };
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1716
|
+
return undefined;
|
|
1717
|
+
};
|
|
1718
|
+
|
|
1643
1719
|
const inferSurfaceKind = (surface) => {
|
|
1644
1720
|
if (!isHTMLElementNode(surface)) return undefined;
|
|
1721
|
+
const positionedSurface = surfacePositionTraitsOf(surface);
|
|
1722
|
+
if (positionedSurface?.kind) return positionedSurface.kind;
|
|
1645
1723
|
const role = surface.getAttribute('role')?.trim();
|
|
1646
1724
|
if (role === 'dialog') return 'dialog';
|
|
1647
1725
|
if (role === 'listbox') return 'listbox';
|
|
@@ -1692,6 +1770,8 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
1692
1770
|
|
|
1693
1771
|
const surfacePriorityOf = (surface) => {
|
|
1694
1772
|
if (!isHTMLElementNode(surface)) return 0;
|
|
1773
|
+
const positionedSurface = surfacePositionTraitsOf(surface);
|
|
1774
|
+
if (positionedSurface?.priority) return positionedSurface.priority;
|
|
1695
1775
|
const role = surface.getAttribute('role')?.trim() || '';
|
|
1696
1776
|
const className = (surface.getAttribute('class') || '').toLowerCase();
|
|
1697
1777
|
if (role === 'dialog' || surface.getAttribute('aria-modal') === 'true') return 100;
|
|
@@ -2094,17 +2174,47 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2094
2174
|
.filter((element) => isVisible(element));
|
|
2095
2175
|
|
|
2096
2176
|
const localSurfaceCandidateOf = (element) => {
|
|
2097
|
-
const
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
candidate
|
|
2101
|
-
|
|
2102
|
-
isVisible(candidate)
|
|
2103
|
-
|
|
2104
|
-
|
|
2177
|
+
const ranked = [];
|
|
2178
|
+
const pushCandidate = (candidate, depth) => {
|
|
2179
|
+
if (
|
|
2180
|
+
!isHTMLElementNode(candidate) ||
|
|
2181
|
+
candidate === element ||
|
|
2182
|
+
!isVisible(candidate)
|
|
2183
|
+
) {
|
|
2184
|
+
return;
|
|
2185
|
+
}
|
|
2186
|
+
|
|
2187
|
+
const priority = surfacePriorityOf(candidate);
|
|
2188
|
+
if (priority <= 0) {
|
|
2189
|
+
return;
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
if (ranked.some((entry) => entry.element === candidate)) {
|
|
2193
|
+
return;
|
|
2194
|
+
}
|
|
2195
|
+
|
|
2196
|
+
ranked.push({ element: candidate, priority, depth });
|
|
2197
|
+
};
|
|
2198
|
+
|
|
2199
|
+
pushCandidate(itemOf(element), 0);
|
|
2200
|
+
pushCandidate(containerOf(element), 1);
|
|
2201
|
+
|
|
2202
|
+
let current = composedParentElement(element);
|
|
2203
|
+
let depth = 0;
|
|
2204
|
+
while (current && depth < 8) {
|
|
2205
|
+
pushCandidate(current, depth + 2);
|
|
2206
|
+
current = composedParentElement(current);
|
|
2207
|
+
depth += 1;
|
|
2208
|
+
}
|
|
2209
|
+
|
|
2210
|
+
ranked.sort((left, right) => {
|
|
2211
|
+
if (left.priority !== right.priority) {
|
|
2212
|
+
return right.priority - left.priority;
|
|
2213
|
+
}
|
|
2214
|
+
return left.depth - right.depth;
|
|
2105
2215
|
});
|
|
2106
2216
|
|
|
2107
|
-
return
|
|
2217
|
+
return ranked[0]?.element;
|
|
2108
2218
|
};
|
|
2109
2219
|
|
|
2110
2220
|
const surfaceSelectorsOf = (element, localSurface) => {
|
|
@@ -2304,6 +2414,36 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2304
2414
|
return false;
|
|
2305
2415
|
};
|
|
2306
2416
|
|
|
2417
|
+
const outputPriorityOf = (candidate) => {
|
|
2418
|
+
let score = candidate.surfacePriority || 0;
|
|
2419
|
+
|
|
2420
|
+
if (candidate.controlsSurfaceSelector) {
|
|
2421
|
+
score += 24;
|
|
2422
|
+
}
|
|
2423
|
+
if (candidate.structure?.family) {
|
|
2424
|
+
score += 18;
|
|
2425
|
+
}
|
|
2426
|
+
if (candidate.validation?.message) {
|
|
2427
|
+
score += 12;
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
const kind = (candidate.kind || '').toLowerCase();
|
|
2431
|
+
const role = (candidate.role || '').toLowerCase();
|
|
2432
|
+
if (['input', 'textarea', 'select'].includes(kind)) {
|
|
2433
|
+
score += 14;
|
|
2434
|
+
}
|
|
2435
|
+
if (['textbox', 'combobox', 'option', 'menuitem', 'gridcell'].includes(role)) {
|
|
2436
|
+
score += 12;
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
const allowedByHint = (candidate.interactionHint || '').toLowerCase();
|
|
2440
|
+
if (allowedByHint === 'click' || allowedByHint === 'press') {
|
|
2441
|
+
score += 4;
|
|
2442
|
+
}
|
|
2443
|
+
|
|
2444
|
+
return score;
|
|
2445
|
+
};
|
|
2446
|
+
|
|
2307
2447
|
const seen = new Set();
|
|
2308
2448
|
return enrichDisplayLabels(collectTargets(document))
|
|
2309
2449
|
.filter((candidate) => {
|
|
@@ -2314,7 +2454,26 @@ async function collectDomTargetsFromDocument(context, options) {
|
|
|
2314
2454
|
seen.add(key);
|
|
2315
2455
|
return hasUsefulInventorySignal(candidate);
|
|
2316
2456
|
})
|
|
2317
|
-
.
|
|
2457
|
+
.map((candidate, index) => ({ candidate, index }))
|
|
2458
|
+
.sort((left, right) => {
|
|
2459
|
+
const priorityDelta = outputPriorityOf(right.candidate) - outputPriorityOf(left.candidate);
|
|
2460
|
+
if (priorityDelta !== 0) {
|
|
2461
|
+
return priorityDelta;
|
|
2462
|
+
}
|
|
2463
|
+
|
|
2464
|
+
return (left.candidate.ordinal ?? left.index) - (right.candidate.ordinal ?? right.index);
|
|
2465
|
+
})
|
|
2466
|
+
.slice(0, collectorOutputLimit)
|
|
2467
|
+
.sort((left, right) => {
|
|
2468
|
+
const ordinalDelta =
|
|
2469
|
+
(left.candidate.ordinal ?? left.index) - (right.candidate.ordinal ?? right.index);
|
|
2470
|
+
if (ordinalDelta !== 0) {
|
|
2471
|
+
return ordinalDelta;
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
return left.index - right.index;
|
|
2475
|
+
})
|
|
2476
|
+
.map(({ candidate }) => candidate);
|
|
2318
2477
|
})()`);
|
|
2319
2478
|
if (!Array.isArray(observedTargets)) {
|
|
2320
2479
|
return [];
|
|
@@ -2435,9 +2594,9 @@ async function collectPageSignalsFromDocument(context, options) {
|
|
|
2435
2594
|
return 'status';
|
|
2436
2595
|
}
|
|
2437
2596
|
if (/toast|snackbar|banner|notice|warning|error|success/.test(classBlob)) {
|
|
2438
|
-
return
|
|
2597
|
+
return 'notice';
|
|
2439
2598
|
}
|
|
2440
|
-
return
|
|
2599
|
+
return 'notice';
|
|
2441
2600
|
};
|
|
2442
2601
|
|
|
2443
2602
|
const seen = new Set();
|
|
@@ -11,4 +11,5 @@ export declare function persistObservedSurfacesForPage(session: BrowseSession, p
|
|
|
11
11
|
surfaceRefMap: Map<string, string>;
|
|
12
12
|
};
|
|
13
13
|
export declare function reconcileObservedTargetsForPage(session: BrowseSession, pageRef: string, observedTargets: ReadonlyArray<Pick<TargetDescriptor, 'ref'>>): void;
|
|
14
|
+
export declare function linkObservedSurfaceGraph(session: BrowseSession, pageRef: string, domTargets: ReadonlyArray<DomObservedTarget>, persistedTargets: ReadonlyArray<TargetDescriptor>, observedScopes: ReadonlyArray<SurfaceDescriptor>, surfaceRefMap: ReadonlyMap<string, string>): SurfaceDescriptor[];
|
|
14
15
|
//# sourceMappingURL=observe-persistence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe-persistence.d.ts","sourceRoot":"","sources":["../../src/commands/observe-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASnD,OAAO,KAAK,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"observe-persistence.d.ts","sourceRoot":"","sources":["../../src/commands/observe-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AASnD,OAAO,KAAK,EAAoB,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQhE,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,EACzB,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAmF/B;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,OAAO,EAAE,gBAAgB,EAAE,GAC1B,IAAI,CAYN;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC,EACzC,OAAO,CAAC,EAAE;IACR,gBAAgB,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C,GACA;IACD,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,CAgEA;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,GAC5D,IAAI,CAsBN;AAUD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC5C,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAAC,EACjD,cAAc,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAChD,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACzC,iBAAiB,EAAE,CAmDrB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ensureRuntimeState, markSurfaceLifecycle, markTargetLifecycle, replaceSurfacesForPage, setSurfaceAvailability, setTargetAvailability, } from '../runtime-state.js';
|
|
2
|
-
import { collectSurfaceDescriptors, pushUniqueLocatorCandidate, surfaceReplacementKey } from './observe-surfaces.js';
|
|
2
|
+
import { buildSyntheticFormSurfaceId, collectSurfaceDescriptors, pushUniqueLocatorCandidate, surfaceReplacementKey, } from './observe-surfaces.js';
|
|
3
3
|
export function toDomDescriptor(pageRef, target, surfaceRefMap) {
|
|
4
4
|
const locatorCandidates = [];
|
|
5
5
|
if (target.role && target.label) {
|
|
@@ -168,3 +168,54 @@ export function reconcileObservedTargetsForPage(session, pageRef, observedTarget
|
|
|
168
168
|
setTargetAvailability(session, target.ref, 'hidden', 'target-not-observed');
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
|
+
function pushUniqueRef(map, key, ref) {
|
|
172
|
+
const refs = map.get(key) ?? [];
|
|
173
|
+
if (!refs.includes(ref)) {
|
|
174
|
+
refs.push(ref);
|
|
175
|
+
map.set(key, refs);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export function linkObservedSurfaceGraph(session, pageRef, domTargets, persistedTargets, observedScopes, surfaceRefMap) {
|
|
179
|
+
const runtime = ensureRuntimeState(session);
|
|
180
|
+
const activeSurfaceRefs = new Set(observedScopes.map((scope) => scope.ref));
|
|
181
|
+
const targetRefsBySurface = new Map();
|
|
182
|
+
const parentBySurface = new Map();
|
|
183
|
+
const childRefsByParent = new Map();
|
|
184
|
+
for (const [index, persistedTarget] of persistedTargets.entries()) {
|
|
185
|
+
if (persistedTarget.pageRef !== pageRef) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (persistedTarget.surfaceRef) {
|
|
189
|
+
pushUniqueRef(targetRefsBySurface, persistedTarget.surfaceRef, persistedTarget.ref);
|
|
190
|
+
}
|
|
191
|
+
const domTarget = domTargets[index];
|
|
192
|
+
if (!domTarget) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
const syntheticFormSurfaceId = buildSyntheticFormSurfaceId(domTarget);
|
|
196
|
+
const formSurfaceRef = syntheticFormSurfaceId
|
|
197
|
+
? surfaceRefMap.get(syntheticFormSurfaceId)
|
|
198
|
+
: undefined;
|
|
199
|
+
if (!formSurfaceRef || !persistedTarget.surfaceRef || persistedTarget.surfaceRef === formSurfaceRef) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
parentBySurface.set(persistedTarget.surfaceRef, formSurfaceRef);
|
|
203
|
+
pushUniqueRef(childRefsByParent, formSurfaceRef, persistedTarget.surfaceRef);
|
|
204
|
+
}
|
|
205
|
+
for (const surface of Object.values(runtime.surfaces)) {
|
|
206
|
+
if (surface.pageRef !== pageRef) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
runtime.surfaces[surface.ref] = {
|
|
210
|
+
...surface,
|
|
211
|
+
parentSurfaceRef: activeSurfaceRefs.has(surface.ref)
|
|
212
|
+
? parentBySurface.get(surface.ref)
|
|
213
|
+
: undefined,
|
|
214
|
+
childSurfaceRefs: activeSurfaceRefs.has(surface.ref)
|
|
215
|
+
? [...(childRefsByParent.get(surface.ref) ?? [])]
|
|
216
|
+
: [],
|
|
217
|
+
targetRefs: activeSurfaceRefs.has(surface.ref) ? [...(targetRefsBySurface.get(surface.ref) ?? [])] : [],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return observedScopes.map((scope) => runtime.surfaces[scope.ref] ?? scope);
|
|
221
|
+
}
|