@athenaintel/react 0.60.0 → 0.61.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 (137) hide show
  1. package/README.md +225 -2
  2. package/dist/agent-runtime/src/client-tool-bridge.cjs +20 -2
  3. package/dist/agent-runtime/src/client-tool-bridge.cjs.map +1 -1
  4. package/dist/agent-runtime/src/client-tool-bridge.d.ts +9 -4
  5. package/dist/agent-runtime/src/client-tool-bridge.js +20 -2
  6. package/dist/agent-runtime/src/client-tool-bridge.js.map +1 -1
  7. package/dist/agent-runtime/src/client-tools.cjs.map +1 -1
  8. package/dist/agent-runtime/src/client-tools.d.ts +9 -0
  9. package/dist/agent-runtime/src/client-tools.js.map +1 -1
  10. package/dist/agent-ui/AgentTarget.cjs +11 -0
  11. package/dist/agent-ui/AgentTarget.cjs.map +1 -0
  12. package/dist/agent-ui/AgentTarget.d.ts +17 -0
  13. package/dist/agent-ui/AgentTarget.js +11 -0
  14. package/dist/agent-ui/AgentTarget.js.map +1 -0
  15. package/dist/agent-ui/AgentUiLayer.cjs +387 -0
  16. package/dist/agent-ui/AgentUiLayer.cjs.map +1 -0
  17. package/dist/agent-ui/AgentUiLayer.d.ts +40 -0
  18. package/dist/agent-ui/AgentUiLayer.js +387 -0
  19. package/dist/agent-ui/AgentUiLayer.js.map +1 -0
  20. package/dist/agent-ui/contract.cjs +104 -0
  21. package/dist/agent-ui/contract.cjs.map +1 -0
  22. package/dist/agent-ui/contract.d.ts +113 -0
  23. package/dist/agent-ui/contract.js +104 -0
  24. package/dist/agent-ui/contract.js.map +1 -0
  25. package/dist/agent-ui/driver.cjs +335 -0
  26. package/dist/agent-ui/driver.cjs.map +1 -0
  27. package/dist/agent-ui/driver.d.ts +66 -0
  28. package/dist/agent-ui/driver.js +335 -0
  29. package/dist/agent-ui/driver.js.map +1 -0
  30. package/dist/agent-ui/index.cjs +33 -0
  31. package/dist/agent-ui/index.cjs.map +1 -0
  32. package/dist/agent-ui/index.d.ts +19 -0
  33. package/dist/agent-ui/index.js +33 -0
  34. package/dist/agent-ui/index.js.map +1 -0
  35. package/dist/agent-ui/pace.cjs +121 -0
  36. package/dist/agent-ui/pace.cjs.map +1 -0
  37. package/dist/agent-ui/pace.d.ts +66 -0
  38. package/dist/agent-ui/pace.js +121 -0
  39. package/dist/agent-ui/pace.js.map +1 -0
  40. package/dist/agent-ui/screen.cjs +471 -0
  41. package/dist/agent-ui/screen.cjs.map +1 -0
  42. package/dist/agent-ui/screen.d.ts +97 -0
  43. package/dist/agent-ui/screen.js +471 -0
  44. package/dist/agent-ui/screen.js.map +1 -0
  45. package/dist/agent-ui/secret-fields.cjs +50 -0
  46. package/dist/agent-ui/secret-fields.cjs.map +1 -0
  47. package/dist/agent-ui/secret-fields.d.ts +15 -0
  48. package/dist/agent-ui/secret-fields.js +50 -0
  49. package/dist/agent-ui/secret-fields.js.map +1 -0
  50. package/dist/agent-ui/stage.cjs +196 -0
  51. package/dist/agent-ui/stage.cjs.map +1 -0
  52. package/dist/agent-ui/stage.d.ts +110 -0
  53. package/dist/agent-ui/stage.js +196 -0
  54. package/dist/agent-ui/stage.js.map +1 -0
  55. package/dist/agent-ui/tools.cjs +448 -0
  56. package/dist/agent-ui/tools.cjs.map +1 -0
  57. package/dist/agent-ui/tools.d.ts +103 -0
  58. package/dist/agent-ui/tools.js +448 -0
  59. package/dist/agent-ui/tools.js.map +1 -0
  60. package/dist/agent-ui/use-agent-target.cjs +63 -0
  61. package/dist/agent-ui/use-agent-target.cjs.map +1 -0
  62. package/dist/agent-ui/use-agent-target.d.ts +27 -0
  63. package/dist/agent-ui/use-agent-target.js +63 -0
  64. package/dist/agent-ui/use-agent-target.js.map +1 -0
  65. package/dist/agent-ui/use-agent-ui.cjs +15 -0
  66. package/dist/agent-ui/use-agent-ui.cjs.map +1 -0
  67. package/dist/agent-ui/use-agent-ui.d.ts +24 -0
  68. package/dist/agent-ui/use-agent-ui.js +15 -0
  69. package/dist/agent-ui/use-agent-ui.js.map +1 -0
  70. package/dist/chat/AthenaChat.cjs +19 -4
  71. package/dist/chat/AthenaChat.cjs.map +1 -1
  72. package/dist/chat/AthenaChat.d.ts +13 -0
  73. package/dist/chat/AthenaChat.js +19 -4
  74. package/dist/chat/AthenaChat.js.map +1 -1
  75. package/dist/chat/StatewireClientToolBridge.cjs +74 -1
  76. package/dist/chat/StatewireClientToolBridge.cjs.map +1 -1
  77. package/dist/chat/StatewireClientToolBridge.d.ts +16 -1
  78. package/dist/chat/StatewireClientToolBridge.js +75 -2
  79. package/dist/chat/StatewireClientToolBridge.js.map +1 -1
  80. package/dist/chat/StatewireClientToolConsentCard.cjs +66 -0
  81. package/dist/chat/StatewireClientToolConsentCard.cjs.map +1 -0
  82. package/dist/chat/StatewireClientToolConsentCard.d.ts +25 -0
  83. package/dist/chat/StatewireClientToolConsentCard.js +66 -0
  84. package/dist/chat/StatewireClientToolConsentCard.js.map +1 -0
  85. package/dist/chat/chat-voice-controls.cjs +5 -2
  86. package/dist/chat/chat-voice-controls.cjs.map +1 -1
  87. package/dist/chat/chat-voice-controls.d.ts +6 -1
  88. package/dist/chat/chat-voice-controls.js +6 -3
  89. package/dist/chat/chat-voice-controls.js.map +1 -1
  90. package/dist/chat/client-tool-write-consent.cjs +122 -0
  91. package/dist/chat/client-tool-write-consent.cjs.map +1 -0
  92. package/dist/chat/client-tool-write-consent.d.ts +79 -0
  93. package/dist/chat/client-tool-write-consent.js +122 -0
  94. package/dist/chat/client-tool-write-consent.js.map +1 -0
  95. package/dist/chat/statewire-client-tools.cjs +30 -5
  96. package/dist/chat/statewire-client-tools.cjs.map +1 -1
  97. package/dist/chat/statewire-client-tools.d.ts +34 -2
  98. package/dist/chat/statewire-client-tools.js +30 -5
  99. package/dist/chat/statewire-client-tools.js.map +1 -1
  100. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +13 -0
  101. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
  102. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.d.ts +12 -0
  103. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +13 -0
  104. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
  105. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +2 -1
  106. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  107. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +3 -2
  108. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  109. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs +2 -1
  110. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs.map +1 -1
  111. package/dist/chat-ui/mentions/use-asset-icon-app-url.d.ts +2 -1
  112. package/dist/chat-ui/mentions/use-asset-icon-app-url.js +2 -1
  113. package/dist/chat-ui/mentions/use-asset-icon-app-url.js.map +1 -1
  114. package/dist/chat-ui/messages/message-components.cjs +1 -1
  115. package/dist/chat-ui/messages/message-components.cjs.map +1 -1
  116. package/dist/chat-ui/messages/message-components.d.ts +2 -2
  117. package/dist/chat-ui/messages/message-components.js +1 -1
  118. package/dist/chat-ui/messages/message-components.js.map +1 -1
  119. package/dist/chat-ui/statewire.cjs +4 -0
  120. package/dist/chat-ui/statewire.cjs.map +1 -1
  121. package/dist/chat-ui/statewire.d.ts +2 -0
  122. package/dist/chat-ui/statewire.js +4 -0
  123. package/dist/chat-ui/statewire.js.map +1 -1
  124. package/dist/index.cjs +12 -0
  125. package/dist/index.cjs.map +1 -1
  126. package/dist/index.d.ts +12 -2
  127. package/dist/index.js +13 -1
  128. package/dist/index.js.map +1 -1
  129. package/dist/provider/AthenaProvider.cjs +59 -11
  130. package/dist/provider/AthenaProvider.cjs.map +1 -1
  131. package/dist/provider/AthenaProvider.d.ts +25 -1
  132. package/dist/provider/AthenaProvider.js +55 -7
  133. package/dist/provider/AthenaProvider.js.map +1 -1
  134. package/dist/react/package.json.cjs +1 -1
  135. package/dist/react/package.json.js +1 -1
  136. package/dist/styles.css +1 -1
  137. package/package.json +6 -1
@@ -0,0 +1,66 @@
1
+ import type { AgentTargetAction } from './contract';
2
+ import { type AgentUiInterruptReason, type AgentUiPace } from './pace';
3
+ import { type AgentTargetSnapshot } from './screen';
4
+ /** Bring an element into view at the pace's speed, and wait until it has stopped moving. */
5
+ export declare function revealElement({ element, pace, signal, }: {
6
+ element: Element;
7
+ pace: AgentUiPace;
8
+ signal?: AbortSignal;
9
+ }): Promise<void>;
10
+ /** The pieces a value is typed in: one character each, or larger so long text stays within the pace. */
11
+ export declare function typingSteps({ text, pace }: {
12
+ text: string;
13
+ pace: AgentUiPace;
14
+ }): string[];
15
+ export interface AgentUiActArgs {
16
+ target: AgentTargetSnapshot;
17
+ action: AgentTargetAction;
18
+ /** `type`: the text. */
19
+ text?: string;
20
+ /** `type`: press Enter after the text. */
21
+ submit?: boolean;
22
+ /** `select`: the option, by its label. */
23
+ option?: string;
24
+ /** `toggle`: the state wanted; absent flips it. */
25
+ checked?: boolean;
26
+ pace: AgentUiPace;
27
+ signal?: AbortSignal;
28
+ /** Called as the cursor should press (the layer shows the click). */
29
+ onPress?: () => void;
30
+ /**
31
+ * Called immediately before each thing done to the page, after every wait:
32
+ * the caller throws when the element is no longer the target it named (a
33
+ * list that reused the node for another row while the cursor glided).
34
+ */
35
+ beforeTouch?: () => void;
36
+ }
37
+ /** What an action did, in the words the agent is told. */
38
+ export interface AgentUiActOutcome {
39
+ /** Nothing needed doing (already in the state asked for). */
40
+ unchanged?: boolean;
41
+ detail: string;
42
+ }
43
+ /** Throws {@link AgentUiError} unless the target allows the action now. */
44
+ export declare function assertCanAct({ target, action, }: {
45
+ target: AgentTargetSnapshot;
46
+ action: AgentTargetAction;
47
+ }): void;
48
+ /** Take one action on a target. Throws {@link AgentUiError} for one the target does not allow. */
49
+ export declare function performAct({ target, action, text, submit, option, checked, pace, signal, onPress, beforeTouch, }: AgentUiActArgs): Promise<AgentUiActOutcome>;
50
+ /** Wait until the page has stopped changing after an action, bounded by the pace. */
51
+ export declare function waitForPageToSettle({ doc, pace, signal, }: {
52
+ doc: Document;
53
+ pace: AgentUiPace;
54
+ signal?: AbortSignal;
55
+ }): Promise<void>;
56
+ /**
57
+ * Watch for the person taking over while the agent acts: a key, a press or a
58
+ * scroll of their own, anywhere but on the overlay. The agent's own events are
59
+ * scripted, so they never count.
60
+ */
61
+ export declare function watchForPerson({ doc, isLayerEvent, isPersonEvent, onTakeover, }: {
62
+ doc: Document;
63
+ isLayerEvent: (event: Event) => boolean;
64
+ isPersonEvent?: (event: Event) => boolean;
65
+ onTakeover: (reason: AgentUiInterruptReason) => void;
66
+ }): () => void;
@@ -0,0 +1,335 @@
1
+ import { throwIfInterrupted, pause } from "./pace.js";
2
+ import { AgentUiError, isInViewport } from "./screen.js";
3
+ const tagOf = (element) => element.tagName.toUpperCase();
4
+ function isFocusable(element) {
5
+ return typeof element.focus === "function";
6
+ }
7
+ async function revealElement({
8
+ element,
9
+ pace,
10
+ signal
11
+ }) {
12
+ throwIfInterrupted(signal);
13
+ if (isInViewport(element) && isFullyInViewport(element)) return;
14
+ element.scrollIntoView({
15
+ behavior: pace.smoothScroll ? "smooth" : "auto",
16
+ block: "center",
17
+ inline: "nearest"
18
+ });
19
+ if (pace.scrollSettleMaxMs <= 0) return;
20
+ const deadline = Date.now() + pace.scrollSettleMaxMs;
21
+ let last = element.getBoundingClientRect();
22
+ let still = 0;
23
+ while (Date.now() < deadline && still < 3) {
24
+ await pause(50, signal);
25
+ const next = element.getBoundingClientRect();
26
+ still = Math.abs(next.top - last.top) < 0.5 && Math.abs(next.left - last.left) < 0.5 ? still + 1 : 0;
27
+ last = next;
28
+ }
29
+ }
30
+ function isFullyInViewport(element) {
31
+ const view = element.ownerDocument.defaultView;
32
+ if (!view) return false;
33
+ const rect = element.getBoundingClientRect();
34
+ return rect.top >= 0 && rect.left >= 0 && rect.bottom <= view.innerHeight && rect.right <= view.innerWidth;
35
+ }
36
+ function setNativeValue(control, value) {
37
+ var _a, _b, _c, _d;
38
+ const view = control.ownerDocument.defaultView;
39
+ const prototype = tagOf(control) === "TEXTAREA" ? (_a = view == null ? void 0 : view.HTMLTextAreaElement) == null ? void 0 : _a.prototype : tagOf(control) === "SELECT" ? (_b = view == null ? void 0 : view.HTMLSelectElement) == null ? void 0 : _b.prototype : (_c = view == null ? void 0 : view.HTMLInputElement) == null ? void 0 : _c.prototype;
40
+ const setter = prototype ? (_d = Object.getOwnPropertyDescriptor(prototype, "value")) == null ? void 0 : _d.set : void 0;
41
+ if (setter) setter.call(control, value);
42
+ else control.value = value;
43
+ }
44
+ function fire(element, type, init = {}) {
45
+ const view = element.ownerDocument.defaultView;
46
+ const EventClass = (view == null ? void 0 : view.Event) ?? Event;
47
+ const event = new EventClass(type, { bubbles: true, cancelable: true, ...init });
48
+ return element.dispatchEvent(event);
49
+ }
50
+ function fireInput(control, data) {
51
+ const view = control.ownerDocument.defaultView;
52
+ const InputEventClass = view == null ? void 0 : view.InputEvent;
53
+ if (InputEventClass) {
54
+ control.dispatchEvent(
55
+ new InputEventClass("input", {
56
+ bubbles: true,
57
+ cancelable: false,
58
+ data,
59
+ inputType: data === null ? "deleteContentBackward" : "insertText"
60
+ })
61
+ );
62
+ } else {
63
+ fire(control, "input");
64
+ }
65
+ }
66
+ function isEditable(control) {
67
+ const editable = control.getAttribute("contenteditable");
68
+ return editable === "" || editable === "true";
69
+ }
70
+ function writeValue(control, value, typed) {
71
+ if (isEditable(control)) control.textContent = value;
72
+ else setNativeValue(control, value);
73
+ fireInput(control, typed);
74
+ }
75
+ function typingSteps({ text, pace }) {
76
+ const characters = Array.from(text);
77
+ if (!pace.typeByCharacter || characters.length === 0) return [text];
78
+ const most = pace.typeCharMs > 0 ? Math.max(1, Math.floor(pace.typeMaxMs / pace.typeCharMs)) : 1;
79
+ const size = Math.max(1, Math.ceil(characters.length / most));
80
+ const steps = [];
81
+ for (let index = size; index < characters.length; index += size) {
82
+ steps.push(characters.slice(0, index).join(""));
83
+ }
84
+ steps.push(text);
85
+ return steps;
86
+ }
87
+ function pressEnter(control) {
88
+ const view = control.ownerDocument.defaultView;
89
+ const KeyboardEventClass = (view == null ? void 0 : view.KeyboardEvent) ?? KeyboardEvent;
90
+ const init = { key: "Enter", code: "Enter", keyCode: 13, which: 13, bubbles: true, cancelable: true };
91
+ const proceeded = control.dispatchEvent(new KeyboardEventClass("keydown", init));
92
+ const form = control.form;
93
+ if (proceeded && form && typeof form.requestSubmit === "function") form.requestSubmit();
94
+ control.dispatchEvent(new KeyboardEventClass("keyup", init));
95
+ }
96
+ function clickElement(element) {
97
+ const view = element.ownerDocument.defaultView;
98
+ const rect = element.getBoundingClientRect();
99
+ const point = {
100
+ bubbles: true,
101
+ cancelable: true,
102
+ composed: true,
103
+ button: 0,
104
+ clientX: rect.left + rect.width / 2,
105
+ clientY: rect.top + rect.height / 2,
106
+ view
107
+ };
108
+ const PointerEventClass = view == null ? void 0 : view.PointerEvent;
109
+ const MouseEventClass = (view == null ? void 0 : view.MouseEvent) ?? MouseEvent;
110
+ const pointer = { ...point, pointerId: 1, pointerType: "mouse", isPrimary: true };
111
+ if (PointerEventClass) element.dispatchEvent(new PointerEventClass("pointerdown", { ...pointer, buttons: 1 }));
112
+ element.dispatchEvent(new MouseEventClass("mousedown", { ...point, buttons: 1 }));
113
+ if (isFocusable(element)) element.focus({ preventScroll: true });
114
+ if (PointerEventClass) element.dispatchEvent(new PointerEventClass("pointerup", pointer));
115
+ element.dispatchEvent(new MouseEventClass("mouseup", point));
116
+ if (typeof element.click === "function") element.click();
117
+ else element.dispatchEvent(new MouseEventClass("click", point));
118
+ }
119
+ const sameWords = (text) => text.replace(/\s+/g, " ").trim().toLowerCase();
120
+ function matchOption(options, wanted) {
121
+ const text = sameWords(wanted).replace(/…$/, "").trimEnd();
122
+ const exact = options.filter(
123
+ (option) => sameWords(option.label) === text || option.value.toLowerCase() === text
124
+ );
125
+ if (exact[0]) return exact[0];
126
+ const starts = options.filter((option) => sameWords(option.label).startsWith(text));
127
+ if (starts.length === 1) return starts[0];
128
+ const holds = options.filter((option) => sameWords(option.label).includes(text));
129
+ return holds.length === 1 ? holds[0] : void 0;
130
+ }
131
+ function assertCanAct({
132
+ target,
133
+ action
134
+ }) {
135
+ if (!target.actions.includes(action)) {
136
+ const allowed = target.actions.length > 0 ? target.actions.join(", ") : "nothing: it can only be pointed at";
137
+ throw new AgentUiError(
138
+ `"${target.ref}" (${target.label}) does not allow "${action}". It allows: ${allowed}.`
139
+ );
140
+ }
141
+ if (target.disabled) {
142
+ throw new AgentUiError(`"${target.ref}" (${target.label}) is disabled right now.`);
143
+ }
144
+ }
145
+ async function performAct({
146
+ target,
147
+ action,
148
+ text,
149
+ submit,
150
+ option,
151
+ checked,
152
+ pace,
153
+ signal,
154
+ onPress,
155
+ beforeTouch
156
+ }) {
157
+ var _a;
158
+ assertCanAct({ target, action });
159
+ const { handlers } = target;
160
+ const control = target.control;
161
+ switch (action) {
162
+ case "click": {
163
+ onPress == null ? void 0 : onPress();
164
+ await pause(pace.pressMs, signal);
165
+ beforeTouch == null ? void 0 : beforeTouch();
166
+ if (handlers == null ? void 0 : handlers.click) await handlers.click();
167
+ else clickElement(target.element);
168
+ return { detail: `Clicked ${target.label}.` };
169
+ }
170
+ case "toggle": {
171
+ const current = target.checked;
172
+ const wanted = checked ?? (current === null ? null : !current);
173
+ if (wanted !== null && current === wanted) {
174
+ return { unchanged: true, detail: `${target.label} is already ${wanted ? "on" : "off"}.` };
175
+ }
176
+ if (target.role === "radio" && wanted === false) {
177
+ throw new AgentUiError(`"${target.ref}" is a radio button: choose another option instead of turning it off.`);
178
+ }
179
+ onPress == null ? void 0 : onPress();
180
+ await pause(pace.pressMs, signal);
181
+ beforeTouch == null ? void 0 : beforeTouch();
182
+ if (handlers == null ? void 0 : handlers.toggle) await handlers.toggle({ checked: wanted });
183
+ else clickElement(control ?? target.element);
184
+ return { detail: `Turned ${target.label} ${wanted === false ? "off" : "on"}.` };
185
+ }
186
+ case "select": {
187
+ if (typeof option !== "string" || !option.trim()) {
188
+ throw new AgentUiError(`Give the option to choose: act_on({ target: "${target.ref}", action: "select", option: "…" }).`);
189
+ }
190
+ if (handlers == null ? void 0 : handlers.select) {
191
+ const known = (_a = handlers.options) == null ? void 0 : _a.call(handlers);
192
+ const chosen2 = known ? matchOption(known.map((label) => ({ label, value: label })), option) : void 0;
193
+ if (known && !chosen2) {
194
+ throw new AgentUiError(`"${option}" is not an option of ${target.label}. Options: ${known.join(", ")}.`);
195
+ }
196
+ onPress == null ? void 0 : onPress();
197
+ await pause(pace.pressMs, signal);
198
+ beforeTouch == null ? void 0 : beforeTouch();
199
+ beforeTouch == null ? void 0 : beforeTouch();
200
+ await handlers.select({ option: (chosen2 == null ? void 0 : chosen2.label) ?? option.trim() });
201
+ return { detail: `Chose ${(chosen2 == null ? void 0 : chosen2.label) ?? option.trim()} in ${target.label}.` };
202
+ }
203
+ if (!control || tagOf(control) !== "SELECT") {
204
+ throw new AgentUiError(`"${target.ref}" has no list of options to choose from.`);
205
+ }
206
+ const select = control;
207
+ const options = Array.from(select.options).filter((entry) => !entry.disabled).map((entry) => ({ label: (entry.label || entry.text).trim(), value: entry.value, entry }));
208
+ const chosen = matchOption(options, option);
209
+ if (!chosen) {
210
+ const listed = options.slice(0, 30).map((entry) => entry.label);
211
+ throw new AgentUiError(
212
+ `"${option}" is not an option of ${target.label}. Options: ${listed.join(", ")}${options.length > listed.length ? ", …" : ""}.`
213
+ );
214
+ }
215
+ const already = select.multiple ? chosen.entry.selected : select.value === chosen.value;
216
+ if (already) {
217
+ return { unchanged: true, detail: `${target.label} is already ${chosen.label}.` };
218
+ }
219
+ onPress == null ? void 0 : onPress();
220
+ await pause(pace.pressMs, signal);
221
+ beforeTouch == null ? void 0 : beforeTouch();
222
+ if (isFocusable(control)) control.focus({ preventScroll: true });
223
+ if (select.multiple) chosen.entry.selected = true;
224
+ else setNativeValue(control, chosen.value);
225
+ fire(control, "input");
226
+ fire(control, "change");
227
+ return { detail: `Chose ${chosen.label} in ${target.label}.` };
228
+ }
229
+ case "clear":
230
+ case "type": {
231
+ const value = action === "clear" ? "" : text ?? "";
232
+ if (action === "type" && typeof text !== "string") {
233
+ throw new AgentUiError(`Give the text to type: act_on({ target: "${target.ref}", action: "type", text: "…" }).`);
234
+ }
235
+ if (target.sensitive && action === "type") {
236
+ throw new AgentUiError(`"${target.ref}" holds a secret: only the person types into it.`);
237
+ }
238
+ if (action === "clear" && (handlers == null ? void 0 : handlers.clear)) {
239
+ beforeTouch == null ? void 0 : beforeTouch();
240
+ await handlers.clear();
241
+ return { detail: `Cleared ${target.label}.` };
242
+ }
243
+ if (handlers == null ? void 0 : handlers.type) {
244
+ for (const step of typingSteps({ text: value, pace })) {
245
+ throwIfInterrupted(signal);
246
+ beforeTouch == null ? void 0 : beforeTouch();
247
+ await handlers.type({ text: step, done: false });
248
+ await pause(pace.typeCharMs, signal);
249
+ }
250
+ await handlers.type({ text: value, done: true });
251
+ return { detail: action === "clear" ? `Cleared ${target.label}.` : `Typed into ${target.label}.` };
252
+ }
253
+ if (!control) {
254
+ throw new AgentUiError(`"${target.ref}" has no field to type into.`);
255
+ }
256
+ if (target.readOnly) {
257
+ throw new AgentUiError(`"${target.ref}" (${target.label}) is read-only: nobody can type into it.`);
258
+ }
259
+ const longest = Number(control.maxLength);
260
+ if (Number.isFinite(longest) && longest >= 0 && Array.from(value).length > longest) {
261
+ throw new AgentUiError(`${target.label} takes at most ${longest} characters, and this text has ${Array.from(value).length}.`);
262
+ }
263
+ beforeTouch == null ? void 0 : beforeTouch();
264
+ if (isFocusable(control)) control.focus({ preventScroll: true });
265
+ if (value === "") {
266
+ writeValue(control, "", null);
267
+ } else {
268
+ let previous = "";
269
+ for (const step of typingSteps({ text: value, pace })) {
270
+ throwIfInterrupted(signal);
271
+ beforeTouch == null ? void 0 : beforeTouch();
272
+ writeValue(control, step, step.slice(previous.length));
273
+ previous = step;
274
+ await pause(pace.typeCharMs, signal);
275
+ }
276
+ }
277
+ fire(control, "change");
278
+ if (submit) pressEnter(control);
279
+ return {
280
+ detail: action === "clear" ? `Cleared ${target.label}.` : `Typed into ${target.label}${submit ? " and pressed Enter" : ""}.`
281
+ };
282
+ }
283
+ }
284
+ }
285
+ async function waitForPageToSettle({
286
+ doc,
287
+ pace,
288
+ signal
289
+ }) {
290
+ var _a;
291
+ await pause(pace.afterActMs, signal);
292
+ const Observer = (_a = doc.defaultView) == null ? void 0 : _a.MutationObserver;
293
+ if (pace.settleMaxMs <= 0 || !Observer || !doc.body) {
294
+ await new Promise((resolve) => setTimeout(resolve, 0));
295
+ return;
296
+ }
297
+ let lastChange = Date.now();
298
+ const observer = new Observer(() => {
299
+ lastChange = Date.now();
300
+ });
301
+ observer.observe(doc.body, { subtree: true, childList: true, attributes: true, characterData: true });
302
+ const deadline = Date.now() + pace.settleMaxMs;
303
+ try {
304
+ while (Date.now() < deadline && Date.now() - lastChange < pace.settleQuietMs) {
305
+ await pause(40, signal);
306
+ }
307
+ } finally {
308
+ observer.disconnect();
309
+ }
310
+ }
311
+ function watchForPerson({
312
+ doc,
313
+ isLayerEvent,
314
+ isPersonEvent = (event) => event.isTrusted,
315
+ onTakeover
316
+ }) {
317
+ const types = ["pointerdown", "keydown", "wheel", "touchstart"];
318
+ const listener = (event) => {
319
+ if (!isPersonEvent(event) || isLayerEvent(event)) return;
320
+ onTakeover("person");
321
+ };
322
+ for (const type of types) doc.addEventListener(type, listener, { capture: true, passive: true });
323
+ return () => {
324
+ for (const type of types) doc.removeEventListener(type, listener, { capture: true });
325
+ };
326
+ }
327
+ export {
328
+ assertCanAct,
329
+ performAct,
330
+ revealElement,
331
+ typingSteps,
332
+ waitForPageToSettle,
333
+ watchForPerson
334
+ };
335
+ //# sourceMappingURL=driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver.js","sources":["../../src/agent-ui/driver.ts"],"sourcesContent":["/*\n * The driver: how the agent's actions reach the page. Every one goes through\n * the element's own events (a pointer press and a click, values set and\n * `input` / `change` fired the way a keyboard would), so the app's handlers,\n * validation and undo run exactly as they do for a person. Nothing is written\n * around the app.\n *\n * A target that ordinary input cannot drive registers its own handler\n * (`useAgentTarget`), which the driver calls instead.\n */\n\nimport type { AgentTargetAction } from './contract';\nimport {\n type AgentUiInterruptReason,\n type AgentUiPace,\n pause,\n throwIfInterrupted,\n} from './pace';\nimport { AgentUiError, type AgentTargetSnapshot, isInViewport } from './screen';\n\nconst tagOf = (element: Element): string => element.tagName.toUpperCase();\n\ninterface FocusableElement extends Element {\n focus(options?: { preventScroll?: boolean }): void;\n click(): void;\n}\n\nfunction isFocusable(element: Element): element is FocusableElement {\n return typeof (element as { focus?: unknown }).focus === 'function';\n}\n\n/** Bring an element into view at the pace's speed, and wait until it has stopped moving. */\nexport async function revealElement({\n element,\n pace,\n signal,\n}: {\n element: Element;\n pace: AgentUiPace;\n signal?: AbortSignal;\n}): Promise<void> {\n throwIfInterrupted(signal);\n if (isInViewport(element) && isFullyInViewport(element)) return;\n element.scrollIntoView({\n behavior: pace.smoothScroll ? 'smooth' : 'auto',\n block: 'center',\n inline: 'nearest',\n });\n if (pace.scrollSettleMaxMs <= 0) return;\n // A smooth scroll has no end event everywhere: wait until the element has\n // held one position for a few frames, bounded.\n const deadline = Date.now() + pace.scrollSettleMaxMs;\n let last = element.getBoundingClientRect();\n let still = 0;\n while (Date.now() < deadline && still < 3) {\n await pause(50, signal);\n const next = element.getBoundingClientRect();\n still = Math.abs(next.top - last.top) < 0.5 && Math.abs(next.left - last.left) < 0.5 ? still + 1 : 0;\n last = next;\n }\n}\n\nfunction isFullyInViewport(element: Element): boolean {\n const view = element.ownerDocument.defaultView;\n if (!view) return false;\n const rect = element.getBoundingClientRect();\n return rect.top >= 0 && rect.left >= 0 && rect.bottom <= view.innerHeight && rect.right <= view.innerWidth;\n}\n\nfunction setNativeValue(control: Element, value: string): void {\n const view = control.ownerDocument.defaultView;\n const prototype =\n tagOf(control) === 'TEXTAREA'\n ? view?.HTMLTextAreaElement?.prototype\n : tagOf(control) === 'SELECT'\n ? view?.HTMLSelectElement?.prototype\n : view?.HTMLInputElement?.prototype;\n // React tracks a controlled field's value on the element itself; the\n // prototype's setter is the one a keystroke goes through, so `onChange` fires.\n const setter = prototype ? Object.getOwnPropertyDescriptor(prototype, 'value')?.set : undefined;\n if (setter) setter.call(control, value);\n else (control as { value?: string }).value = value;\n}\n\nfunction fire(element: Element, type: string, init: Record<string, unknown> = {}): boolean {\n const view = element.ownerDocument.defaultView;\n const EventClass = view?.Event ?? Event;\n const event = new EventClass(type, { bubbles: true, cancelable: true, ...init });\n return element.dispatchEvent(event);\n}\n\nfunction fireInput(control: Element, data: string | null): void {\n const view = control.ownerDocument.defaultView;\n const InputEventClass = view?.InputEvent;\n if (InputEventClass) {\n control.dispatchEvent(\n new InputEventClass('input', {\n bubbles: true,\n cancelable: false,\n data,\n inputType: data === null ? 'deleteContentBackward' : 'insertText',\n }),\n );\n } else {\n fire(control, 'input');\n }\n}\n\nfunction isEditable(control: Element): boolean {\n const editable = control.getAttribute('contenteditable');\n return editable === '' || editable === 'true';\n}\n\nfunction writeValue(control: Element, value: string, typed: string | null): void {\n if (isEditable(control)) control.textContent = value;\n else setNativeValue(control, value);\n fireInput(control, typed);\n}\n\n/** The pieces a value is typed in: one character each, or larger so long text stays within the pace. */\nexport function typingSteps({ text, pace }: { text: string; pace: AgentUiPace }): string[] {\n const characters = Array.from(text);\n if (!pace.typeByCharacter || characters.length === 0) return [text];\n const most = pace.typeCharMs > 0 ? Math.max(1, Math.floor(pace.typeMaxMs / pace.typeCharMs)) : 1;\n const size = Math.max(1, Math.ceil(characters.length / most));\n const steps: string[] = [];\n for (let index = size; index < characters.length; index += size) {\n steps.push(characters.slice(0, index).join(''));\n }\n steps.push(text);\n return steps;\n}\n\nfunction pressEnter(control: Element): void {\n const view = control.ownerDocument.defaultView;\n const KeyboardEventClass = view?.KeyboardEvent ?? KeyboardEvent;\n const init = { key: 'Enter', code: 'Enter', keyCode: 13, which: 13, bubbles: true, cancelable: true };\n const proceeded = control.dispatchEvent(new KeyboardEventClass('keydown', init));\n // A script's key event submits nothing by itself: do what the browser would\n // have, unless the app's own handler took the key.\n const form = (control as { form?: { requestSubmit?: () => void } | null }).form;\n if (proceeded && form && typeof form.requestSubmit === 'function') form.requestSubmit();\n control.dispatchEvent(new KeyboardEventClass('keyup', init));\n}\n\n/** A person's click, as the page receives it: pointer and mouse down and up, focus, then the click. */\nfunction clickElement(element: Element): void {\n const view = element.ownerDocument.defaultView;\n const rect = element.getBoundingClientRect();\n const point = {\n bubbles: true,\n cancelable: true,\n composed: true,\n button: 0,\n clientX: rect.left + rect.width / 2,\n clientY: rect.top + rect.height / 2,\n view,\n };\n const PointerEventClass = view?.PointerEvent;\n const MouseEventClass = view?.MouseEvent ?? MouseEvent;\n const pointer = { ...point, pointerId: 1, pointerType: 'mouse', isPrimary: true };\n if (PointerEventClass) element.dispatchEvent(new PointerEventClass('pointerdown', { ...pointer, buttons: 1 }));\n element.dispatchEvent(new MouseEventClass('mousedown', { ...point, buttons: 1 }));\n if (isFocusable(element)) element.focus({ preventScroll: true });\n if (PointerEventClass) element.dispatchEvent(new PointerEventClass('pointerup', pointer));\n element.dispatchEvent(new MouseEventClass('mouseup', point));\n // An SVG element can be focused but has no `click()` of its own.\n if (typeof (element as { click?: unknown }).click === 'function') (element as FocusableElement).click();\n else element.dispatchEvent(new MouseEventClass('click', point));\n}\n\nconst sameWords = (text: string): string => text.replace(/\\s+/g, ' ').trim().toLowerCase();\n\nfunction matchOption<T extends { label: string; value: string }>(\n options: readonly T[],\n wanted: string,\n): T | undefined {\n // A long option is listed cut short with an ellipsis: what the agent read\n // back is then the start of the one it means.\n const text = sameWords(wanted).replace(/…$/, '').trimEnd();\n const exact = options.filter(\n (option) => sameWords(option.label) === text || option.value.toLowerCase() === text,\n );\n if (exact[0]) return exact[0];\n const starts = options.filter((option) => sameWords(option.label).startsWith(text));\n if (starts.length === 1) return starts[0];\n const holds = options.filter((option) => sameWords(option.label).includes(text));\n return holds.length === 1 ? holds[0] : undefined;\n}\n\nexport interface AgentUiActArgs {\n target: AgentTargetSnapshot;\n action: AgentTargetAction;\n /** `type`: the text. */\n text?: string;\n /** `type`: press Enter after the text. */\n submit?: boolean;\n /** `select`: the option, by its label. */\n option?: string;\n /** `toggle`: the state wanted; absent flips it. */\n checked?: boolean;\n pace: AgentUiPace;\n signal?: AbortSignal;\n /** Called as the cursor should press (the layer shows the click). */\n onPress?: () => void;\n /**\n * Called immediately before each thing done to the page, after every wait:\n * the caller throws when the element is no longer the target it named (a\n * list that reused the node for another row while the cursor glided).\n */\n beforeTouch?: () => void;\n}\n\n/** What an action did, in the words the agent is told. */\nexport interface AgentUiActOutcome {\n /** Nothing needed doing (already in the state asked for). */\n unchanged?: boolean;\n detail: string;\n}\n\n/** Throws {@link AgentUiError} unless the target allows the action now. */\nexport function assertCanAct({\n target,\n action,\n}: {\n target: AgentTargetSnapshot;\n action: AgentTargetAction;\n}): void {\n if (!target.actions.includes(action)) {\n const allowed =\n target.actions.length > 0 ? target.actions.join(', ') : 'nothing: it can only be pointed at';\n throw new AgentUiError(\n `\"${target.ref}\" (${target.label}) does not allow \"${action}\". It allows: ${allowed}.`,\n );\n }\n if (target.disabled) {\n throw new AgentUiError(`\"${target.ref}\" (${target.label}) is disabled right now.`);\n }\n}\n\n/** Take one action on a target. Throws {@link AgentUiError} for one the target does not allow. */\nexport async function performAct({\n target,\n action,\n text,\n submit,\n option,\n checked,\n pace,\n signal,\n onPress,\n beforeTouch,\n}: AgentUiActArgs): Promise<AgentUiActOutcome> {\n assertCanAct({ target, action });\n const { handlers } = target;\n const control = target.control;\n\n switch (action) {\n case 'click': {\n onPress?.();\n await pause(pace.pressMs, signal);\n beforeTouch?.();\n if (handlers?.click) await handlers.click();\n else clickElement(target.element);\n return { detail: `Clicked ${target.label}.` };\n }\n\n case 'toggle': {\n const current = target.checked;\n const wanted = checked ?? (current === null ? null : !current);\n if (wanted !== null && current === wanted) {\n return { unchanged: true, detail: `${target.label} is already ${wanted ? 'on' : 'off'}.` };\n }\n if (target.role === 'radio' && wanted === false) {\n throw new AgentUiError(`\"${target.ref}\" is a radio button: choose another option instead of turning it off.`);\n }\n onPress?.();\n await pause(pace.pressMs, signal);\n beforeTouch?.();\n if (handlers?.toggle) await handlers.toggle({ checked: wanted });\n else clickElement(control ?? target.element);\n return { detail: `Turned ${target.label} ${wanted === false ? 'off' : 'on'}.` };\n }\n\n case 'select': {\n if (typeof option !== 'string' || !option.trim()) {\n throw new AgentUiError(`Give the option to choose: act_on({ target: \"${target.ref}\", action: \"select\", option: \"…\" }).`);\n }\n if (handlers?.select) {\n const known = handlers.options?.();\n const chosen = known ? matchOption(known.map((label) => ({ label, value: label })), option) : undefined;\n if (known && !chosen) {\n throw new AgentUiError(`\"${option}\" is not an option of ${target.label}. Options: ${known.join(', ')}.`);\n }\n onPress?.();\n await pause(pace.pressMs, signal);\n beforeTouch?.();\n beforeTouch?.();\n await handlers.select({ option: chosen?.label ?? option.trim() });\n return { detail: `Chose ${chosen?.label ?? option.trim()} in ${target.label}.` };\n }\n if (!control || tagOf(control) !== 'SELECT') {\n throw new AgentUiError(`\"${target.ref}\" has no list of options to choose from.`);\n }\n const select = control as unknown as {\n multiple?: boolean;\n value?: string;\n options: ArrayLike<{ label: string; text: string; value: string; disabled: boolean; selected: boolean }>;\n };\n const options = Array.from(select.options)\n .filter((entry) => !entry.disabled)\n .map((entry) => ({ label: (entry.label || entry.text).trim(), value: entry.value, entry }));\n const chosen = matchOption(options, option);\n if (!chosen) {\n const listed = options.slice(0, 30).map((entry) => entry.label);\n throw new AgentUiError(\n `\"${option}\" is not an option of ${target.label}. Options: ${listed.join(', ')}${options.length > listed.length ? ', …' : ''}.`,\n );\n }\n const already = select.multiple ? chosen.entry.selected : select.value === chosen.value;\n if (already) {\n return { unchanged: true, detail: `${target.label} is already ${chosen.label}.` };\n }\n onPress?.();\n await pause(pace.pressMs, signal);\n beforeTouch?.();\n if (isFocusable(control)) control.focus({ preventScroll: true });\n // A list that takes several choices gains this one; the others stay.\n if (select.multiple) chosen.entry.selected = true;\n else setNativeValue(control, chosen.value);\n fire(control, 'input');\n fire(control, 'change');\n return { detail: `Chose ${chosen.label} in ${target.label}.` };\n }\n\n case 'clear':\n case 'type': {\n const value = action === 'clear' ? '' : (text ?? '');\n if (action === 'type' && typeof text !== 'string') {\n throw new AgentUiError(`Give the text to type: act_on({ target: \"${target.ref}\", action: \"type\", text: \"…\" }).`);\n }\n if (target.sensitive && action === 'type') {\n throw new AgentUiError(`\"${target.ref}\" holds a secret: only the person types into it.`);\n }\n if (action === 'clear' && handlers?.clear) {\n beforeTouch?.();\n await handlers.clear();\n return { detail: `Cleared ${target.label}.` };\n }\n if (handlers?.type) {\n for (const step of typingSteps({ text: value, pace })) {\n throwIfInterrupted(signal);\n beforeTouch?.();\n await handlers.type({ text: step, done: false });\n await pause(pace.typeCharMs, signal);\n }\n await handlers.type({ text: value, done: true });\n return { detail: action === 'clear' ? `Cleared ${target.label}.` : `Typed into ${target.label}.` };\n }\n if (!control) {\n throw new AgentUiError(`\"${target.ref}\" has no field to type into.`);\n }\n // What a keyboard could not do, the agent does not do either.\n if (target.readOnly) {\n throw new AgentUiError(`\"${target.ref}\" (${target.label}) is read-only: nobody can type into it.`);\n }\n const longest = Number((control as { maxLength?: number }).maxLength);\n if (Number.isFinite(longest) && longest >= 0 && Array.from(value).length > longest) {\n throw new AgentUiError(`${target.label} takes at most ${longest} characters, and this text has ${Array.from(value).length}.`);\n }\n beforeTouch?.();\n if (isFocusable(control)) control.focus({ preventScroll: true });\n // Typing replaces what the field held, as selecting it all and typing would.\n if (value === '') {\n writeValue(control, '', null);\n } else {\n let previous = '';\n for (const step of typingSteps({ text: value, pace })) {\n throwIfInterrupted(signal);\n beforeTouch?.();\n writeValue(control, step, step.slice(previous.length));\n previous = step;\n await pause(pace.typeCharMs, signal);\n }\n }\n fire(control, 'change');\n if (submit) pressEnter(control);\n return {\n detail:\n action === 'clear'\n ? `Cleared ${target.label}.`\n : `Typed into ${target.label}${submit ? ' and pressed Enter' : ''}.`,\n };\n }\n }\n}\n\n/** Wait until the page has stopped changing after an action, bounded by the pace. */\nexport async function waitForPageToSettle({\n doc,\n pace,\n signal,\n}: {\n doc: Document;\n pace: AgentUiPace;\n signal?: AbortSignal;\n}): Promise<void> {\n await pause(pace.afterActMs, signal);\n const Observer = doc.defaultView?.MutationObserver;\n if (pace.settleMaxMs <= 0 || !Observer || !doc.body) {\n // Let the app's own updates from the action land before the page is read back.\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n return;\n }\n let lastChange = Date.now();\n const observer = new Observer(() => {\n lastChange = Date.now();\n });\n observer.observe(doc.body, { subtree: true, childList: true, attributes: true, characterData: true });\n const deadline = Date.now() + pace.settleMaxMs;\n try {\n while (Date.now() < deadline && Date.now() - lastChange < pace.settleQuietMs) {\n await pause(40, signal);\n }\n } finally {\n observer.disconnect();\n }\n}\n\n/**\n * Watch for the person taking over while the agent acts: a key, a press or a\n * scroll of their own, anywhere but on the overlay. The agent's own events are\n * scripted, so they never count.\n */\nexport function watchForPerson({\n doc,\n isLayerEvent,\n isPersonEvent = (event) => event.isTrusted,\n onTakeover,\n}: {\n doc: Document;\n isLayerEvent: (event: Event) => boolean;\n isPersonEvent?: (event: Event) => boolean;\n onTakeover: (reason: AgentUiInterruptReason) => void;\n}): () => void {\n const types = ['pointerdown', 'keydown', 'wheel', 'touchstart'] as const;\n const listener = (event: Event) => {\n if (!isPersonEvent(event) || isLayerEvent(event)) return;\n onTakeover('person');\n };\n for (const type of types) doc.addEventListener(type, listener, { capture: true, passive: true });\n return () => {\n for (const type of types) doc.removeEventListener(type, listener, { capture: true });\n };\n}\n"],"names":["chosen"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const contract = require("./contract.cjs");
4
+ const AgentTarget = require("./AgentTarget.cjs");
5
+ const AgentUiLayer = require("./AgentUiLayer.cjs");
6
+ const pace = require("./pace.cjs");
7
+ const screen = require("./screen.cjs");
8
+ const tools = require("./tools.cjs");
9
+ const useAgentTarget = require("./use-agent-target.cjs");
10
+ const useAgentUi = require("./use-agent-ui.cjs");
11
+ exports.AGENT_ATTR = contract.AGENT_ATTR;
12
+ exports.AGENT_TARGET_ACTIONS = contract.AGENT_TARGET_ACTIONS;
13
+ exports.agentRegion = contract.agentRegion;
14
+ exports.agentTarget = contract.agentTarget;
15
+ exports.agentTargetRef = contract.agentTargetRef;
16
+ exports.isAgentTargetId = contract.isAgentTargetId;
17
+ exports.registerAgentTargetHandlers = contract.registerAgentTargetHandlers;
18
+ exports.AgentTarget = AgentTarget.AgentTarget;
19
+ exports.AgentUiLayer = AgentUiLayer.AgentUiLayer;
20
+ exports.MAX_STEPS = pace.MAX_STEPS;
21
+ exports.POINT_DEFAULT_MS = pace.POINT_DEFAULT_MS;
22
+ exports.POINT_MAX_MS = pace.POINT_MAX_MS;
23
+ exports.AgentUiError = screen.AgentUiError;
24
+ exports.describeTarget = screen.describeTarget;
25
+ exports.readScreen = screen.readScreen;
26
+ exports.resolveTarget = screen.resolveTarget;
27
+ exports.snapshotTargets = screen.snapshotTargets;
28
+ exports.AGENT_UI_ACT_SUMMARY = tools.AGENT_UI_ACT_SUMMARY;
29
+ exports.AGENT_UI_TOOL_NAMES = tools.AGENT_UI_TOOL_NAMES;
30
+ exports.createAgentUi = tools.createAgentUi;
31
+ exports.useAgentTarget = useAgentTarget.useAgentTarget;
32
+ exports.useAgentUi = useAgentUi.useAgentUi;
33
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Agent-drivable UI: an app marks the elements its agent may see, point at and
3
+ * operate, and the agent gets a handful of tools for the screen the person has
4
+ * open: read it, point at something, walk through steps, operate a control.
5
+ * Everything it does is shown on the page as it happens.
6
+ *
7
+ * Published as the `@athenaintel/react/agent-ui` sub-path. `<AthenaProvider
8
+ * agentUi>` wires all of it in one prop; the pieces are here for a host that
9
+ * wires them itself or draws its own overlay.
10
+ */
11
+ export { AGENT_ATTR, AGENT_TARGET_ACTIONS, type AgentTargetAction, type AgentTargetHandlers, type AgentTargetOptions, type AgentTargetProps as AgentTargetAttributes, agentRegion, agentTarget, agentTargetRef, isAgentTargetId, registerAgentTargetHandlers, } from './contract';
12
+ export { AgentTarget, type AgentTargetProps } from './AgentTarget';
13
+ export { AgentUiLayer, type AgentUiLayerClassNames, type AgentUiLayerProps, } from './AgentUiLayer';
14
+ export { type AgentUiPace, type AgentUiSpeed, MAX_STEPS, POINT_DEFAULT_MS, POINT_MAX_MS } from './pace';
15
+ export { AgentUiError, type AgentTargetSnapshot, describeTarget, readScreen, resolveTarget, snapshotTargets, } from './screen';
16
+ export type { AgentUiCursor, AgentUiMark, AgentUiMarkTone, AgentUiQuestion, AgentUiStage, AgentUiStageState, AgentUiTour, AgentUiTourStep, } from './stage';
17
+ export { AGENT_UI_ACT_SUMMARY, AGENT_UI_TOOL_NAMES, type AgentUi, type AgentUiOptions, type AgentUiRoute, type AgentUiTool, type AgentUiToolName, createAgentUi, } from './tools';
18
+ export { type UseAgentTargetOptions, useAgentTarget } from './use-agent-target';
19
+ export { type UseAgentUi, useAgentUi } from './use-agent-ui';
@@ -0,0 +1,33 @@
1
+ import { AGENT_ATTR, AGENT_TARGET_ACTIONS, agentRegion, agentTarget, agentTargetRef, isAgentTargetId, registerAgentTargetHandlers } from "./contract.js";
2
+ import { AgentTarget } from "./AgentTarget.js";
3
+ import { AgentUiLayer } from "./AgentUiLayer.js";
4
+ import { MAX_STEPS, POINT_DEFAULT_MS, POINT_MAX_MS } from "./pace.js";
5
+ import { AgentUiError, describeTarget, readScreen, resolveTarget, snapshotTargets } from "./screen.js";
6
+ import { AGENT_UI_ACT_SUMMARY, AGENT_UI_TOOL_NAMES, createAgentUi } from "./tools.js";
7
+ import { useAgentTarget } from "./use-agent-target.js";
8
+ import { useAgentUi } from "./use-agent-ui.js";
9
+ export {
10
+ AGENT_ATTR,
11
+ AGENT_TARGET_ACTIONS,
12
+ AGENT_UI_ACT_SUMMARY,
13
+ AGENT_UI_TOOL_NAMES,
14
+ AgentTarget,
15
+ AgentUiError,
16
+ AgentUiLayer,
17
+ MAX_STEPS,
18
+ POINT_DEFAULT_MS,
19
+ POINT_MAX_MS,
20
+ agentRegion,
21
+ agentTarget,
22
+ agentTargetRef,
23
+ createAgentUi,
24
+ describeTarget,
25
+ isAgentTargetId,
26
+ readScreen,
27
+ registerAgentTargetHandlers,
28
+ resolveTarget,
29
+ snapshotTargets,
30
+ useAgentTarget,
31
+ useAgentUi
32
+ };
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}