@petukhovart/agent-view 0.16.1 → 0.17.1

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 (82) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +5 -3
  3. package/agents/act-decider.md +40 -0
  4. package/dist/cdp/transport.d.ts +2 -0
  5. package/dist/cdp/transport.d.ts.map +1 -1
  6. package/dist/cdp/transport.js +168 -9
  7. package/dist/cdp/transport.js.map +1 -1
  8. package/dist/cdp/types.d.ts +44 -1
  9. package/dist/cdp/types.d.ts.map +1 -1
  10. package/dist/cdp/types.js.map +1 -1
  11. package/dist/cli/client.d.ts.map +1 -1
  12. package/dist/cli/client.js +1 -3
  13. package/dist/cli/client.js.map +1 -1
  14. package/dist/cli/commands/act.d.ts +3 -0
  15. package/dist/cli/commands/act.d.ts.map +1 -0
  16. package/dist/cli/commands/act.js +19 -0
  17. package/dist/cli/commands/act.js.map +1 -0
  18. package/dist/cli/commands/click.d.ts +2 -0
  19. package/dist/cli/commands/click.d.ts.map +1 -1
  20. package/dist/cli/commands/click.js +9 -4
  21. package/dist/cli/commands/click.js.map +1 -1
  22. package/dist/cli/commands/dom.d.ts.map +1 -1
  23. package/dist/cli/commands/dom.js +1 -0
  24. package/dist/cli/commands/dom.js.map +1 -1
  25. package/dist/cli/commands/fill.d.ts +2 -0
  26. package/dist/cli/commands/fill.d.ts.map +1 -1
  27. package/dist/cli/commands/fill.js +11 -4
  28. package/dist/cli/commands/fill.js.map +1 -1
  29. package/dist/cli/commands/screenshot.d.ts +2 -0
  30. package/dist/cli/commands/screenshot.d.ts.map +1 -1
  31. package/dist/cli/commands/screenshot.js +10 -1
  32. package/dist/cli/commands/screenshot.js.map +1 -1
  33. package/dist/cli/commands/wait.d.ts +3 -1
  34. package/dist/cli/commands/wait.d.ts.map +1 -1
  35. package/dist/cli/commands/wait.js +6 -2
  36. package/dist/cli/commands/wait.js.map +1 -1
  37. package/dist/cli/commands/watch.js +1 -1
  38. package/dist/cli/commands/watch.js.map +1 -1
  39. package/dist/cli/index.js +46 -4
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/config/manager.d.ts.map +1 -1
  42. package/dist/config/manager.js +4 -0
  43. package/dist/config/manager.js.map +1 -1
  44. package/dist/config/types.d.ts +5 -0
  45. package/dist/config/types.d.ts.map +1 -1
  46. package/dist/inspectors/controls/index.d.ts +39 -0
  47. package/dist/inspectors/controls/index.d.ts.map +1 -0
  48. package/dist/inspectors/controls/index.js +140 -0
  49. package/dist/inspectors/controls/index.js.map +1 -0
  50. package/dist/inspectors/dom/index.d.ts +2 -0
  51. package/dist/inspectors/dom/index.d.ts.map +1 -1
  52. package/dist/inspectors/dom/index.js +21 -14
  53. package/dist/inspectors/dom/index.js.map +1 -1
  54. package/dist/server/act-replay.d.ts +23 -0
  55. package/dist/server/act-replay.d.ts.map +1 -0
  56. package/dist/server/act-replay.js +143 -0
  57. package/dist/server/act-replay.js.map +1 -0
  58. package/dist/server/act-script.d.ts +46 -0
  59. package/dist/server/act-script.d.ts.map +1 -0
  60. package/dist/server/act-script.js +46 -0
  61. package/dist/server/act-script.js.map +1 -0
  62. package/dist/server/act-session.d.ts +23 -0
  63. package/dist/server/act-session.d.ts.map +1 -0
  64. package/dist/server/act-session.js +304 -0
  65. package/dist/server/act-session.js.map +1 -0
  66. package/dist/server/locator.d.ts +19 -0
  67. package/dist/server/locator.d.ts.map +1 -0
  68. package/dist/server/locator.js +33 -0
  69. package/dist/server/locator.js.map +1 -0
  70. package/dist/server/port.d.ts +7 -0
  71. package/dist/server/port.d.ts.map +1 -0
  72. package/dist/server/port.js +19 -0
  73. package/dist/server/port.js.map +1 -0
  74. package/dist/server/server.d.ts +1 -0
  75. package/dist/server/server.d.ts.map +1 -1
  76. package/dist/server/server.js +76 -18
  77. package/dist/server/server.js.map +1 -1
  78. package/dist/types.d.ts +2 -0
  79. package/dist/types.d.ts.map +1 -1
  80. package/package.json +2 -1
  81. package/skills/verify/SKILL.md +12 -20
  82. package/skills/verify/references/commands.md +118 -4
@@ -0,0 +1,143 @@
1
+ import { isDeadSocket } from '../cdp/transport.js';
2
+ import { extractControls } from '../inspectors/controls/index.js';
3
+ import { findByLocator, locatorFromArgs, testIdAttributes, testIdLocator } from './locator.js';
4
+ import { edgePoint, readScript, viewportBox } from './act-script.js';
5
+ const POLL_MS = 50;
6
+ const STEP_TIMEOUT_MS = 10_000;
7
+ const UNTIL_TIMEOUT_MS = 15_000;
8
+ const EXIT_DONE = 0;
9
+ const EXIT_FAIL = 1;
10
+ const EXIT_STALE = 3;
11
+ /**
12
+ * A saved `act` run, executed with no model and no settle: each step waits only until
13
+ * its own target is on screen, enabled and uncovered, then acts. First line of the
14
+ * result: `DONE` (until met), `FAIL` (the app did not answer: until never came, or a
15
+ * control stayed disabled or covered — a bug) or `STALE` (a step's control is gone —
16
+ * the script no longer fits the app).
17
+ */
18
+ export async function replay({ name, secret, testIdAttribute }, deps) {
19
+ const script = await readScript(name);
20
+ if (!script)
21
+ return { ok: false, error: `No saved script "${name}" — record one with act start … --save ${name}` };
22
+ if (script.steps.some(s => 'isPassword' in s && s.isPassword) && !secret) {
23
+ return { ok: false, error: `"${name}" types a password — set AGENT_VIEW_SECRET` };
24
+ }
25
+ const until = locatorFromArgs({ ...script.until, testIdAttribute });
26
+ if (!until)
27
+ return { ok: false, error: `"${name}" has no done condition — re-record it with act start --until-testid …` };
28
+ const attributes = testIdAttributes(testIdAttribute);
29
+ const t0 = Date.now();
30
+ const elapsed = () => `${((Date.now() - t0) / 1000).toFixed(1)}s`;
31
+ const verdict = (exitCode, line) => ({ ok: true, data: `${line} · ${elapsed()}`, exitCode });
32
+ /** Polls until `probe` yields a value or time runs out; rides over the window reloading. */
33
+ const poll = async (probe, timeoutMs) => {
34
+ const end = Date.now() + timeoutMs;
35
+ for (;;) {
36
+ try {
37
+ const value = await probe(deps.conn);
38
+ if (value !== undefined)
39
+ return value;
40
+ }
41
+ catch (err) {
42
+ if (!isDeadSocket(err))
43
+ throw err;
44
+ // Between documents the window is not there yet; the next poll tries again.
45
+ deps.conn = await deps.reconnect().catch(() => deps.conn);
46
+ }
47
+ if (Date.now() > end)
48
+ return undefined;
49
+ await new Promise(r => setTimeout(r, POLL_MS));
50
+ }
51
+ };
52
+ /** The control, or why it is not usable yet: absent, or present but disabled / covered. */
53
+ const find = async (target, { isEnabledRequired }) => {
54
+ let seen;
55
+ const control = await poll(async (c) => {
56
+ deps.invalidateAxCache();
57
+ const [ax, layout] = await Promise.all([c.getAccessibilityTree(), c.getLayoutSnapshot()]);
58
+ const hit = extractControls(ax, layout, attributes).find(ctl => target.testid ? ctl.testid === target.testid : ctl.role === target.role && ctl.name === target.name);
59
+ seen = undefined;
60
+ if (!hit)
61
+ return undefined;
62
+ if (isEnabledRequired && hit.states.includes('disabled')) {
63
+ seen = 'disabled';
64
+ return undefined;
65
+ }
66
+ let covering;
67
+ try {
68
+ covering = await c.hitTest(hit.backendDOMNodeId, attributes);
69
+ }
70
+ catch (err) {
71
+ if (isDeadSocket(err))
72
+ throw err;
73
+ return undefined; // detached between the snapshot and the hit test: look again
74
+ }
75
+ if (covering)
76
+ seen = `covered by ${covering}`;
77
+ return covering ? undefined : hit;
78
+ }, STEP_TIMEOUT_MS);
79
+ return { control, seen };
80
+ };
81
+ const findTestId = (testid) => poll(async (c) => {
82
+ const found = await findByLocator(c, testIdLocator(testid, testIdAttribute));
83
+ return 'error' in found ? undefined : found;
84
+ }, STEP_TIMEOUT_MS);
85
+ const describe = (t) => (t.name ? `${t.role} "${t.name}"` : t.role) + (t.testid ? ` testid=${t.testid}` : '');
86
+ for (const [i, step] of script.steps.entries()) {
87
+ const at = `step ${i + 1}/${script.steps.length}`;
88
+ if (step.op === 'scroll') {
89
+ await poll(async (c) => { await c.scrollViewport(step.direction); return true; }, STEP_TIMEOUT_MS);
90
+ continue;
91
+ }
92
+ const { control, seen } = await find(step.target, { isEnabledRequired: step.op !== 'drag' });
93
+ if (!control) {
94
+ // Present but unusable is the app misbehaving; absent is the script out of date.
95
+ return seen
96
+ ? verdict(EXIT_FAIL, `FAIL: ${at} ${step.op} ${describe(step.target)} — still ${seen} after ${STEP_TIMEOUT_MS / 1000}s`)
97
+ : verdict(EXIT_STALE, `STALE: ${at} ${step.op} ${describe(step.target)} — not on screen within ${STEP_TIMEOUT_MS / 1000}s`);
98
+ }
99
+ try {
100
+ if (step.op !== 'drag') {
101
+ if (step.op === 'click') {
102
+ await deps.conn.clickByNodeId(control.backendDOMNodeId);
103
+ }
104
+ else if (step.op === 'type') {
105
+ await deps.conn.fillByNodeId(control.backendDOMNodeId, step.isPassword ? secret : step.value ?? '');
106
+ }
107
+ else {
108
+ const outcome = await deps.conn.selectOption(control.backendDOMNodeId, step.value ?? '');
109
+ const reason = outcome === 'no-option' ? `no option "${step.value}"` : 'not a native select';
110
+ if (outcome !== 'ok')
111
+ return verdict(EXIT_STALE, `STALE: ${at} select ${describe(step.target)} — ${reason}`);
112
+ }
113
+ }
114
+ else {
115
+ const to = step.to;
116
+ const dest = !to ? undefined : 'role' in to ? (await find(to, { isEnabledRequired: false })).control : await findTestId(to.testid);
117
+ if (to && !dest) {
118
+ const label = 'role' in to ? describe(to) : `testid=${to.testid}`;
119
+ return verdict(EXIT_STALE, `STALE: ${at} drag target ${label} not found`);
120
+ }
121
+ const from = await deps.conn.getBoxCenter(control.backendDOMNodeId);
122
+ const box = dest ? await deps.conn.getBoxRect(dest.backendDOMNodeId, { scrollIntoView: false }) : await viewportBox(deps.conn);
123
+ await deps.conn.dragBetweenPositions(from, edgePoint(box, step.edge), { mode: 'pointer' });
124
+ }
125
+ }
126
+ catch (err) {
127
+ // The window reloaded under the action (login, logout): it went out; the next poll reconnects.
128
+ // Any other failure means the control vanished between finding and acting (a panel
129
+ // that toggled shut): the app is not in the state the script was recorded in.
130
+ if (!isDeadSocket(err)) {
131
+ const reason = err instanceof Error ? err.message : String(err);
132
+ return verdict(EXIT_STALE, `STALE: ${at} ${step.op} ${describe(step.target)} — ${reason}`);
133
+ }
134
+ }
135
+ }
136
+ // Split the total: our steps vs the app answering them (auth, reload) — only the first is ours to speed up.
137
+ const stepsTime = elapsed();
138
+ const isMet = await poll(async (c) => ('error' in await findByLocator(c, until) ? undefined : true), UNTIL_TIMEOUT_MS);
139
+ return isMet
140
+ ? verdict(EXIT_DONE, `DONE: replay ${name} · ${script.steps.length} steps in ${stepsTime}, then ${until.label}`)
141
+ : verdict(EXIT_FAIL, `FAIL: replay ${name} — steps ran, ${until.label} not visible after ${UNTIL_TIMEOUT_MS / 1000}s`);
142
+ }
143
+ //# sourceMappingURL=act-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act-replay.js","sourceRoot":"","sources":["../../src/server/act-replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { PageSession, Point, Rect } from '../cdp/types.js';
2
+ /** How a replay finds a control again: its test id, else role + name. */
3
+ export type StepTarget = {
4
+ testid?: string;
5
+ role: string;
6
+ name: string;
7
+ };
8
+ /** A drop target: a row, or any element by its test id. */
9
+ export type DropTarget = StepTarget | {
10
+ testid: string;
11
+ };
12
+ export type RecordedStep = {
13
+ op: 'click' | 'type' | 'select';
14
+ target: StepTarget;
15
+ value?: string;
16
+ isPassword: boolean;
17
+ } | {
18
+ op: 'scroll';
19
+ direction: 'up' | 'down';
20
+ }
21
+ /** `to`: a row, any element by test id, or absent = the viewport. */
22
+ | {
23
+ op: 'drag';
24
+ target: StepTarget;
25
+ to?: DropTarget;
26
+ edge: Edge;
27
+ };
28
+ export type UntilArgs = {
29
+ testid?: string;
30
+ selector?: string;
31
+ };
32
+ export type ActScript = {
33
+ until: UntilArgs;
34
+ steps: RecordedStep[];
35
+ };
36
+ export declare const isScriptName: (name: string | undefined) => name is string;
37
+ /** Steps are stored by what identifies a control across runs, never by row number. Passwords are not stored. */
38
+ export declare function writeScript(name: string, { until, steps }: ActScript): Promise<string>;
39
+ export declare function readScript(name: string): Promise<ActScript | undefined>;
40
+ export declare const EDGES: readonly ["left", "right", "top", "bottom", "center"];
41
+ export type Edge = typeof EDGES[number];
42
+ export declare const isEdge: (value: string) => value is Edge;
43
+ /** Drop point inside `box`, on its midline, inset from `edge` — a centre drop replaces instead of splitting. */
44
+ export declare function edgePoint(box: Rect, edge: Edge): Point;
45
+ export declare function viewportBox(conn: PageSession): Promise<Rect>;
46
+ //# sourceMappingURL=act-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act-script.d.ts","sourceRoot":"","sources":["../../src/server/act-script.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAG/D,yEAAyE;AACzE,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAExE,2DAA2D;AAC3D,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAExD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GAC5F;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,MAAM,CAAA;CAAE;AAC5C,qEAAqE;GACnE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAA;AAEnE,MAAM,MAAM,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9D,MAAM,MAAM,SAAS,GAAG;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CAAA;AAInE,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,GAAG,SAAS,KAAG,IAAI,IAAI,MAA0C,CAAA;AAG1G,gHAAgH;AAChH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAK5F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAM7E;AAED,eAAO,MAAM,KAAK,uDAAwD,CAAA;AAC1E,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAA;AAIvC,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,KAAG,KAAK,IAAI,IAAoD,CAAA;AAEpG,gHAAgH;AAChH,wBAAgB,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,CAUtD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}
@@ -0,0 +1,46 @@
1
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { AGENT_VIEW_DIR } from './port.js';
4
+ const SCRIPT_DIR = join(AGENT_VIEW_DIR, 'scratch');
5
+ export const isScriptName = (name) => !!name && /^[\w.-]+$/.test(name);
6
+ const scriptPath = (name) => join(SCRIPT_DIR, `${name}.json`);
7
+ /** Steps are stored by what identifies a control across runs, never by row number. Passwords are not stored. */
8
+ export async function writeScript(name, { until, steps }) {
9
+ await mkdir(SCRIPT_DIR, { recursive: true });
10
+ const stored = steps.map(s => ('isPassword' in s && s.isPassword ? { ...s, value: undefined } : s));
11
+ await writeFile(scriptPath(name), JSON.stringify({ until, steps: stored }, null, 1));
12
+ return scriptPath(name);
13
+ }
14
+ export async function readScript(name) {
15
+ try {
16
+ return JSON.parse(await readFile(scriptPath(name), 'utf8'));
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ }
22
+ export const EDGES = ['left', 'right', 'top', 'bottom', 'center'];
23
+ /** Deepest a drop point sits inside an edge; split zones along a widget edge are ~60 px strips. */
24
+ const EDGE_INSET_PX = 20;
25
+ export const isEdge = (value) => EDGES.includes(value);
26
+ /** Drop point inside `box`, on its midline, inset from `edge` — a centre drop replaces instead of splitting. */
27
+ export function edgePoint(box, edge) {
28
+ const cx = box.x + box.width / 2;
29
+ const cy = box.y + box.height / 2;
30
+ const insetX = Math.min(EDGE_INSET_PX, box.width / 4);
31
+ const insetY = Math.min(EDGE_INSET_PX, box.height / 4);
32
+ if (edge === 'left')
33
+ return { x: box.x + insetX, y: cy };
34
+ if (edge === 'right')
35
+ return { x: box.x + box.width - insetX, y: cy };
36
+ if (edge === 'top')
37
+ return { x: cx, y: box.y + insetY };
38
+ if (edge === 'bottom')
39
+ return { x: cx, y: box.y + box.height - insetY };
40
+ return { x: cx, y: cy };
41
+ }
42
+ export async function viewportBox(conn) {
43
+ const { viewport } = await conn.getLayoutSnapshot();
44
+ return { x: 0, y: 0, ...viewport };
45
+ }
46
+ //# sourceMappingURL=act-script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act-script.js","sourceRoot":"","sources":["../../src/server/act-script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { ServerResponse } from '../types.js';
2
+ import { type Control } from '../inspectors/controls/index.js';
3
+ import { type Locator } from './locator.js';
4
+ import { type RecordedStep, type UntilArgs } from './act-script.js';
5
+ import { type ActDeps } from './act-replay.js';
6
+ /** Step-protocol state for one CDP port. Rows are those of the LAST printed table. */
7
+ export type ActSession = {
8
+ until: Locator;
9
+ untilArgs: UntilArgs;
10
+ maxSteps: number;
11
+ testIdAttribute?: string;
12
+ rows: Control[];
13
+ steps: RecordedStep[];
14
+ startedAt: number;
15
+ /** Script name to write on DONE (`act start --save`). */
16
+ saveAs?: string;
17
+ /** DONE was printed: the recording is complete and takes no more steps. */
18
+ isDone: boolean;
19
+ };
20
+ export declare function runAct(holder: {
21
+ act: ActSession | null;
22
+ }, args: Record<string, unknown>, deps: ActDeps): Promise<ServerResponse>;
23
+ //# sourceMappingURL=act-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act-session.d.ts","sourceRoot":"","sources":["../../src/server/act-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAQL,KAAK,OAAO,EACb,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAmE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAC5G,OAAO,EAQL,KAAK,YAAY,EAEjB,KAAK,SAAS,EACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAU,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAetD,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAUD,wBAAsB,MAAM,CAC1B,MAAM,EAAE;IAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,EAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,cAAc,CAAC,CA+BzB"}
@@ -0,0 +1,304 @@
1
+ import { isDeadSocket } from '../cdp/transport.js';
2
+ import { PASSWORD_MASK, TEXT_ROLES, describeControl, extractControls, formatControlRow, formatControlTable, resolveRow, } from '../inspectors/controls/index.js';
3
+ import { findByLocator, locatorFromArgs, testIdAttributes, testIdLocator } from './locator.js';
4
+ import { EDGES, edgePoint, isEdge, isScriptName, viewportBox, writeScript, } from './act-script.js';
5
+ import { replay } from './act-replay.js';
6
+ const DEFAULT_MAX_STEPS = 30;
7
+ const SETTLE_POLL_MS = 100;
8
+ const SETTLE_BUDGET_MS = 3_000;
9
+ /** Polls the table must stay unchanged, after it changed, to count as settled. */
10
+ const SETTLE_STABLE_POLLS = 2;
11
+ /** Polls an action that changed nothing waits before giving up on a reaction. */
12
+ const SETTLE_QUIET_POLLS = 4;
13
+ const ROW_OPS = ['click', 'type', 'select'];
14
+ const stepTarget = (c) => ({ testid: c.testid, role: c.role, name: c.name });
15
+ const str = (args, key) => typeof args[key] === 'string' ? args[key] : undefined;
16
+ const num = (value) => (typeof value === 'number' ? value : NaN);
17
+ const isRowOp = (op) => ROW_OPS.includes(op);
18
+ export async function runAct(holder, args, deps) {
19
+ const op = str(args, 'op') ?? '';
20
+ if (op === 'replay') {
21
+ const name = str(args, 'name');
22
+ if (!isScriptName(name))
23
+ return { ok: false, error: 'act replay <name>' };
24
+ return replay({ name, secret: str(args, 'secret'), testIdAttribute: str(args, 'testIdAttribute') }, deps);
25
+ }
26
+ if (op === 'start') {
27
+ // Done is agent-view's call, never the driver's: no run without a done condition.
28
+ if ((str(args, 'untilTestid') === undefined) === (str(args, 'untilSelector') === undefined)) {
29
+ return { ok: false, error: 'act start --until-testid <id> | --until-selector <css> — exactly one' };
30
+ }
31
+ holder.act = createSession(args);
32
+ return tableOrDone({ session: holder.act, deps });
33
+ }
34
+ const session = holder.act;
35
+ if (!session)
36
+ return { ok: false, error: 'run `agent-view act start` first' };
37
+ const run = { session, deps };
38
+ if (op === 'table')
39
+ return tableOrDone(run);
40
+ if (op === 'save')
41
+ return save(session, str(args, 'name'));
42
+ if (op === 'wait')
43
+ return finishStep(run, { before: tableKey(await snapshot(run)), done: 'wait', quietPolls: Infinity });
44
+ if (session.isDone)
45
+ return { ok: false, error: 'this act run is DONE — `agent-view act start` for a new one' };
46
+ if (session.steps.length >= session.maxSteps) {
47
+ return { ok: true, data: `BLOCKED: step budget ${session.maxSteps} exhausted\n${await printTable(run)}` };
48
+ }
49
+ if (op === 'scroll')
50
+ return scrollStep(run, str(args, 'direction'));
51
+ if (op === 'drag')
52
+ return dragStep(run, { n: num(args.n), to: str(args, 'to'), edge: str(args, 'edge') });
53
+ if (isRowOp(op))
54
+ return rowStep(run, { op, n: num(args.n), text: str(args, 'text') ?? '' });
55
+ if (op === 'do')
56
+ return batchStep(run, args.steps);
57
+ return { ok: false, error: `Unknown act op: ${op}` };
58
+ }
59
+ function createSession(args) {
60
+ const untilArgs = { testid: str(args, 'untilTestid'), selector: str(args, 'untilSelector') };
61
+ const testIdAttribute = str(args, 'testIdAttribute');
62
+ const maxSteps = typeof args.maxSteps === 'number' && args.maxSteps > 0 ? args.maxSteps : DEFAULT_MAX_STEPS;
63
+ return {
64
+ until: locatorFromArgs({ ...untilArgs, testIdAttribute }),
65
+ untilArgs,
66
+ maxSteps,
67
+ testIdAttribute,
68
+ rows: [],
69
+ steps: [],
70
+ startedAt: Date.now(),
71
+ saveAs: str(args, 'save'),
72
+ isDone: false,
73
+ };
74
+ }
75
+ /** `read` on the live socket; when the window reloaded under it, once more on a fresh one. */
76
+ async function onLiveConn(deps, read) {
77
+ try {
78
+ return await read();
79
+ }
80
+ catch (err) {
81
+ if (!isDeadSocket(err))
82
+ throw err;
83
+ deps.conn = await deps.reconnect();
84
+ return read();
85
+ }
86
+ }
87
+ const unlessDeadSocket = (read, fallback) => read.catch((err) => {
88
+ if (isDeadSocket(err))
89
+ return fallback;
90
+ throw err;
91
+ });
92
+ async function snapshot({ session, deps }) {
93
+ deps.invalidateAxCache();
94
+ return onLiveConn(deps, async () => {
95
+ const [ax, layout] = await Promise.all([deps.conn.getAccessibilityTree(), deps.conn.getLayoutSnapshot()]);
96
+ return extractControls(ax, layout, testIdAttributes(session.testIdAttribute));
97
+ });
98
+ }
99
+ /** Prints `controls` (or a fresh snapshot) and makes it the table the next `n` refers to. */
100
+ async function printTable(run, controls) {
101
+ const { session } = run;
102
+ session.rows = controls ?? await snapshot(run);
103
+ return formatControlTable(session.rows, { step: session.steps.length, maxSteps: session.maxSteps, untilLabel: session.until.label });
104
+ }
105
+ async function rowStep(run, { op, n, text }) {
106
+ const located = await locate(run, n);
107
+ if (!('target' in located))
108
+ return located;
109
+ const { target, fresh } = located;
110
+ if (op === 'type' && !TEXT_ROLES.has(target.role)) {
111
+ return { ok: false, error: `[${n}] is a ${target.role}, not a text field — pick a textbox/combobox row` };
112
+ }
113
+ const { session, deps } = run;
114
+ const echo = op === 'click' ? '' : ` ${target.isPassword ? PASSWORD_MASK : JSON.stringify(text)}`;
115
+ const done = `${op} [${n}] ${describeControl(target)}${echo}`;
116
+ let isReloaded = false;
117
+ try {
118
+ if (op === 'click') {
119
+ await deps.conn.clickByNodeId(target.backendDOMNodeId);
120
+ }
121
+ else if (op === 'type') {
122
+ await deps.conn.fillByNodeId(target.backendDOMNodeId, text);
123
+ }
124
+ else {
125
+ const outcome = await deps.conn.selectOption(target.backendDOMNodeId, text);
126
+ if (outcome === 'not-select')
127
+ return { ok: false, error: 'not a native select — click it' };
128
+ if (outcome === 'no-option')
129
+ return { ok: false, error: `No option "${text}" in [${n}]` };
130
+ }
131
+ }
132
+ catch (err) {
133
+ // The window reloaded under the action (login, logout): the socket died, the action went out.
134
+ if (!isDeadSocket(err))
135
+ throw err;
136
+ isReloaded = true;
137
+ }
138
+ deps.invalidateAxCache();
139
+ session.steps.push({ op, target: stepTarget(target), value: op === 'click' ? undefined : text, isPassword: target.isPassword });
140
+ return finishStep(run, { before: tableKey(fresh), done: isReloaded ? `${done} · window reloaded` : done });
141
+ }
142
+ /** `type 3 a b` types `a b`: the text is the rest of the step, spaces kept. */
143
+ function parseRowStep(step) {
144
+ const m = /^\s*(\S+)\s+(\d+)(?:\s(.*))?$/s.exec(step);
145
+ return m && isRowOp(m[1]) ? { op: m[1], n: Number(m[2]), text: m[3] ?? '' } : undefined;
146
+ }
147
+ /**
148
+ * Several row ops decided from ONE table — a form fill is one decision, not three model
149
+ * turns. Every n refers to that table: it is re-pinned before each op, so the stale guard
150
+ * maps it onto whatever the previous op left. Stops at the first error, BLOCKED or DONE.
151
+ */
152
+ async function batchStep(run, raw) {
153
+ const steps = Array.isArray(raw) ? raw.map(String) : [];
154
+ const parsed = steps.map(parseRowStep);
155
+ if (!parsed.every((p) => p !== undefined)) {
156
+ const bad = steps[parsed.indexOf(undefined)];
157
+ return { ok: false, error: `act do: "${bad}" — each step is click|type|select <n> [text]` };
158
+ }
159
+ const pinned = run.session.rows;
160
+ const lines = [];
161
+ for (const [i, step] of parsed.entries()) {
162
+ run.session.rows = pinned;
163
+ const result = await rowStep(run, step);
164
+ if (!result.ok)
165
+ return { ok: false, error: [...lines, result.error].join('\n') };
166
+ const out = String(result.data);
167
+ if (i === parsed.length - 1 || !out.startsWith('✓'))
168
+ return { ok: true, data: [...lines, out].join('\n') };
169
+ lines.push(out.split('\n')[0]);
170
+ }
171
+ return { ok: false, error: 'act do "<op> <n> [text]" …' };
172
+ }
173
+ /** Row n of the last table in a fresh snapshot: stale guard, then hit check. */
174
+ async function locate(run, n) {
175
+ const { session, deps } = run;
176
+ const last = session.rows[n - 1];
177
+ if (!last)
178
+ return { ok: false, error: `No row [${n}] in the last table (1-${session.rows.length})` };
179
+ const fresh = await snapshot(run);
180
+ const resolved = resolveRow(last, fresh);
181
+ if ('gone' in resolved)
182
+ return blocked(run, `[${n}] ${describeControl(last)} is gone`, fresh);
183
+ const covering = await deps.conn.hitTest(resolved.control.backendDOMNodeId, testIdAttributes(session.testIdAttribute));
184
+ if (covering)
185
+ return blocked(run, `[${n}] covered by ${covering}`, fresh);
186
+ return { target: resolved.control, fresh };
187
+ }
188
+ /**
189
+ * Pointer drag of row n onto an edge of: row `to`, any visible element `testid=<id>`
190
+ * (drop zones are rarely controls), or the viewport.
191
+ */
192
+ async function dragStep(run, { n, to, edge = 'center' }) {
193
+ if (!isEdge(edge))
194
+ return { ok: false, error: `act drag <n> [to] [edge] — edge is one of ${EDGES.join('|')}` };
195
+ const { session, deps } = run;
196
+ const located = await locate(run, n);
197
+ if (!('target' in located))
198
+ return located;
199
+ let destId;
200
+ let toLabel = 'viewport';
201
+ let toTarget;
202
+ if (to !== undefined && to !== 'center' && to.startsWith('testid=')) {
203
+ const testid = to.slice('testid='.length);
204
+ const found = await findByLocator(deps.conn, testIdLocator(testid, session.testIdAttribute));
205
+ if ('error' in found)
206
+ return { ok: false, error: found.error };
207
+ destId = found.backendDOMNodeId;
208
+ toLabel = to;
209
+ toTarget = { testid };
210
+ }
211
+ else if (to !== undefined && to !== 'center') {
212
+ const dest = await locate(run, Number(to));
213
+ if (!('target' in dest))
214
+ return dest;
215
+ destId = dest.target.backendDOMNodeId;
216
+ toLabel = `[${to}] ${describeControl(dest.target)}`;
217
+ toTarget = stepTarget(dest.target);
218
+ }
219
+ // Source first: scrolling it into view may move the target, so the target is measured after.
220
+ const from = await deps.conn.getBoxCenter(located.target.backendDOMNodeId);
221
+ const box = destId === undefined ? await viewportBox(deps.conn) : await deps.conn.getBoxRect(destId, { scrollIntoView: false });
222
+ await deps.conn.dragBetweenPositions(from, edgePoint(box, edge), { mode: 'pointer' });
223
+ deps.invalidateAxCache();
224
+ session.steps.push({ op: 'drag', target: stepTarget(located.target), to: toTarget, edge });
225
+ const source = `${describeControl(located.target)}${located.target.testid ? ` testid=${located.target.testid}` : ''}`;
226
+ return finishStep(run, { before: tableKey(located.fresh), done: `drag [${n}] ${source} → ${toLabel} ${edge}` });
227
+ }
228
+ async function scrollStep(run, direction) {
229
+ if (direction !== 'up' && direction !== 'down')
230
+ return { ok: false, error: 'act scroll <up|down>' };
231
+ const before = tableKey(await snapshot(run));
232
+ await run.deps.conn.scrollViewport(direction);
233
+ run.deps.invalidateAxCache();
234
+ run.session.steps.push({ op: 'scroll', direction });
235
+ return finishStep(run, { before, done: `scroll ${direction}` });
236
+ }
237
+ async function blocked(run, reason, fresh) {
238
+ return { ok: true, data: `BLOCKED: ${reason}\n${await printTable(run, fresh)}` };
239
+ }
240
+ const tableKey = (controls) => controls.map((c, i) => formatControlRow(c, i)).join('\n');
241
+ /** A table the decider asked for still ends the run when the goal was reached meanwhile. */
242
+ async function tableOrDone(run) {
243
+ const table = await printTable(run);
244
+ return { ok: true, data: await isUntilMet(run) ? await doneLine(run.session) : table };
245
+ }
246
+ /** The DONE line; with `start --save`, the recording is written here, sparing the decider a turn. */
247
+ async function doneLine(session) {
248
+ const line = `DONE: until ${session.until.label} · ${session.steps.length} steps · ${((Date.now() - session.startedAt) / 1000).toFixed(1)}s`;
249
+ const isFirstDone = !session.isDone;
250
+ session.isDone = true;
251
+ if (!session.saveAs || !isFirstDone)
252
+ return line;
253
+ const saved = await save(session, session.saveAs);
254
+ return `${line} · saved ${saved.ok ? saved.data : saved.error}`;
255
+ }
256
+ function isUntilMet({ session, deps }) {
257
+ return onLiveConn(deps, async () => !('error' in await findByLocator(deps.conn, session.until)));
258
+ }
259
+ /**
260
+ * Settle, not sleep: poll until the until-condition holds, or the table changed and then
261
+ * held still for SETTLE_STABLE_POLLS polls, or never changed for `quietPolls`, or the
262
+ * budget runs out.
263
+ */
264
+ async function finishStep(run, { before, done, quietPolls = SETTLE_QUIET_POLLS }) {
265
+ const t0 = Date.now();
266
+ let previous = before;
267
+ let hasChanged = false;
268
+ let stablePolls = 0;
269
+ let controls = [];
270
+ let isDone = false;
271
+ do {
272
+ await new Promise(r => setTimeout(r, SETTLE_POLL_MS));
273
+ // A socket that dies again mid-reload is a document between loads: an empty table.
274
+ controls = await unlessDeadSocket(snapshot(run), []);
275
+ isDone = await unlessDeadSocket(isUntilMet(run), false);
276
+ if (isDone)
277
+ break;
278
+ const key = tableKey(controls);
279
+ // An empty table is a document between loads, never a settled screen.
280
+ if (controls.length === 0 || key !== previous) {
281
+ hasChanged = true;
282
+ stablePolls = 0;
283
+ }
284
+ else {
285
+ stablePolls++;
286
+ }
287
+ previous = key;
288
+ } while (stablePolls < (hasChanged ? SETTLE_STABLE_POLLS : quietPolls) && Date.now() - t0 < SETTLE_BUDGET_MS);
289
+ const elapsed = Date.now() - t0;
290
+ if (isDone)
291
+ return { ok: true, data: await doneLine(run.session) };
292
+ const table = await printTable(run, controls);
293
+ const { session } = run;
294
+ if (session.steps.length >= session.maxSteps)
295
+ return { ok: true, data: `BLOCKED: step budget ${session.maxSteps} exhausted\n${table}` };
296
+ return { ok: true, data: `✓ ${done} · ${elapsed}ms\n${table}` };
297
+ }
298
+ async function save(session, name) {
299
+ if (!isScriptName(name))
300
+ return { ok: false, error: 'act save <name> — letters, digits, . _ - only' };
301
+ const path = await writeScript(name, { until: session.untilArgs, steps: session.steps });
302
+ return { ok: true, data: `${path} · replay: agent-view act replay ${name}` };
303
+ }
304
+ //# sourceMappingURL=act-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act-session.js","sourceRoot":"","sources":["../../src/server/act-session.ts"],"names":[],"mappings":"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"}