@nexface/tools 0.1.1-alpha.9 → 0.1.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"worker-runner.js","sourceRoot":"","sources":["../../src/browser/worker-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { PageController } from \"./controller.js\";\nimport type {\n ExecutionLimits,\n ExecutionResult,\n JSONValue,\n PageCommand,\n SnapshotRegistry,\n} from \"./types.js\";\n\ninterface WorkerCommandMessage {\n type: \"command\";\n requestId: number;\n command: PageCommand;\n}\n\ninterface WorkerDoneMessage {\n type: \"done\";\n hasValue: boolean;\n value?: unknown;\n}\n\ninterface WorkerErrorMessage {\n type: \"error\";\n error: { code: string; message: string; statement?: string };\n}\n\ntype WorkerMessage =\n | WorkerCommandMessage\n | WorkerDoneMessage\n | WorkerErrorMessage;\n\nexport function createWorkerRuntimeSource(\n executionId: string,\n code: string,\n): string {\n return `\nconst executionId = ${JSON.stringify(executionId)};\nlet requestId = 0;\nlet commandSeq = 0;\nconst pending = new Map();\n\nself.onmessage = (event) => {\n const message = event.data;\n if (message.type !== \"response\") return;\n const entry = pending.get(message.requestId);\n if (!entry) return;\n pending.delete(message.requestId);\n if (message.response.ok) entry.resolve(message.response.value);\n else {\n const error = new Error(message.response.error?.message || \"Page command failed\");\n error.code = message.response.error?.code || \"PAGE_COMMAND_FAILED\";\n error.candidates = message.response.error?.candidates;\n entry.reject(error);\n }\n};\n\nfunction normalizeRPCValue(value) {\n if (value instanceof RegExp) {\n return { source: value.source, flags: value.flags };\n }\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n ) {\n return value;\n }\n if (Array.isArray(value)) return value.map(normalizeRPCValue);\n if (value && typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\"Page API arguments must be plain JSON values or RegExp.\");\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeRPCValue(item)])\n );\n }\n throw new Error(\"Page API arguments contain an unsupported value.\");\n}\n\nfunction normalizeResult(value, seen = new Set()) {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) throw new Error(\"executeCode returned a cyclic value.\");\n seen.add(value);\n const result = value.map((item) => normalizeResult(item, seen));\n seen.delete(value);\n return result;\n }\n if (value && typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\"executeCode must return JSON-serializable data.\");\n }\n if (seen.has(value)) throw new Error(\"executeCode returned a cyclic value.\");\n seen.add(value);\n const result = Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeResult(item, seen)])\n );\n seen.delete(value);\n return result;\n }\n throw new Error(\"executeCode must return JSON-serializable data.\");\n}\n\nfunction rpc(target, method, args) {\n if (pending.size > 0) {\n const error = new Error(\"Page API operations must be awaited sequentially.\");\n error.code = \"CONCURRENT_PAGE_OPERATION\";\n throw error;\n }\n const id = ++requestId;\n const command = {\n executionId,\n commandSeq: ++commandSeq,\n target: normalizeRPCValue(target),\n method,\n args: normalizeRPCValue(args)\n };\n self.postMessage({ type: \"command\", requestId: id, command });\n return new Promise((resolve, reject) =>\n pending.set(id, { resolve, reject })\n );\n}\n\nclass Locator {\n constructor(steps) { this.steps = steps; }\n getByRole(role, options = {}) {\n return new Locator([...this.steps, { kind: \"role\", role, options }]);\n }\n getByText(text, options = {}) {\n return new Locator([...this.steps, { kind: \"text\", text, options }]);\n }\n getByLabel(text, options = {}) {\n return new Locator([...this.steps, { kind: \"label\", text, options }]);\n }\n filter(options) {\n return new Locator([...this.steps, { kind: \"filter\", hasText: options.hasText }]);\n }\n call(method, ...args) {\n return rpc(\n { type: \"locator\", locator: { steps: this.steps } },\n method,\n args\n );\n }\n click() { return this.call(\"click\"); }\n fill(value) { return this.call(\"fill\", value); }\n press(key) { return this.call(\"press\", key); }\n check() { return this.call(\"check\"); }\n uncheck() { return this.call(\"uncheck\"); }\n selectOption(value) { return this.call(\"selectOption\", value); }\n hover() { return this.call(\"hover\"); }\n focus() { return this.call(\"focus\"); }\n blur() { return this.call(\"blur\"); }\n scrollBy(value) { return this.call(\"scrollBy\", value); }\n scrollTo(value) { return this.call(\"scrollTo\", value); }\n scrollIntoView() { return this.call(\"scrollIntoView\"); }\n exists() { return this.call(\"exists\"); }\n text() { return this.call(\"text\"); }\n waitFor(options = {}) { return this.call(\"waitFor\", options); }\n}\n\nconst uiTarget = Object.freeze({\n ref: (ref) => {\n if (typeof ref !== \"string\" || !/^@\\\\d+$/.test(ref)) {\n throw new Error(\"ui.ref(ref) requires a Snapshot ref such as @12.\");\n }\n return new LocatorProxy({ type: \"ref\", ref });\n },\n getByRole: (role, options = {}) =>\n new Locator([{ kind: \"role\", role, options }]),\n getByText: (text, options = {}) =>\n new Locator([{ kind: \"text\", text, options }]),\n getByLabel: (text, options = {}) =>\n new Locator([{ kind: \"label\", text, options }]),\n scrollBy: (value) => rpc({ type: \"page\" }, \"scrollBy\", [value]),\n waitForTimeout: (ms) => rpc({ type: \"page\" }, \"waitForTimeout\", [ms]),\n waitForURL: (url, options = {}) =>\n rpc({ type: \"page\" }, \"waitForURL\", [url, options])\n});\nconst ui = new Proxy(uiTarget, {\n get(target, property, receiver) {\n if (typeof property !== \"string\" || Object.hasOwn(target, property)) {\n return Reflect.get(target, property, receiver);\n }\n const error = new Error(\n 'UI API method \"' + property + '\" is not available. Supported methods: '\n + Object.keys(uiTarget).join(\", \") + \".\"\n );\n error.code = \"UI_API_NOT_AVAILABLE\";\n throw error;\n }\n});\n\nfunction LocatorProxy(target) {\n this.target = target;\n}\nLocatorProxy.prototype.call = function(method, ...args) {\n return rpc(this.target, method, args);\n};\nfor (const method of [\n \"click\",\n \"check\",\n \"uncheck\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollIntoView\",\n \"exists\",\n \"text\"\n]) {\n LocatorProxy.prototype[method] = function() {\n return this.call(method);\n };\n}\nLocatorProxy.prototype.fill = function(value) { return this.call(\"fill\", value); };\nLocatorProxy.prototype.press = function(key) { return this.call(\"press\", key); };\nLocatorProxy.prototype.selectOption = function(value) {\n return this.call(\"selectOption\", value);\n};\nLocatorProxy.prototype.scrollBy = function(value) {\n return this.call(\"scrollBy\", value);\n};\nLocatorProxy.prototype.scrollTo = function(value) {\n return this.call(\"scrollTo\", value);\n};\nLocatorProxy.prototype.waitFor = function(options = {}) {\n return this.call(\"waitFor\", options);\n};\n\n(async () => {\n try {\n const rawResult = await (async () => {\n${code}\n })();\n if (pending.size > 0) {\n const error = new Error(\"Every Page API operation must be awaited before executeCode returns.\");\n error.code = \"UNAWAITED_PAGE_OPERATION\";\n throw error;\n }\n const hasValue = rawResult !== undefined;\n const value = hasValue ? normalizeResult(rawResult) : undefined;\n self.postMessage({ type: \"done\", hasValue, value });\n } catch (error) {\n self.postMessage({\n type: \"error\",\n error: {\n code: error?.code || \"CODE_EXECUTION_FAILED\",\n message: error?.message || String(error),\n statement: error?.statement || error?.stack?.split(\"\\\\n\")[1]?.trim()\n }\n });\n }\n})();`;\n}\n\nfunction validateJSONValue(\n value: unknown,\n maxChars: number,\n): JSONValue {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) {\n throw new Error(\"executeCode returned a non-JSON value.\");\n }\n if (serialized.length > maxChars) {\n throw new Error(\n `executeCode result exceeds ${maxChars} serialized characters.`,\n );\n }\n return JSON.parse(serialized) as JSONValue;\n}\n\nexport class WorkerRunner {\n private active:\n | {\n executionId: string;\n worker: Worker;\n objectUrl: string;\n settled: boolean;\n cancel: () => void;\n }\n | undefined;\n\n constructor(\n private readonly controller: PageController,\n private readonly limits: ExecutionLimits,\n ) {}\n\n async execute(\n code: string,\n registry: SnapshotRegistry,\n maxDurationMs = this.limits.maxDurationMs,\n ): Promise<ExecutionResult> {\n if (code.length > this.limits.maxCodeLength) {\n return {\n executionId: \"rejected\",\n ok: false,\n completedActions: [],\n error: {\n code: \"CODE_TOO_LONG\",\n message: `Code exceeds ${this.limits.maxCodeLength} characters.`,\n },\n };\n }\n\n if (this.active && !this.active.settled) {\n return {\n executionId: \"rejected\",\n ok: false,\n completedActions: [],\n error: {\n code: \"EXECUTION_IN_PROGRESS\",\n message: \"Another executeCode call is still running.\",\n },\n };\n }\n\n const executionId = crypto.randomUUID();\n const source = createWorkerRuntimeSource(executionId, code);\n const blob = new Blob([source], {\n type: \"text/javascript\",\n });\n const objectUrl = URL.createObjectURL(blob);\n const worker = new Worker(objectUrl, {\n name: `nexface-${executionId}`,\n });\n this.controller.beginExecution(executionId, registry);\n\n return new Promise<ExecutionResult>((resolve) => {\n const active: NonNullable<WorkerRunner[\"active\"]> = {\n executionId,\n worker,\n objectUrl,\n settled: false,\n cancel: () => {},\n };\n this.active = active;\n\n const settle = (\n partial: Omit<\n ExecutionResult,\n \"executionId\" | \"completedActions\" | \"failedCall\"\n >,\n ): void => {\n if (active.settled) return;\n active.settled = true;\n window.clearTimeout(timer);\n worker.terminate();\n URL.revokeObjectURL(objectUrl);\n const receipt = this.controller.completeExecution(executionId);\n if (this.active === active) this.active = undefined;\n resolve({\n executionId,\n ...partial,\n completedActions: receipt.completedActions,\n ...(receipt.failedCall ? { failedCall: receipt.failedCall } : {}),\n });\n };\n\n active.cancel = () => {\n this.controller.cancelExecution(executionId);\n settle({\n ok: false,\n error: {\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled.\",\n },\n });\n };\n\n const timer = window.setTimeout(() => {\n this.controller.cancelExecution(executionId);\n settle({\n ok: false,\n error: {\n code: \"EXECUTION_TIMEOUT\",\n message: `Execution exceeded ${maxDurationMs}ms.`,\n },\n });\n }, maxDurationMs);\n\n worker.onmessage = async (event: MessageEvent<WorkerMessage>) => {\n const message = event.data;\n if (message.type === \"command\") {\n let response = await this.controller.execute(message.command);\n if (response.ok && response.value !== undefined) {\n try {\n response = {\n ...response,\n value: validateJSONValue(\n response.value,\n this.limits.maxResultChars,\n ),\n };\n } catch (error) {\n response = {\n ok: false,\n error: {\n code: \"RESULT_TOO_LARGE\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n if (!active.settled) {\n worker.postMessage({\n type: \"response\",\n requestId: message.requestId,\n response,\n });\n }\n return;\n }\n if (message.type === \"done\") {\n if (!message.hasValue) {\n settle({ ok: true });\n return;\n }\n try {\n settle({\n ok: true,\n value: validateJSONValue(\n message.value,\n this.limits.maxResultChars,\n ),\n });\n } catch (error) {\n settle({\n ok: false,\n error: {\n code: \"RESULT_INVALID\",\n message:\n error instanceof Error ? error.message : String(error),\n },\n });\n }\n return;\n }\n settle({ ok: false, error: message.error });\n };\n\n worker.onerror = (event) => {\n settle({\n ok: false,\n error: {\n code: \"WORKER_ERROR\",\n message: event.message || \"Worker execution failed.\",\n },\n });\n };\n });\n }\n\n cancel(): void {\n const active = this.active;\n if (!active || active.settled) return;\n active.cancel();\n }\n}\n"]}
1
+ {"version":3,"file":"worker-runner.js","sourceRoot":"","sources":["../../src/browser/worker-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { PageController } from \"./controller.js\";\nimport type {\n ExecutionLimits,\n ExecutionResult,\n JSONValue,\n PageCommand,\n SnapshotRegistry,\n} from \"./types.js\";\n\ninterface WorkerCommandMessage {\n type: \"command\";\n requestId: number;\n command: PageCommand;\n}\n\ninterface WorkerDoneMessage {\n type: \"done\";\n hasValue: boolean;\n value?: unknown;\n}\n\ninterface WorkerErrorMessage {\n type: \"error\";\n error: { code: string; message: string; statement?: string };\n}\n\ntype WorkerMessage =\n | WorkerCommandMessage\n | WorkerDoneMessage\n | WorkerErrorMessage;\n\nexport function createWorkerRuntimeSource(\n executionId: string,\n code: string,\n): string {\n return `\nconst executionId = ${JSON.stringify(executionId)};\nlet requestId = 0;\nlet commandSeq = 0;\nconst pending = new Map();\n\nself.onmessage = (event) => {\n const message = event.data;\n if (message.type !== \"response\") return;\n const entry = pending.get(message.requestId);\n if (!entry) return;\n pending.delete(message.requestId);\n if (message.response.ok) entry.resolve(message.response.value);\n else {\n const error = new Error(message.response.error?.message || \"Page command failed\");\n error.code = message.response.error?.code || \"PAGE_COMMAND_FAILED\";\n error.candidates = message.response.error?.candidates;\n entry.reject(error);\n }\n};\n\nfunction normalizeRPCValue(value) {\n if (value instanceof RegExp) {\n return { source: value.source, flags: value.flags };\n }\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n ) {\n return value;\n }\n if (Array.isArray(value)) return value.map(normalizeRPCValue);\n if (value && typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\"Page API arguments must be plain JSON values or RegExp.\");\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeRPCValue(item)])\n );\n }\n throw new Error(\"Page API arguments contain an unsupported value.\");\n}\n\nfunction normalizeResult(value, seen = new Set()) {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value))\n ) {\n return value;\n }\n if (Array.isArray(value)) {\n if (seen.has(value)) throw new Error(\"nxf_executeCode returned a cyclic value.\");\n seen.add(value);\n const result = value.map((item) => normalizeResult(item, seen));\n seen.delete(value);\n return result;\n }\n if (value && typeof value === \"object\") {\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new Error(\"nxf_executeCode must return JSON-serializable data.\");\n }\n if (seen.has(value)) throw new Error(\"nxf_executeCode returned a cyclic value.\");\n seen.add(value);\n const result = Object.fromEntries(\n Object.entries(value).map(([key, item]) => [key, normalizeResult(item, seen)])\n );\n seen.delete(value);\n return result;\n }\n throw new Error(\"nxf_executeCode must return JSON-serializable data.\");\n}\n\nfunction rpc(target, method, args) {\n if (pending.size > 0) {\n const error = new Error(\"Page API operations must be awaited sequentially.\");\n error.code = \"CONCURRENT_PAGE_OPERATION\";\n throw error;\n }\n const id = ++requestId;\n const command = {\n executionId,\n commandSeq: ++commandSeq,\n target: normalizeRPCValue(target),\n method,\n args: normalizeRPCValue(args)\n };\n self.postMessage({ type: \"command\", requestId: id, command });\n return new Promise((resolve, reject) =>\n pending.set(id, { resolve, reject })\n );\n}\n\nclass Locator {\n constructor(steps) { this.steps = steps; }\n getByRole(role, options = {}) {\n return new Locator([...this.steps, { kind: \"role\", role, options }]);\n }\n getByText(text, options = {}) {\n return new Locator([...this.steps, { kind: \"text\", text, options }]);\n }\n getByLabel(text, options = {}) {\n return new Locator([...this.steps, { kind: \"label\", text, options }]);\n }\n filter(options) {\n return new Locator([...this.steps, { kind: \"filter\", hasText: options.hasText }]);\n }\n call(method, ...args) {\n return rpc(\n { type: \"locator\", locator: { steps: this.steps } },\n method,\n args\n );\n }\n click() { return this.call(\"click\"); }\n fill(value) { return this.call(\"fill\", value); }\n press(key) { return this.call(\"press\", key); }\n check() { return this.call(\"check\"); }\n uncheck() { return this.call(\"uncheck\"); }\n selectOption(value) { return this.call(\"selectOption\", value); }\n hover() { return this.call(\"hover\"); }\n focus() { return this.call(\"focus\"); }\n blur() { return this.call(\"blur\"); }\n scrollBy(value) { return this.call(\"scrollBy\", value); }\n scrollTo(value) { return this.call(\"scrollTo\", value); }\n scrollIntoView() { return this.call(\"scrollIntoView\"); }\n exists() { return this.call(\"exists\"); }\n text() { return this.call(\"text\"); }\n waitFor(options = {}) { return this.call(\"waitFor\", options); }\n}\n\nconst uiTarget = Object.freeze({\n ref: (ref) => {\n if (typeof ref !== \"string\" || !/^@\\\\d+$/.test(ref)) {\n throw new Error(\"ui.ref(ref) requires a Snapshot ref such as @12.\");\n }\n return new LocatorProxy({ type: \"ref\", ref });\n },\n getByRole: (role, options = {}) =>\n new Locator([{ kind: \"role\", role, options }]),\n getByText: (text, options = {}) =>\n new Locator([{ kind: \"text\", text, options }]),\n getByLabel: (text, options = {}) =>\n new Locator([{ kind: \"label\", text, options }]),\n scrollBy: (value) => rpc({ type: \"page\" }, \"scrollBy\", [value]),\n waitForTimeout: (ms) => rpc({ type: \"page\" }, \"waitForTimeout\", [ms]),\n waitForURL: (url, options = {}) =>\n rpc({ type: \"page\" }, \"waitForURL\", [url, options])\n});\nconst ui = new Proxy(uiTarget, {\n get(target, property, receiver) {\n if (typeof property !== \"string\" || Object.hasOwn(target, property)) {\n return Reflect.get(target, property, receiver);\n }\n const error = new Error(\n 'UI API method \"' + property + '\" is not available. Supported methods: '\n + Object.keys(uiTarget).join(\", \") + \".\"\n );\n error.code = \"UI_API_NOT_AVAILABLE\";\n throw error;\n }\n});\n\nfunction LocatorProxy(target) {\n this.target = target;\n}\nLocatorProxy.prototype.call = function(method, ...args) {\n return rpc(this.target, method, args);\n};\nfor (const method of [\n \"click\",\n \"check\",\n \"uncheck\",\n \"hover\",\n \"focus\",\n \"blur\",\n \"scrollIntoView\",\n \"exists\",\n \"text\"\n]) {\n LocatorProxy.prototype[method] = function() {\n return this.call(method);\n };\n}\nLocatorProxy.prototype.fill = function(value) { return this.call(\"fill\", value); };\nLocatorProxy.prototype.press = function(key) { return this.call(\"press\", key); };\nLocatorProxy.prototype.selectOption = function(value) {\n return this.call(\"selectOption\", value);\n};\nLocatorProxy.prototype.scrollBy = function(value) {\n return this.call(\"scrollBy\", value);\n};\nLocatorProxy.prototype.scrollTo = function(value) {\n return this.call(\"scrollTo\", value);\n};\nLocatorProxy.prototype.waitFor = function(options = {}) {\n return this.call(\"waitFor\", options);\n};\n\n(async () => {\n try {\n const rawResult = await (async () => {\n${code}\n })();\n if (pending.size > 0) {\n const error = new Error(\"Every Page API operation must be awaited before nxf_executeCode returns.\");\n error.code = \"UNAWAITED_PAGE_OPERATION\";\n throw error;\n }\n const hasValue = rawResult !== undefined;\n const value = hasValue ? normalizeResult(rawResult) : undefined;\n self.postMessage({ type: \"done\", hasValue, value });\n } catch (error) {\n self.postMessage({\n type: \"error\",\n error: {\n code: error?.code || \"CODE_EXECUTION_FAILED\",\n message: error?.message || String(error),\n statement: error?.statement || error?.stack?.split(\"\\\\n\")[1]?.trim()\n }\n });\n }\n})();`;\n}\n\nfunction validateJSONValue(\n value: unknown,\n maxChars: number,\n): JSONValue {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) {\n throw new Error(\"nxf_executeCode returned a non-JSON value.\");\n }\n if (serialized.length > maxChars) {\n throw new Error(\n `nxf_executeCode result exceeds ${maxChars} serialized characters.`,\n );\n }\n return JSON.parse(serialized) as JSONValue;\n}\n\nexport class WorkerRunner {\n private active:\n | {\n executionId: string;\n worker: Worker;\n objectUrl: string;\n settled: boolean;\n cancel: () => void;\n }\n | undefined;\n\n constructor(\n private readonly controller: PageController,\n private readonly limits: ExecutionLimits,\n ) {}\n\n async execute(\n code: string,\n registry: SnapshotRegistry,\n maxDurationMs = this.limits.maxDurationMs,\n ): Promise<ExecutionResult> {\n if (code.length > this.limits.maxCodeLength) {\n return {\n executionId: \"rejected\",\n ok: false,\n completedActions: [],\n error: {\n code: \"CODE_TOO_LONG\",\n message: `Code exceeds ${this.limits.maxCodeLength} characters.`,\n },\n };\n }\n\n if (this.active && !this.active.settled) {\n return {\n executionId: \"rejected\",\n ok: false,\n completedActions: [],\n error: {\n code: \"EXECUTION_IN_PROGRESS\",\n message: \"Another nxf_executeCode call is still running.\",\n },\n };\n }\n\n const executionId = crypto.randomUUID();\n const source = createWorkerRuntimeSource(executionId, code);\n const blob = new Blob([source], {\n type: \"text/javascript\",\n });\n const objectUrl = URL.createObjectURL(blob);\n const worker = new Worker(objectUrl, {\n name: `nexface-${executionId}`,\n });\n this.controller.beginExecution(executionId, registry);\n\n return new Promise<ExecutionResult>((resolve) => {\n const active: NonNullable<WorkerRunner[\"active\"]> = {\n executionId,\n worker,\n objectUrl,\n settled: false,\n cancel: () => {},\n };\n this.active = active;\n\n const settle = (\n partial: Omit<\n ExecutionResult,\n \"executionId\" | \"completedActions\" | \"failedCall\"\n >,\n ): void => {\n if (active.settled) return;\n active.settled = true;\n window.clearTimeout(timer);\n worker.terminate();\n URL.revokeObjectURL(objectUrl);\n const receipt = this.controller.completeExecution(executionId);\n if (this.active === active) this.active = undefined;\n resolve({\n executionId,\n ...partial,\n completedActions: receipt.completedActions,\n ...(receipt.failedCall ? { failedCall: receipt.failedCall } : {}),\n });\n };\n\n active.cancel = () => {\n this.controller.cancelExecution(executionId);\n settle({\n ok: false,\n error: {\n code: \"EXECUTION_CANCELLED\",\n message: \"Execution was cancelled.\",\n },\n });\n };\n\n const timer = window.setTimeout(() => {\n this.controller.cancelExecution(executionId);\n settle({\n ok: false,\n error: {\n code: \"EXECUTION_TIMEOUT\",\n message: `Execution exceeded ${maxDurationMs}ms.`,\n },\n });\n }, maxDurationMs);\n\n worker.onmessage = async (event: MessageEvent<WorkerMessage>) => {\n const message = event.data;\n if (message.type === \"command\") {\n let response = await this.controller.execute(message.command);\n if (response.ok && response.value !== undefined) {\n try {\n response = {\n ...response,\n value: validateJSONValue(\n response.value,\n this.limits.maxResultChars,\n ),\n };\n } catch (error) {\n response = {\n ok: false,\n error: {\n code: \"RESULT_TOO_LARGE\",\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n if (!active.settled) {\n worker.postMessage({\n type: \"response\",\n requestId: message.requestId,\n response,\n });\n }\n return;\n }\n if (message.type === \"done\") {\n if (!message.hasValue) {\n settle({ ok: true });\n return;\n }\n try {\n settle({\n ok: true,\n value: validateJSONValue(\n message.value,\n this.limits.maxResultChars,\n ),\n });\n } catch (error) {\n settle({\n ok: false,\n error: {\n code: \"RESULT_INVALID\",\n message:\n error instanceof Error ? error.message : String(error),\n },\n });\n }\n return;\n }\n settle({ ok: false, error: message.error });\n };\n\n worker.onerror = (event) => {\n settle({\n ok: false,\n error: {\n code: \"WORKER_ERROR\",\n message: event.message || \"Worker execution failed.\",\n },\n });\n };\n });\n }\n\n cancel(): void {\n const active = this.active;\n if (!active || active.settled) return;\n active.cancel();\n }\n}\n"]}
@@ -10,10 +10,15 @@ const reservedContextNames = new Set([
10
10
  "finish",
11
11
  "getSnapshot",
12
12
  "executeCode",
13
+ "nxf_callAppTool",
14
+ "nxf_finish",
15
+ "nxf_getSnapshot",
16
+ "nxf_executeCode",
13
17
  ]);
14
18
  const reservedToolNames = new Set([
15
19
  ...reservedContextNames,
16
20
  "loadSkill",
21
+ "nxf_loadSkill",
17
22
  "beginOperation",
18
23
  "endOperation",
19
24
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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","sourcesContent":["import { assertAgentToolInputSchema } from \"./schema.js\";\nimport type {\n AgentToolDefinition,\n AgentToolInputSchema,\n InferJsonSchema,\n} from \"./types.js\";\n\nconst emptyInputSchema: AgentToolInputSchema = Object.freeze({\n type: \"object\",\n properties: Object.freeze({}),\n additionalProperties: false,\n});\n\ninterface AgentToolMetadataInput {\n name: string;\n description: string;\n effect?: \"read\" | \"action\" | \"navigate\";\n}\n\nconst agentNamePattern = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst reservedContextNames = new Set([\n \"callAppTool\",\n \"finish\",\n \"getSnapshot\",\n \"executeCode\",\n]);\n\nconst reservedToolNames = new Set([\n ...reservedContextNames,\n \"loadSkill\",\n \"beginOperation\",\n \"endOperation\",\n]);\n\nexport function isValidAgentContextName(name: string): boolean {\n return agentNamePattern.test(name) && !reservedContextNames.has(name);\n}\n\nfunction assertName(name: string): void {\n if (!agentNamePattern.test(name) || reservedToolNames.has(name)) {\n throw new Error(`Invalid or reserved agent tool name: ${name}.`);\n }\n}\n\nfunction assertSystemName(name: string): void {\n if (!agentNamePattern.test(name)) {\n throw new Error(`Invalid system agent tool name: ${name}.`);\n }\n}\n\nfunction normalizeEffect(\n effect: AgentToolMetadataInput[\"effect\"],\n): \"read\" | \"action\" | \"navigate\" {\n const normalized = effect ?? \"action\";\n if (![\"read\", \"action\", \"navigate\"].includes(normalized)) {\n throw new Error(`Invalid agent tool effect: ${String(effect)}.`);\n }\n return normalized;\n}\n\nexport function defineAgentTool<TResult = unknown>(\n metadata: AgentToolMetadataInput,\n): AgentToolDefinition<Record<string, never>, TResult>;\nexport function defineAgentTool<\n TInput = never,\n TResult = unknown,\n const TSchema extends AgentToolInputSchema = AgentToolInputSchema,\n>(\n metadata: AgentToolMetadataInput & { inputSchema: TSchema },\n): AgentToolDefinition<\n [TInput] extends [never] ? InferJsonSchema<TSchema> : TInput,\n TResult\n>;\nexport function defineAgentTool(\n metadata: AgentToolMetadataInput & { inputSchema?: AgentToolInputSchema },\n): AgentToolDefinition {\n assertName(metadata.name);\n if (!metadata.description.trim()) throw new Error(\"Tool description is required.\");\n const inputSchema = metadata.inputSchema === undefined ? emptyInputSchema : metadata.inputSchema;\n if (inputSchema?.type !== \"object\") {\n throw new TypeError(`Tool inputSchema root type must be object. Tool \"${metadata.name}\".inputSchema.type is invalid.`);\n }\n assertAgentToolInputSchema(inputSchema, `Tool \"${metadata.name}\".inputSchema`);\n return freezeAgentToolDefinition({\n ...metadata,\n inputSchema,\n effect: normalizeEffect(metadata.effect),\n });\n}\n\nexport function defineSystemAgentTool<TInput, TResult>(\n metadata: AgentToolMetadataInput & { inputSchema: AgentToolInputSchema },\n): AgentToolDefinition<TInput, TResult> {\n assertSystemName(metadata.name);\n if (!metadata.description.trim()) {\n throw new Error(\"Tool description is required.\");\n }\n if (metadata.inputSchema?.type !== \"object\") {\n throw new TypeError(`Tool inputSchema root type must be object. Tool \"${metadata.name}\".inputSchema.type is invalid.`);\n }\n assertAgentToolInputSchema(metadata.inputSchema, `Tool \"${metadata.name}\".inputSchema`);\n return freezeAgentToolDefinition({\n ...metadata,\n effect: normalizeEffect(metadata.effect),\n });\n}\n\nfunction cloneAndFreeze<T>(value: T): T {\n if (Array.isArray(value)) {\n return Object.freeze(value.map(cloneAndFreeze)) as T;\n }\n if (value && typeof value === \"object\") {\n return Object.freeze(Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n cloneAndFreeze(item),\n ]),\n )) as T;\n }\n return value;\n}\n\nfunction freezeAgentToolDefinition<\n TInput,\n TResult,\n>(\n definition: AgentToolDefinition<TInput, TResult>,\n): AgentToolDefinition<TInput, TResult> {\n return Object.freeze({\n name: definition.name,\n description: definition.description,\n inputSchema: cloneAndFreeze(definition.inputSchema),\n effect: definition.effect,\n });\n}\n"]}
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"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","sourcesContent":["import { assertAgentToolInputSchema } from \"./schema.js\";\nimport type {\n AgentToolDefinition,\n AgentToolInputSchema,\n InferJsonSchema,\n} from \"./types.js\";\n\nconst emptyInputSchema: AgentToolInputSchema = Object.freeze({\n type: \"object\",\n properties: Object.freeze({}),\n additionalProperties: false,\n});\n\ninterface AgentToolMetadataInput {\n name: string;\n description: string;\n effect?: \"read\" | \"action\" | \"navigate\";\n}\n\nconst agentNamePattern = /^[A-Za-z0-9_-]{1,64}$/;\n\nconst reservedContextNames = new Set([\n \"callAppTool\",\n \"finish\",\n \"getSnapshot\",\n \"executeCode\",\n \"nxf_callAppTool\",\n \"nxf_finish\",\n \"nxf_getSnapshot\",\n \"nxf_executeCode\",\n]);\n\nconst reservedToolNames = new Set([\n ...reservedContextNames,\n \"loadSkill\",\n \"nxf_loadSkill\",\n \"beginOperation\",\n \"endOperation\",\n]);\n\nexport function isValidAgentContextName(name: string): boolean {\n return agentNamePattern.test(name) && !reservedContextNames.has(name);\n}\n\nfunction assertName(name: string): void {\n if (!agentNamePattern.test(name) || reservedToolNames.has(name)) {\n throw new Error(`Invalid or reserved agent tool name: ${name}.`);\n }\n}\n\nfunction assertSystemName(name: string): void {\n if (!agentNamePattern.test(name)) {\n throw new Error(`Invalid system agent tool name: ${name}.`);\n }\n}\n\nfunction normalizeEffect(\n effect: AgentToolMetadataInput[\"effect\"],\n): \"read\" | \"action\" | \"navigate\" {\n const normalized = effect ?? \"action\";\n if (![\"read\", \"action\", \"navigate\"].includes(normalized)) {\n throw new Error(`Invalid agent tool effect: ${String(effect)}.`);\n }\n return normalized;\n}\n\nexport function defineAgentTool<TResult = unknown>(\n metadata: AgentToolMetadataInput,\n): AgentToolDefinition<Record<string, never>, TResult>;\nexport function defineAgentTool<\n TInput = never,\n TResult = unknown,\n const TSchema extends AgentToolInputSchema = AgentToolInputSchema,\n>(\n metadata: AgentToolMetadataInput & { inputSchema: TSchema },\n): AgentToolDefinition<\n [TInput] extends [never] ? InferJsonSchema<TSchema> : TInput,\n TResult\n>;\nexport function defineAgentTool(\n metadata: AgentToolMetadataInput & { inputSchema?: AgentToolInputSchema },\n): AgentToolDefinition {\n assertName(metadata.name);\n if (!metadata.description.trim()) throw new Error(\"Tool description is required.\");\n const inputSchema = metadata.inputSchema === undefined ? emptyInputSchema : metadata.inputSchema;\n if (inputSchema?.type !== \"object\") {\n throw new TypeError(`Tool inputSchema root type must be object. Tool \"${metadata.name}\".inputSchema.type is invalid.`);\n }\n assertAgentToolInputSchema(inputSchema, `Tool \"${metadata.name}\".inputSchema`);\n return freezeAgentToolDefinition({\n ...metadata,\n inputSchema,\n effect: normalizeEffect(metadata.effect),\n });\n}\n\nexport function defineSystemAgentTool<TInput, TResult>(\n metadata: AgentToolMetadataInput & { inputSchema: AgentToolInputSchema },\n): AgentToolDefinition<TInput, TResult> {\n assertSystemName(metadata.name);\n if (!metadata.description.trim()) {\n throw new Error(\"Tool description is required.\");\n }\n if (metadata.inputSchema?.type !== \"object\") {\n throw new TypeError(`Tool inputSchema root type must be object. Tool \"${metadata.name}\".inputSchema.type is invalid.`);\n }\n assertAgentToolInputSchema(metadata.inputSchema, `Tool \"${metadata.name}\".inputSchema`);\n return freezeAgentToolDefinition({\n ...metadata,\n effect: normalizeEffect(metadata.effect),\n });\n}\n\nfunction cloneAndFreeze<T>(value: T): T {\n if (Array.isArray(value)) {\n return Object.freeze(value.map(cloneAndFreeze)) as T;\n }\n if (value && typeof value === \"object\") {\n return Object.freeze(Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n cloneAndFreeze(item),\n ]),\n )) as T;\n }\n return value;\n}\n\nfunction freezeAgentToolDefinition<\n TInput,\n TResult,\n>(\n definition: AgentToolDefinition<TInput, TResult>,\n): AgentToolDefinition<TInput, TResult> {\n return Object.freeze({\n name: definition.name,\n description: definition.description,\n inputSchema: cloneAndFreeze(definition.inputSchema),\n effect: definition.effect,\n });\n}\n"]}
@@ -4,7 +4,7 @@ import { SparkleIcon as Sparkle } from "@phosphor-icons/react/Sparkle";
4
4
  import { useLayoutEffect, useEffect, useId, useRef, useState } from "react";
5
5
  import { createPortal } from "react-dom";
6
6
  import { lockOperationSurface } from "./operation-lock.js";
7
- const BROWSER_TOOL_NAMES = new Set(["getSnapshot", "executeCode"]);
7
+ const BROWSER_TOOL_NAMES = new Set(["nxf_getSnapshot", "nxf_executeCode"]);
8
8
  const POINTER_EXIT_DURATION_MS = 120;
9
9
  const POINTER_CLICK_FEEDBACK_DURATION_MS = 720;
10
10
  const CONTROLLER_EXIT_DURATION_MS = 300;
@@ -1 +1 @@
1
- {"version":3,"file":"operation-view.js","sourceRoot":"","sources":["../src/operation-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import { CursorIcon as Cursor } from \"@phosphor-icons/react/Cursor\";\nimport { SparkleIcon as Sparkle } from \"@phosphor-icons/react/Sparkle\";\nimport { useLayoutEffect, useEffect, useId, useRef, useState, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { AgentOperation, AgentOperationProgressEntry, AgentOperationTarget } from \"./operation-types.js\";\n\nimport { lockOperationSurface } from \"./operation-lock.js\";\n\nconst BROWSER_TOOL_NAMES = new Set([\"getSnapshot\", \"executeCode\"]);\nconst POINTER_EXIT_DURATION_MS = 120;\nconst POINTER_CLICK_FEEDBACK_DURATION_MS = 720;\nconst CONTROLLER_EXIT_DURATION_MS = 300;\n\ninterface PointerPosition {\n left: number;\n top: number;\n}\n\ntype PointerPhase = \"hidden\" | \"resting\" | \"moving\";\n\ninterface PointerMotion {\n durationMs: number;\n phase: PointerPhase;\n position: PointerPosition;\n revision: number;\n toolCallId: string;\n}\n\nfunction operationProgressLabel(operation: AgentOperation): string {\n const progressLabel = operation.progressLabel?.trim().replace(/\\s+/g, \" \");\n if (progressLabel) return progressLabel.slice(0, 48);\n return BROWSER_TOOL_NAMES.has(operation.name)\n ? \"正在浏览网页\"\n : \"正在处理你的请求\";\n}\n\nfunction operationEffect(operation: AgentOperation): \"read\" | \"action\" | \"navigate\" | \"processing\" {\n return operation.effect ?? \"action\";\n}\n\nfunction normalizedLabel(label: string | undefined): string | undefined {\n const normalized = label?.trim().replace(/\\s+/g, \" \");\n return normalized || undefined;\n}\n\nfunction operationTargetLabel(\n operation: AgentOperation,\n target: AgentOperationTarget | undefined,\n): string | undefined {\n const label = target?.label;\n if (!label || label === operation.name) return undefined;\n const rawNamePrefix = `${operation.name} · `;\n return label.startsWith(rawNamePrefix) ? label.slice(rawNamePrefix.length) : label;\n}\n\nfunction pointerMoveDuration(from: PointerPosition, to: PointerPosition): number {\n const distance = Math.hypot(to.left - from.left, to.top - from.top);\n if (distance < 2) return 0;\n return Math.round(Math.min(360, Math.max(180, 180 + distance * 0.18)));\n}\n\nfunction pointerReachedTarget(element: HTMLElement, target: PointerPosition): boolean {\n const rect = element.getBoundingClientRect();\n return Math.hypot(rect.left - target.left, rect.top - target.top) < 2;\n}\n\ninterface AgentPointerProps {\n active: boolean;\n initialPosition: PointerPosition | undefined;\n label: string;\n labelActive: boolean;\n operation: AgentOperation;\n targetElement: HTMLElement | undefined;\n targetPosition: PointerPosition | undefined;\n visible: boolean;\n}\n\nfunction AgentPointer({ active, initialPosition, label, labelActive, operation, targetElement, targetPosition, visible }: AgentPointerProps) {\n const pointerRef = useRef<HTMLDivElement>(null);\n const activeOperationRef = useRef<string | undefined>(undefined);\n const activeTargetRef = useRef<HTMLElement | undefined>(undefined);\n const exitTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const feedbackTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const motionRevisionRef = useRef(0);\n const latestActiveRef = useRef(active);\n const latestOperationRef = useRef(operation);\n const [motion, setMotion] = useState<PointerMotion>();\n latestActiveRef.current = active;\n latestOperationRef.current = operation;\n\n const clearExitTimer = () => {\n if (!exitTimerRef.current) return;\n clearTimeout(exitTimerRef.current);\n exitTimerRef.current = undefined;\n };\n const clearFeedbackTimer = () => {\n if (!feedbackTimerRef.current) return;\n clearTimeout(feedbackTimerRef.current);\n feedbackTimerRef.current = undefined;\n };\n const beginFeedback = (revision: number, toolCallId: string) => {\n const latestOperation = latestOperationRef.current;\n if (!latestActiveRef.current\n || motionRevisionRef.current !== revision\n || latestOperation.toolCallId !== toolCallId) return;\n setMotion((current) => current?.revision === revision\n ? { ...current, phase: \"resting\" }\n : current);\n };\n\n useEffect(() => () => {\n clearExitTimer();\n clearFeedbackTimer();\n }, []);\n\n useEffect(() => {\n if (!visible || !initialPosition) {\n if (!motion || motion.phase === \"hidden\") return;\n activeOperationRef.current = undefined;\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n const revision = ++motionRevisionRef.current;\n setMotion((current) => current\n ? { ...current, durationMs: POINTER_EXIT_DURATION_MS, phase: \"hidden\", revision }\n : current);\n clearExitTimer();\n exitTimerRef.current = setTimeout(() => {\n if (motionRevisionRef.current === revision) setMotion(undefined);\n }, POINTER_EXIT_DURATION_MS);\n return;\n }\n\n clearExitTimer();\n if (!motion) {\n activeOperationRef.current = operation.toolCallId;\n activeTargetRef.current = undefined;\n const revision = ++motionRevisionRef.current;\n setMotion({\n durationMs: 0,\n phase: \"resting\",\n position: initialPosition,\n revision,\n toolCallId: operation.toolCallId,\n });\n return;\n }\n\n if (!active) {\n activeOperationRef.current = undefined;\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n if (motion.phase !== \"resting\") {\n const revision = ++motionRevisionRef.current;\n setMotion((current) => current\n ? { ...current, phase: \"resting\", revision }\n : current);\n }\n return;\n }\n\n const operationChanged = activeOperationRef.current !== operation.toolCallId;\n if (operationChanged) {\n activeOperationRef.current = operation.toolCallId;\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n } else if (motion.phase === \"hidden\") {\n setMotion((current) => current\n ? { ...current, durationMs: 0, phase: \"resting\" }\n : current);\n }\n\n if (!targetElement || !targetPosition) {\n if (operationChanged || activeTargetRef.current) {\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n const revision = ++motionRevisionRef.current;\n const pointerRect = pointerRef.current?.getBoundingClientRect();\n setMotion((current) => current\n ? {\n ...current,\n durationMs: 0,\n phase: \"resting\",\n position: operationChanged ? initialPosition : pointerRect\n ? { left: pointerRect.left, top: pointerRect.top }\n : current.position,\n revision,\n toolCallId: operation.toolCallId,\n }\n : current);\n }\n return;\n }\n const targetChanged = operationChanged || activeTargetRef.current !== targetElement;\n if (!targetChanged) {\n if (motion.position.left === targetPosition.left && motion.position.top === targetPosition.top) return;\n setMotion((current) => current\n ? { ...current, durationMs: 180, position: targetPosition }\n : current);\n return;\n }\n\n activeTargetRef.current = targetElement;\n clearFeedbackTimer();\n const revision = ++motionRevisionRef.current;\n const pointerRect = pointerRef.current?.getBoundingClientRect();\n const currentPosition = pointerRect\n ? { left: pointerRect.left, top: pointerRect.top }\n : motion.position;\n const prefersReducedMotion = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n const durationMs = prefersReducedMotion ? 0 : pointerMoveDuration(currentPosition, targetPosition);\n setMotion((current) => current\n ? {\n ...current,\n durationMs,\n phase: \"moving\",\n position: targetPosition,\n revision,\n toolCallId: operation.toolCallId,\n }\n : current);\n if (durationMs === 0) beginFeedback(revision, operation.toolCallId);\n else {\n // A first-frame position update may not dispatch transitionend.\n feedbackTimerRef.current = setTimeout(() => beginFeedback(revision, operation.toolCallId), durationMs + 50);\n }\n }, [\n active,\n initialPosition?.left,\n initialPosition?.top,\n motion,\n operation.toolCallId,\n targetElement,\n targetPosition?.left,\n targetPosition?.top,\n visible,\n ]);\n\n if (!motion) return null;\n const effect = operationEffect(operation);\n const activeEffect = active ? effect : undefined;\n return (\n <div\n aria-hidden\n className=\"agent-operation__pointer-effect\"\n data-active={active ? \"true\" : \"false\"}\n data-operation-effect={activeEffect}\n data-phase={motion.phase}\n onTransitionEnd={(event) => {\n if (event.currentTarget !== event.target\n || event.propertyName !== \"transform\"\n || motion.phase !== \"moving\"\n || !pointerReachedTarget(event.currentTarget, motion.position)) return;\n beginFeedback(motion.revision, motion.toolCallId);\n }}\n ref={pointerRef}\n style={{\n \"--agent-operation-pointer-duration\": `${motion.durationMs}ms`,\n \"--agent-operation-pointer-x\": `${motion.position.left}px`,\n \"--agent-operation-pointer-y\": `${motion.position.top}px`,\n \"--agent-operation-ripple-duration\": `${POINTER_CLICK_FEEDBACK_DURATION_MS}ms`,\n } as CSSProperties}\n >\n {active && visible && motion.toolCallId === operation.toolCallId && effect === \"action\" && motion.phase !== \"hidden\" ? (\n <>\n <span className=\"agent-operation__pointer-ripple agent-operation__pointer-ripple--primary\" key={`primary-${motion.revision}`} />\n <span className=\"agent-operation__pointer-cursor\">\n <Cursor className=\"agent-operation__pointer\" size={24} weight=\"fill\" />\n </span>\n </>\n ) : null}\n {active && motion.phase !== \"hidden\" && (labelActive || effect !== \"action\") ? (\n <span className={labelActive ? \"agent-operation__pointer-label\" : \"agent-operation__pointer-indicator\"} data-operation-effect={activeEffect} title={labelActive ? label : undefined}>\n {activeEffect === \"processing\" ? <span className=\"agent-operation__pointer-processing\" /> : null}\n {activeEffect === \"read\" ? (\n <span className=\"agent-operation__pointer-read-scan\">\n <i />\n <i />\n <i />\n <i />\n <i />\n </span>\n ) : null}\n {activeEffect === \"navigate\" ? <span className=\"agent-operation__pointer-navigation-trail\" /> : null}\n {labelActive ? <span className=\"agent-operation__pointer-label-text\">{label}</span> : null}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport interface OperationOverlayViewProps {\n fallbackPosition?: PointerPosition;\n feedbackActive?: boolean;\n labelActive?: boolean;\n operation?: AgentOperation;\n progressHistory?: readonly AgentOperationProgressEntry[];\n running: boolean;\n humanHasControl?: boolean;\n cancelling?: boolean;\n onCancel?(): void;\n resolveSurface?(): HTMLElement | undefined;\n resolveTarget?(operation: AgentOperation): AgentOperationTarget | undefined;\n}\n\nexport function OperationOverlayView({ operation, progressHistory = [], running, feedbackActive = running, labelActive = feedbackActive, humanHasControl = false, cancelling = false, onCancel, resolveSurface, resolveTarget, fallbackPosition }: OperationOverlayViewProps) {\n const [, setGeometry] = useState(\"\");\n useLayoutEffect(() => {\n const rect = resolveSurface?.()?.getBoundingClientRect();\n if (rect) setGeometry([rect.left, rect.top, rect.width, rect.height].join(\",\"));\n }, [resolveSurface]);\n const [historyOpen, setHistoryOpen] = useState(false);\n const historyId = useId();\n const clearTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n const controllerTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [visibleOperation, setVisibleOperation] = useState(operation);\n const [controllerMounted, setControllerMounted] = useState(Boolean(operation\n && operation.status !== \"cancelled\"\n && (running || humanHasControl || operation.status === \"failed\")));\n const [controllerExiting, setControllerExiting] = useState(false);\n useLayoutEffect(() => {\n if (clearTimerRef.current) clearTimeout(clearTimerRef.current);\n if (operation) setVisibleOperation(operation);\n if (operation?.status === \"cancelled\") {\n clearTimerRef.current = setTimeout(() => setVisibleOperation(undefined), 600);\n }\n return () => { if (clearTimerRef.current) clearTimeout(clearTimerRef.current); };\n }, [operation, running]);\n useEffect(() => {\n if ((!running && !feedbackActive && !humanHasControl) || !visibleOperation || visibleOperation.status === \"cancelled\") return;\n let frame = requestAnimationFrame(function update() {\n const surface = resolveSurface?.();\n const target = resolveTarget?.(visibleOperation)?.element;\n const geometry = [surface, target].map((element) => {\n if (!element?.isConnected) return \"\";\n const rect = element.getBoundingClientRect();\n return [rect.left, rect.top, rect.width, rect.height].join(\",\");\n }).join(\";\");\n setGeometry(geometry);\n frame = requestAnimationFrame(update);\n });\n return () => cancelAnimationFrame(frame);\n }, [visibleOperation?.toolCallId, visibleOperation?.status, running, feedbackActive, humanHasControl, resolveSurface, resolveTarget]);\n useEffect(() => {\n if (progressHistory.length === 0) setHistoryOpen(false);\n }, [progressHistory.length]);\n const controllerShouldBeVisible = Boolean(visibleOperation\n && visibleOperation.status !== \"cancelled\"\n && (running || humanHasControl || visibleOperation.status === \"failed\"));\n useEffect(() => {\n if (controllerTimerRef.current) clearTimeout(controllerTimerRef.current);\n if (controllerShouldBeVisible) {\n setControllerMounted(true);\n setControllerExiting(false);\n return;\n }\n if (!controllerMounted) {\n setControllerExiting(false);\n return;\n }\n setHistoryOpen(false);\n setControllerExiting(true);\n controllerTimerRef.current = setTimeout(() => {\n setControllerMounted(false);\n setControllerExiting(false);\n }, CONTROLLER_EXIT_DURATION_MS);\n return () => {\n if (controllerTimerRef.current) clearTimeout(controllerTimerRef.current);\n };\n }, [controllerMounted, controllerShouldBeVisible]);\n useLayoutEffect(() => {\n const surface = resolveSurface?.();\n if (!surface || !running || humanHasControl) return;\n return lockOperationSurface(surface, () => cancelButtonRef.current?.focus());\n }, [humanHasControl, resolveSurface, running]);\n if (!visibleOperation || typeof document === \"undefined\") return null;\n const resolvedTarget = resolveTarget?.(visibleOperation);\n const surfaceElement = resolveSurface?.();\n const target = resolvedTarget && (!surfaceElement || surfaceElement.contains(resolvedTarget.element))\n ? resolvedTarget\n : undefined;\n const progressLabel = operationProgressLabel(visibleOperation);\n const effect = operationEffect(visibleOperation);\n const targetLabel = operationTargetLabel(visibleOperation, target);\n const pointerLabel = normalizedLabel(visibleOperation.progressLabel) ?? targetLabel ?? progressLabel;\n const controllerLabel = humanHasControl ? undefined : progressLabel;\n const statusLabel = humanHasControl ? \"等待你完成操作\" : {\n running: \"Agent 正在控制\",\n completed: running ? \"工具已完成,任务继续中\" : \"操作已完成\",\n failed: running ? \"Agent 正在处理错误\" : \"操作失败\",\n cancelled: \"任务已终止\",\n }[visibleOperation.status];\n const compactStatusLabel = humanHasControl\n ? \"等待你完成操作\"\n : progressLabel;\n const rect = target?.element.isConnected ? target.element.getBoundingClientRect() : undefined;\n const highlightedRect = effect === \"navigate\" ? undefined : rect;\n const surfaceRect = surfaceElement?.isConnected ? surfaceElement.getBoundingClientRect() : undefined;\n const agentControlsSurface = running && !humanHasControl;\n const operationFeedbackActive = feedbackActive && !humanHasControl && visibleOperation.status !== \"cancelled\";\n const pointerVisible = Boolean(surfaceRect) && feedbackActive && !humanHasControl && visibleOperation.status !== \"cancelled\";\n const pointerPosition = rect ? {\n left: rect.left + rect.width / 2,\n top: rect.top + rect.height / 2,\n } : undefined;\n const cancel = onCancel ? () => {\n onCancel();\n } : undefined;\n return createPortal(\n <div className=\"agent-operation\" data-nexface-ignore data-feedback-active={feedbackActive} data-human-control={humanHasControl} data-operation-effect={effect} data-run-active={running} data-status={visibleOperation.status}>\n {agentControlsSurface && surfaceRect ? <div aria-hidden className=\"agent-operation__surface\" style={{\n ...(highlightedRect ? {\n \"--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`,\n \"--agent-operation-cutout-width\": `${highlightedRect.width}px`,\n } : {}),\n height: surfaceRect.height, left: surfaceRect.left, top: surfaceRect.top, width: surfaceRect.width,\n } as CSSProperties} /> : null}\n {operationFeedbackActive && 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\n active={operationFeedbackActive}\n initialPosition={pointerPosition ?? fallbackPosition ?? (surfaceRect ? { left: surfaceRect.left + surfaceRect.width / 2, top: surfaceRect.top + surfaceRect.height / 2 } : undefined)}\n label={pointerLabel}\n labelActive={labelActive}\n operation={visibleOperation}\n targetElement={target?.element}\n targetPosition={pointerPosition}\n visible={pointerVisible}\n />\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) && visibleOperation.status !== \"cancelled\" ? <span className=\"agent-operation__compact-status\" title={compactStatusLabel}>{compactStatusLabel}</span> : null}\n {cancel && (running || humanHasControl) && visibleOperation.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"]}
1
+ {"version":3,"file":"operation-view.js","sourceRoot":"","sources":["../src/operation-view.tsx"],"names":[],"mappings":"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","sourcesContent":["import { CursorIcon as Cursor } from \"@phosphor-icons/react/Cursor\";\nimport { SparkleIcon as Sparkle } from \"@phosphor-icons/react/Sparkle\";\nimport { useLayoutEffect, useEffect, useId, useRef, useState, type CSSProperties } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { AgentOperation, AgentOperationProgressEntry, AgentOperationTarget } from \"./operation-types.js\";\n\nimport { lockOperationSurface } from \"./operation-lock.js\";\n\nconst BROWSER_TOOL_NAMES = new Set([\"nxf_getSnapshot\", \"nxf_executeCode\"]);\nconst POINTER_EXIT_DURATION_MS = 120;\nconst POINTER_CLICK_FEEDBACK_DURATION_MS = 720;\nconst CONTROLLER_EXIT_DURATION_MS = 300;\n\ninterface PointerPosition {\n left: number;\n top: number;\n}\n\ntype PointerPhase = \"hidden\" | \"resting\" | \"moving\";\n\ninterface PointerMotion {\n durationMs: number;\n phase: PointerPhase;\n position: PointerPosition;\n revision: number;\n toolCallId: string;\n}\n\nfunction operationProgressLabel(operation: AgentOperation): string {\n const progressLabel = operation.progressLabel?.trim().replace(/\\s+/g, \" \");\n if (progressLabel) return progressLabel.slice(0, 48);\n return BROWSER_TOOL_NAMES.has(operation.name)\n ? \"正在浏览网页\"\n : \"正在处理你的请求\";\n}\n\nfunction operationEffect(operation: AgentOperation): \"read\" | \"action\" | \"navigate\" | \"processing\" {\n return operation.effect ?? \"action\";\n}\n\nfunction normalizedLabel(label: string | undefined): string | undefined {\n const normalized = label?.trim().replace(/\\s+/g, \" \");\n return normalized || undefined;\n}\n\nfunction operationTargetLabel(\n operation: AgentOperation,\n target: AgentOperationTarget | undefined,\n): string | undefined {\n const label = target?.label;\n if (!label || label === operation.name) return undefined;\n const rawNamePrefix = `${operation.name} · `;\n return label.startsWith(rawNamePrefix) ? label.slice(rawNamePrefix.length) : label;\n}\n\nfunction pointerMoveDuration(from: PointerPosition, to: PointerPosition): number {\n const distance = Math.hypot(to.left - from.left, to.top - from.top);\n if (distance < 2) return 0;\n return Math.round(Math.min(360, Math.max(180, 180 + distance * 0.18)));\n}\n\nfunction pointerReachedTarget(element: HTMLElement, target: PointerPosition): boolean {\n const rect = element.getBoundingClientRect();\n return Math.hypot(rect.left - target.left, rect.top - target.top) < 2;\n}\n\ninterface AgentPointerProps {\n active: boolean;\n initialPosition: PointerPosition | undefined;\n label: string;\n labelActive: boolean;\n operation: AgentOperation;\n targetElement: HTMLElement | undefined;\n targetPosition: PointerPosition | undefined;\n visible: boolean;\n}\n\nfunction AgentPointer({ active, initialPosition, label, labelActive, operation, targetElement, targetPosition, visible }: AgentPointerProps) {\n const pointerRef = useRef<HTMLDivElement>(null);\n const activeOperationRef = useRef<string | undefined>(undefined);\n const activeTargetRef = useRef<HTMLElement | undefined>(undefined);\n const exitTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const feedbackTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const motionRevisionRef = useRef(0);\n const latestActiveRef = useRef(active);\n const latestOperationRef = useRef(operation);\n const [motion, setMotion] = useState<PointerMotion>();\n latestActiveRef.current = active;\n latestOperationRef.current = operation;\n\n const clearExitTimer = () => {\n if (!exitTimerRef.current) return;\n clearTimeout(exitTimerRef.current);\n exitTimerRef.current = undefined;\n };\n const clearFeedbackTimer = () => {\n if (!feedbackTimerRef.current) return;\n clearTimeout(feedbackTimerRef.current);\n feedbackTimerRef.current = undefined;\n };\n const beginFeedback = (revision: number, toolCallId: string) => {\n const latestOperation = latestOperationRef.current;\n if (!latestActiveRef.current\n || motionRevisionRef.current !== revision\n || latestOperation.toolCallId !== toolCallId) return;\n setMotion((current) => current?.revision === revision\n ? { ...current, phase: \"resting\" }\n : current);\n };\n\n useEffect(() => () => {\n clearExitTimer();\n clearFeedbackTimer();\n }, []);\n\n useEffect(() => {\n if (!visible || !initialPosition) {\n if (!motion || motion.phase === \"hidden\") return;\n activeOperationRef.current = undefined;\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n const revision = ++motionRevisionRef.current;\n setMotion((current) => current\n ? { ...current, durationMs: POINTER_EXIT_DURATION_MS, phase: \"hidden\", revision }\n : current);\n clearExitTimer();\n exitTimerRef.current = setTimeout(() => {\n if (motionRevisionRef.current === revision) setMotion(undefined);\n }, POINTER_EXIT_DURATION_MS);\n return;\n }\n\n clearExitTimer();\n if (!motion) {\n activeOperationRef.current = operation.toolCallId;\n activeTargetRef.current = undefined;\n const revision = ++motionRevisionRef.current;\n setMotion({\n durationMs: 0,\n phase: \"resting\",\n position: initialPosition,\n revision,\n toolCallId: operation.toolCallId,\n });\n return;\n }\n\n if (!active) {\n activeOperationRef.current = undefined;\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n if (motion.phase !== \"resting\") {\n const revision = ++motionRevisionRef.current;\n setMotion((current) => current\n ? { ...current, phase: \"resting\", revision }\n : current);\n }\n return;\n }\n\n const operationChanged = activeOperationRef.current !== operation.toolCallId;\n if (operationChanged) {\n activeOperationRef.current = operation.toolCallId;\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n } else if (motion.phase === \"hidden\") {\n setMotion((current) => current\n ? { ...current, durationMs: 0, phase: \"resting\" }\n : current);\n }\n\n if (!targetElement || !targetPosition) {\n if (operationChanged || activeTargetRef.current) {\n activeTargetRef.current = undefined;\n clearFeedbackTimer();\n const revision = ++motionRevisionRef.current;\n const pointerRect = pointerRef.current?.getBoundingClientRect();\n setMotion((current) => current\n ? {\n ...current,\n durationMs: 0,\n phase: \"resting\",\n position: operationChanged ? initialPosition : pointerRect\n ? { left: pointerRect.left, top: pointerRect.top }\n : current.position,\n revision,\n toolCallId: operation.toolCallId,\n }\n : current);\n }\n return;\n }\n const targetChanged = operationChanged || activeTargetRef.current !== targetElement;\n if (!targetChanged) {\n if (motion.position.left === targetPosition.left && motion.position.top === targetPosition.top) return;\n setMotion((current) => current\n ? { ...current, durationMs: 180, position: targetPosition }\n : current);\n return;\n }\n\n activeTargetRef.current = targetElement;\n clearFeedbackTimer();\n const revision = ++motionRevisionRef.current;\n const pointerRect = pointerRef.current?.getBoundingClientRect();\n const currentPosition = pointerRect\n ? { left: pointerRect.left, top: pointerRect.top }\n : motion.position;\n const prefersReducedMotion = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n const durationMs = prefersReducedMotion ? 0 : pointerMoveDuration(currentPosition, targetPosition);\n setMotion((current) => current\n ? {\n ...current,\n durationMs,\n phase: \"moving\",\n position: targetPosition,\n revision,\n toolCallId: operation.toolCallId,\n }\n : current);\n if (durationMs === 0) beginFeedback(revision, operation.toolCallId);\n else {\n // A first-frame position update may not dispatch transitionend.\n feedbackTimerRef.current = setTimeout(() => beginFeedback(revision, operation.toolCallId), durationMs + 50);\n }\n }, [\n active,\n initialPosition?.left,\n initialPosition?.top,\n motion,\n operation.toolCallId,\n targetElement,\n targetPosition?.left,\n targetPosition?.top,\n visible,\n ]);\n\n if (!motion) return null;\n const effect = operationEffect(operation);\n const activeEffect = active ? effect : undefined;\n return (\n <div\n aria-hidden\n className=\"agent-operation__pointer-effect\"\n data-active={active ? \"true\" : \"false\"}\n data-operation-effect={activeEffect}\n data-phase={motion.phase}\n onTransitionEnd={(event) => {\n if (event.currentTarget !== event.target\n || event.propertyName !== \"transform\"\n || motion.phase !== \"moving\"\n || !pointerReachedTarget(event.currentTarget, motion.position)) return;\n beginFeedback(motion.revision, motion.toolCallId);\n }}\n ref={pointerRef}\n style={{\n \"--agent-operation-pointer-duration\": `${motion.durationMs}ms`,\n \"--agent-operation-pointer-x\": `${motion.position.left}px`,\n \"--agent-operation-pointer-y\": `${motion.position.top}px`,\n \"--agent-operation-ripple-duration\": `${POINTER_CLICK_FEEDBACK_DURATION_MS}ms`,\n } as CSSProperties}\n >\n {active && visible && motion.toolCallId === operation.toolCallId && effect === \"action\" && motion.phase !== \"hidden\" ? (\n <>\n <span className=\"agent-operation__pointer-ripple agent-operation__pointer-ripple--primary\" key={`primary-${motion.revision}`} />\n <span className=\"agent-operation__pointer-cursor\">\n <Cursor className=\"agent-operation__pointer\" size={24} weight=\"fill\" />\n </span>\n </>\n ) : null}\n {active && motion.phase !== \"hidden\" && (labelActive || effect !== \"action\") ? (\n <span className={labelActive ? \"agent-operation__pointer-label\" : \"agent-operation__pointer-indicator\"} data-operation-effect={activeEffect} title={labelActive ? label : undefined}>\n {activeEffect === \"processing\" ? <span className=\"agent-operation__pointer-processing\" /> : null}\n {activeEffect === \"read\" ? (\n <span className=\"agent-operation__pointer-read-scan\">\n <i />\n <i />\n <i />\n <i />\n <i />\n </span>\n ) : null}\n {activeEffect === \"navigate\" ? <span className=\"agent-operation__pointer-navigation-trail\" /> : null}\n {labelActive ? <span className=\"agent-operation__pointer-label-text\">{label}</span> : null}\n </span>\n ) : null}\n </div>\n );\n}\n\nexport interface OperationOverlayViewProps {\n fallbackPosition?: PointerPosition;\n feedbackActive?: boolean;\n labelActive?: boolean;\n operation?: AgentOperation;\n progressHistory?: readonly AgentOperationProgressEntry[];\n running: boolean;\n humanHasControl?: boolean;\n cancelling?: boolean;\n onCancel?(): void;\n resolveSurface?(): HTMLElement | undefined;\n resolveTarget?(operation: AgentOperation): AgentOperationTarget | undefined;\n}\n\nexport function OperationOverlayView({ operation, progressHistory = [], running, feedbackActive = running, labelActive = feedbackActive, humanHasControl = false, cancelling = false, onCancel, resolveSurface, resolveTarget, fallbackPosition }: OperationOverlayViewProps) {\n const [, setGeometry] = useState(\"\");\n useLayoutEffect(() => {\n const rect = resolveSurface?.()?.getBoundingClientRect();\n if (rect) setGeometry([rect.left, rect.top, rect.width, rect.height].join(\",\"));\n }, [resolveSurface]);\n const [historyOpen, setHistoryOpen] = useState(false);\n const historyId = useId();\n const clearTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const cancelButtonRef = useRef<HTMLButtonElement>(null);\n const controllerTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const [visibleOperation, setVisibleOperation] = useState(operation);\n const [controllerMounted, setControllerMounted] = useState(Boolean(operation\n && operation.status !== \"cancelled\"\n && (running || humanHasControl || operation.status === \"failed\")));\n const [controllerExiting, setControllerExiting] = useState(false);\n useLayoutEffect(() => {\n if (clearTimerRef.current) clearTimeout(clearTimerRef.current);\n if (operation) setVisibleOperation(operation);\n if (operation?.status === \"cancelled\") {\n clearTimerRef.current = setTimeout(() => setVisibleOperation(undefined), 600);\n }\n return () => { if (clearTimerRef.current) clearTimeout(clearTimerRef.current); };\n }, [operation, running]);\n useEffect(() => {\n if ((!running && !feedbackActive && !humanHasControl) || !visibleOperation || visibleOperation.status === \"cancelled\") return;\n let frame = requestAnimationFrame(function update() {\n const surface = resolveSurface?.();\n const target = resolveTarget?.(visibleOperation)?.element;\n const geometry = [surface, target].map((element) => {\n if (!element?.isConnected) return \"\";\n const rect = element.getBoundingClientRect();\n return [rect.left, rect.top, rect.width, rect.height].join(\",\");\n }).join(\";\");\n setGeometry(geometry);\n frame = requestAnimationFrame(update);\n });\n return () => cancelAnimationFrame(frame);\n }, [visibleOperation?.toolCallId, visibleOperation?.status, running, feedbackActive, humanHasControl, resolveSurface, resolveTarget]);\n useEffect(() => {\n if (progressHistory.length === 0) setHistoryOpen(false);\n }, [progressHistory.length]);\n const controllerShouldBeVisible = Boolean(visibleOperation\n && visibleOperation.status !== \"cancelled\"\n && (running || humanHasControl || visibleOperation.status === \"failed\"));\n useEffect(() => {\n if (controllerTimerRef.current) clearTimeout(controllerTimerRef.current);\n if (controllerShouldBeVisible) {\n setControllerMounted(true);\n setControllerExiting(false);\n return;\n }\n if (!controllerMounted) {\n setControllerExiting(false);\n return;\n }\n setHistoryOpen(false);\n setControllerExiting(true);\n controllerTimerRef.current = setTimeout(() => {\n setControllerMounted(false);\n setControllerExiting(false);\n }, CONTROLLER_EXIT_DURATION_MS);\n return () => {\n if (controllerTimerRef.current) clearTimeout(controllerTimerRef.current);\n };\n }, [controllerMounted, controllerShouldBeVisible]);\n useLayoutEffect(() => {\n const surface = resolveSurface?.();\n if (!surface || !running || humanHasControl) return;\n return lockOperationSurface(surface, () => cancelButtonRef.current?.focus());\n }, [humanHasControl, resolveSurface, running]);\n if (!visibleOperation || typeof document === \"undefined\") return null;\n const resolvedTarget = resolveTarget?.(visibleOperation);\n const surfaceElement = resolveSurface?.();\n const target = resolvedTarget && (!surfaceElement || surfaceElement.contains(resolvedTarget.element))\n ? resolvedTarget\n : undefined;\n const progressLabel = operationProgressLabel(visibleOperation);\n const effect = operationEffect(visibleOperation);\n const targetLabel = operationTargetLabel(visibleOperation, target);\n const pointerLabel = normalizedLabel(visibleOperation.progressLabel) ?? targetLabel ?? progressLabel;\n const controllerLabel = humanHasControl ? undefined : progressLabel;\n const statusLabel = humanHasControl ? \"等待你完成操作\" : {\n running: \"Agent 正在控制\",\n completed: running ? \"工具已完成,任务继续中\" : \"操作已完成\",\n failed: running ? \"Agent 正在处理错误\" : \"操作失败\",\n cancelled: \"任务已终止\",\n }[visibleOperation.status];\n const compactStatusLabel = humanHasControl\n ? \"等待你完成操作\"\n : progressLabel;\n const rect = target?.element.isConnected ? target.element.getBoundingClientRect() : undefined;\n const highlightedRect = effect === \"navigate\" ? undefined : rect;\n const surfaceRect = surfaceElement?.isConnected ? surfaceElement.getBoundingClientRect() : undefined;\n const agentControlsSurface = running && !humanHasControl;\n const operationFeedbackActive = feedbackActive && !humanHasControl && visibleOperation.status !== \"cancelled\";\n const pointerVisible = Boolean(surfaceRect) && feedbackActive && !humanHasControl && visibleOperation.status !== \"cancelled\";\n const pointerPosition = rect ? {\n left: rect.left + rect.width / 2,\n top: rect.top + rect.height / 2,\n } : undefined;\n const cancel = onCancel ? () => {\n onCancel();\n } : undefined;\n return createPortal(\n <div className=\"agent-operation\" data-nexface-ignore data-feedback-active={feedbackActive} data-human-control={humanHasControl} data-operation-effect={effect} data-run-active={running} data-status={visibleOperation.status}>\n {agentControlsSurface && surfaceRect ? <div aria-hidden className=\"agent-operation__surface\" style={{\n ...(highlightedRect ? {\n \"--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`,\n \"--agent-operation-cutout-width\": `${highlightedRect.width}px`,\n } : {}),\n height: surfaceRect.height, left: surfaceRect.left, top: surfaceRect.top, width: surfaceRect.width,\n } as CSSProperties} /> : null}\n {operationFeedbackActive && 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\n active={operationFeedbackActive}\n initialPosition={pointerPosition ?? fallbackPosition ?? (surfaceRect ? { left: surfaceRect.left + surfaceRect.width / 2, top: surfaceRect.top + surfaceRect.height / 2 } : undefined)}\n label={pointerLabel}\n labelActive={labelActive}\n operation={visibleOperation}\n targetElement={target?.element}\n targetPosition={pointerPosition}\n visible={pointerVisible}\n />\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) && visibleOperation.status !== \"cancelled\" ? <span className=\"agent-operation__compact-status\" title={compactStatusLabel}>{compactStatusLabel}</span> : null}\n {cancel && (running || humanHasControl) && visibleOperation.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/runtime.js CHANGED
@@ -326,7 +326,6 @@ export class ToolRuntimeImplementation extends EventTarget {
326
326
  }
327
327
  getWebMcpTools() {
328
328
  return [...this.#bindings.values()]
329
- .filter((binding) => !binding.getConfirmation?.())
330
329
  .map(({ runtimeTool }) => runtimeTool)
331
330
  .sort((left, right) => compareStrings(left.definition.name, right.definition.name));
332
331
  }