@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
@@ -1,19 +1,13 @@
1
1
  import { CursorIcon as Cursor } from "@phosphor-icons/react/Cursor";
2
2
  import { SparkleIcon as Sparkle } from "@phosphor-icons/react/Sparkle";
3
3
  import * as React from "react";
4
- import { useCallback, useLayoutEffect, useEffect, useRef, useState, } from "react";
4
+ import { useCallback, useLayoutEffect, useEffect, useRef, useState } from "react";
5
5
  import { createPortal } from "react-dom";
6
6
  import { PageCommandError } from "./browser/locator.js";
7
7
  import { lockOperationSurface } from "./operation-lock.js";
8
- const center = (rect) => ({
9
- left: rect.left + rect.width / 2,
10
- top: rect.top + rect.height / 2,
11
- });
8
+ const center = (rect) => ({ left: rect.left + rect.width / 2, top: rect.top + rect.height / 2 });
12
9
  const distance = (a, b) => Math.hypot(a.left - b.left, a.top - b.top);
13
- const interrupted = () => new PageCommandError({
14
- code: "EXECUTION_CANCELLED",
15
- message: "Page action presentation was interrupted.",
16
- });
10
+ const interrupted = () => new PageCommandError({ code: "EXECUTION_CANCELLED", message: "Page action presentation was interrupted." });
17
11
  function presentPointer(pointer, target, presentation) {
18
12
  let finished = false;
19
13
  const finish = (error) => {
@@ -25,57 +19,45 @@ function presentPointer(pointer, target, presentation) {
25
19
  presentation.signal?.removeEventListener("abort", onAbort);
26
20
  presentation.finish(error);
27
21
  };
28
- const reached = () => pointer.isConnected &&
29
- target.isConnected &&
30
- distance(pointer.getBoundingClientRect(), center(target.getBoundingClientRect())) < 2;
22
+ const reached = () => pointer.isConnected && target.isConnected && distance(pointer.getBoundingClientRect(), center(target.getBoundingClientRect())) < 2;
31
23
  const onTransition = (event) => {
32
24
  if (event.target === pointer && event.propertyName === "transform" && reached())
33
25
  finish();
34
26
  };
35
27
  const onAbort = () => finish(interrupted());
36
- const timer = setTimeout(() => reached()
37
- ? finish()
38
- : finish(new PageCommandError({
39
- code: "ACTION_TIMEOUT",
40
- message: "Page action pointer did not reach its target in time.",
41
- })), 750);
28
+ const timer = setTimeout(() => reached() ? finish() : finish(new PageCommandError({
29
+ code: "ACTION_TIMEOUT", message: "Page action pointer did not reach its target in time.",
30
+ })), 750);
42
31
  pointer.addEventListener("transitionend", onTransition);
43
32
  presentation.signal?.addEventListener("abort", onAbort, { once: true });
44
- queueMicrotask(() => {
45
- if (presentation.signal?.aborted)
46
- onAbort();
47
- else if (reached())
48
- finish();
49
- });
33
+ queueMicrotask(() => { if (presentation.signal?.aborted)
34
+ onAbort();
35
+ else if (reached())
36
+ finish(); });
50
37
  return () => finish(interrupted());
51
38
  }
52
39
  function FeedbackLabel({ feedback }) {
53
- return (React.createElement("span", { className: "agent-operation__pointer-label", "data-browser-tool": feedback.centered ? "true" : undefined, "data-operation-effect": feedback.effect, title: feedback.label },
54
- feedback.effect === "processing" ? (React.createElement("span", { className: "agent-operation__pointer-processing" })) : null,
55
- feedback.effect === "read" ? (React.createElement("span", { className: "agent-operation__pointer-read-scan" },
40
+ return React.createElement("span", { className: "agent-operation__pointer-label", "data-browser-tool": feedback.centered ? "true" : undefined, "data-operation-effect": feedback.effect, title: feedback.label },
41
+ feedback.effect === "processing" ? React.createElement("span", { className: "agent-operation__pointer-processing" }) : null,
42
+ feedback.effect === "read" ? React.createElement("span", { className: "agent-operation__pointer-read-scan" },
56
43
  React.createElement("i", null),
57
44
  React.createElement("i", null),
58
45
  React.createElement("i", null),
59
46
  React.createElement("i", null),
60
- React.createElement("i", null))) : null,
61
- feedback.effect === "navigate" ? (React.createElement("span", { className: "agent-operation__pointer-navigation-trail" })) : null,
62
- React.createElement("span", { className: "agent-operation__pointer-label-text" }, feedback.label)));
47
+ React.createElement("i", null)) : null,
48
+ feedback.effect === "navigate" ? React.createElement("span", { className: "agent-operation__pointer-navigation-trail" }) : null,
49
+ React.createElement("span", { className: "agent-operation__pointer-label-text" }, feedback.label));
63
50
  }
64
- function FeedbackIndicator({ feedback, position, }) {
51
+ function FeedbackIndicator({ feedback, position }) {
65
52
  const [lastPosition, setLastPosition] = useState(position ?? feedback.position);
66
- useLayoutEffect(() => {
67
- if (position)
68
- setLastPosition(position);
69
- }, [position?.left, position?.top]);
53
+ useLayoutEffect(() => { if (position)
54
+ setLastPosition(position); }, [position?.left, position?.top]);
70
55
  const current = position ?? lastPosition;
71
- return current ? (React.createElement("div", { "aria-hidden": true, className: "agent-operation__pointer-effect", "data-active": "true", "data-operation-effect": feedback.effect, style: {
72
- "--agent-operation-pointer-duration": "0ms",
73
- "--agent-operation-pointer-x": `${current.left}px`,
74
- "--agent-operation-pointer-y": `${current.top}px`,
75
- } },
76
- React.createElement(FeedbackLabel, { feedback: feedback }))) : null;
56
+ return current ? React.createElement("div", { "aria-hidden": true, className: "agent-operation__pointer-effect", "data-active": "true", "data-operation-effect": feedback.effect, style: { "--agent-operation-pointer-duration": "0ms", "--agent-operation-pointer-x": `${current.left}px`,
57
+ "--agent-operation-pointer-y": `${current.top}px` } },
58
+ React.createElement(FeedbackLabel, { feedback: feedback })) : null;
77
59
  }
78
- function AgentPointer({ active, feedback, targetPosition, surfaceCenter, }) {
60
+ function AgentPointer({ active, feedback, targetPosition, surfaceCenter }) {
79
61
  const pointer = useRef(null);
80
62
  const [motion, setMotion] = useState();
81
63
  const action = feedback?.effect === "action" && (!feedback.requiresTarget || Boolean(targetPosition));
@@ -93,11 +75,8 @@ function AgentPointer({ active, feedback, targetPosition, surfaceCenter, }) {
93
75
  return;
94
76
  }
95
77
  if (!motion) {
96
- setMotion({
97
- position: feedback?.persistentCursor && surfaceCenter ? surfaceCenter : targetPosition,
98
- durationMs: 0,
99
- persistent: Boolean(feedback?.persistentCursor),
100
- });
78
+ setMotion({ position: feedback?.persistentCursor && surfaceCenter ? surfaceCenter : targetPosition,
79
+ durationMs: 0, persistent: Boolean(feedback?.persistentCursor) });
101
80
  return;
102
81
  }
103
82
  if (distance(motion.position, targetPosition) < 1) {
@@ -106,14 +85,9 @@ function AgentPointer({ active, feedback, targetPosition, surfaceCenter, }) {
106
85
  return;
107
86
  }
108
87
  const from = pointer.current?.getBoundingClientRect() ?? motion.position;
109
- const durationMs = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches
110
- ? 0
88
+ const durationMs = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ? 0
111
89
  : Math.round(Math.min(360, Math.max(180, 180 + distance(from, targetPosition) * 0.18)));
112
- setMotion({
113
- position: targetPosition,
114
- durationMs,
115
- persistent: motion.persistent || Boolean(feedback?.persistentCursor),
116
- });
90
+ setMotion({ position: targetPosition, durationMs, persistent: motion.persistent || Boolean(feedback?.persistentCursor) });
117
91
  }, [active, action, feedback?.id, targetPosition?.left, targetPosition?.top, motion]);
118
92
  const show = Boolean(active && motion && (motion.persistent || action));
119
93
  useLayoutEffect(() => {
@@ -126,22 +100,18 @@ function AgentPointer({ active, feedback, targetPosition, surfaceCenter, }) {
126
100
  if (show && pointer.current)
127
101
  return presentPointer(pointer.current, feedback.target, feedback.presentation);
128
102
  }, [active, show, feedback?.presentation, feedback?.target, Boolean(targetPosition)]);
129
- return show && motion ? (React.createElement("div", { "aria-hidden": true, ref: pointer, className: "agent-operation__pointer-effect", "data-active": action, "data-operation-effect": action ? "action" : undefined, style: {
130
- "--agent-operation-pointer-duration": `${motion.durationMs}ms`,
131
- "--agent-operation-pointer-x": `${motion.position.left}px`,
132
- "--agent-operation-pointer-y": `${motion.position.top}px`,
133
- } },
103
+ return show && motion ? React.createElement("div", { "aria-hidden": true, ref: pointer, className: "agent-operation__pointer-effect", "data-active": action, "data-operation-effect": action ? "action" : undefined, style: { "--agent-operation-pointer-duration": `${motion.durationMs}ms`,
104
+ "--agent-operation-pointer-x": `${motion.position.left}px`, "--agent-operation-pointer-y": `${motion.position.top}px` } },
134
105
  React.createElement("span", { className: "agent-operation__pointer-cursor" },
135
106
  React.createElement(Cursor, { className: "agent-operation__pointer", size: 24, weight: "fill" })),
136
- action && feedback ? React.createElement(FeedbackLabel, { feedback: feedback }) : null)) : null;
107
+ action && feedback ? React.createElement(FeedbackLabel, { feedback: feedback }) : null) : null;
137
108
  }
138
- export function OperationOverlayView({ operation, feedback, progressHistory = [], running, humanHasControl = false, cancelling = false, onCancel: cancel, resolveSurface, }) {
109
+ export function OperationOverlayView({ operation, feedback, progressHistory = [], running, humanHasControl = false, cancelling = false, onCancel: cancel, resolveSurface }) {
139
110
  const [, setGeometry] = useState("");
140
111
  const [historyOpen, setHistoryOpen] = useState(false);
141
112
  const [historyId] = useState(() => `nexface-operation-history-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`}`);
142
113
  const cancelButtonRef = useRef(null);
143
- const controllerShouldBeVisible = operation.status !== "cancelled" &&
144
- (running || humanHasControl || operation.status === "failed");
114
+ const controllerShouldBeVisible = operation.status !== "cancelled" && (running || humanHasControl || operation.status === "failed");
145
115
  const [controllerVisibility, setControllerVisibility] = useState(controllerShouldBeVisible ? "visible" : undefined);
146
116
  useEffect(() => {
147
117
  if (controllerShouldBeVisible) {
@@ -149,14 +119,12 @@ export function OperationOverlayView({ operation, feedback, progressHistory = []
149
119
  return;
150
120
  }
151
121
  setHistoryOpen(false);
152
- setControllerVisibility((current) => (current ? "exiting" : undefined));
122
+ setControllerVisibility((current) => current ? "exiting" : undefined);
153
123
  const timer = setTimeout(() => setControllerVisibility(undefined), 300);
154
124
  return () => clearTimeout(timer);
155
125
  }, [controllerShouldBeVisible]);
156
- useEffect(() => {
157
- if (!progressHistory.length)
158
- setHistoryOpen(false);
159
- }, [progressHistory.length]);
126
+ useEffect(() => { if (!progressHistory.length)
127
+ setHistoryOpen(false); }, [progressHistory.length]);
160
128
  useLayoutEffect(() => {
161
129
  const surface = resolveSurface?.();
162
130
  if (!surface || !running || humanHasControl)
@@ -176,22 +144,17 @@ export function OperationOverlayView({ operation, feedback, progressHistory = []
176
144
  useLayoutEffect(() => {
177
145
  const update = () => {
178
146
  const { surfaceRect, targetRect } = readGeometry();
179
- const geometry = [surfaceRect, targetRect]
180
- .map((rect) => {
147
+ const geometry = [surfaceRect, targetRect].map((rect) => {
181
148
  if (!rect)
182
149
  return "";
183
150
  return [rect.left, rect.top, rect.width, rect.height].join(",");
184
- })
185
- .join(";");
151
+ }).join(";");
186
152
  setGeometry(geometry);
187
153
  };
188
154
  update();
189
155
  if (!running && !humanHasControl)
190
156
  return;
191
- let frame = requestAnimationFrame(function track() {
192
- update();
193
- frame = requestAnimationFrame(track);
194
- });
157
+ let frame = requestAnimationFrame(function track() { update(); frame = requestAnimationFrame(track); });
195
158
  return () => cancelAnimationFrame(frame);
196
159
  }, [readGeometry, operation, running, humanHasControl]);
197
160
  if (typeof document === "undefined")
@@ -207,53 +170,29 @@ export function OperationOverlayView({ operation, feedback, progressHistory = []
207
170
  const controllerExiting = controllerVisibility === "exiting";
208
171
  const controllerLabel = humanHasControl ? undefined : operation.progressLabel;
209
172
  const compactStatusLabel = humanHasControl ? "等待你完成操作" : operation.progressLabel;
210
- const statusLabel = humanHasControl
211
- ? "等待你完成操作"
212
- : {
213
- running: "Agent 正在控制",
214
- completed: running ? "工具已完成,任务继续中" : "操作已完成",
215
- failed: running ? "Agent 正在处理错误" : "操作失败",
216
- cancelled: "任务已终止",
217
- }[operation.status];
173
+ const statusLabel = humanHasControl ? "等待你完成操作" : {
174
+ running: "Agent 正在控制", completed: running ? "工具已完成,任务继续中" : "操作已完成",
175
+ failed: running ? "Agent 正在处理错误" : "操作失败", cancelled: "任务已终止",
176
+ }[operation.status];
218
177
  const targetPosition = rect ? center(rect) : undefined;
219
178
  return createPortal(React.createElement("div", { className: "agent-operation", "data-nexface-ignore": true, "data-feedback-active": operationFeedbackActive, "data-structured-target-lost": structuredTargetLost, "data-human-control": humanHasControl, "data-operation-effect": effect ?? "action", "data-run-active": running, "data-status": operation.status },
220
- agentControlsSurface && surfaceRect ? (React.createElement("div", { "aria-hidden": true, className: "agent-operation__surface", style: {
221
- ...(highlightedRect
222
- ? {
223
- "--agent-operation-cutout-height": `${highlightedRect.height}px`,
224
- "--agent-operation-cutout-left": `${highlightedRect.left - surfaceRect.left}px`,
225
- "--agent-operation-cutout-top": `${highlightedRect.top - surfaceRect.top}px`,
226
- "--agent-operation-cutout-width": `${highlightedRect.width}px`,
227
- }
228
- : {}),
229
- height: surfaceRect.height,
230
- left: surfaceRect.left,
231
- top: surfaceRect.top,
232
- width: surfaceRect.width,
233
- } })) : null,
234
- activeFeedback && highlightedRect ? (React.createElement("div", { "aria-hidden": true, className: "agent-operation__target", "data-operation-effect": effect, style: {
235
- height: highlightedRect.height,
236
- left: highlightedRect.left,
237
- top: highlightedRect.top,
238
- width: highlightedRect.width,
239
- } })) : null,
179
+ agentControlsSurface && surfaceRect ? React.createElement("div", { "aria-hidden": true, className: "agent-operation__surface", style: {
180
+ ...(highlightedRect ? { "--agent-operation-cutout-height": `${highlightedRect.height}px`,
181
+ "--agent-operation-cutout-left": `${highlightedRect.left - surfaceRect.left}px`,
182
+ "--agent-operation-cutout-top": `${highlightedRect.top - surfaceRect.top}px`, "--agent-operation-cutout-width": `${highlightedRect.width}px` } : {}),
183
+ height: surfaceRect.height, left: surfaceRect.left, top: surfaceRect.top, width: surfaceRect.width,
184
+ } }) : null,
185
+ activeFeedback && highlightedRect ? React.createElement("div", { "aria-hidden": true, className: "agent-operation__target", "data-operation-effect": effect, style: { height: highlightedRect.height, left: highlightedRect.left, top: highlightedRect.top, width: highlightedRect.width } }) : null,
240
186
  React.createElement(AgentPointer, { active: agentControlsSurface && !cancelling, feedback: feedback?.presentation ? feedback : activeFeedback, targetPosition: targetPosition, surfaceCenter: surfaceRect ? center(surfaceRect) : undefined }),
241
- activeFeedback && effect !== "action" && surfaceRect ? (React.createElement(FeedbackIndicator, { key: activeFeedback.id, feedback: activeFeedback, position: activeFeedback.centered ? center(surfaceRect) : targetPosition })) : null,
242
- controllerMounted ? (React.createElement("section", { "aria-live": "polite", className: "agent-operation__controller", "data-visibility": controllerExiting ? "exiting" : "visible", style: surfaceRect
243
- ? {
244
- left: surfaceRect.left + surfaceRect.width / 2,
245
- right: "auto",
246
- "--agent-operation-controller-x": "-50%",
247
- maxWidth: Math.max(0, surfaceRect.width - 32),
248
- }
249
- : undefined },
250
- historyOpen ? (React.createElement("aside", { "aria-label": "\u672C\u6B21\u8FD0\u884C\u7684\u64CD\u4F5C\u8BB0\u5F55", className: "agent-operation__history", id: historyId },
187
+ activeFeedback && effect !== "action" && surfaceRect ? React.createElement(FeedbackIndicator, { key: activeFeedback.id, feedback: activeFeedback, position: activeFeedback.centered ? center(surfaceRect) : targetPosition }) : null,
188
+ controllerMounted ? React.createElement("section", { "aria-live": "polite", className: "agent-operation__controller", "data-visibility": controllerExiting ? "exiting" : "visible", style: surfaceRect ? { left: surfaceRect.left + surfaceRect.width / 2, right: "auto", "--agent-operation-controller-x": "-50%", maxWidth: Math.max(0, surfaceRect.width - 32) } : undefined },
189
+ historyOpen ? React.createElement("aside", { "aria-label": "\u672C\u6B21\u8FD0\u884C\u7684\u64CD\u4F5C\u8BB0\u5F55", className: "agent-operation__history", id: historyId },
251
190
  React.createElement("header", null,
252
191
  React.createElement("strong", null, "\u64CD\u4F5C\u8BB0\u5F55"),
253
192
  React.createElement("span", null, progressHistory.length)),
254
- React.createElement("ol", null, progressHistory.map(({ progressLabel: label, toolCallId }, index) => (React.createElement("li", { key: toolCallId },
193
+ React.createElement("ol", null, progressHistory.map(({ progressLabel: label, toolCallId }, index) => React.createElement("li", { key: toolCallId },
255
194
  React.createElement("span", { "aria-hidden": true }, index + 1),
256
- React.createElement("p", null, label))))))) : null,
195
+ React.createElement("p", null, label))))) : null,
257
196
  React.createElement("span", { "aria-hidden": true, className: "agent-operation__edge-flow" }),
258
197
  React.createElement("span", { "aria-hidden": true, className: "agent-operation__pause-mark" },
259
198
  React.createElement("i", null),
@@ -265,8 +204,9 @@ export function OperationOverlayView({ operation, feedback, progressHistory = []
265
204
  React.createElement("div", null,
266
205
  React.createElement("span", { className: "agent-operation__heading" },
267
206
  React.createElement("strong", null, controllerLabel)),
268
- statusLabel ? (React.createElement("small", { className: "agent-operation__description" },
269
- React.createElement("span", { className: "agent-operation__status" }, statusLabel))) : null),
270
- (running || humanHasControl) && operation.status !== "cancelled" ? (React.createElement("span", { className: "agent-operation__compact-status", title: compactStatusLabel }, compactStatusLabel)) : null,
271
- cancel && (running || humanHasControl) && operation.status !== "cancelled" ? (React.createElement("button", { ref: cancelButtonRef, className: "agent-operation__stop", type: "button", disabled: cancelling, onClick: cancel }, cancelling ? "正在终止" : "终止任务")) : null)) : null), document.body);
207
+ statusLabel ? React.createElement("small", { className: "agent-operation__description" },
208
+ React.createElement("span", { className: "agent-operation__status" }, statusLabel)) : null),
209
+ (running || humanHasControl) && operation.status !== "cancelled" ? React.createElement("span", { className: "agent-operation__compact-status", title: compactStatusLabel }, compactStatusLabel) : null,
210
+ cancel && (running || humanHasControl) && operation.status !== "cancelled" ? React.createElement("button", { ref: cancelButtonRef, className: "agent-operation__stop", type: "button", disabled: cancelling, onClick: cancel }, cancelling ? "正在终止" : "终止任务") : null) : null), document.body);
272
211
  }
212
+ //# sourceMappingURL=operation-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-view.js","sourceRoot":"","sources":["../src/operation-view.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AACtG,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D,MAAM,MAAM,GAAG,CAAC,IAAa,EAAY,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;AACpH,MAAM,QAAQ,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1F,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC;AAEtI,SAAS,cAAc,CAAC,OAAoB,EAAE,MAAe,EAAE,YAA4D;IACzH,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;QAC/B,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAC3D,YAAY,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3D,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACzJ,MAAM,YAAY,GAAG,CAAC,KAAsB,EAAE,EAAE;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC,YAAY,KAAK,WAAW,IAAI,OAAO,EAAE;YAAE,MAAM,EAAE,CAAC;IAC5F,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC;QAChF,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uDAAuD;KACzF,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,gBAAgB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACxD,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO;QAAE,OAAO,EAAE,CAAC;SAAM,IAAI,OAAO,EAAE;QAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAmC;IAClE,OAAO,8BAAM,SAAS,EAAC,gCAAgC,uBAAoB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,2BAAyB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK;QAC7K,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,8BAAM,SAAS,EAAC,qCAAqC,GAAG,CAAC,CAAC,CAAC,IAAI;QAClG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,8BAAM,SAAS,EAAC,oCAAoC;YAAC,8BAAK;YAAA,8BAAK;YAAA,8BAAK;YAAA,8BAAK;YAAA,8BAAK,CAAO,CAAC,CAAC,CAAC,IAAI;QACzH,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,8BAAM,SAAS,EAAC,2CAA2C,GAAG,CAAC,CAAC,CAAC,IAAI;QACvG,8BAAM,SAAS,EAAC,qCAAqC,IAAE,QAAQ,CAAC,KAAK,CAAQ,CACxE,CAAC;AACV,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAmE;IAChH,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChF,eAAe,CAAC,GAAG,EAAE,GAAG,IAAI,QAAQ;QAAE,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IACrG,MAAM,OAAO,GAAG,QAAQ,IAAI,YAAY,CAAC;IACzC,OAAO,OAAO,CAAC,CAAC,CAAC,kDAAiB,SAAS,EAAC,iCAAiC,iBAAa,MAAM,2BAAwB,QAAQ,CAAC,MAAM,EACrI,KAAK,EAAE,EAAE,oCAAoC,EAAE,KAAK,EAAE,6BAA6B,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI;YACtG,6BAA6B,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,EAAmB;QACtE,oBAAC,aAAa,IAAC,QAAQ,EAAE,QAAQ,GAAI,CACjC,CAAC,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAKtE;IACC,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACtG,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,IAAI,MAAM,IAAI,CAAC,QAAQ,EAAE,cAAc,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBACrD,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACpG,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc;gBAChG,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAClD,IAAI,QAAQ,EAAE,gBAAgB,IAAI,CAAC,MAAM,CAAC,UAAU;gBAAE,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACjG,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC;QACzE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpF,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1F,SAAS,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC5H,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC;IACxE,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,QAAQ,EAAE,YAAY;YAAE,OAAO;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,cAAc,EAAE,CAAC;YAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACzH,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO;YAAE,OAAO,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9G,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACtF,OAAO,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,kDAAiB,GAAG,EAAE,OAAO,EAAE,SAAS,EAAC,iCAAiC,iBACnF,MAAM,2BAAyB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EACzE,KAAK,EAAE,EAAE,oCAAoC,EAAE,GAAG,MAAM,CAAC,UAAU,IAAI;YACrE,6BAA6B,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,6BAA6B,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAmB;QAC1I,8BAAM,SAAS,EAAC,iCAAiC;YAAC,oBAAC,MAAM,IAAC,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,GAAG,CAAO;QAC/H,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,oBAAC,aAAa,IAAC,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,CAAC,IAAI,CAAC;AAChB,CAAC;AAaD,MAAM,UAAU,oBAAoB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAA6B;IACnM,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,6BAA6B,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IACzI,MAAM,eAAe,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IACxD,MAAM,yBAAyB,GAAG,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,OAAO,IAAI,eAAe,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;IACpI,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAoC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvJ,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,yBAAyB,EAAE,CAAC;YAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9E,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,uBAAuB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM;QAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACnG,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,OAAO,GAAG,cAAc,EAAE,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,eAAe;YAAE,OAAO;QACpD,OAAO,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,eAAe,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,OAAO,GAAG,cAAc,EAAE,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC7F,MAAM,MAAM,GAAG,cAAc,EAAE,WAAW,IAAI,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7G,OAAO;YACL,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,SAAS;YAC/E,MAAM;YACN,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE;SAC5C,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAChE,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAAC;YACnD,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtD,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACb,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,EAAE,CAAC;QACT,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe;YAAE,OAAO;QACzC,IAAI,KAAK,GAAG,qBAAqB,CAAC,SAAS,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxG,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IACjE,MAAM,oBAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,CAAC,UAAU,IAAI,CAAC,eAAe,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,MAAM,MAAM,GAAG,cAAc,EAAE,MAAM,CAAC;IACtC,MAAM,eAAe,GAAG,MAAM,KAAK,UAAU,IAAI,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7F,MAAM,oBAAoB,GAAG,OAAO,IAAI,CAAC,eAAe,CAAC;IACzD,MAAM,uBAAuB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,iBAAiB,GAAG,oBAAoB,KAAK,SAAS,CAAC;IAC7D,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC;IAC9E,MAAM,kBAAkB,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC;IACjF,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAChD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO;QACnE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO;KAC9D,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,OAAO,YAAY,CACjB,6BAAK,SAAS,EAAC,iBAAiB,uDAA2C,uBAAuB,iCAA+B,oBAAoB,wBAAsB,eAAe,2BAAyB,MAAM,IAAI,QAAQ,qBAAmB,OAAO,iBAAe,SAAS,CAAC,MAAM;QAC3R,oBAAoB,IAAI,WAAW,CAAC,CAAC,CAAC,kDAAiB,SAAS,EAAC,0BAA0B,EAAC,KAAK,EAAE;gBAClG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,iCAAiC,EAAE,GAAG,eAAe,CAAC,MAAM,IAAI;oBACtF,+BAA+B,EAAE,GAAG,eAAe,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,IAAI;oBAC/E,8BAA8B,EAAE,GAAG,eAAe,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,IAAI,EAAE,gCAAgC,EAAE,GAAG,eAAe,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtJ,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK;aAClF,GAAI,CAAC,CAAC,CAAC,IAAI;QAC5B,cAAc,IAAI,eAAe,CAAC,CAAC,CAAC,kDAAiB,SAAS,EAAC,yBAAyB,2BAAwB,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI;QACjQ,oBAAC,YAAY,IAAC,MAAM,EAAE,oBAAoB,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,EACrH,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,GAAI;QACjG,cAAc,IAAI,MAAM,KAAK,QAAQ,IAAI,WAAW,CAAC,CAAC,CAAC,oBAAC,iBAAiB,IAAC,GAAG,EAAE,cAAc,CAAC,EAAE,EAC/F,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,GAAI,CAAC,CAAC,CAAC,IAAI;QAC9G,iBAAiB,CAAC,CAAC,CAAC,8CAAmB,QAAQ,EAAC,SAAS,EAAC,6BAA6B,qBAAkB,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC,EAAmB,CAAC,CAAC,CAAC,SAAS;YAC9V,WAAW,CAAC,CAAC,CAAC,6CAAkB,wDAAW,EAAC,SAAS,EAAC,0BAA0B,EAAC,EAAE,EAAE,SAAS;gBAC7F;oBAAQ,+DAAqB;oBAAA,kCAAO,eAAe,CAAC,MAAM,CAAQ,CAAS;gBAC3E,gCAAK,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,4BAAI,GAAG,EAAE,UAAU;oBAC3F,qDAAmB,KAAK,GAAG,CAAC,CAAQ;oBAAA,+BAAI,KAAK,CAAK,CAC/C,CAAC,CAAM,CACN,CAAC,CAAC,CAAC,IAAI;YACf,mDAAkB,SAAS,EAAC,4BAA4B,GAAG;YAAA,mDAAkB,SAAS,EAAC,6BAA6B;gBAAC,8BAAK;gBAAA,8BAAK,CAAO;YAAA,iDACrH,SAAS,mBACT,WAAW,gBACf,oEAAa,EACxB,SAAS,EAAC,2BAA2B,eAC1B,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EACzC,QAAQ,EAAE,eAAe,CAAC,MAAM,KAAK,CAAC,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EACpD,KAAK,EAAE,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAC9D,IAAI,EAAC,QAAQ;gBACd,oBAAC,OAAO,IAAC,SAAS,EAAC,gCAAgC,EAAC,IAAI,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,GAAG;gBAAA,8BAAK;gBAAA,wCAAQ,CAAS;YACrG;gBAAK,8BAAM,SAAS,EAAC,0BAA0B;oBAAC,oCAAS,eAAe,CAAU,CAAO;gBAAC,WAAW,CAAC,CAAC,CAAC,+BAAO,SAAS,EAAC,8BAA8B;oBAAC,8BAAM,SAAS,EAAC,yBAAyB,IAAE,WAAW,CAAQ,CAAQ,CAAC,CAAC,CAAC,IAAI,CAAO;YAC3O,CAAC,OAAO,IAAI,eAAe,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,8BAAM,SAAS,EAAC,iCAAiC,EAAC,KAAK,EAAE,kBAAkB,IAAG,kBAAkB,CAAQ,CAAC,CAAC,CAAC,IAAI;YAClL,MAAM,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,gCAAQ,GAAG,EAAE,eAAe,EAAE,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAU,CAAC,CAAC,CAAC,IAAI,CACzO,CAAC,CAAC,CAAC,IAAI,CACb,EAAE,QAAQ,CAAC,IAAI,CACtB,CAAC;AACJ,CAAC","sourcesContent":["import { CursorIcon as Cursor } from \"@phosphor-icons/react/Cursor\";\nimport { SparkleIcon as Sparkle } from \"@phosphor-icons/react/Sparkle\";\nimport * as React from \"react\";\nimport { useCallback, useLayoutEffect, useEffect, useRef, useState, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { PageCommandError } from \"./browser/locator.js\";\nimport type { AgentOperation, AgentOperationProgressEntry, OperationFeedback } from \"./operation-types.js\";\nimport { lockOperationSurface } from \"./operation-lock.js\";\n\ntype Position = { left: number; top: number };\ntype Motion = { position: Position; durationMs: number; persistent: boolean };\nconst center = (rect: DOMRect): Position => ({ left: rect.left + rect.width / 2, top: rect.top + rect.height / 2 });\nconst distance = (a: Position, b: Position) => Math.hypot(a.left - b.left, a.top - b.top);\nconst interrupted = () => new PageCommandError({ code: \"EXECUTION_CANCELLED\", message: \"Page action presentation was interrupted.\" });\n\nfunction presentPointer(pointer: HTMLElement, target: Element, presentation: NonNullable<OperationFeedback[\"presentation\"]>): () => void {\n let finished = false;\n const finish = (error?: Error) => {\n if (finished) return;\n finished = true;\n clearTimeout(timer);\n pointer.removeEventListener(\"transitionend\", onTransition);\n presentation.signal?.removeEventListener(\"abort\", onAbort);\n presentation.finish(error);\n };\n const reached = () => pointer.isConnected && target.isConnected && distance(pointer.getBoundingClientRect(), center(target.getBoundingClientRect())) < 2;\n const onTransition = (event: TransitionEvent) => {\n if (event.target === pointer && event.propertyName === \"transform\" && reached()) finish();\n };\n const onAbort = () => finish(interrupted());\n const timer = setTimeout(() => reached() ? finish() : finish(new PageCommandError({\n code: \"ACTION_TIMEOUT\", message: \"Page action pointer did not reach its target in time.\",\n })), 750);\n pointer.addEventListener(\"transitionend\", onTransition);\n presentation.signal?.addEventListener(\"abort\", onAbort, { once: true });\n queueMicrotask(() => { if (presentation.signal?.aborted) onAbort(); else if (reached()) finish(); });\n return () => finish(interrupted());\n}\n\nfunction FeedbackLabel({ feedback }: { feedback: OperationFeedback }) {\n return <span className=\"agent-operation__pointer-label\" data-browser-tool={feedback.centered ? \"true\" : undefined} data-operation-effect={feedback.effect} title={feedback.label}>\n {feedback.effect === \"processing\" ? <span className=\"agent-operation__pointer-processing\" /> : null}\n {feedback.effect === \"read\" ? <span className=\"agent-operation__pointer-read-scan\"><i /><i /><i /><i /><i /></span> : null}\n {feedback.effect === \"navigate\" ? <span className=\"agent-operation__pointer-navigation-trail\" /> : null}\n <span className=\"agent-operation__pointer-label-text\">{feedback.label}</span>\n </span>;\n}\n\nfunction FeedbackIndicator({ feedback, position }: { feedback: OperationFeedback; position: Position | undefined }) {\n const [lastPosition, setLastPosition] = useState(position ?? feedback.position);\n useLayoutEffect(() => { if (position) setLastPosition(position); }, [position?.left, position?.top]);\n const current = position ?? lastPosition;\n return current ? <div aria-hidden className=\"agent-operation__pointer-effect\" data-active=\"true\" data-operation-effect={feedback.effect}\n style={{ \"--agent-operation-pointer-duration\": \"0ms\", \"--agent-operation-pointer-x\": `${current.left}px`,\n \"--agent-operation-pointer-y\": `${current.top}px` } as CSSProperties}>\n <FeedbackLabel feedback={feedback} />\n </div> : null;\n}\n\nfunction AgentPointer({ active, feedback, targetPosition, surfaceCenter }: {\n active: boolean;\n feedback: OperationFeedback | undefined;\n targetPosition: Position | undefined;\n surfaceCenter: Position | undefined;\n}) {\n const pointer = useRef<HTMLDivElement>(null);\n const [motion, setMotion] = useState<Motion>();\n const action = feedback?.effect === \"action\" && (!feedback.requiresTarget || Boolean(targetPosition));\n useLayoutEffect(() => {\n if (!active) { setMotion(undefined); return; }\n if (!action || !targetPosition) {\n if (action && !feedback?.requiresTarget && motion && pointer.current) {\n const rect = pointer.current.getBoundingClientRect();\n if (distance(rect, motion.position) >= 1) setMotion({ ...motion, position: rect, durationMs: 0 });\n }\n return;\n }\n if (!motion) {\n setMotion({ position: feedback?.persistentCursor && surfaceCenter ? surfaceCenter : targetPosition,\n durationMs: 0, persistent: Boolean(feedback?.persistentCursor) });\n return;\n }\n if (distance(motion.position, targetPosition) < 1) {\n if (feedback?.persistentCursor && !motion.persistent) setMotion({ ...motion, persistent: true });\n return;\n }\n const from = pointer.current?.getBoundingClientRect() ?? motion.position;\n const durationMs = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ? 0\n : Math.round(Math.min(360, Math.max(180, 180 + distance(from, targetPosition) * 0.18)));\n setMotion({ position: targetPosition, durationMs, persistent: motion.persistent || Boolean(feedback?.persistentCursor) });\n }, [active, action, feedback?.id, targetPosition?.left, targetPosition?.top, motion]);\n const show = Boolean(active && motion && (motion.persistent || action));\n useLayoutEffect(() => {\n if (!feedback?.presentation) return;\n if (!active || !feedback.target?.isConnected || !targetPosition) { feedback.presentation.finish(interrupted()); return; }\n if (show && pointer.current) return presentPointer(pointer.current, feedback.target, feedback.presentation);\n }, [active, show, feedback?.presentation, feedback?.target, Boolean(targetPosition)]);\n return show && motion ? <div aria-hidden ref={pointer} className=\"agent-operation__pointer-effect\"\n data-active={action} data-operation-effect={action ? \"action\" : undefined}\n style={{ \"--agent-operation-pointer-duration\": `${motion.durationMs}ms`,\n \"--agent-operation-pointer-x\": `${motion.position.left}px`, \"--agent-operation-pointer-y\": `${motion.position.top}px` } as CSSProperties}>\n <span className=\"agent-operation__pointer-cursor\"><Cursor className=\"agent-operation__pointer\" size={24} weight=\"fill\" /></span>\n {action && feedback ? <FeedbackLabel feedback={feedback} /> : null}\n </div> : null;\n}\n\nexport interface OperationOverlayViewProps {\n operation: AgentOperation;\n feedback?: OperationFeedback;\n progressHistory?: readonly AgentOperationProgressEntry[];\n running: boolean;\n humanHasControl?: boolean;\n cancelling?: boolean;\n onCancel?(): void;\n resolveSurface?(): HTMLElement | undefined;\n}\n\nexport function OperationOverlayView({ operation, feedback, progressHistory = [], running, humanHasControl = false, cancelling = false, onCancel: cancel, resolveSurface }: OperationOverlayViewProps) {\n const [, setGeometry] = useState(\"\");\n const [historyOpen, setHistoryOpen] = useState(false);\n const [historyId] = useState(() => `nexface-operation-history-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`}`);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n const controllerShouldBeVisible = operation.status !== \"cancelled\" && (running || humanHasControl || operation.status === \"failed\");\n const [controllerVisibility, setControllerVisibility] = useState<\"visible\" | \"exiting\" | undefined>(controllerShouldBeVisible ? \"visible\" : undefined);\n useEffect(() => {\n if (controllerShouldBeVisible) { setControllerVisibility(\"visible\"); return; }\n setHistoryOpen(false);\n setControllerVisibility((current) => current ? \"exiting\" : undefined);\n const timer = setTimeout(() => setControllerVisibility(undefined), 300);\n return () => clearTimeout(timer);\n }, [controllerShouldBeVisible]);\n useEffect(() => { if (!progressHistory.length) setHistoryOpen(false); }, [progressHistory.length]);\n useLayoutEffect(() => {\n const surface = resolveSurface?.();\n if (!surface || !running || humanHasControl) return;\n return lockOperationSurface(surface, () => cancelButtonRef.current?.focus());\n }, [humanHasControl, resolveSurface, running]);\n const readGeometry = useCallback(() => {\n const surface = resolveSurface?.();\n const resolvedTarget = feedback?.resolveTarget ? feedback.resolveTarget() : feedback?.target;\n const target = resolvedTarget?.isConnected && surface?.contains(resolvedTarget) ? resolvedTarget : undefined;\n return {\n surfaceRect: surface?.isConnected ? surface.getBoundingClientRect() : undefined,\n target,\n targetRect: target?.getBoundingClientRect(),\n };\n }, [resolveSurface, feedback?.target, feedback?.resolveTarget]);\n useLayoutEffect(() => {\n const update = () => {\n const { surfaceRect, targetRect } = readGeometry();\n const geometry = [surfaceRect, targetRect].map((rect) => {\n if (!rect) return \"\";\n return [rect.left, rect.top, rect.width, rect.height].join(\",\");\n }).join(\";\");\n setGeometry(geometry);\n };\n update();\n if (!running && !humanHasControl) return;\n let frame = requestAnimationFrame(function track() { update(); frame = requestAnimationFrame(track); });\n return () => cancelAnimationFrame(frame);\n }, [readGeometry, operation, running, humanHasControl]);\n if (typeof document === \"undefined\") return null;\n const { surfaceRect, target, targetRect: rect } = readGeometry();\n const structuredTargetLost = Boolean(feedback?.requiresTarget && !target);\n const activeFeedback = !cancelling && !humanHasControl && !structuredTargetLost ? feedback : undefined;\n const effect = activeFeedback?.effect;\n const highlightedRect = effect === \"navigate\" || activeFeedback?.centered ? undefined : rect;\n const agentControlsSurface = running && !humanHasControl;\n const operationFeedbackActive = Boolean(activeFeedback);\n const controllerMounted = Boolean(controllerVisibility);\n const controllerExiting = controllerVisibility === \"exiting\";\n const controllerLabel = humanHasControl ? undefined : operation.progressLabel;\n const compactStatusLabel = humanHasControl ? \"等待你完成操作\" : operation.progressLabel;\n const statusLabel = humanHasControl ? \"等待你完成操作\" : {\n running: \"Agent 正在控制\", completed: running ? \"工具已完成,任务继续中\" : \"操作已完成\",\n failed: running ? \"Agent 正在处理错误\" : \"操作失败\", cancelled: \"任务已终止\",\n }[operation.status];\n const targetPosition = rect ? center(rect) : undefined;\n return createPortal(\n <div className=\"agent-operation\" data-nexface-ignore data-feedback-active={operationFeedbackActive} data-structured-target-lost={structuredTargetLost} data-human-control={humanHasControl} data-operation-effect={effect ?? \"action\"} data-run-active={running} data-status={operation.status}>\n {agentControlsSurface && surfaceRect ? <div aria-hidden className=\"agent-operation__surface\" style={{\n ...(highlightedRect ? { \"--agent-operation-cutout-height\": `${highlightedRect.height}px`,\n \"--agent-operation-cutout-left\": `${highlightedRect.left - surfaceRect.left}px`,\n \"--agent-operation-cutout-top\": `${highlightedRect.top - surfaceRect.top}px`, \"--agent-operation-cutout-width\": `${highlightedRect.width}px` } : {}),\n height: surfaceRect.height, left: surfaceRect.left, top: surfaceRect.top, width: surfaceRect.width,\n } as CSSProperties} /> : null}\n {activeFeedback && highlightedRect ? <div aria-hidden className=\"agent-operation__target\" data-operation-effect={effect} style={{ height: highlightedRect.height, left: highlightedRect.left, top: highlightedRect.top, width: highlightedRect.width }} /> : null}\n <AgentPointer active={agentControlsSurface && !cancelling} feedback={feedback?.presentation ? feedback : activeFeedback}\n targetPosition={targetPosition} surfaceCenter={surfaceRect ? center(surfaceRect) : undefined} />\n {activeFeedback && effect !== \"action\" && surfaceRect ? <FeedbackIndicator key={activeFeedback.id}\n feedback={activeFeedback} position={activeFeedback.centered ? center(surfaceRect) : targetPosition} /> : null}\n {controllerMounted ? <section aria-live=\"polite\" className=\"agent-operation__controller\" data-visibility={controllerExiting ? \"exiting\" : \"visible\"} style={surfaceRect ? { left: surfaceRect.left + surfaceRect.width / 2, right: \"auto\", \"--agent-operation-controller-x\": \"-50%\", maxWidth: Math.max(0, surfaceRect.width - 32) } as CSSProperties : undefined}>\n {historyOpen ? <aside aria-label=\"本次运行的操作记录\" className=\"agent-operation__history\" id={historyId}>\n <header><strong>操作记录</strong><span>{progressHistory.length}</span></header>\n <ol>{progressHistory.map(({ progressLabel: label, toolCallId }, index) => <li key={toolCallId}>\n <span aria-hidden>{index + 1}</span><p>{label}</p>\n </li>)}</ol>\n </aside> : null}\n <span aria-hidden className=\"agent-operation__edge-flow\" /><span aria-hidden className=\"agent-operation__pause-mark\"><i /><i /></span><button\n aria-controls={historyId}\n aria-expanded={historyOpen}\n aria-label=\"查看本次运行的操作记录\"\n className=\"agent-operation__activity\"\n data-open={historyOpen ? \"true\" : \"false\"}\n disabled={progressHistory.length === 0}\n onClick={() => setHistoryOpen((current) => !current)}\n title={progressHistory.length === 0 ? \"暂无操作记录\" : \"查看本次运行的操作记录\"}\n type=\"button\"\n ><Sparkle className=\"agent-operation__activity-icon\" size={16} weight=\"fill\" /><i /><b>✦</b></button>\n <div><span className=\"agent-operation__heading\"><strong>{controllerLabel}</strong></span>{statusLabel ? <small className=\"agent-operation__description\"><span className=\"agent-operation__status\">{statusLabel}</span></small> : null}</div>\n {(running || humanHasControl) && operation.status !== \"cancelled\" ? <span className=\"agent-operation__compact-status\" title={compactStatusLabel}>{compactStatusLabel}</span> : null}\n {cancel && (running || humanHasControl) && operation.status !== \"cancelled\" ? <button ref={cancelButtonRef} className=\"agent-operation__stop\" type=\"button\" disabled={cancelling} onClick={cancel}>{cancelling ? \"正在终止\" : \"终止任务\"}</button> : null}\n </section> : null}\n </div>, document.body,\n );\n}\n"]}
package/dist/react.js CHANGED
@@ -3,7 +3,7 @@ import { Children, Fragment, cloneElement, useCallback, useEffect, useLayoutEffe
3
3
  import { defineAgentTool } from "./definition.js";
4
4
  import { getAgentNavigationEntries, } from "./navigation.js";
5
5
  import { AgentToolError, getInternalToolRuntime } from "./runtime.js";
6
- import { InternalToolRuntimeScope, useInternalToolRuntime } from "./internal-react.js";
6
+ import { InternalToolRuntimeScope, useInternalToolRuntime, } from "./internal-react.js";
7
7
  import { connectToolRuntimeToWebMcp } from "./webmcp.js";
8
8
  const bindingInternals = new WeakMap();
9
9
  export function getAgentToolBindingInternals(binding) {
@@ -55,10 +55,10 @@ function createAgentToolBinding(toolName) {
55
55
  function useAgentBinding(definition, execute, options) {
56
56
  const runtime = useInternalToolRuntime();
57
57
  const confirmation = options.requiresConfirmation;
58
- if (confirmation !== undefined &&
59
- (!confirmation ||
60
- typeof confirmation !== "object" ||
61
- (confirmation.mode !== "chat" && confirmation.mode !== "page"))) {
58
+ if (confirmation !== undefined
59
+ && (!confirmation
60
+ || typeof confirmation !== "object"
61
+ || (confirmation.mode !== "chat" && confirmation.mode !== "page"))) {
62
62
  throw new Error("requiresConfirmation must explicitly use chat or page mode.");
63
63
  }
64
64
  const executeRef = useRef(execute);
@@ -82,7 +82,9 @@ export function useAgentTool(definition, execute, options = {}) {
82
82
  return useAgentBinding(definition, execute, options);
83
83
  }
84
84
  function getAgentNavigationExecutor(executors, key) {
85
- if (!executors || typeof executors !== "object" || !Object.hasOwn(executors, key)) {
85
+ if (!executors
86
+ || typeof executors !== "object"
87
+ || !Object.hasOwn(executors, key)) {
86
88
  throw new Error(`Missing navigation executor: ${key}.`);
87
89
  }
88
90
  const executor = executors[key];
@@ -363,3 +365,4 @@ export function AgentUIAction({ name, description, event = "click", children, })
363
365
  ref: mergedRef,
364
366
  });
365
367
  }
368
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport {\n Children,\n Fragment,\n cloneElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type MouseEvent,\n type JSXElementConstructor,\n type Ref,\n type ReactElement,\n type ReactNode,\n type RefCallback,\n} from \"react\";\n\nimport { defineAgentTool } from \"./definition.js\";\nimport {\n getAgentNavigationEntries,\n type AgentNavigation,\n type AgentNavigationExecutors,\n type AgentNavigationResult,\n} from \"./navigation.js\";\nimport { AgentToolError, getInternalToolRuntime } from \"./runtime.js\";\nimport {\n InternalToolRuntimeScope,\n useInternalToolRuntime,\n} from \"./internal-react.js\";\nimport type { ToolRuntime } from \"./runtime.js\";\nimport type {\n AgentContextEntry,\n AgentContextRegistration,\n AgentToolDefinition,\n AgentToolExecutor,\n} from \"./types.js\";\nimport type { AgentToolConfirmationConfig } from \"./runtime.js\";\nimport { connectToolRuntimeToWebMcp } from \"./webmcp.js\";\n\n/**\n * @experimental Human-in-the-loop Chat confirmation configuration.\n * @beta\n */\nexport interface AgentToolChatConfirmationConfig {\n mode: \"chat\";\n title?: string;\n description?: string;\n confirmLabel?: string;\n rejectLabel?: string;\n}\n\n/**\n * @experimental Human-in-the-loop Page confirmation configuration.\n * @beta\n */\nexport interface AgentToolPageConfirmationConfig {\n mode: \"page\";\n title?: string;\n description?: string;\n}\n\nexport interface UseAgentToolDefaultOptions {\n /**\n * @experimental Enables human-in-the-loop Chat confirmation.\n * @beta\n */\n requiresConfirmation?: AgentToolChatConfirmationConfig;\n}\n\n/**\n * @experimental Enables human-in-the-loop Page confirmation.\n * @beta\n */\nexport interface UseAgentToolPageConfirmationOptions {\n requiresConfirmation: AgentToolPageConfirmationConfig;\n}\n\nexport interface AgentToolBinding<\n TInput = unknown,\n TElement extends HTMLElement = HTMLElement,\n> {\n readonly toolName: string;\n readonly ref: RefCallback<TElement>;\n refWhen(match: (input: TInput) => boolean): RefCallback<TElement>;\n}\n\ntype BindingInternals = {\n resolveTarget(input: unknown): HTMLElement | undefined;\n getConditionalTargetRegistrations(): readonly {\n element: HTMLElement;\n match(input: unknown): boolean;\n }[];\n};\n\nconst bindingInternals = new WeakMap<object, BindingInternals>();\n\nexport function getAgentToolBindingInternals(\n binding: AgentToolBinding,\n): BindingInternals {\n const internals = bindingInternals.get(binding);\n if (!internals) throw new Error(\"Invalid Agent Tool Binding.\");\n return internals;\n}\n\nfunction createAgentToolBinding<TInput, TElement extends HTMLElement>(\n toolName: string,\n): AgentToolBinding<TInput, TElement> {\n let fixedElement: TElement | null = null;\n const conditionalElements = new Map<\n RefCallback<TElement>,\n { element: TElement; match: (input: TInput) => boolean }\n >();\n const ref: RefCallback<TElement> = (element) => {\n if (element && fixedElement && fixedElement !== element) {\n throw new Error(\"An Agent Tool Binding ref can only attach to one element.\");\n }\n fixedElement = element;\n };\n const binding: AgentToolBinding<TInput, TElement> = {\n toolName,\n ref,\n refWhen(match) {\n let callback: RefCallback<TElement>;\n callback = (element) => {\n if (element) {\n conditionalElements.set(callback, { element, match });\n } else {\n conditionalElements.delete(callback);\n }\n };\n return callback;\n },\n };\n bindingInternals.set(binding, {\n resolveTarget(input) {\n for (const entry of conditionalElements.values()) {\n if (entry.element.isConnected && entry.match(input as TInput)) return entry.element;\n }\n return fixedElement?.isConnected ? fixedElement : undefined;\n },\n getConditionalTargetRegistrations: () =>\n Array.from(conditionalElements.values(), ({ element, match }) => ({\n element,\n match: (input: unknown) => match(input as TInput),\n })),\n });\n return binding;\n}\n\nfunction useAgentBinding<\n TInput,\n TResult,\n TElement extends HTMLElement,\n>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options: UseAgentToolDefaultOptions | UseAgentToolPageConfirmationOptions,\n): AgentToolBinding<TInput, TElement> {\n const runtime = useInternalToolRuntime();\n const confirmation = options.requiresConfirmation;\n if (\n confirmation !== undefined\n && (\n !confirmation\n || typeof confirmation !== \"object\"\n || (confirmation.mode !== \"chat\" && confirmation.mode !== \"page\")\n )\n ) {\n throw new Error(\n \"requiresConfirmation must explicitly use chat or page mode.\",\n );\n }\n const executeRef = useRef(execute);\n executeRef.current = execute;\n const confirmationRef = useRef<AgentToolConfirmationConfig | undefined>(\n confirmation,\n );\n confirmationRef.current = confirmation;\n const mode = confirmation?.mode;\n const binding = useMemo(\n () => createAgentToolBinding<TInput, TElement>(\n definition.name,\n ),\n [runtime, definition, mode],\n );\n useLayoutEffect(() => {\n const controller = new AbortController();\n runtime.register(\n definition,\n (input, context) => executeRef.current(input, context),\n {\n signal: controller.signal,\n getConfirmation: () => confirmationRef.current,\n resolveTarget: (input) => getAgentToolBindingInternals(binding).resolveTarget(input),\n },\n );\n return () => controller.abort();\n }, [runtime, definition, mode]);\n return binding;\n}\n\n/**\n * @experimental The Page confirmation overload is experimental.\n * @beta\n */\nexport function useAgentTool<\n TInput,\n TResult,\n TElement extends HTMLElement = HTMLElement,\n>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options: UseAgentToolPageConfirmationOptions,\n): AgentToolBinding<TInput, TElement>;\nexport function useAgentTool<\n TInput,\n TResult,\n TElement extends HTMLElement = HTMLElement,\n>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options?: UseAgentToolDefaultOptions,\n): AgentToolBinding<TInput, TElement>;\nexport function useAgentTool<\n TInput,\n TResult,\n TElement extends HTMLElement = HTMLElement,\n>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options: UseAgentToolDefaultOptions | UseAgentToolPageConfirmationOptions = {},\n): AgentToolBinding<TInput, TElement> {\n return useAgentBinding(definition, execute, options);\n}\n\nfunction getAgentNavigationExecutor(\n executors: unknown,\n key: string,\n): AgentToolExecutor<any, void> {\n if (\n !executors\n || typeof executors !== \"object\"\n || !Object.hasOwn(executors, key)\n ) {\n throw new Error(`Missing navigation executor: ${key}.`);\n }\n const executor = (executors as Record<string, unknown>)[key];\n if (typeof executor !== \"function\") {\n throw new Error(`Missing navigation executor: ${key}.`);\n }\n return executor as AgentToolExecutor<any, void>;\n}\n\nexport function useAgentNavigation<\n TNavigation extends AgentNavigation,\n const TExecutors extends AgentNavigationExecutors<TNavigation>,\n>(\n navigation: TNavigation,\n executors: TExecutors & Record<\n Exclude<\n keyof TExecutors,\n keyof AgentNavigationExecutors<TNavigation>\n >,\n never\n >,\n): void {\n const runtime = useInternalToolRuntime();\n const entries = getAgentNavigationEntries(navigation);\n for (const entry of entries) {\n getAgentNavigationExecutor(executors, entry.key);\n }\n const routeKeys = new Set(entries.map((entry) => entry.key));\n for (const key of Object.keys(executors)) {\n if (!routeKeys.has(key)) {\n throw new Error(`Unknown navigation executor: ${key}.`);\n }\n }\n const executorsRef = useRef(executors);\n executorsRef.current = executors;\n\n useLayoutEffect(() => {\n const controller = new AbortController();\n try {\n for (const entry of entries) {\n runtime.register(\n entry.definition,\n async (input, context): Promise<AgentNavigationResult> => {\n const executor = getAgentNavigationExecutor(\n executorsRef.current,\n entry.key,\n );\n await executor(input, context);\n return { status: \"navigated\" };\n },\n { signal: controller.signal },\n );\n }\n } catch (error) {\n controller.abort();\n throw error;\n }\n return () => controller.abort();\n }, [runtime, navigation]);\n}\n\nexport function ToolsProvider({\n children,\n toolRuntime,\n webMcp = true,\n}: {\n children: ReactNode;\n toolRuntime: ToolRuntime;\n webMcp?: boolean;\n}): ReactElement {\n const runtime = getInternalToolRuntime(toolRuntime);\n return (\n <InternalToolRuntimeScope runtime={toolRuntime}>\n <WebMcpRuntimeBridge enabled={webMcp} runtime={runtime} />\n {children}\n </InternalToolRuntimeScope>\n );\n}\n\nfunction WebMcpRuntimeBridge({\n enabled,\n runtime,\n}: {\n enabled: boolean;\n runtime: ReturnType<typeof getInternalToolRuntime>;\n}) {\n useEffect(() => {\n if (!enabled) return undefined;\n return connectToolRuntimeToWebMcp(runtime);\n }, [enabled, runtime]);\n return null;\n}\n\nexport function useAgentContext(context: AgentContextEntry): void {\n const runtime = useInternalToolRuntime();\n const registrationRef = useRef<AgentContextRegistration | undefined>(undefined);\n useLayoutEffect(() => {\n const controller = new AbortController();\n const registration = runtime.registerContext(context, { signal: controller.signal });\n registrationRef.current = registration;\n return () => {\n if (registrationRef.current === registration) registrationRef.current = undefined;\n controller.abort();\n };\n }, [runtime, context.name]);\n useLayoutEffect(() => {\n registrationRef.current?.update(context);\n }, [runtime, context.name, context.description, context.value]);\n}\n\nexport function AgentContext(context: AgentContextEntry): null {\n useAgentContext(context);\n return null;\n}\n\nfunction waitForActionResult<TResult>(\n result: TResult | Promise<TResult>,\n signal: AbortSignal,\n): Promise<TResult> {\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(signal.reason);\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve(result).then(\n (value) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n },\n );\n });\n}\n\nexport type AgentUIActionEvent = \"click\";\n\ntype Awaitable<TResult> = TResult | Promise<TResult>;\n\nexport interface AgentUIActionChildProps<TResult = void> {\n onClick: (event: MouseEvent<HTMLElement>) => Awaitable<TResult>;\n disabled?: boolean;\n}\n\nexport interface AgentUIActionProps<TResult = void> {\n name: string;\n description: string;\n event?: AgentUIActionEvent;\n children: ReactElement<AgentUIActionChildProps<TResult>>;\n}\n\ntype PendingInvocation<TResult> = {\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n reject: (reason?: unknown) => void;\n};\n\nfunction setRefValue<T>(ref: Ref<T> | undefined, value: T | null): (() => void) | undefined {\n if (typeof ref === \"function\") {\n const cleanup = ref(value);\n return typeof cleanup === \"function\" ? cleanup : undefined;\n }\n if (ref) (ref as { current: T | null }).current = value;\n}\n\nfunction getElementRef(element: ReactElement): Ref<HTMLElement> | undefined {\n const props = element.props as Record<string, unknown>;\n const refDescriptor = Object.getOwnPropertyDescriptor(element, \"ref\");\n if (refDescriptor && \"value\" in refDescriptor) {\n return refDescriptor.value as Ref<HTMLElement> | undefined;\n }\n return (props as { ref?: Ref<HTMLElement> }).ref;\n}\n\nfunction isHTMLElement(value: unknown): value is HTMLElement {\n if (!value || typeof value !== \"object\") return false;\n const ownerDocument = (value as { ownerDocument?: Document }).ownerDocument;\n const ElementConstructor =\n ownerDocument?.defaultView?.HTMLElement ??\n (typeof HTMLElement === \"undefined\" ? undefined : HTMLElement);\n return ElementConstructor !== undefined && value instanceof ElementConstructor;\n}\n\nfunction warnAgentUIAction(message: string): void {\n if (typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n console.warn(message);\n }\n}\n\nconst eventAdapters: Record<AgentUIActionEvent, { invoke(target: HTMLElement): void }> = {\n click: {\n invoke(target) {\n target.click();\n },\n },\n};\n\nexport function AgentUIAction<TResult = void>({\n name,\n description,\n event = \"click\",\n children,\n}: AgentUIActionProps<TResult>): ReactElement<AgentUIActionChildProps<TResult>, string | JSXElementConstructor<any>> {\n const runtime = useInternalToolRuntime();\n const child = Children.only(children) as ReactElement<AgentUIActionChildProps<TResult>>;\n const isFragment = child.type === Fragment;\n const handler = isFragment ? undefined : child.props.onClick;\n const childDisabled = isFragment ? false : Boolean(child.props.disabled);\n const childRef = isFragment ? undefined : getElementRef(child);\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const targetRef = useRef<HTMLElement | null>(null);\n const handlerRef = useRef(handler);\n const disabledRef = useRef(childDisabled);\n const pendingInvocationRef = useRef<PendingInvocation<TResult> | null>(null);\n const invalidTargetRef = useRef(false);\n const warnedTargetRef = useRef(false);\n const warnedChildRef = useRef<\"fragment\" | \"handler\" | null>(null);\n const invokingRef = useRef(false);\n\n useLayoutEffect(() => {\n handlerRef.current = handler;\n disabledRef.current = childDisabled;\n });\n\n const mergedRef = useCallback(\n (value: unknown) => {\n const element = isHTMLElement(value) ? value : null;\n const cleanupChildRef = setRefValue(childRef as Ref<unknown> | undefined, value);\n invalidTargetRef.current = value !== null && !element;\n targetRef.current = element;\n setTarget(element);\n if (element) warnedTargetRef.current = false;\n if (cleanupChildRef) {\n return () => {\n cleanupChildRef();\n if (targetRef.current === element) {\n invalidTargetRef.current = false;\n targetRef.current = null;\n setTarget(null);\n }\n };\n }\n },\n [childRef],\n );\n\n const invokeHandler = useCallback((mouseEvent: MouseEvent<HTMLElement>) => {\n const currentHandler = handlerRef.current;\n const pending = pendingInvocationRef.current;\n if (pending) pendingInvocationRef.current = null;\n if (!currentHandler) {\n pending?.reject(\n new AgentToolError(\n \"ACTION_NOT_HANDLED\",\n `AgentUIAction \"${name}\" does not have an onClick handler.`,\n ),\n );\n return undefined as TResult;\n }\n try {\n const result = currentHandler(mouseEvent);\n if (pending) Promise.resolve(result).then(pending.resolve, pending.reject);\n return result;\n } catch (error) {\n if (pending) {\n pending.reject(error);\n return undefined as TResult;\n }\n throw error;\n }\n }, [name]);\n\n const definition = useMemo(\n () =>\n defineAgentTool<TResult>({\n name,\n description,\n }),\n [name, description],\n );\n\n useLayoutEffect(() => {\n if (isFragment || !handler) {\n const warningType = isFragment ? \"fragment\" : \"handler\";\n if (warnedChildRef.current !== warningType) {\n warnedChildRef.current = warningType;\n warnAgentUIAction(\n isFragment\n ? `AgentUIAction \"${name}\" does not support React.Fragment children.`\n : `AgentUIAction \"${name}\" needs a child with onClick.`,\n );\n }\n return;\n }\n warnedChildRef.current = null;\n if (!target) {\n if (!targetRef.current && !warnedTargetRef.current) {\n warnedTargetRef.current = true;\n warnAgentUIAction(\n invalidTargetRef.current\n ? `AgentUIAction \"${name}\" needs its child ref to resolve to an HTMLElement; the Tool is not registered.`\n : `AgentUIAction \"${name}\" needs its child to forward ref to an HTMLElement; the Tool is not registered.`,\n );\n }\n return;\n }\n\n const controller = new AbortController();\n runtime.register(\n definition,\n async (_input, context) => {\n if (invokingRef.current) {\n throw new AgentToolError(\n \"ACTION_IN_FLIGHT\",\n `AgentUIAction \"${name}\" is already being invoked.`,\n );\n }\n if (disabledRef.current) {\n throw new AgentToolError(\n \"TOOL_UNAVAILABLE\",\n `AgentUIAction \"${name}\" is disabled.`,\n );\n }\n const currentTarget = targetRef.current;\n if (!currentTarget || !currentTarget.isConnected) {\n throw new AgentToolError(\n \"ACTION_TARGET_UNAVAILABLE\",\n `AgentUIAction \"${name}\" target is not available.`,\n );\n }\n invokingRef.current = true;\n let resolveInvocation!: (value: TResult | PromiseLike<TResult>) => void;\n let rejectInvocation!: (reason?: unknown) => void;\n const actionPromise = new Promise<TResult>((resolve, reject) => {\n resolveInvocation = resolve;\n rejectInvocation = reject;\n });\n const pendingInvocation = {\n resolve: resolveInvocation,\n reject: rejectInvocation,\n };\n pendingInvocationRef.current = pendingInvocation;\n try {\n eventAdapters[event].invoke(currentTarget);\n } catch (error) {\n if (pendingInvocationRef.current === pendingInvocation) {\n pendingInvocationRef.current = null;\n }\n invokingRef.current = false;\n throw error;\n }\n if (pendingInvocationRef.current === pendingInvocation) {\n pendingInvocationRef.current = null;\n invokingRef.current = false;\n throw new AgentToolError(\n \"ACTION_NOT_HANDLED\",\n `AgentUIAction \"${name}\" click did not invoke its onClick handler.`,\n );\n }\n try {\n return await waitForActionResult(actionPromise, context.signal);\n } finally {\n if (context.signal.aborted) {\n void actionPromise.then(\n () => {\n invokingRef.current = false;\n },\n () => {\n invokingRef.current = false;\n },\n );\n } else {\n invokingRef.current = false;\n }\n }\n },\n { signal: controller.signal },\n );\n return () => controller.abort();\n }, [runtime, definition, event, handler !== undefined, isFragment, name, target]);\n\n if (isFragment) return child;\n return cloneElement(child, {\n onClick: invokeHandler,\n ref: mergedRef,\n } as AgentUIActionChildProps<TResult> & { ref: Ref<HTMLElement> });\n}\n\nexport type {\n AgentContextValue,\n AgentToolDefinition,\n AgentToolExecutor,\n} from \"./types.js\";\n"]}
@@ -9,3 +9,9 @@ export declare function registerAgentTool<TInput, TResult>(definition: AgentTool
9
9
  execute: RegisteredAgentTool<TInput, TResult>["execute"];
10
10
  requiresConfirmation?: never;
11
11
  }): RegisteredAgentTool<TInput, TResult>;
12
+ export declare function createAgentToolRegistry(): {
13
+ register<TInput, TResult>(definition: AgentToolDefinition<TInput, TResult>, options: {
14
+ execute: RegisteredAgentTool<TInput, TResult>["execute"];
15
+ requiresConfirmation?: never;
16
+ }): () => void;
17
+ };
@@ -1,8 +1,8 @@
1
+ import { defineAgentTool } from "./definition.js";
2
+ import { toolRegistrySymbol } from "./shared/tool-registry.js";
1
3
  import { assertAgentToolInputSchema } from "./shared/schema.js";
2
4
  export function registerAgentTool(definition, options) {
3
- if (!definition ||
4
- typeof definition.name !== "string" ||
5
- typeof options?.execute !== "function") {
5
+ if (!definition || typeof definition.name !== "string" || typeof options?.execute !== "function") {
6
6
  throw new TypeError("registerAgentTool requires a definition and execute function.");
7
7
  }
8
8
  if ("requiresConfirmation" in options) {
@@ -11,3 +11,25 @@ export function registerAgentTool(definition, options) {
11
11
  assertAgentToolInputSchema(definition.inputSchema, `Tool "${definition.name}".inputSchema`);
12
12
  return Object.freeze({ definition, execute: options.execute });
13
13
  }
14
+ export function createAgentToolRegistry() {
15
+ const tools = new Map();
16
+ const registry = {
17
+ register(definition, options) {
18
+ const validated = registerAgentTool(definition, options);
19
+ if (tools.has(definition.name))
20
+ throw new TypeError(`Tool "${definition.name}" is already registered.`);
21
+ const copied = defineAgentTool(validated.definition);
22
+ const tool = Object.freeze({ definition: copied, execute: validated.execute });
23
+ tools.set(copied.name, tool);
24
+ return () => {
25
+ if (tools.get(copied.name) === tool)
26
+ tools.delete(copied.name);
27
+ };
28
+ },
29
+ };
30
+ Object.defineProperty(registry, toolRegistrySymbol, {
31
+ value: Object.freeze({ getTools: () => [...tools.values()] }),
32
+ });
33
+ return Object.freeze(registry);
34
+ }
35
+ //# sourceMappingURL=registration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registration.js","sourceRoot":"","sources":["../src/registration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAQhE,MAAM,UAAU,iBAAiB,CAC/B,UAAgD,EAChD,OAAmG;IAEnG,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;QACjG,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,sBAAsB,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;IACrF,CAAC;IACD,0BAA0B,CAAC,UAAU,CAAC,WAAW,EAAE,SAAS,UAAU,CAAC,IAAI,eAAe,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,uBAAuB;IAMrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,MAAM,QAAQ,GAAG;QACf,QAAQ,CACN,UAAgD,EAChD,OAAmG;YAEnG,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,SAAS,UAAU,CAAC,IAAI,0BAA0B,CAAC,CAAC;YACxG,MAAM,MAAM,GAAG,eAAe,CAAkB,SAAS,CAAC,UAAU,CAAC,CAAC;YACtE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7B,OAAO,GAAG,EAAE;gBACV,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI;oBAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,kBAAkB,EAAE;QAClD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;KAC9D,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import { defineAgentTool } from \"./definition.js\";\nimport { toolRegistrySymbol } from \"./shared/tool-registry.js\";\nimport { assertAgentToolInputSchema } from \"./shared/schema.js\";\nimport type { AgentToolDefinition } from \"./types.js\";\n\nexport interface RegisteredAgentTool<TInput = any, TResult = any> {\n readonly definition: AgentToolDefinition<TInput, TResult>;\n readonly execute: (input: TInput, context: { signal: AbortSignal }) => TResult | Promise<TResult>;\n}\n\nexport function registerAgentTool<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n options: { execute: RegisteredAgentTool<TInput, TResult>[\"execute\"]; requiresConfirmation?: never },\n): RegisteredAgentTool<TInput, TResult> {\n if (!definition || typeof definition.name !== \"string\" || typeof options?.execute !== \"function\") {\n throw new TypeError(\"registerAgentTool requires a definition and execute function.\");\n }\n if (\"requiresConfirmation\" in options) {\n throw new TypeError(\"Registered Agent tools do not support requiresConfirmation.\");\n }\n assertAgentToolInputSchema(definition.inputSchema, `Tool \"${definition.name}\".inputSchema`);\n return Object.freeze({ definition, execute: options.execute });\n}\n\nexport function createAgentToolRegistry(): {\n register<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n options: { execute: RegisteredAgentTool<TInput, TResult>[\"execute\"]; requiresConfirmation?: never },\n ): () => void;\n} {\n const tools = new Map<string, RegisteredAgentTool>();\n const registry = {\n register<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n options: { execute: RegisteredAgentTool<TInput, TResult>[\"execute\"]; requiresConfirmation?: never },\n ): () => void {\n const validated = registerAgentTool(definition, options);\n if (tools.has(definition.name)) throw new TypeError(`Tool \"${definition.name}\" is already registered.`);\n const copied = defineAgentTool<TInput, TResult>(validated.definition);\n const tool = Object.freeze({ definition: copied, execute: validated.execute });\n tools.set(copied.name, tool);\n return () => {\n if (tools.get(copied.name) === tool) tools.delete(copied.name);\n };\n },\n };\n Object.defineProperty(registry, toolRegistrySymbol, {\n value: Object.freeze({ getTools: () => [...tools.values()] }),\n });\n return Object.freeze(registry);\n}\n"]}
package/dist/runtime.d.ts CHANGED
@@ -7,14 +7,13 @@ import type { AgentContextEntry, AgentContextInput, AgentContextRegistration, Ag
7
7
  import type { AgentToolExecutionEvent } from "./internal-types.js";
8
8
  export interface ToolRuntimeOptions {
9
9
  readonly pageAutomation?: boolean;
10
- readonly routeSearch?: boolean;
11
10
  }
12
11
  export interface ToolRuntimeToolChangeEvent {
13
12
  readonly toolName: string;
14
- readonly change: "registered" | "unregistered" | "visibility";
13
+ readonly change: "registered" | "unregistered";
15
14
  }
16
15
  declare const CONTEXT_ERROR_CODES: readonly ["CONTEXT_DISPOSED", "CONTEXT_NAME_MISMATCH", "DUPLICATE_CONTEXT", "INVALID_CONTEXT"];
17
- type AgentContextErrorCode = (typeof CONTEXT_ERROR_CODES)[number];
16
+ type AgentContextErrorCode = typeof CONTEXT_ERROR_CODES[number];
18
17
  export declare function isToolRuntimeError(error: unknown): error is {
19
18
  readonly type: "tool_runtime_error";
20
19
  readonly domain: "tool" | "context";
@@ -171,7 +170,6 @@ export declare class ToolRuntimeImplementation extends EventTarget implements To
171
170
  getContexts(options?: {
172
171
  signal?: AbortSignal;
173
172
  }): Promise<readonly AgentContextEntry[]>;
174
- getRegisteredTools(): readonly RuntimeAgentTool[];
175
173
  getWebMcpTools(): readonly RuntimeAgentTool[];
176
174
  isRegistered(name: string): boolean;
177
175
  getTools(): readonly RuntimeAgentTool[];