@nexface/tools 0.1.0 → 0.1.1-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.
- package/dist/browser/toolset.js +1 -0
- package/dist/browser/toolset.js.map +1 -1
- package/dist/definition.d.ts +1 -0
- package/dist/definition.js +13 -1
- package/dist/definition.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/internal-react.d.ts +1 -0
- package/dist/internal-react.js +2 -1
- package/dist/internal-react.js.map +1 -1
- package/dist/internal-types.d.ts +4 -0
- package/dist/navigation.d.ts +32 -0
- package/dist/navigation.js +40 -0
- package/dist/navigation.js.map +1 -0
- package/dist/operation-host.d.ts +17 -0
- package/dist/operation-host.js +9 -0
- package/dist/operation-host.js.map +1 -0
- package/dist/operation-surface.d.ts +7 -0
- package/dist/operation-surface.js +82 -0
- package/dist/operation-surface.js.map +1 -0
- package/dist/operation-types.d.ts +17 -0
- package/dist/operation-types.js +2 -0
- package/dist/operation-types.js.map +1 -0
- package/dist/operation-view.d.ts +14 -0
- package/dist/operation-view.js +376 -0
- package/dist/operation-view.js.map +1 -0
- package/dist/react.d.ts +42 -3
- package/dist/react.js +115 -6
- package/dist/react.js.map +1 -1
- package/dist/runtime.d.ts +47 -6
- package/dist/runtime.js +129 -20
- package/dist/runtime.js.map +1 -1
- package/dist/styles.css +189 -0
- package/dist/types.d.ts +2 -0
- package/dist/webmcp.js +11 -10
- package/dist/webmcp.js.map +1 -1
- package/package.json +23 -2
- package/src/browser/controller.ts +0 -984
- package/src/browser/dom.ts +0 -507
- package/src/browser/feedback.ts +0 -5
- package/src/browser/locator.ts +0 -383
- package/src/browser/prompt.generated.ts +0 -50
- package/src/browser/prompt.ts +0 -10
- package/src/browser/snapshot.ts +0 -542
- package/src/browser/toolset.ts +0 -522
- package/src/browser/types.ts +0 -172
- package/src/browser/worker-runner.ts +0 -468
- package/src/definition.ts +0 -115
- package/src/index.ts +0 -35
- package/src/internal-react.tsx +0 -62
- package/src/internal-types.ts +0 -12
- package/src/internal.ts +0 -36
- package/src/react.tsx +0 -397
- package/src/runtime.ts +0 -722
- package/src/schema.ts +0 -52
- package/src/types.ts +0 -123
- package/src/webmcp.ts +0 -102
- package/tsconfig.json +0 -8
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CursorIcon as Cursor } from "@phosphor-icons/react/Cursor";
|
|
3
|
+
import { SparkleIcon as Sparkle } from "@phosphor-icons/react/Sparkle";
|
|
4
|
+
import { useEffect, useId, useRef, useState } from "react";
|
|
5
|
+
import { createPortal } from "react-dom";
|
|
6
|
+
const BROWSER_TOOL_NAMES = new Set(["getSnapshot", "executeCode"]);
|
|
7
|
+
const POINTER_EXIT_DURATION_MS = 120;
|
|
8
|
+
const POINTER_CLICK_FEEDBACK_DURATION_MS = 720;
|
|
9
|
+
const CONTROLLER_EXIT_DURATION_MS = 300;
|
|
10
|
+
function operationProgressLabel(operation) {
|
|
11
|
+
const progressLabel = operation.progressLabel?.trim().replace(/\s+/g, " ");
|
|
12
|
+
if (progressLabel)
|
|
13
|
+
return progressLabel.slice(0, 48);
|
|
14
|
+
return BROWSER_TOOL_NAMES.has(operation.name)
|
|
15
|
+
? "正在浏览网页"
|
|
16
|
+
: "正在处理你的请求";
|
|
17
|
+
}
|
|
18
|
+
function operationEffect(operation) {
|
|
19
|
+
return operation.effect ?? "action";
|
|
20
|
+
}
|
|
21
|
+
function normalizedLabel(label) {
|
|
22
|
+
const normalized = label?.trim().replace(/\s+/g, " ");
|
|
23
|
+
return normalized || undefined;
|
|
24
|
+
}
|
|
25
|
+
function operationTargetLabel(operation, target) {
|
|
26
|
+
const label = target?.label;
|
|
27
|
+
if (!label || label === operation.name)
|
|
28
|
+
return undefined;
|
|
29
|
+
const rawNamePrefix = `${operation.name} · `;
|
|
30
|
+
return label.startsWith(rawNamePrefix) ? label.slice(rawNamePrefix.length) : label;
|
|
31
|
+
}
|
|
32
|
+
function pointerMoveDuration(from, to) {
|
|
33
|
+
const distance = Math.hypot(to.left - from.left, to.top - from.top);
|
|
34
|
+
if (distance < 2)
|
|
35
|
+
return 0;
|
|
36
|
+
return Math.round(Math.min(360, Math.max(180, 180 + distance * 0.18)));
|
|
37
|
+
}
|
|
38
|
+
function pointerReachedTarget(element, target) {
|
|
39
|
+
const rect = element.getBoundingClientRect();
|
|
40
|
+
return Math.hypot(rect.left - target.left, rect.top - target.top) < 2;
|
|
41
|
+
}
|
|
42
|
+
function AgentPointer({ active, initialPosition, label, labelActive, operation, targetElement, targetPosition, visible }) {
|
|
43
|
+
const pointerRef = useRef(null);
|
|
44
|
+
const activeOperationRef = useRef(undefined);
|
|
45
|
+
const activeTargetRef = useRef(undefined);
|
|
46
|
+
const exitTimerRef = useRef(undefined);
|
|
47
|
+
const feedbackTimerRef = useRef(undefined);
|
|
48
|
+
const motionRevisionRef = useRef(0);
|
|
49
|
+
const latestActiveRef = useRef(active);
|
|
50
|
+
const latestOperationRef = useRef(operation);
|
|
51
|
+
const [motion, setMotion] = useState();
|
|
52
|
+
latestActiveRef.current = active;
|
|
53
|
+
latestOperationRef.current = operation;
|
|
54
|
+
const clearExitTimer = () => {
|
|
55
|
+
if (!exitTimerRef.current)
|
|
56
|
+
return;
|
|
57
|
+
clearTimeout(exitTimerRef.current);
|
|
58
|
+
exitTimerRef.current = undefined;
|
|
59
|
+
};
|
|
60
|
+
const clearFeedbackTimer = () => {
|
|
61
|
+
if (!feedbackTimerRef.current)
|
|
62
|
+
return;
|
|
63
|
+
clearTimeout(feedbackTimerRef.current);
|
|
64
|
+
feedbackTimerRef.current = undefined;
|
|
65
|
+
};
|
|
66
|
+
const scheduleResting = (revision, durationMs) => {
|
|
67
|
+
clearFeedbackTimer();
|
|
68
|
+
feedbackTimerRef.current = setTimeout(() => {
|
|
69
|
+
if (motionRevisionRef.current !== revision)
|
|
70
|
+
return;
|
|
71
|
+
setMotion((current) => current?.revision === revision
|
|
72
|
+
? { ...current, feedback: undefined, phase: "resting" }
|
|
73
|
+
: current);
|
|
74
|
+
}, durationMs);
|
|
75
|
+
};
|
|
76
|
+
const beginFeedback = (revision, toolCallId) => {
|
|
77
|
+
const latestOperation = latestOperationRef.current;
|
|
78
|
+
if (!latestActiveRef.current
|
|
79
|
+
|| motionRevisionRef.current !== revision
|
|
80
|
+
|| latestOperation.toolCallId !== toolCallId)
|
|
81
|
+
return;
|
|
82
|
+
const feedback = operationEffect(latestOperation) === "action"
|
|
83
|
+
&& latestOperation.status !== "failed"
|
|
84
|
+
&& latestOperation.status !== "cancelled"
|
|
85
|
+
? "click"
|
|
86
|
+
: undefined;
|
|
87
|
+
if (!feedback) {
|
|
88
|
+
setMotion((current) => current?.revision === revision
|
|
89
|
+
? { ...current, feedback: undefined, phase: "resting" }
|
|
90
|
+
: current);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
setMotion((current) => current?.revision === revision
|
|
94
|
+
? { ...current, feedback, phase: "arrived" }
|
|
95
|
+
: current);
|
|
96
|
+
scheduleResting(revision, POINTER_CLICK_FEEDBACK_DURATION_MS);
|
|
97
|
+
};
|
|
98
|
+
useEffect(() => () => {
|
|
99
|
+
clearExitTimer();
|
|
100
|
+
clearFeedbackTimer();
|
|
101
|
+
}, []);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (!visible || !initialPosition) {
|
|
104
|
+
if (!motion || motion.phase === "hidden")
|
|
105
|
+
return;
|
|
106
|
+
activeOperationRef.current = undefined;
|
|
107
|
+
activeTargetRef.current = undefined;
|
|
108
|
+
clearFeedbackTimer();
|
|
109
|
+
const revision = ++motionRevisionRef.current;
|
|
110
|
+
setMotion((current) => current
|
|
111
|
+
? { ...current, durationMs: POINTER_EXIT_DURATION_MS, feedback: undefined, phase: "hidden", revision }
|
|
112
|
+
: current);
|
|
113
|
+
clearExitTimer();
|
|
114
|
+
exitTimerRef.current = setTimeout(() => {
|
|
115
|
+
if (motionRevisionRef.current === revision)
|
|
116
|
+
setMotion(undefined);
|
|
117
|
+
}, POINTER_EXIT_DURATION_MS);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
clearExitTimer();
|
|
121
|
+
if (!motion) {
|
|
122
|
+
activeOperationRef.current = operation.toolCallId;
|
|
123
|
+
activeTargetRef.current = undefined;
|
|
124
|
+
const revision = ++motionRevisionRef.current;
|
|
125
|
+
setMotion({
|
|
126
|
+
durationMs: 0,
|
|
127
|
+
feedback: undefined,
|
|
128
|
+
phase: "resting",
|
|
129
|
+
position: initialPosition,
|
|
130
|
+
revision,
|
|
131
|
+
toolCallId: operation.toolCallId,
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (!active) {
|
|
136
|
+
activeOperationRef.current = undefined;
|
|
137
|
+
activeTargetRef.current = undefined;
|
|
138
|
+
clearFeedbackTimer();
|
|
139
|
+
if (motion.phase !== "resting" || motion.feedback) {
|
|
140
|
+
const revision = ++motionRevisionRef.current;
|
|
141
|
+
setMotion((current) => current
|
|
142
|
+
? { ...current, feedback: undefined, phase: "resting", revision }
|
|
143
|
+
: current);
|
|
144
|
+
}
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const operationChanged = activeOperationRef.current !== operation.toolCallId;
|
|
148
|
+
if (operationChanged) {
|
|
149
|
+
activeOperationRef.current = operation.toolCallId;
|
|
150
|
+
activeTargetRef.current = undefined;
|
|
151
|
+
clearFeedbackTimer();
|
|
152
|
+
}
|
|
153
|
+
else if (motion.phase === "hidden") {
|
|
154
|
+
setMotion((current) => current
|
|
155
|
+
? { ...current, durationMs: 0, phase: "resting" }
|
|
156
|
+
: current);
|
|
157
|
+
}
|
|
158
|
+
if (!targetElement || !targetPosition) {
|
|
159
|
+
if (operationChanged || activeTargetRef.current) {
|
|
160
|
+
activeTargetRef.current = undefined;
|
|
161
|
+
clearFeedbackTimer();
|
|
162
|
+
const revision = ++motionRevisionRef.current;
|
|
163
|
+
const pointerRect = pointerRef.current?.getBoundingClientRect();
|
|
164
|
+
setMotion((current) => current
|
|
165
|
+
? {
|
|
166
|
+
...current,
|
|
167
|
+
durationMs: 0,
|
|
168
|
+
feedback: undefined,
|
|
169
|
+
phase: "resting",
|
|
170
|
+
position: pointerRect
|
|
171
|
+
? { left: pointerRect.left, top: pointerRect.top }
|
|
172
|
+
: current.position,
|
|
173
|
+
revision,
|
|
174
|
+
toolCallId: operation.toolCallId,
|
|
175
|
+
}
|
|
176
|
+
: current);
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const targetChanged = operationChanged || activeTargetRef.current !== targetElement;
|
|
181
|
+
if (!targetChanged) {
|
|
182
|
+
if (motion.position.left === targetPosition.left && motion.position.top === targetPosition.top)
|
|
183
|
+
return;
|
|
184
|
+
setMotion((current) => current
|
|
185
|
+
? { ...current, durationMs: 180, position: targetPosition }
|
|
186
|
+
: current);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
activeTargetRef.current = targetElement;
|
|
190
|
+
clearFeedbackTimer();
|
|
191
|
+
const revision = ++motionRevisionRef.current;
|
|
192
|
+
const pointerRect = pointerRef.current?.getBoundingClientRect();
|
|
193
|
+
const currentPosition = pointerRect
|
|
194
|
+
? { left: pointerRect.left, top: pointerRect.top }
|
|
195
|
+
: motion.position;
|
|
196
|
+
const prefersReducedMotion = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
|
|
197
|
+
const durationMs = prefersReducedMotion ? 0 : pointerMoveDuration(currentPosition, targetPosition);
|
|
198
|
+
setMotion((current) => current
|
|
199
|
+
? {
|
|
200
|
+
...current,
|
|
201
|
+
durationMs,
|
|
202
|
+
feedback: undefined,
|
|
203
|
+
phase: "moving",
|
|
204
|
+
position: targetPosition,
|
|
205
|
+
revision,
|
|
206
|
+
toolCallId: operation.toolCallId,
|
|
207
|
+
}
|
|
208
|
+
: current);
|
|
209
|
+
if (durationMs === 0)
|
|
210
|
+
beginFeedback(revision, operation.toolCallId);
|
|
211
|
+
}, [
|
|
212
|
+
active,
|
|
213
|
+
initialPosition?.left,
|
|
214
|
+
initialPosition?.top,
|
|
215
|
+
motion,
|
|
216
|
+
operation.toolCallId,
|
|
217
|
+
targetElement,
|
|
218
|
+
targetPosition?.left,
|
|
219
|
+
targetPosition?.top,
|
|
220
|
+
visible,
|
|
221
|
+
]);
|
|
222
|
+
if (!motion)
|
|
223
|
+
return null;
|
|
224
|
+
const effect = operationEffect(operation);
|
|
225
|
+
const activeEffect = active ? effect : undefined;
|
|
226
|
+
return (_jsxs("div", { "aria-hidden": true, className: "agent-operation__pointer-effect", "data-active": active ? "true" : "false", "data-feedback": motion.feedback, "data-operation-effect": activeEffect, "data-phase": motion.phase, onTransitionEnd: (event) => {
|
|
227
|
+
if (event.currentTarget !== event.target
|
|
228
|
+
|| event.propertyName !== "transform"
|
|
229
|
+
|| motion.phase !== "moving"
|
|
230
|
+
|| !pointerReachedTarget(event.currentTarget, motion.position))
|
|
231
|
+
return;
|
|
232
|
+
beginFeedback(motion.revision, motion.toolCallId);
|
|
233
|
+
}, ref: pointerRef, style: {
|
|
234
|
+
"--agent-operation-pointer-duration": `${motion.durationMs}ms`,
|
|
235
|
+
"--agent-operation-pointer-x": `${motion.position.left}px`,
|
|
236
|
+
"--agent-operation-pointer-y": `${motion.position.top}px`,
|
|
237
|
+
"--agent-operation-ripple-duration": `${POINTER_CLICK_FEEDBACK_DURATION_MS}ms`,
|
|
238
|
+
}, children: [motion.phase === "arrived" && motion.feedback ? (_jsx("span", { className: "agent-operation__pointer-ripple agent-operation__pointer-ripple--primary" }, `primary-${motion.revision}`)) : null, _jsx("span", { className: "agent-operation__pointer-cursor", children: visible && effect === "action" ? (_jsx(Cursor, { className: "agent-operation__pointer", size: 24, weight: "fill" })) : null }), active && motion.phase !== "hidden" && (labelActive || effect !== "action") ? (_jsxs("span", { className: labelActive ? "agent-operation__pointer-label" : "agent-operation__pointer-indicator", "data-operation-effect": activeEffect, title: labelActive ? label : undefined, children: [activeEffect === "read" ? (_jsxs("span", { className: "agent-operation__pointer-read-scan", children: [_jsx("i", {}), _jsx("i", {}), _jsx("i", {}), _jsx("i", {}), _jsx("i", {})] })) : null, activeEffect === "navigate" ? _jsx("span", { className: "agent-operation__pointer-navigation-trail" }) : null, labelActive ? _jsx("span", { className: "agent-operation__pointer-label-text", children: label }) : null] })) : null] }));
|
|
239
|
+
}
|
|
240
|
+
export function OperationOverlayView({ operation, progressHistory = [], running, feedbackActive = running, labelActive = feedbackActive, humanHasControl = false, taskLabel, onCancel, resolveSurface, resolveTarget }) {
|
|
241
|
+
const [, setGeometry] = useState("");
|
|
242
|
+
const [historyOpen, setHistoryOpen] = useState(false);
|
|
243
|
+
const historyId = useId();
|
|
244
|
+
const clearTimerRef = useRef(undefined);
|
|
245
|
+
const controllerTimerRef = useRef(undefined);
|
|
246
|
+
const [visibleOperation, setVisibleOperation] = useState(operation);
|
|
247
|
+
const [controllerMounted, setControllerMounted] = useState(Boolean(operation
|
|
248
|
+
&& operation.status !== "cancelled"
|
|
249
|
+
&& (running || humanHasControl || operation.status === "failed")));
|
|
250
|
+
const [controllerExiting, setControllerExiting] = useState(false);
|
|
251
|
+
useEffect(() => {
|
|
252
|
+
if (clearTimerRef.current)
|
|
253
|
+
clearTimeout(clearTimerRef.current);
|
|
254
|
+
if (operation)
|
|
255
|
+
setVisibleOperation(operation);
|
|
256
|
+
if (operation?.status === "cancelled") {
|
|
257
|
+
clearTimerRef.current = setTimeout(() => setVisibleOperation(undefined), 600);
|
|
258
|
+
}
|
|
259
|
+
return () => { if (clearTimerRef.current)
|
|
260
|
+
clearTimeout(clearTimerRef.current); };
|
|
261
|
+
}, [operation, running]);
|
|
262
|
+
useEffect(() => {
|
|
263
|
+
if ((!running && !feedbackActive && !humanHasControl) || !visibleOperation || visibleOperation.status === "cancelled")
|
|
264
|
+
return;
|
|
265
|
+
let frame = requestAnimationFrame(function update() {
|
|
266
|
+
const surface = resolveSurface?.();
|
|
267
|
+
const target = resolveTarget?.(visibleOperation)?.element;
|
|
268
|
+
const geometry = [surface, target].map((element) => {
|
|
269
|
+
if (!element?.isConnected)
|
|
270
|
+
return "";
|
|
271
|
+
const rect = element.getBoundingClientRect();
|
|
272
|
+
return [rect.left, rect.top, rect.width, rect.height].join(",");
|
|
273
|
+
}).join(";");
|
|
274
|
+
setGeometry(geometry);
|
|
275
|
+
frame = requestAnimationFrame(update);
|
|
276
|
+
});
|
|
277
|
+
return () => cancelAnimationFrame(frame);
|
|
278
|
+
}, [visibleOperation?.toolCallId, visibleOperation?.status, running, feedbackActive, humanHasControl, resolveSurface, resolveTarget]);
|
|
279
|
+
useEffect(() => {
|
|
280
|
+
if (progressHistory.length === 0)
|
|
281
|
+
setHistoryOpen(false);
|
|
282
|
+
}, [progressHistory.length]);
|
|
283
|
+
const controllerShouldBeVisible = Boolean(visibleOperation
|
|
284
|
+
&& visibleOperation.status !== "cancelled"
|
|
285
|
+
&& (running || humanHasControl || visibleOperation.status === "failed"));
|
|
286
|
+
useEffect(() => {
|
|
287
|
+
if (controllerTimerRef.current)
|
|
288
|
+
clearTimeout(controllerTimerRef.current);
|
|
289
|
+
if (controllerShouldBeVisible) {
|
|
290
|
+
setControllerMounted(true);
|
|
291
|
+
setControllerExiting(false);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (!controllerMounted) {
|
|
295
|
+
setControllerExiting(false);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
setHistoryOpen(false);
|
|
299
|
+
setControllerExiting(true);
|
|
300
|
+
controllerTimerRef.current = setTimeout(() => {
|
|
301
|
+
setControllerMounted(false);
|
|
302
|
+
setControllerExiting(false);
|
|
303
|
+
}, CONTROLLER_EXIT_DURATION_MS);
|
|
304
|
+
return () => {
|
|
305
|
+
if (controllerTimerRef.current)
|
|
306
|
+
clearTimeout(controllerTimerRef.current);
|
|
307
|
+
};
|
|
308
|
+
}, [controllerMounted, controllerShouldBeVisible]);
|
|
309
|
+
useEffect(() => {
|
|
310
|
+
if (typeof document === "undefined")
|
|
311
|
+
return;
|
|
312
|
+
const surface = resolveSurface?.();
|
|
313
|
+
if (!surface)
|
|
314
|
+
return;
|
|
315
|
+
const previousInert = surface.inert;
|
|
316
|
+
const previousBusy = surface.getAttribute("aria-busy");
|
|
317
|
+
const locked = running && !humanHasControl;
|
|
318
|
+
surface.inert = locked;
|
|
319
|
+
if (locked)
|
|
320
|
+
surface.setAttribute("aria-busy", "true");
|
|
321
|
+
else
|
|
322
|
+
surface.removeAttribute("aria-busy");
|
|
323
|
+
return () => {
|
|
324
|
+
surface.inert = previousInert;
|
|
325
|
+
if (previousBusy === null)
|
|
326
|
+
surface.removeAttribute("aria-busy");
|
|
327
|
+
else
|
|
328
|
+
surface.setAttribute("aria-busy", previousBusy);
|
|
329
|
+
};
|
|
330
|
+
}, [humanHasControl, resolveSurface, running]);
|
|
331
|
+
if (!visibleOperation || typeof document === "undefined")
|
|
332
|
+
return null;
|
|
333
|
+
const resolvedTarget = resolveTarget?.(visibleOperation);
|
|
334
|
+
const surfaceElement = resolveSurface?.();
|
|
335
|
+
const target = resolvedTarget && (!surfaceElement || surfaceElement.contains(resolvedTarget.element))
|
|
336
|
+
? resolvedTarget
|
|
337
|
+
: undefined;
|
|
338
|
+
const progressLabel = operationProgressLabel(visibleOperation);
|
|
339
|
+
const effect = operationEffect(visibleOperation);
|
|
340
|
+
const targetLabel = operationTargetLabel(visibleOperation, target);
|
|
341
|
+
const pointerLabel = normalizedLabel(visibleOperation.progressLabel) ?? targetLabel ?? progressLabel;
|
|
342
|
+
const normalizedTaskLabel = normalizedLabel(taskLabel);
|
|
343
|
+
const controllerLabel = normalizedTaskLabel ?? (humanHasControl ? undefined : progressLabel);
|
|
344
|
+
const statusLabel = humanHasControl ? "等待你完成操作" : {
|
|
345
|
+
running: "Agent 正在控制",
|
|
346
|
+
completed: running ? "Agent 正在控制" : "操作已完成",
|
|
347
|
+
failed: running ? "Agent 正在处理错误" : "操作失败",
|
|
348
|
+
cancelled: "任务已终止",
|
|
349
|
+
}[visibleOperation.status];
|
|
350
|
+
const compactStatusLabel = humanHasControl
|
|
351
|
+
? "等待你完成操作"
|
|
352
|
+
: normalizedTaskLabel ?? progressLabel;
|
|
353
|
+
const rect = target?.element.isConnected ? target.element.getBoundingClientRect() : undefined;
|
|
354
|
+
const highlightedRect = effect === "navigate" ? undefined : rect;
|
|
355
|
+
const surfaceRect = surfaceElement?.isConnected ? surfaceElement.getBoundingClientRect() : undefined;
|
|
356
|
+
const agentControlsSurface = running && !humanHasControl;
|
|
357
|
+
const operationFeedbackActive = feedbackActive && !humanHasControl && visibleOperation.status !== "cancelled";
|
|
358
|
+
const pointerVisible = Boolean(surfaceRect) && feedbackActive && !humanHasControl && visibleOperation.status !== "cancelled";
|
|
359
|
+
const pointerPosition = rect ? {
|
|
360
|
+
left: rect.left + rect.width / 2,
|
|
361
|
+
top: rect.top + rect.height / 2,
|
|
362
|
+
} : undefined;
|
|
363
|
+
const cancel = onCancel ? () => {
|
|
364
|
+
onCancel();
|
|
365
|
+
} : undefined;
|
|
366
|
+
return createPortal(_jsxs("div", { className: "agent-operation", "data-feedback-active": feedbackActive, "data-human-control": humanHasControl, "data-operation-effect": effect, "data-run-active": running, "data-status": visibleOperation.status, children: [agentControlsSurface && surfaceRect ? _jsx("div", { "aria-hidden": true, className: "agent-operation__surface", style: {
|
|
367
|
+
...(highlightedRect ? {
|
|
368
|
+
"--agent-operation-cutout-height": `${highlightedRect.height}px`,
|
|
369
|
+
"--agent-operation-cutout-left": `${highlightedRect.left - surfaceRect.left}px`,
|
|
370
|
+
"--agent-operation-cutout-top": `${highlightedRect.top - surfaceRect.top}px`,
|
|
371
|
+
"--agent-operation-cutout-width": `${highlightedRect.width}px`,
|
|
372
|
+
} : {}),
|
|
373
|
+
height: surfaceRect.height, left: surfaceRect.left, top: surfaceRect.top, width: surfaceRect.width,
|
|
374
|
+
} }) : null, operationFeedbackActive && highlightedRect ? _jsx("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, _jsx(AgentPointer, { active: operationFeedbackActive, initialPosition: surfaceRect ? { left: surfaceRect.left + surfaceRect.width / 2, top: surfaceRect.top + surfaceRect.height / 2 } : undefined, label: pointerLabel, labelActive: labelActive, operation: visibleOperation, targetElement: target?.element, targetPosition: pointerPosition, visible: pointerVisible }), controllerMounted ? _jsxs("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, children: [historyOpen ? _jsxs("aside", { "aria-label": "\u672C\u6B21\u8FD0\u884C\u7684\u64CD\u4F5C\u8BB0\u5F55", className: "agent-operation__history", id: historyId, children: [_jsxs("header", { children: [_jsx("strong", { children: "\u64CD\u4F5C\u8BB0\u5F55" }), _jsx("span", { children: progressHistory.length })] }), _jsx("ol", { children: progressHistory.map(({ progressLabel: label, toolCallId }, index) => _jsxs("li", { children: [_jsx("span", { "aria-hidden": true, children: index + 1 }), _jsx("p", { children: label })] }, toolCallId)) })] }) : null, _jsx("span", { "aria-hidden": true, className: "agent-operation__edge-flow" }), _jsxs("span", { "aria-hidden": true, className: "agent-operation__pause-mark", children: [_jsx("i", {}), _jsx("i", {})] }), _jsxs("button", { "aria-controls": historyId, "aria-expanded": historyOpen, "aria-label": "\u67E5\u770B\u672C\u6B21\u8FD0\u884C\u7684\u64CD\u4F5C\u8BB0\u5F55", className: "agent-operation__activity", "data-open": historyOpen ? "true" : "false", disabled: progressHistory.length === 0, onClick: () => setHistoryOpen((current) => !current), title: progressHistory.length === 0 ? "暂无操作记录" : "查看本次运行的操作记录", type: "button", children: [_jsx(Sparkle, { className: "agent-operation__activity-icon", size: 16, weight: "fill" }), _jsx("i", {}), _jsx("b", { children: "\u2726" })] }), _jsxs("div", { children: [_jsx("span", { className: "agent-operation__heading", children: _jsx("strong", { children: controllerLabel }) }), statusLabel ? _jsx("small", { className: "agent-operation__description", children: _jsx("span", { className: "agent-operation__status", children: statusLabel }) }) : null] }), (running || humanHasControl) && visibleOperation.status !== "cancelled" ? _jsx("span", { className: "agent-operation__compact-status", title: compactStatusLabel, children: compactStatusLabel }) : null, cancel && running && visibleOperation.status !== "cancelled" ? _jsx("button", { className: "agent-operation__stop", type: "button", onClick: cancel, children: "\u7EC8\u6B62\u4EFB\u52A1" }) : null] }) : null] }), document.body);
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=operation-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-view.js","sourceRoot":"","sources":["../src/operation-view.tsx"],"names":[],"mappings":"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"}
|
package/dist/react.d.ts
CHANGED
|
@@ -1,8 +1,47 @@
|
|
|
1
|
-
import { type MouseEvent, type ReactElement, type ReactNode } from "react";
|
|
1
|
+
import { type MouseEvent, type ReactElement, type ReactNode, type RefCallback } from "react";
|
|
2
|
+
import { type AgentNavigation, type AgentNavigationExecutors } from "./navigation.js";
|
|
2
3
|
import type { ToolRuntime } from "./runtime.js";
|
|
3
4
|
import type { AgentContextEntry, AgentToolDefinition, AgentToolExecutor } from "./types.js";
|
|
4
|
-
export
|
|
5
|
-
|
|
5
|
+
export interface AgentToolChatConfirmationConfig {
|
|
6
|
+
mode: "chat";
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
confirmLabel?: string;
|
|
10
|
+
rejectLabel?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AgentToolPageConfirmationConfig {
|
|
13
|
+
mode: "page";
|
|
14
|
+
title?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface UseAgentToolDefaultOptions {
|
|
18
|
+
requiresConfirmation?: AgentToolChatConfirmationConfig;
|
|
19
|
+
}
|
|
20
|
+
export interface UseAgentToolPageConfirmationOptions {
|
|
21
|
+
requiresConfirmation: AgentToolPageConfirmationConfig;
|
|
22
|
+
}
|
|
23
|
+
export interface AgentToolBinding<TInput = unknown, TElement extends HTMLElement = HTMLElement> {
|
|
24
|
+
readonly toolName: string;
|
|
25
|
+
readonly ref: RefCallback<TElement>;
|
|
26
|
+
refWhen(match: (input: TInput) => boolean): RefCallback<TElement>;
|
|
27
|
+
}
|
|
28
|
+
declare const pageConfirmableAgentToolBindingBrand: unique symbol;
|
|
29
|
+
export interface PageConfirmableAgentToolBinding<TInput = unknown, TElement extends HTMLElement = HTMLElement> extends AgentToolBinding<TInput, TElement> {
|
|
30
|
+
readonly [pageConfirmableAgentToolBindingBrand]: true;
|
|
31
|
+
}
|
|
32
|
+
type BindingInternals = {
|
|
33
|
+
resolveTarget(input: unknown): HTMLElement | undefined;
|
|
34
|
+
pageConfirmable: boolean;
|
|
35
|
+
getConditionalTargetRegistrations(): readonly {
|
|
36
|
+
element: HTMLElement;
|
|
37
|
+
match(input: unknown): boolean;
|
|
38
|
+
}[];
|
|
39
|
+
};
|
|
40
|
+
export declare function getAgentToolBindingInternals(binding: AgentToolBinding): BindingInternals;
|
|
41
|
+
export declare function useAgentTool<TInput, TResult, TElement extends HTMLElement = HTMLElement>(definition: AgentToolDefinition<TInput, TResult>, execute: AgentToolExecutor<TInput, TResult>, options: UseAgentToolPageConfirmationOptions): PageConfirmableAgentToolBinding<TInput, TElement>;
|
|
42
|
+
export declare function useAgentTool<TInput, TResult, TElement extends HTMLElement = HTMLElement>(definition: AgentToolDefinition<TInput, TResult>, execute: AgentToolExecutor<TInput, TResult>, options?: UseAgentToolDefaultOptions): AgentToolBinding<TInput, TElement>;
|
|
43
|
+
export declare function useAgentNavigation<TNavigation extends AgentNavigation, const TExecutors extends AgentNavigationExecutors<TNavigation>>(navigation: TNavigation, executors: TExecutors & Record<Exclude<keyof TExecutors, keyof AgentNavigationExecutors<TNavigation>>, never>): void;
|
|
44
|
+
export declare function ToolsProvider({ children, toolRuntime, webMcp, }: {
|
|
6
45
|
children: ReactNode;
|
|
7
46
|
toolRuntime: ToolRuntime;
|
|
8
47
|
webMcp?: boolean;
|
package/dist/react.js
CHANGED
|
@@ -1,23 +1,132 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Children, Fragment, cloneElement, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, } from "react";
|
|
3
3
|
import { defineAgentTool } from "./definition.js";
|
|
4
|
+
import { getAgentNavigationEntries, } from "./navigation.js";
|
|
4
5
|
import { AgentToolError, getInternalToolRuntime } from "./runtime.js";
|
|
5
6
|
import { InternalToolRuntimeScope, useInternalToolRuntime, } from "./internal-react.js";
|
|
6
7
|
import { connectToolRuntimeToWebMcp } from "./webmcp.js";
|
|
7
|
-
|
|
8
|
+
const bindingInternals = new WeakMap();
|
|
9
|
+
export function getAgentToolBindingInternals(binding) {
|
|
10
|
+
const internals = bindingInternals.get(binding);
|
|
11
|
+
if (!internals)
|
|
12
|
+
throw new Error("Invalid Agent Tool Binding.");
|
|
13
|
+
return internals;
|
|
14
|
+
}
|
|
15
|
+
function createAgentToolBinding(toolName, pageConfirmable) {
|
|
16
|
+
let fixedElement = null;
|
|
17
|
+
const conditionalElements = new Map();
|
|
18
|
+
const ref = (element) => {
|
|
19
|
+
if (element && fixedElement && fixedElement !== element) {
|
|
20
|
+
throw new Error("An Agent Tool Binding ref can only attach to one element.");
|
|
21
|
+
}
|
|
22
|
+
fixedElement = element;
|
|
23
|
+
};
|
|
24
|
+
const binding = {
|
|
25
|
+
toolName,
|
|
26
|
+
ref,
|
|
27
|
+
refWhen(match) {
|
|
28
|
+
let callback;
|
|
29
|
+
callback = (element) => {
|
|
30
|
+
if (element) {
|
|
31
|
+
conditionalElements.set(callback, { element, match });
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
conditionalElements.delete(callback);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return callback;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
bindingInternals.set(binding, {
|
|
41
|
+
resolveTarget(input) {
|
|
42
|
+
for (const entry of conditionalElements.values()) {
|
|
43
|
+
if (entry.element.isConnected && entry.match(input))
|
|
44
|
+
return entry.element;
|
|
45
|
+
}
|
|
46
|
+
return fixedElement?.isConnected ? fixedElement : undefined;
|
|
47
|
+
},
|
|
48
|
+
pageConfirmable,
|
|
49
|
+
getConditionalTargetRegistrations: () => Array.from(conditionalElements.values(), ({ element, match }) => ({
|
|
50
|
+
element,
|
|
51
|
+
match: (input) => match(input),
|
|
52
|
+
})),
|
|
53
|
+
});
|
|
54
|
+
return binding;
|
|
55
|
+
}
|
|
56
|
+
function useAgentBinding(definition, execute, options) {
|
|
8
57
|
const runtime = useInternalToolRuntime();
|
|
58
|
+
const confirmation = options.requiresConfirmation;
|
|
59
|
+
if (confirmation !== undefined
|
|
60
|
+
&& (!confirmation
|
|
61
|
+
|| typeof confirmation !== "object"
|
|
62
|
+
|| (confirmation.mode !== "chat" && confirmation.mode !== "page"))) {
|
|
63
|
+
throw new Error("requiresConfirmation must explicitly use chat or page mode.");
|
|
64
|
+
}
|
|
9
65
|
const executeRef = useRef(execute);
|
|
10
66
|
executeRef.current = execute;
|
|
67
|
+
const confirmationRef = useRef(confirmation);
|
|
68
|
+
confirmationRef.current = confirmation;
|
|
69
|
+
const mode = confirmation?.mode;
|
|
70
|
+
const binding = useMemo(() => createAgentToolBinding(definition.name, mode === "page"), [runtime, definition, mode]);
|
|
11
71
|
useLayoutEffect(() => {
|
|
12
72
|
const controller = new AbortController();
|
|
13
|
-
runtime.register(definition, (input, context) => executeRef.current(input, context), {
|
|
73
|
+
runtime.register(definition, (input, context) => executeRef.current(input, context), {
|
|
74
|
+
signal: controller.signal,
|
|
75
|
+
getConfirmation: () => confirmationRef.current,
|
|
76
|
+
resolveTarget: (input) => getAgentToolBindingInternals(binding).resolveTarget(input),
|
|
77
|
+
});
|
|
14
78
|
return () => controller.abort();
|
|
15
|
-
}, [runtime, definition]);
|
|
79
|
+
}, [runtime, definition, mode]);
|
|
80
|
+
return binding;
|
|
81
|
+
}
|
|
82
|
+
export function useAgentTool(definition, execute, options = {}) {
|
|
83
|
+
return useAgentBinding(definition, execute, options);
|
|
16
84
|
}
|
|
17
|
-
|
|
18
|
-
|
|
85
|
+
function getAgentNavigationExecutor(executors, key) {
|
|
86
|
+
if (!executors
|
|
87
|
+
|| typeof executors !== "object"
|
|
88
|
+
|| !Object.hasOwn(executors, key)) {
|
|
89
|
+
throw new Error(`Missing navigation executor: ${key}.`);
|
|
90
|
+
}
|
|
91
|
+
const executor = executors[key];
|
|
92
|
+
if (typeof executor !== "function") {
|
|
93
|
+
throw new Error(`Missing navigation executor: ${key}.`);
|
|
94
|
+
}
|
|
95
|
+
return executor;
|
|
96
|
+
}
|
|
97
|
+
export function useAgentNavigation(navigation, executors) {
|
|
98
|
+
const runtime = useInternalToolRuntime();
|
|
99
|
+
const entries = getAgentNavigationEntries(navigation);
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
getAgentNavigationExecutor(executors, entry.key);
|
|
102
|
+
}
|
|
103
|
+
const routeKeys = new Set(entries.map((entry) => entry.key));
|
|
104
|
+
for (const key of Object.keys(executors)) {
|
|
105
|
+
if (!routeKeys.has(key)) {
|
|
106
|
+
throw new Error(`Unknown navigation executor: ${key}.`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const executorsRef = useRef(executors);
|
|
110
|
+
executorsRef.current = executors;
|
|
111
|
+
useLayoutEffect(() => {
|
|
112
|
+
const controller = new AbortController();
|
|
113
|
+
try {
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
runtime.register(entry.definition, async (input, context) => {
|
|
116
|
+
const executor = getAgentNavigationExecutor(executorsRef.current, entry.key);
|
|
117
|
+
await executor(input, context);
|
|
118
|
+
return { status: "navigated" };
|
|
119
|
+
}, { signal: controller.signal });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
controller.abort();
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
return () => controller.abort();
|
|
127
|
+
}, [runtime, navigation]);
|
|
19
128
|
}
|
|
20
|
-
export function
|
|
129
|
+
export function ToolsProvider({ children, toolRuntime, webMcp = true, }) {
|
|
21
130
|
const runtime = getInternalToolRuntime(toolRuntime);
|
|
22
131
|
return (_jsxs(InternalToolRuntimeScope, { runtime: toolRuntime, children: [_jsx(WebMcpRuntimeBridge, { enabled: webMcp, runtime: runtime }), children] }));
|
|
23
132
|
}
|