@nexface/tools 0.1.14 → 0.1.15-alpha.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 (88) hide show
  1. package/dist/browser/actions.js +10 -34
  2. package/dist/browser/actions.js.map +1 -0
  3. package/dist/browser/controller.js +74 -53
  4. package/dist/browser/controller.js.map +1 -0
  5. package/dist/browser/diagnostics.js +3 -8
  6. package/dist/browser/diagnostics.js.map +1 -0
  7. package/dist/browser/dom.js +28 -12
  8. package/dist/browser/dom.js.map +1 -0
  9. package/dist/browser/feedback.js +5 -6
  10. package/dist/browser/feedback.js.map +1 -0
  11. package/dist/browser/focus.js +1 -0
  12. package/dist/browser/focus.js.map +1 -0
  13. package/dist/browser/locator.js +9 -3
  14. package/dist/browser/locator.js.map +1 -0
  15. package/dist/browser/prompt.generated.js +1 -0
  16. package/dist/browser/prompt.generated.js.map +1 -0
  17. package/dist/browser/prompt.js +1 -0
  18. package/dist/browser/prompt.js.map +1 -0
  19. package/dist/browser/snapshot.js +22 -10
  20. package/dist/browser/snapshot.js.map +1 -0
  21. package/dist/browser/toolset.js +36 -42
  22. package/dist/browser/toolset.js.map +1 -0
  23. package/dist/browser/types.d.ts +1 -1
  24. package/dist/browser/types.js +1 -0
  25. package/dist/browser/types.js.map +1 -0
  26. package/dist/browser/worker-runner.js +1 -0
  27. package/dist/browser/worker-runner.js.map +1 -0
  28. package/dist/definition.d.ts +3 -1
  29. package/dist/definition.js +2 -2
  30. package/dist/definition.js.map +1 -0
  31. package/dist/index.browser.js +1 -0
  32. package/dist/index.browser.js.map +1 -0
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +2 -1
  35. package/dist/index.js.map +1 -0
  36. package/dist/internal-react.d.ts +1 -1
  37. package/dist/internal-react.js +4 -3
  38. package/dist/internal-react.js.map +1 -0
  39. package/dist/internal-types.js +1 -0
  40. package/dist/internal-types.js.map +1 -0
  41. package/dist/navigation.js +1 -0
  42. package/dist/navigation.js.map +1 -0
  43. package/dist/operation-lock.js +2 -36
  44. package/dist/operation-lock.js.map +1 -0
  45. package/dist/operation-runtime.js +13 -41
  46. package/dist/operation-runtime.js.map +1 -0
  47. package/dist/operation-surface.js +41 -118
  48. package/dist/operation-surface.js.map +1 -0
  49. package/dist/operation-types.js +1 -0
  50. package/dist/operation-types.js.map +1 -0
  51. package/dist/operation-view.d.ts +1 -1
  52. package/dist/operation-view.js +60 -120
  53. package/dist/operation-view.js.map +1 -0
  54. package/dist/react.js +9 -6
  55. package/dist/react.js.map +1 -0
  56. package/dist/registration.d.ts +6 -0
  57. package/dist/registration.js +25 -3
  58. package/dist/registration.js.map +1 -0
  59. package/dist/runtime.d.ts +2 -4
  60. package/dist/runtime.js +44 -103
  61. package/dist/runtime.js.map +1 -0
  62. package/dist/shared/definition.js +1 -0
  63. package/dist/shared/definition.js.map +1 -0
  64. package/dist/shared/errors.d.ts +1 -1
  65. package/dist/shared/errors.js +1 -0
  66. package/dist/shared/errors.js.map +1 -0
  67. package/dist/shared/page-protocol.js +1 -0
  68. package/dist/shared/page-protocol.js.map +1 -0
  69. package/dist/shared/page-tools.js +1 -0
  70. package/dist/shared/page-tools.js.map +1 -0
  71. package/dist/shared/runtime-controller.d.ts +0 -1
  72. package/dist/shared/runtime-controller.js +1 -0
  73. package/dist/shared/runtime-controller.js.map +1 -0
  74. package/dist/shared/runtime-execution.js +1 -0
  75. package/dist/shared/runtime-execution.js.map +1 -0
  76. package/dist/shared/schema.js +19 -45
  77. package/dist/shared/schema.js.map +1 -0
  78. package/dist/shared/tool-registry.d.ts +6 -0
  79. package/dist/shared/tool-registry.js +10 -0
  80. package/dist/shared/tool-registry.js.map +1 -0
  81. package/dist/styles.css +109 -879
  82. package/dist/types.js +1 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/webmcp.js +12 -38
  85. package/dist/webmcp.js.map +1 -0
  86. package/package.json +2 -6
  87. package/dist/tool-search.d.ts +0 -11
  88. package/dist/tool-search.js +0 -117
@@ -6,22 +6,12 @@ export function collectElementActions(actions, ref, element, role, label, state,
6
6
  return;
7
7
  const id = `a${actions.size + 1}`;
8
8
  actions.set(id, {
9
- candidate: {
10
- id,
11
- operation,
12
- ref,
13
- role,
14
- label: (optionElement ? `${label} / ${option}` : label).slice(0, 500),
15
- state,
16
- ...(option === undefined ? {} : { option: option.slice(0, 500) }),
17
- },
9
+ candidate: { id, operation, ref, role, label: (optionElement ? `${label} / ${option}` : label).slice(0, 500), state, ...(option === undefined ? {} : { option: option.slice(0, 500) }) },
18
10
  command: { target, method, args },
19
11
  ...(optionElement ? { optionElement } : {}),
20
12
  });
21
13
  };
22
- if (state.disabled ||
23
- element.closest('[inert],[aria-disabled="true"]') ||
24
- element.matches(":disabled"))
14
+ if (state.disabled || element.closest('[inert],[aria-disabled="true"]') || element.matches(":disabled"))
25
15
  return;
26
16
  if (scrollable) {
27
17
  if (element.scrollTop > 0)
@@ -40,25 +30,18 @@ export function collectElementActions(actions, ref, element, role, label, state,
40
30
  counts.set(option.value, (counts.get(option.value) ?? 0) + 1);
41
31
  for (const option of element.options) {
42
32
  if (element.multiple) {
43
- if (counts.get(option.value) === 1 &&
44
- !option.disabled &&
45
- !option.closest("optgroup[disabled]")) {
33
+ if (counts.get(option.value) === 1 && !option.disabled && !option.closest("optgroup[disabled]")) {
46
34
  add(option.selected ? "uncheck" : "check", "setOptionSelected", [option.value, !option.selected, option.label], option.label, option);
47
35
  }
48
36
  continue;
49
37
  }
50
- if (counts.get(option.value) === 1 &&
51
- !(element.required && option.value === "") &&
52
- !option.disabled &&
53
- !option.selected &&
54
- !option.closest("optgroup[disabled]"))
38
+ if (counts.get(option.value) === 1 && !(element.required && option.value === "") && !option.disabled && !option.selected && !option.closest("optgroup[disabled]"))
55
39
  add("select", "selectOption", [option.value], option.label);
56
40
  }
57
41
  return;
58
42
  }
59
- if (role === "option" &&
60
- element.closest('[role="listbox"]')?.getAttribute("aria-multiselectable") === "true" &&
61
- ["true", "false"].includes(element.getAttribute("aria-selected") ?? "")) {
43
+ if (role === "option" && element.closest('[role="listbox"]')?.getAttribute("aria-multiselectable") === "true"
44
+ && ["true", "false"].includes(element.getAttribute("aria-selected") ?? "")) {
62
45
  const field = computeName(element.closest('[role="listbox"]'));
63
46
  label = field ? `${field} / ${label}` : label;
64
47
  add(state.selected ? "uncheck" : "check", state.selected ? "uncheck" : "check", []);
@@ -71,23 +54,15 @@ export function collectElementActions(actions, ref, element, role, label, state,
71
54
  add("uncheck", "uncheck", []);
72
55
  return;
73
56
  }
74
- const editable = element instanceof HTMLInputElement ||
75
- element instanceof HTMLTextAreaElement ||
76
- (element instanceof HTMLElement && element.isContentEditable);
77
- if (editable &&
78
- !("readOnly" in element && element.readOnly) &&
79
- element.getAttribute("aria-readonly") !== "true" &&
80
- ["textbox", "searchbox", "combobox", "spinbutton"].includes(role)) {
57
+ const editable = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || (element instanceof HTMLElement && element.isContentEditable);
58
+ if (editable && !("readOnly" in element && element.readOnly) && element.getAttribute("aria-readonly") !== "true" && ["textbox", "searchbox", "combobox", "spinbutton"].includes(role)) {
81
59
  add("fill", "fill", []);
82
60
  }
83
61
  add("click", "click", []);
84
62
  }
85
63
  export function collectPageActions(actions) {
86
64
  const add = (id, operation, method, args) => {
87
- actions.set(id, {
88
- candidate: { id, operation, label: operation, role: "page", state: {} },
89
- command: { target: { type: "page" }, method, args },
90
- });
65
+ actions.set(id, { candidate: { id, operation, label: operation, role: "page", state: {} }, command: { target: { type: "page" }, method, args } });
91
66
  };
92
67
  if (window.scrollY > 0)
93
68
  add("pageUp", "scrollUp", "scrollBy", [{ y: -560 }]);
@@ -95,3 +70,4 @@ export function collectPageActions(actions) {
95
70
  add("pageDown", "scrollDown", "scrollBy", [{ y: 560 }]);
96
71
  add("wait", "wait", "waitForTimeout", [100]);
97
72
  }
73
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/browser/actions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PageActionCandidate, PageCommand, SemanticState } from \"./types.js\";\nimport { computeName } from \"./dom.js\";\n\nexport interface ObservedAction {\n candidate: PageActionCandidate;\n command: Pick<PageCommand, \"target\" | \"method\" | \"args\">;\n optionElement?: HTMLOptionElement;\n}\n\nexport function collectElementActions(\n actions: Map<string, ObservedAction>,\n ref: string,\n element: Element,\n role: string,\n label: string,\n state: SemanticState,\n scrollable: boolean,\n): void {\n const target = { type: \"ref\", ref } as const;\n const add = (operation: PageActionCandidate[\"operation\"], method: PageCommand[\"method\"], args: unknown[], option?: string, optionElement?: HTMLOptionElement): void => {\n if (actions.size >= 240) return;\n const id = `a${actions.size + 1}`;\n actions.set(id, {\n candidate: { id, operation, ref, role, label: (optionElement ? `${label} / ${option}` : label).slice(0, 500), state, ...(option === undefined ? {} : { option: option.slice(0, 500) }) },\n command: { target, method, args },\n ...(optionElement ? { optionElement } : {}),\n });\n };\n if (state.disabled || element.closest('[inert],[aria-disabled=\"true\"]') || element.matches(\":disabled\")) return;\n if (scrollable) {\n if (element.scrollTop > 0) add(\"scrollUp\", \"scrollBy\", [{ y: -560 }]);\n if (element.scrollTop + element.clientHeight < element.scrollHeight - 1) add(\"scrollDown\", \"scrollBy\", [{ y: 560 }]);\n return;\n }\n if (element instanceof HTMLInputElement && [\"password\", \"file\", \"hidden\"].includes(element.type)) return;\n if (element instanceof HTMLOptionElement) return;\n if (element instanceof HTMLSelectElement) {\n const counts = new Map<string, number>();\n for (const option of element.options) counts.set(option.value, (counts.get(option.value) ?? 0) + 1);\n for (const option of element.options) {\n if (element.multiple) {\n if (counts.get(option.value) === 1 && !option.disabled && !option.closest(\"optgroup[disabled]\")) {\n add(option.selected ? \"uncheck\" : \"check\", \"setOptionSelected\", [option.value, !option.selected, option.label], option.label, option);\n }\n continue;\n }\n if (counts.get(option.value) === 1 && !(element.required && option.value === \"\") && !option.disabled && !option.selected && !option.closest(\"optgroup[disabled]\")) add(\"select\", \"selectOption\", [option.value], option.label);\n }\n return;\n }\n if (role === \"option\" && element.closest('[role=\"listbox\"]')?.getAttribute(\"aria-multiselectable\") === \"true\"\n && [\"true\", \"false\"].includes(element.getAttribute(\"aria-selected\") ?? \"\")) {\n const field = computeName(element.closest('[role=\"listbox\"]')!);\n label = field ? `${field} / ${label}` : label;\n add(state.selected ? \"uncheck\" : \"check\", state.selected ? \"uncheck\" : \"check\", []);\n return;\n }\n if (role === \"checkbox\" || role === \"switch\" || role === \"radio\") {\n if (state.checked !== true) add(\"check\", \"check\", []);\n else if (role !== \"radio\") add(\"uncheck\", \"uncheck\", []);\n return;\n }\n const editable = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || (element instanceof HTMLElement && element.isContentEditable);\n if (editable && !(\"readOnly\" in element && element.readOnly) && element.getAttribute(\"aria-readonly\") !== \"true\" && [\"textbox\", \"searchbox\", \"combobox\", \"spinbutton\"].includes(role)) {\n add(\"fill\", \"fill\", []);\n }\n add(\"click\", \"click\", []);\n}\n\nexport function collectPageActions(actions: Map<string, ObservedAction>): void {\n const add = (id: string, operation: PageActionCandidate[\"operation\"], method: PageCommand[\"method\"], args: unknown[]): void => {\n actions.set(id, { candidate: { id, operation, label: operation, role: \"page\", state: {} }, command: { target: { type: \"page\" }, method, args } });\n };\n if (window.scrollY > 0) add(\"pageUp\", \"scrollUp\", \"scrollBy\", [{ y: -560 }]);\n if (window.scrollY + window.innerHeight < document.documentElement.scrollHeight - 1) add(\"pageDown\", \"scrollDown\", \"scrollBy\", [{ y: 560 }]);\n add(\"wait\", \"wait\", \"waitForTimeout\", [100]);\n}\n"]}
@@ -20,7 +20,11 @@ const LOCATOR_METHODS = new Set([
20
20
  "text",
21
21
  "waitFor",
22
22
  ]);
23
- const PAGE_METHODS = new Set(["scrollBy", "waitForTimeout", "waitForURL"]);
23
+ const PAGE_METHODS = new Set([
24
+ "scrollBy",
25
+ "waitForTimeout",
26
+ "waitForURL",
27
+ ]);
24
28
  const WAIT_FOR_URL_TIMEOUT_MS = 3_000;
25
29
  const URL_POLL_INTERVAL_MS = 50;
26
30
  const ACTION_METHODS = new Set([
@@ -61,7 +65,7 @@ function dispatchClickSequence(element) {
61
65
  message: "Click target does not have an uncovered hit point.",
62
66
  });
63
67
  }
64
- const { element: hitTarget, clientX, clientY } = hit;
68
+ const { element: hitTarget, clientX, clientY, } = hit;
65
69
  const init = {
66
70
  bubbles: true,
67
71
  cancelable: true,
@@ -191,7 +195,8 @@ function validateArgs(command, maxChars) {
191
195
  }
192
196
  if (command.method === "selectOption") {
193
197
  if (command.args.length !== 1 ||
194
- (typeof command.args[0] !== "string" && !Array.isArray(command.args[0]))) {
198
+ (typeof command.args[0] !== "string" &&
199
+ !Array.isArray(command.args[0]))) {
195
200
  throw invalidCommand("selectOption() requires a string or string array.");
196
201
  }
197
202
  if (Array.isArray(command.args[0]) &&
@@ -199,11 +204,8 @@ function validateArgs(command, maxChars) {
199
204
  throw invalidCommand("selectOption() array values must be strings.");
200
205
  }
201
206
  }
202
- if (command.method === "setOptionSelected" &&
203
- (command.args.length !== 3 ||
204
- typeof command.args[0] !== "string" ||
205
- typeof command.args[1] !== "boolean" ||
206
- typeof command.args[2] !== "string")) {
207
+ if (command.method === "setOptionSelected" && (command.args.length !== 3
208
+ || typeof command.args[0] !== "string" || typeof command.args[1] !== "boolean" || typeof command.args[2] !== "string")) {
207
209
  throw invalidCommand("Invalid observed option selection.");
208
210
  }
209
211
  if (command.method === "waitFor") {
@@ -219,7 +221,9 @@ function validateArgs(command, maxChars) {
219
221
  throw invalidCommand("waitFor() state is invalid.");
220
222
  }
221
223
  if (value?.timeout !== undefined &&
222
- (typeof value.timeout !== "number" || !Number.isFinite(value.timeout) || value.timeout < 0)) {
224
+ (typeof value.timeout !== "number" ||
225
+ !Number.isFinite(value.timeout) ||
226
+ value.timeout < 0)) {
223
227
  throw invalidCommand("waitFor() timeout is invalid.");
224
228
  }
225
229
  }
@@ -260,8 +264,10 @@ function validateArgs(command, maxChars) {
260
264
  Array.isArray(value) ||
261
265
  Object.keys(value).length === 0 ||
262
266
  Object.keys(value).some((key) => !["x", "y"].includes(key)) ||
263
- (value.x !== undefined && (typeof value.x !== "number" || !Number.isFinite(value.x))) ||
264
- (value.y !== undefined && (typeof value.y !== "number" || !Number.isFinite(value.y)))) {
267
+ (value.x !== undefined &&
268
+ (typeof value.x !== "number" || !Number.isFinite(value.x))) ||
269
+ (value.y !== undefined &&
270
+ (typeof value.y !== "number" || !Number.isFinite(value.y)))) {
265
271
  throw invalidCommand("scrollBy() requires finite numeric x/y values.");
266
272
  }
267
273
  }
@@ -275,7 +281,8 @@ function validateArgs(command, maxChars) {
275
281
  Object.keys(value).some((key) => !["left", "top"].includes(key)) ||
276
282
  (value.left !== undefined &&
277
283
  (typeof value.left !== "number" || !Number.isFinite(value.left))) ||
278
- (value.top !== undefined && (typeof value.top !== "number" || !Number.isFinite(value.top)))) {
284
+ (value.top !== undefined &&
285
+ (typeof value.top !== "number" || !Number.isFinite(value.top)))) {
279
286
  throw invalidCommand("scrollTo() requires finite numeric left/top values.");
280
287
  }
281
288
  }
@@ -333,7 +340,9 @@ export class PageController {
333
340
  throw invalidCommand("Command envelope is invalid.");
334
341
  }
335
342
  const record = this.executions.get(command.executionId);
336
- if (!record || record.status !== "running" || record.abortController.signal.aborted) {
343
+ if (!record ||
344
+ record.status !== "running" ||
345
+ record.abortController.signal.aborted) {
337
346
  throw new PageCommandError({
338
347
  code: "EXECUTION_CANCELLED",
339
348
  message: "The execution is no longer active.",
@@ -384,16 +393,15 @@ export class PageController {
384
393
  record = this.requireActive(command);
385
394
  const value = command.target.type === "page"
386
395
  ? await this.executePage(command, record)
387
- : await this.executeTarget(command, record, beforeAction &&
388
- (async () => {
389
- try {
390
- await beforeAction();
391
- }
392
- catch (error) {
393
- presentationFailed = true;
394
- throw error;
395
- }
396
- }));
396
+ : await this.executeTarget(command, record, beforeAction && (async () => {
397
+ try {
398
+ await beforeAction();
399
+ }
400
+ catch (error) {
401
+ presentationFailed = true;
402
+ throw error;
403
+ }
404
+ }));
397
405
  if (ACTION_METHODS.has(command.method) &&
398
406
  !record.completedActions.some((action) => action.callIndex === command.commandSeq)) {
399
407
  this.recordCompletedAction(record, command);
@@ -513,7 +521,9 @@ export class PageController {
513
521
  return record.registry.refs.get(command.target.ref);
514
522
  }
515
523
  locator(command) {
516
- return command.target.type === "locator" ? command.target.locator : undefined;
524
+ return command.target.type === "locator"
525
+ ? command.target.locator
526
+ : undefined;
517
527
  }
518
528
  async executeTarget(command, record, beforeAction) {
519
529
  const signal = record.abortController.signal;
@@ -547,7 +557,11 @@ export class PageController {
547
557
  return null;
548
558
  }
549
559
  if (command.method === "text") {
550
- const element = ref ? requireValidRef(ref) : locator ? requireUnique(locator) : undefined;
560
+ const element = ref
561
+ ? requireValidRef(ref)
562
+ : locator
563
+ ? requireUnique(locator)
564
+ : undefined;
551
565
  if (!element)
552
566
  throw invalidCommand("Target is missing.");
553
567
  if (element instanceof HTMLInputElement ||
@@ -558,7 +572,11 @@ export class PageController {
558
572
  return normalizeText(element.textContent);
559
573
  }
560
574
  if (command.method === "scrollIntoView") {
561
- const element = ref ? requireValidRef(ref) : locator ? requireUnique(locator) : undefined;
575
+ const element = ref
576
+ ? requireValidRef(ref)
577
+ : locator
578
+ ? requireUnique(locator)
579
+ : undefined;
562
580
  if (!element)
563
581
  throw invalidCommand("Target is missing.");
564
582
  const beforeIdentity = createIdentity(element);
@@ -579,7 +597,11 @@ export class PageController {
579
597
  return null;
580
598
  }
581
599
  if (command.method === "scrollBy" || command.method === "scrollTo") {
582
- const element = ref ? ref.element : locator ? requireUnique(locator) : undefined;
600
+ const element = ref
601
+ ? ref.element
602
+ : locator
603
+ ? requireUnique(locator)
604
+ : undefined;
583
605
  if (!(element instanceof HTMLElement)) {
584
606
  throw new PageCommandError({
585
607
  code: "UNSUPPORTED_OPERATION",
@@ -626,8 +648,12 @@ export class PageController {
626
648
  }
627
649
  else {
628
650
  const value = command.args[0];
629
- if ((value.left !== undefined && value.left !== element.scrollLeft && !scrollability.x) ||
630
- (value.top !== undefined && value.top !== element.scrollTop && !scrollability.y)) {
651
+ if ((value.left !== undefined &&
652
+ value.left !== element.scrollLeft &&
653
+ !scrollability.x) ||
654
+ (value.top !== undefined &&
655
+ value.top !== element.scrollTop &&
656
+ !scrollability.y)) {
631
657
  throw new PageCommandError({
632
658
  code: "UNSUPPORTED_OPERATION",
633
659
  message: "Requested axis does not have a scroll range.",
@@ -656,9 +682,7 @@ export class PageController {
656
682
  this.requireStillActive(record);
657
683
  const element = ref
658
684
  ? await prepareRefForAction(ref, signal)
659
- : locator
660
- ? await prepareLocatorForAction(locator, signal)
661
- : undefined;
685
+ : locator ? await prepareLocatorForAction(locator, signal) : undefined;
662
686
  if (!element)
663
687
  throw invalidCommand("Target is missing.");
664
688
  this.requireStillActive(record);
@@ -668,13 +692,9 @@ export class PageController {
668
692
  await feedback;
669
693
  this.requireStillActive(record);
670
694
  await beforeAction?.();
671
- if (!element.isConnected ||
672
- createIdentity(element) !== identity ||
673
- (locator && requireUnique(locator) !== element)) {
674
- throw new PageCommandError({
675
- code: "REF_ACTION_FAILED",
676
- message: "Target changed before the action.",
677
- });
695
+ if (!element.isConnected || createIdentity(element) !== identity
696
+ || (locator && requireUnique(locator) !== element)) {
697
+ throw new PageCommandError({ code: "REF_ACTION_FAILED", message: "Target changed before the action." });
678
698
  }
679
699
  ensureActionable(element);
680
700
  this.requireStillActive(record);
@@ -694,7 +714,8 @@ export class PageController {
694
714
  });
695
715
  }
696
716
  requireStillActive(record) {
697
- if (record.status !== "running" || record.abortController.signal.aborted) {
717
+ if (record.status !== "running" ||
718
+ record.abortController.signal.aborted) {
698
719
  throw new PageCommandError({
699
720
  code: "EXECUTION_CANCELLED",
700
721
  message: "Execution was cancelled before the DOM action.",
@@ -708,7 +729,8 @@ export class PageController {
708
729
  }
709
730
  if (command.method === "fill") {
710
731
  const value = String(command.args[0] ?? "");
711
- if ((element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) &&
732
+ if ((element instanceof HTMLInputElement ||
733
+ element instanceof HTMLTextAreaElement) &&
712
734
  !element.readOnly) {
713
735
  focusForAgent(element);
714
736
  setNativeValue(element, value);
@@ -733,14 +755,15 @@ export class PageController {
733
755
  }
734
756
  if (command.method === "check" || command.method === "uncheck") {
735
757
  const checked = command.method === "check";
736
- if (element.getAttribute("role") === "option" &&
737
- element.closest('[role="listbox"]')?.getAttribute("aria-multiselectable") === "true" &&
738
- ["true", "false"].includes(element.getAttribute("aria-selected") ?? "")) {
758
+ if (element.getAttribute("role") === "option"
759
+ && element.closest('[role="listbox"]')?.getAttribute("aria-multiselectable") === "true"
760
+ && ["true", "false"].includes(element.getAttribute("aria-selected") ?? "")) {
739
761
  if ((element.getAttribute("aria-selected") === "true") !== checked)
740
762
  dispatchClickSequence(element);
741
763
  return null;
742
764
  }
743
- if (element instanceof HTMLInputElement && ["checkbox", "radio"].includes(element.type)) {
765
+ if (element instanceof HTMLInputElement &&
766
+ ["checkbox", "radio"].includes(element.type)) {
744
767
  if (element.type === "radio" && !checked) {
745
768
  throw new PageCommandError({
746
769
  code: "UNSUPPORTED_OPERATION",
@@ -766,14 +789,9 @@ export class PageController {
766
789
  if (command.method === "setOptionSelected") {
767
790
  const [value, selected, label] = command.args;
768
791
  const options = element instanceof HTMLSelectElement && element.multiple
769
- ? [...element.options].filter((option) => option.value === value)
770
- : [];
792
+ ? [...element.options].filter((option) => option.value === value) : [];
771
793
  const option = options[0];
772
- if (options.length !== 1 ||
773
- !option ||
774
- option.label !== label ||
775
- option.disabled ||
776
- option.closest("optgroup[disabled]")) {
794
+ if (options.length !== 1 || !option || option.label !== label || option.disabled || option.closest("optgroup[disabled]")) {
777
795
  throw invalidCommand("The observed multiple-select option is no longer available.");
778
796
  }
779
797
  if (option.selected !== selected) {
@@ -790,7 +808,9 @@ export class PageController {
790
808
  });
791
809
  }
792
810
  const requested = command.args[0];
793
- const values = Array.isArray(requested) ? requested.map(String) : [String(requested ?? "")];
811
+ const values = Array.isArray(requested)
812
+ ? requested.map(String)
813
+ : [String(requested ?? "")];
794
814
  const availableValues = new Set(Array.from(element.options, (option) => option.value));
795
815
  const missing = values.filter((value) => !availableValues.has(value));
796
816
  if (missing.length > 0) {
@@ -821,3 +841,4 @@ export class PageController {
821
841
  throw invalidCommand(`Unsupported locator method: ${command.method}`);
822
842
  }
823
843
  }
844
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/browser/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { measurePagePhase } from \"./diagnostics.js\";\nimport { focusForAgent, withAgentActivation } from \"./focus.js\";\nimport { ActionFeedback } from \"./feedback.js\";\nimport {\n createIdentity,\n createScrollableIdentity,\n getElementScrollability,\n normalizeText,\n} from \"./dom.js\";\nimport {\n PageCommandError,\n findElementHitTarget,\n ensureActionable,\n prepareLocatorForAction,\n prepareRefForAction,\n requireUnique,\n requireValidRef,\n resolveLocator,\n waitForLocator,\n} from \"./locator.js\";\nimport type {\n CommandError,\n CompletedAction,\n ExecutionLimits,\n FailedCall,\n LocatorDescriptor,\n LocatorMethod,\n PageCommand,\n PageMethod,\n RefTarget,\n SnapshotRegistry,\n} from \"./types.js\";\n\ninterface ExecutionRecord {\n abortController: AbortController;\n callCount: number;\n completedActions: CompletedAction[];\n failedCall?: FailedCall;\n lastSeq: number;\n registry: SnapshotRegistry;\n status: \"running\" | \"cancelled\" | \"completed\";\n}\n\nexport interface ExecutionReceipt {\n completedActions: CompletedAction[];\n failedCall?: FailedCall;\n}\n\nexport interface CommandResponse {\n ok: boolean;\n value?: unknown;\n error?: CommandError;\n}\n\nconst LOCATOR_METHODS = new Set<LocatorMethod>([\n \"click\",\n \"fill\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"selectOption\",\n \"setOptionSelected\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollBy\",\n \"scrollTo\",\n \"scrollIntoView\",\n \"exists\",\n \"text\",\n \"waitFor\",\n]);\n\nconst PAGE_METHODS = new Set<PageMethod>([\n \"scrollBy\",\n \"waitForTimeout\",\n \"waitForURL\",\n]);\nconst WAIT_FOR_URL_TIMEOUT_MS = 3_000;\nconst URL_POLL_INTERVAL_MS = 50;\nconst ACTION_METHODS = new Set<LocatorMethod | PageMethod>([\n \"click\",\n \"fill\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"selectOption\",\n \"setOptionSelected\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollIntoView\",\n \"scrollBy\",\n \"scrollTo\",\n]);\n\nfunction dispatchInput(element: Element): void {\n element.dispatchEvent(\n new InputEvent(\"input\", {\n bubbles: true,\n inputType: \"insertText\",\n }),\n );\n element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nfunction setNativeValue(\n element: HTMLInputElement | HTMLTextAreaElement,\n value: string,\n): void {\n const prototype =\n element instanceof HTMLInputElement\n ? HTMLInputElement.prototype\n : HTMLTextAreaElement.prototype;\n const setter = Object.getOwnPropertyDescriptor(prototype, \"value\")?.set;\n setter?.call(element, value);\n dispatchInput(element);\n}\n\nfunction dispatchClickSequence(element: Element): void {\n const hit = findElementHitTarget(element);\n if (!hit) {\n throw new PageCommandError({\n code: \"ELEMENT_COVERED\",\n message: \"Click target does not have an uncovered hit point.\",\n });\n }\n const {\n element: hitTarget,\n clientX,\n clientY,\n } = hit;\n\n const init: MouseEventInit = {\n bubbles: true,\n cancelable: true,\n composed: true,\n view: window,\n clientX,\n clientY,\n button: 0,\n detail: 1,\n };\n\n hitTarget.dispatchEvent(\n new PointerEvent(\"pointerdown\", {\n ...init,\n buttons: 1,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n }),\n );\n const shouldFocus = hitTarget.dispatchEvent(\n new MouseEvent(\"mousedown\", { ...init, buttons: 1 }),\n );\n if (\n shouldFocus &&\n element instanceof HTMLElement &&\n element.ownerDocument.activeElement !== element\n ) {\n focusForAgent(element);\n }\n if (!element.isConnected || !hitTarget.isConnected) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Click target changed after mousedown.\",\n });\n }\n hitTarget.dispatchEvent(\n new PointerEvent(\"pointerup\", {\n ...init,\n buttons: 0,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n }),\n );\n hitTarget.dispatchEvent(\n new MouseEvent(\"mouseup\", { ...init, buttons: 0 }),\n );\n if (hitTarget instanceof HTMLElement) {\n withAgentActivation(() => hitTarget.click());\n return;\n }\n hitTarget.dispatchEvent(\n new MouseEvent(\"click\", { ...init, buttons: 0 }),\n );\n}\n\nfunction targetLabel(command: PageCommand): string | undefined {\n if (command.target.type === \"ref\") return command.target.ref;\n if (command.target.type === \"locator\") {\n return JSON.stringify(command.target.locator).slice(0, 500);\n }\n return \"page\";\n}\n\nfunction invalidCommand(message: string): PageCommandError {\n return new PageCommandError({ code: \"INVALID_COMMAND\", message });\n}\n\nfunction validateMatcher(value: unknown, maxChars: number): void {\n if (typeof value === \"string\") {\n if (value.length > maxChars) throw invalidCommand(\"Matcher is too long.\");\n return;\n }\n if (!value || typeof value !== \"object\") {\n throw invalidCommand(\"Matcher must be a string or normalized regex.\");\n }\n const regex = value as { source?: unknown; flags?: unknown };\n if (\n typeof regex.source !== \"string\" ||\n regex.source.length > maxChars ||\n typeof regex.flags !== \"string\" ||\n !/^[dgimsuvy]*$/.test(regex.flags)\n ) {\n throw invalidCommand(\"Regex matcher is invalid.\");\n }\n try {\n new RegExp(regex.source, regex.flags);\n } catch {\n throw invalidCommand(\"Regex matcher could not be compiled.\");\n }\n}\n\nfunction validateLocator(\n descriptor: LocatorDescriptor,\n maxChars: number,\n): void {\n if (\n !descriptor ||\n typeof descriptor !== \"object\" ||\n !Array.isArray(descriptor.steps) ||\n descriptor.steps.length === 0\n ) {\n throw invalidCommand(\"Locator must contain at least one step.\");\n }\n if (descriptor.steps.length > 12) {\n throw invalidCommand(\"Locator contains too many steps.\");\n }\n for (const step of descriptor.steps) {\n if (step.kind === \"role\") {\n if (!step.role || step.role.length > 80) {\n throw invalidCommand(\"Locator role is invalid.\");\n }\n if (step.options?.name !== undefined) {\n validateMatcher(step.options.name, maxChars);\n }\n continue;\n }\n if (step.kind === \"text\" || step.kind === \"label\") {\n validateMatcher(step.text, maxChars);\n continue;\n }\n if (step.kind === \"filter\") {\n validateMatcher(step.hasText, maxChars);\n continue;\n }\n throw invalidCommand(\"Locator contains an unsupported step.\");\n }\n}\n\nfunction validateArgs(command: PageCommand, maxChars: number): void {\n if (!Array.isArray(command.args)) {\n throw invalidCommand(\"Command args must be an array.\");\n }\n let serialized: string;\n try {\n serialized = JSON.stringify(command.args);\n } catch {\n throw invalidCommand(\"Command args must be serializable.\");\n }\n if (serialized.length > maxChars) {\n throw invalidCommand(\"Command args are too large.\");\n }\n\n if (command.method === \"fill\" || command.method === \"press\") {\n if (command.args.length !== 1 || typeof command.args[0] !== \"string\") {\n throw invalidCommand(`${command.method}() requires one string argument.`);\n }\n }\n if (command.method === \"selectOption\") {\n if (\n command.args.length !== 1 ||\n (typeof command.args[0] !== \"string\" &&\n !Array.isArray(command.args[0]))\n ) {\n throw invalidCommand(\"selectOption() requires a string or string array.\");\n }\n if (\n Array.isArray(command.args[0]) &&\n command.args[0].some((item) => typeof item !== \"string\")\n ) {\n throw invalidCommand(\"selectOption() array values must be strings.\");\n }\n }\n if (command.method === \"setOptionSelected\" && (command.args.length !== 3\n || typeof command.args[0] !== \"string\" || typeof command.args[1] !== \"boolean\" || typeof command.args[2] !== \"string\")) {\n throw invalidCommand(\"Invalid observed option selection.\");\n }\n if (command.method === \"waitFor\") {\n const options = command.args[0];\n if (\n command.args.length > 1 ||\n (options !== undefined &&\n (typeof options !== \"object\" || options === null || Array.isArray(options)))\n ) {\n throw invalidCommand(\"waitFor() options are invalid.\");\n }\n const value = options as { state?: unknown; timeout?: unknown } | undefined;\n if (\n value?.state !== undefined &&\n ![\"visible\", \"hidden\", \"attached\"].includes(String(value.state))\n ) {\n throw invalidCommand(\"waitFor() state is invalid.\");\n }\n if (\n value?.timeout !== undefined &&\n (typeof value.timeout !== \"number\" ||\n !Number.isFinite(value.timeout) ||\n value.timeout < 0)\n ) {\n throw invalidCommand(\"waitFor() timeout is invalid.\");\n }\n }\n if (command.method === \"waitForTimeout\") {\n if (\n command.args.length !== 1 ||\n typeof command.args[0] !== \"number\" ||\n !Number.isFinite(command.args[0]) ||\n command.args[0] < 0\n ) {\n throw invalidCommand(\"waitForTimeout() requires one non-negative number.\");\n }\n }\n if (command.method === \"waitForURL\") {\n const expected = command.args[0];\n const options = command.args[1];\n if (\n command.args.length < 1 ||\n command.args.length > 2 ||\n typeof expected !== \"string\" ||\n expected.length === 0 ||\n (options !== undefined &&\n (typeof options !== \"object\" || options === null || Array.isArray(options)))\n ) {\n throw invalidCommand(\n \"waitForURL() requires a URL string and optional timeout options.\",\n );\n }\n const value = options as { timeout?: unknown } | undefined;\n if (\n value &&\n (Object.keys(value).some((key) => key !== \"timeout\") ||\n (value.timeout !== undefined &&\n (typeof value.timeout !== \"number\" ||\n !Number.isFinite(value.timeout) ||\n value.timeout < 0)))\n ) {\n throw invalidCommand(\"waitForURL() options are invalid.\");\n }\n }\n if (command.method === \"scrollBy\") {\n const value = command.args[0] as { x?: unknown; y?: unknown } | undefined;\n if (\n command.args.length !== 1 ||\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).length === 0 ||\n Object.keys(value).some((key) => ![\"x\", \"y\"].includes(key)) ||\n (value.x !== undefined &&\n (typeof value.x !== \"number\" || !Number.isFinite(value.x))) ||\n (value.y !== undefined &&\n (typeof value.y !== \"number\" || !Number.isFinite(value.y)))\n ) {\n throw invalidCommand(\"scrollBy() requires finite numeric x/y values.\");\n }\n }\n if (command.method === \"scrollTo\") {\n const value = command.args[0] as { left?: unknown; top?: unknown } | undefined;\n if (\n command.args.length !== 1 ||\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).length === 0 ||\n Object.keys(value).some((key) => ![\"left\", \"top\"].includes(key)) ||\n (value.left !== undefined &&\n (typeof value.left !== \"number\" || !Number.isFinite(value.left))) ||\n (value.top !== undefined &&\n (typeof value.top !== \"number\" || !Number.isFinite(value.top)))\n ) {\n throw invalidCommand(\"scrollTo() requires finite numeric left/top values.\");\n }\n }\n}\n\nasync function waitAnimationFrames(\n count: number,\n signal: AbortSignal,\n): Promise<void> {\n for (let index = 0; index < count; index += 1) {\n signal.throwIfAborted();\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n }\n signal.throwIfAborted();\n}\n\nexport class PageController {\n private readonly executions = new Map<string, ExecutionRecord>();\n\n constructor(\n private readonly limits: ExecutionLimits,\n private readonly animator: ActionFeedback,\n ) {}\n\n beginExecution(\n executionId: string,\n registry: SnapshotRegistry,\n ): void {\n this.executions.set(executionId, {\n abortController: new AbortController(),\n callCount: 0,\n completedActions: [],\n lastSeq: 0,\n registry,\n status: \"running\",\n });\n }\n\n cancelExecution(executionId: string): void {\n const record = this.executions.get(executionId);\n if (!record) return;\n record.status = \"cancelled\";\n record.abortController.abort();\n }\n\n completeExecution(executionId: string): ExecutionReceipt {\n const record = this.executions.get(executionId);\n if (!record) return { completedActions: [] };\n record.status = \"completed\";\n record.abortController.abort();\n this.executions.delete(executionId);\n return {\n completedActions: [...record.completedActions].sort(\n (a, b) => a.callIndex - b.callIndex,\n ),\n ...(record.failedCall ? { failedCall: record.failedCall } : {}),\n };\n }\n\n private requireActive(command: PageCommand): ExecutionRecord {\n if (\n !command ||\n typeof command !== \"object\" ||\n typeof command.executionId !== \"string\" ||\n !Number.isSafeInteger(command.commandSeq) ||\n command.commandSeq <= 0\n ) {\n throw invalidCommand(\"Command envelope is invalid.\");\n }\n const record = this.executions.get(command.executionId);\n if (\n !record ||\n record.status !== \"running\" ||\n record.abortController.signal.aborted\n ) {\n throw new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"The execution is no longer active.\",\n });\n }\n if (command.commandSeq <= record.lastSeq) {\n throw invalidCommand(\"Command sequence must be strictly increasing.\");\n }\n record.lastSeq = command.commandSeq;\n record.callCount += 1;\n if (record.callCount > this.limits.maxPageCalls) {\n throw invalidCommand(\n `Page API call budget exceeded (${this.limits.maxPageCalls}).`,\n );\n }\n this.validateCommand(command);\n return record;\n }\n\n private validateCommand(command: PageCommand): void {\n if (\n !command.target ||\n typeof command.target !== \"object\" ||\n ![\"page\", \"ref\", \"locator\"].includes(command.target.type) ||\n typeof command.method !== \"string\"\n ) {\n throw invalidCommand(\"Command target or method is invalid.\");\n }\n if (command.target.type === \"page\") {\n if (!PAGE_METHODS.has(command.method as PageMethod)) {\n throw invalidCommand(`Unsupported page method: ${command.method}`);\n }\n } else {\n if (!LOCATOR_METHODS.has(command.method as LocatorMethod)) {\n throw invalidCommand(`Unsupported locator method: ${command.method}`);\n }\n if (command.target.type === \"ref\") {\n if (!/^@\\d+$/.test(command.target.ref)) {\n throw invalidCommand(\"Snapshot ref is invalid.\");\n }\n } else {\n validateLocator(\n command.target.locator,\n this.limits.maxArgumentChars,\n );\n }\n }\n validateArgs(command, this.limits.maxArgumentChars);\n }\n\n async execute(command: PageCommand, beforeAction?: () => Promise<void>): Promise<CommandResponse> {\n let record = this.executions.get(command.executionId);\n let presentationFailed = false;\n try {\n record = this.requireActive(command);\n const value =\n command.target.type === \"page\"\n ? await this.executePage(command, record)\n : await this.executeTarget(command, record, beforeAction && (async () => {\n try { await beforeAction(); }\n catch (error) { presentationFailed = true; throw error; }\n }));\n if (\n ACTION_METHODS.has(command.method) &&\n !record.completedActions.some(\n (action) => action.callIndex === command.commandSeq,\n )\n ) {\n this.recordCompletedAction(record, command);\n }\n return { ok: true, value };\n } catch (error) {\n if (record && !record.failedCall) {\n const target = targetLabel(command);\n record.failedCall = {\n callIndex: command.commandSeq,\n method: command.method,\n ...(target ? { target } : {}),\n };\n }\n if (presentationFailed) throw error;\n if (error instanceof PageCommandError) {\n return { ok: false, error: error.detail };\n }\n return {\n ok: false,\n error: {\n code: \"EXECUTION_OUTCOME_UNKNOWN\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n private async executePage(\n command: PageCommand,\n record: ExecutionRecord,\n ): Promise<unknown> {\n const feedback = this.animator.before(command.method);\n if (feedback) await feedback;\n this.requireStillActive(record);\n if (command.method === \"scrollBy\") {\n const value = (command.args[0] ?? {}) as { x?: number; y?: number };\n window.scrollBy({\n left: Number(value.x ?? 0),\n top: Number(value.y ?? 0),\n behavior: \"auto\",\n });\n return null;\n }\n if (command.method === \"waitForTimeout\") {\n const requested = Number(command.args[0] ?? 0);\n const duration = Math.max(\n 0,\n Math.min(requested, this.limits.singleActionTimeoutMs),\n );\n await measurePagePhase(\"explicit-wait\", () => new Promise<void>((resolve, reject) => {\n const onAbort = (): void => {\n window.clearTimeout(timer);\n reject(\n new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled while waiting.\",\n }),\n );\n };\n const timer = window.setTimeout(() => {\n record.abortController.signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, duration);\n record.abortController.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n }));\n return null;\n }\n if (command.method === \"waitForURL\") {\n let expectedUrl: string;\n try {\n expectedUrl = new URL(String(command.args[0]), location.href).href;\n } catch {\n throw invalidCommand(\"waitForURL() URL is invalid.\");\n }\n const options = (command.args[1] ?? {}) as { timeout?: number };\n const timeout = Math.min(\n options.timeout ?? WAIT_FOR_URL_TIMEOUT_MS,\n WAIT_FOR_URL_TIMEOUT_MS,\n this.limits.singleActionTimeoutMs,\n );\n if (location.href === expectedUrl) return null;\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n window.clearInterval(interval);\n window.clearTimeout(timer);\n record.abortController.signal.removeEventListener(\"abort\", onAbort);\n };\n const settle = (error?: PageCommandError): void => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error) reject(error);\n else resolve();\n };\n const onAbort = (): void => settle(new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled while waiting for the URL.\",\n }));\n const interval = window.setInterval(() => {\n if (location.href === expectedUrl) settle();\n }, URL_POLL_INTERVAL_MS);\n const timer = window.setTimeout(() => settle(new PageCommandError({\n code: \"ACTION_TIMEOUT\",\n message: `URL did not become ${expectedUrl} within ${timeout}ms.`,\n })), timeout);\n record.abortController.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n });\n return null;\n }\n throw invalidCommand(`Unsupported page method: ${command.method}`);\n }\n\n private resolveRef(\n command: PageCommand,\n record: ExecutionRecord,\n ): RefTarget | undefined {\n if (command.target.type !== \"ref\") return undefined;\n return record.registry.refs.get(command.target.ref);\n }\n\n private locator(command: PageCommand): LocatorDescriptor | undefined {\n return command.target.type === \"locator\"\n ? command.target.locator\n : undefined;\n }\n\n private async executeTarget(\n command: PageCommand,\n record: ExecutionRecord,\n beforeAction?: () => Promise<void>,\n ): Promise<unknown> {\n const signal = record.abortController.signal;\n const ref = this.resolveRef(command, record);\n const locator = this.locator(command);\n\n if ([\"exists\", \"text\", \"waitFor\", \"scrollBy\", \"scrollTo\", \"scrollIntoView\"].includes(command.method)) {\n const feedback = this.animator.before(command.method);\n if (feedback) await feedback;\n this.requireStillActive(record);\n }\n\n if (command.method === \"exists\") {\n if (ref) {\n try {\n requireValidRef(ref);\n return true;\n } catch {\n return false;\n }\n }\n return locator ? resolveLocator(locator).length > 0 : false;\n }\n\n if (command.method === \"waitFor\") {\n const options = (command.args[0] ?? {}) as {\n state?: \"visible\" | \"hidden\" | \"attached\";\n timeout?: number;\n };\n if (!locator) {\n requireValidRef(ref);\n return null;\n }\n await waitForLocator(\n locator,\n options.state ?? \"visible\",\n Math.min(\n options.timeout ?? this.limits.singleActionTimeoutMs,\n this.limits.singleActionTimeoutMs,\n ),\n signal,\n );\n return null;\n }\n\n if (command.method === \"text\") {\n const element = ref\n ? requireValidRef(ref)\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement ||\n element instanceof HTMLSelectElement\n ) {\n return element.value;\n }\n return normalizeText(element.textContent);\n }\n\n if (command.method === \"scrollIntoView\") {\n const element = ref\n ? requireValidRef(ref)\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n const beforeIdentity = createIdentity(element);\n element.scrollIntoView({\n block: \"center\",\n inline: \"nearest\",\n behavior: \"auto\",\n });\n this.recordCompletedAction(record, command);\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n signal.throwIfAborted();\n if (!element.isConnected || createIdentity(element) !== beforeIdentity) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Target changed while scrolling.\",\n });\n }\n return null;\n }\n\n if (command.method === \"scrollBy\" || command.method === \"scrollTo\") {\n const element = ref\n ? ref.element\n : locator\n ? requireUnique(locator)\n : undefined;\n if (!(element instanceof HTMLElement)) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Scroll target is not an HTML element.\",\n });\n }\n if (ref?.kind !== \"scrollable\") {\n if (ref) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Snapshot ref is not a scrollable container.\",\n });\n }\n }\n const identity = createScrollableIdentity(element);\n if (!element.isConnected || (ref && identity !== ref.identity)) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Scrollable target changed after the snapshot.\",\n });\n }\n const scrollability = getElementScrollability(element);\n if (!scrollability) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Target does not currently have a scroll range.\",\n });\n }\n\n this.requireStillActive(record);\n if (command.method === \"scrollBy\") {\n const value = command.args[0] as { x?: number; y?: number };\n if (\n (value.x !== undefined && value.x !== 0 && !scrollability.x) ||\n (value.y !== undefined && value.y !== 0 && !scrollability.y)\n ) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Requested axis does not have a scroll range.\",\n });\n }\n element.scrollBy({\n left: Number(value.x ?? 0),\n top: Number(value.y ?? 0),\n behavior: \"auto\",\n });\n } else {\n const value = command.args[0] as { left?: number; top?: number };\n if (\n (value.left !== undefined &&\n value.left !== element.scrollLeft &&\n !scrollability.x) ||\n (value.top !== undefined &&\n value.top !== element.scrollTop &&\n !scrollability.y)\n ) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Requested axis does not have a scroll range.\",\n });\n }\n element.scrollTo({\n left: Number(value.left ?? element.scrollLeft),\n top: Number(value.top ?? element.scrollTop),\n behavior: \"auto\",\n });\n }\n this.recordCompletedAction(record, command);\n await waitAnimationFrames(2, signal);\n if (!element.isConnected || createScrollableIdentity(element) !== identity) {\n throw new PageCommandError({\n code: \"REF_ACTION_FAILED\",\n message: \"Scrollable target changed while scrolling.\",\n });\n }\n return null;\n }\n\n if (locator) {\n await waitForLocator(locator, \"visible\", this.limits.singleActionTimeoutMs, signal);\n }\n this.animator.assertActive?.();\n this.requireStillActive(record);\n const element = ref\n ? await prepareRefForAction(ref, signal)\n : locator ? await prepareLocatorForAction(locator, signal) : undefined;\n if (!element) throw invalidCommand(\"Target is missing.\");\n\n this.requireStillActive(record);\n const identity = createIdentity(element);\n const feedback = this.animator.before(command.method, element);\n if (feedback) await feedback;\n this.requireStillActive(record);\n await beforeAction?.();\n if (!element.isConnected || createIdentity(element) !== identity\n || (locator && requireUnique(locator) !== element)) {\n throw new PageCommandError({ code: \"REF_ACTION_FAILED\", message: \"Target changed before the action.\" });\n }\n ensureActionable(element);\n this.requireStillActive(record);\n const result = this.performAction(element, command);\n this.recordCompletedAction(record, command);\n return result;\n }\n\n private recordCompletedAction(\n record: ExecutionRecord,\n command: PageCommand,\n ): void {\n if (record.completedActions.some(\n (action) => action.callIndex === command.commandSeq,\n )) {\n return;\n }\n const target = targetLabel(command);\n record.completedActions.push({\n callIndex: command.commandSeq,\n method: command.method,\n ...(target ? { target } : {}),\n });\n }\n\n private requireStillActive(record: ExecutionRecord): void {\n if (\n record.status !== \"running\" ||\n record.abortController.signal.aborted\n ) {\n throw new PageCommandError({\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled before the DOM action.\",\n });\n }\n }\n\n private performAction(\n element: Element,\n command: PageCommand,\n ): unknown {\n if (command.method === \"click\") {\n dispatchClickSequence(element);\n return null;\n }\n if (command.method === \"fill\") {\n const value = String(command.args[0] ?? \"\");\n if (\n (element instanceof HTMLInputElement ||\n element instanceof HTMLTextAreaElement) &&\n !element.readOnly\n ) {\n focusForAgent(element);\n setNativeValue(element, value);\n return null;\n }\n if (element instanceof HTMLElement && element.isContentEditable) {\n focusForAgent(element);\n element.textContent = value;\n dispatchInput(element);\n return null;\n }\n throw new PageCommandError({\n code: \"NOT_EDITABLE\",\n message: \"fill() target is not editable.\",\n });\n }\n if (command.method === \"press\") {\n const key = String(command.args[0] ?? \"\");\n element.dispatchEvent(\n new KeyboardEvent(\"keydown\", { key, bubbles: true }),\n );\n element.dispatchEvent(\n new KeyboardEvent(\"keyup\", { key, bubbles: true }),\n );\n return null;\n }\n if (command.method === \"check\" || command.method === \"uncheck\") {\n const checked = command.method === \"check\";\n if (element.getAttribute(\"role\") === \"option\"\n && element.closest('[role=\"listbox\"]')?.getAttribute(\"aria-multiselectable\") === \"true\"\n && [\"true\", \"false\"].includes(element.getAttribute(\"aria-selected\") ?? \"\")) {\n if ((element.getAttribute(\"aria-selected\") === \"true\") !== checked) dispatchClickSequence(element);\n return null;\n }\n if (\n element instanceof HTMLInputElement &&\n [\"checkbox\", \"radio\"].includes(element.type)\n ) {\n if (element.type === \"radio\" && !checked) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Native radio elements cannot be unchecked directly.\",\n });\n }\n if (element.checked !== checked) {\n dispatchClickSequence(element);\n }\n return null;\n }\n if (element.getAttribute(\"aria-checked\") !== null) {\n const current = element.getAttribute(\"aria-checked\") === \"true\";\n if (current !== checked) dispatchClickSequence(element);\n return null;\n }\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: `${command.method}() target is not checkable.`,\n });\n }\n if (command.method === \"setOptionSelected\") {\n const [value, selected, label] = command.args;\n const options = element instanceof HTMLSelectElement && element.multiple\n ? [...element.options].filter((option) => option.value === value) : [];\n const option = options[0];\n if (options.length !== 1 || !option || option.label !== label || option.disabled || option.closest(\"optgroup[disabled]\")) {\n throw invalidCommand(\"The observed multiple-select option is no longer available.\");\n }\n if (option.selected !== selected) {\n option.selected = selected as boolean;\n dispatchInput(element);\n }\n return null;\n }\n if (command.method === \"selectOption\") {\n if (!(element instanceof HTMLSelectElement)) {\n throw new PageCommandError({\n code: \"UNSUPPORTED_OPERATION\",\n message: \"selectOption() currently supports native select elements.\",\n });\n }\n const requested = command.args[0];\n const values = Array.isArray(requested)\n ? requested.map(String)\n : [String(requested ?? \"\")];\n const availableValues = new Set(\n Array.from(element.options, (option) => option.value),\n );\n const missing = values.filter((value) => !availableValues.has(value));\n if (missing.length > 0) {\n throw new PageCommandError({\n code: \"NOT_FOUND\",\n message: `selectOption() values were not found: ${missing.join(\", \")}`,\n });\n }\n for (const option of element.options) {\n option.selected = values.includes(option.value);\n }\n dispatchInput(element);\n return null;\n }\n if (command.method === \"hover\") {\n element.dispatchEvent(\n new MouseEvent(\"mouseover\", { bubbles: true, composed: true }),\n );\n element.dispatchEvent(\n new MouseEvent(\"mouseenter\", { bubbles: false, composed: true }),\n );\n return null;\n }\n if (command.method === \"focus\") {\n focusForAgent(element as HTMLElement);\n return null;\n }\n if (command.method === \"blur\") {\n (element as HTMLElement).blur();\n return null;\n }\n throw invalidCommand(`Unsupported locator method: ${command.method}`);\n }\n}\n"]}
@@ -11,15 +11,10 @@ export async function measurePagePhase(phase, execute) {
11
11
  }
12
12
  finally {
13
13
  try {
14
- performance.measure("nexface.browser.phase", {
15
- start,
16
- end: performance.now(),
17
- detail: { phase, status },
18
- });
14
+ performance.measure("nexface.browser.phase", { start, end: performance.now(), detail: { phase, status } });
19
15
  performance.clearMeasures("nexface.browser.phase");
20
16
  }
21
- catch {
22
- /* Diagnostics must never interrupt execution. */
23
- }
17
+ catch { /* Diagnostics must never interrupt execution. */ }
24
18
  }
25
19
  }
20
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/browser/diagnostics.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAI,KAAa,EAAE,OAAyB;IAChF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,WAAW,CAAC;IACzB,IAAI,CAAC;QAAC,OAAO,MAAM,OAAO,EAAE,CAAC;IAAC,CAAC;IAC/B,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,GAAG,OAAO,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;YACxC,CAAC;QACP,IAAI,CAAC;YACH,WAAW,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC3G,WAAW,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC","sourcesContent":["// Internal User Timing entries are consumed by local diagnostic tooling.\nexport async function measurePagePhase<T>(phase: string, execute: () => Promise<T>): Promise<T> {\n const start = performance.now();\n let status = \"completed\";\n try { return await execute(); }\n catch (error) { status = \"error\"; throw error; }\n finally {\n try {\n performance.measure(\"nexface.browser.phase\", { start, end: performance.now(), detail: { phase, status } });\n performance.clearMeasures(\"nexface.browser.phase\");\n } catch { /* Diagnostics must never interrupt execution. */ }\n }\n}\n"]}