@nexface/tools 0.1.13-alpha.0 → 0.1.13-alpha.2
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/runtime.d.ts +3 -1
- package/dist/runtime.js +40 -2
- package/dist/runtime.js.map +1 -1
- package/dist/shared/runtime-controller.d.ts +1 -0
- package/dist/shared/runtime-controller.js.map +1 -1
- package/dist/tool-search.d.ts +11 -0
- package/dist/tool-search.js +92 -0
- package/dist/tool-search.js.map +1 -0
- package/package.json +1 -1
package/dist/runtime.d.ts
CHANGED
|
@@ -7,10 +7,11 @@ import type { AgentContextEntry, AgentContextInput, AgentContextRegistration, Ag
|
|
|
7
7
|
import type { AgentToolExecutionEvent } from "./internal-types.js";
|
|
8
8
|
export interface ToolRuntimeOptions {
|
|
9
9
|
readonly pageAutomation?: boolean;
|
|
10
|
+
readonly routeSearch?: boolean;
|
|
10
11
|
}
|
|
11
12
|
export interface ToolRuntimeToolChangeEvent {
|
|
12
13
|
readonly toolName: string;
|
|
13
|
-
readonly change: "registered" | "unregistered";
|
|
14
|
+
readonly change: "registered" | "unregistered" | "visibility";
|
|
14
15
|
}
|
|
15
16
|
declare const CONTEXT_ERROR_CODES: readonly ["CONTEXT_DISPOSED", "CONTEXT_NAME_MISMATCH", "DUPLICATE_CONTEXT", "INVALID_CONTEXT"];
|
|
16
17
|
type AgentContextErrorCode = typeof CONTEXT_ERROR_CODES[number];
|
|
@@ -170,6 +171,7 @@ export declare class ToolRuntimeImplementation extends EventTarget implements To
|
|
|
170
171
|
getContexts(options?: {
|
|
171
172
|
signal?: AbortSignal;
|
|
172
173
|
}): Promise<readonly AgentContextEntry[]>;
|
|
174
|
+
getRegisteredTools(): readonly RuntimeAgentTool[];
|
|
173
175
|
getWebMcpTools(): readonly RuntimeAgentTool[];
|
|
174
176
|
isRegistered(name: string): boolean;
|
|
175
177
|
getTools(): readonly RuntimeAgentTool[];
|
package/dist/runtime.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { searchNavigationTools, searchToolDefinition } from "./tool-search.js";
|
|
1
2
|
import { pageDecisionSymbol } from "./shared/runtime-execution.js";
|
|
2
3
|
import { PageCommandError } from "./browser/locator.js";
|
|
3
4
|
import { measurePagePhase } from "./browser/diagnostics.js";
|
|
@@ -123,6 +124,8 @@ export function getInternalToolRuntime(runtime) {
|
|
|
123
124
|
export class ToolRuntimeImplementation extends EventTarget {
|
|
124
125
|
[toolRuntimeBrand] = true;
|
|
125
126
|
#bindings = new Map();
|
|
127
|
+
#routeSearch;
|
|
128
|
+
#visibleNavigation = new Set();
|
|
126
129
|
#contexts = new Map();
|
|
127
130
|
#contextRevision = 0;
|
|
128
131
|
#browserToolset;
|
|
@@ -157,6 +160,33 @@ export class ToolRuntimeImplementation extends EventTarget {
|
|
|
157
160
|
typeof options.pageAutomation !== "boolean") {
|
|
158
161
|
throw new AgentToolError("INVALID_INPUT", "pageAutomation must be a boolean.");
|
|
159
162
|
}
|
|
163
|
+
if (options.routeSearch !== undefined && typeof options.routeSearch !== "boolean") {
|
|
164
|
+
throw new AgentToolError("INVALID_INPUT", "routeSearch must be a boolean.");
|
|
165
|
+
}
|
|
166
|
+
this.#routeSearch = options.routeSearch ?? false;
|
|
167
|
+
if (this.#routeSearch)
|
|
168
|
+
this.register(searchToolDefinition, ({ query, queries }) => {
|
|
169
|
+
if (query !== undefined && queries !== undefined)
|
|
170
|
+
throw new AgentToolError("INVALID_INPUT", "Use either query or queries, not both.");
|
|
171
|
+
const searchQueries = queries === undefined ? (query === undefined ? undefined : [query]) : [...queries];
|
|
172
|
+
if (searchQueries?.some((phrase) => typeof phrase !== "string" || !phrase.trim()))
|
|
173
|
+
throw new AgentToolError("INVALID_INPUT", "Search queries must contain nonblank strings.");
|
|
174
|
+
const navigation = this.getRegisteredTools().filter(({ definition }) => definition.effect === "navigate");
|
|
175
|
+
const candidates = searchQueries === undefined ? navigation : searchNavigationTools(navigation, searchQueries.map((phrase) => phrase.trim()));
|
|
176
|
+
if (searchQueries !== undefined) {
|
|
177
|
+
const previous = this.#visibleNavigation;
|
|
178
|
+
this.#visibleNavigation = new Set(candidates);
|
|
179
|
+
for (const tool of new Set([...previous, ...candidates])) {
|
|
180
|
+
if (previous.has(tool) === this.#visibleNavigation.has(tool))
|
|
181
|
+
continue;
|
|
182
|
+
this.dispatchEvent(new DetailEvent("toolchange", Object.freeze({
|
|
183
|
+
toolName: tool.definition.name,
|
|
184
|
+
change: "visibility",
|
|
185
|
+
})));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { tools: candidates.map(({ definition: { name, description } }) => ({ name, description })) };
|
|
189
|
+
});
|
|
160
190
|
this.#browserToolset = options.pageAutomation ? createBrowserToolset() : undefined;
|
|
161
191
|
runtimeInternals.set(this, this);
|
|
162
192
|
const controller = Object.freeze({
|
|
@@ -165,6 +195,7 @@ export class ToolRuntimeImplementation extends EventTarget {
|
|
|
165
195
|
setTaskProgress: this.setTaskProgress,
|
|
166
196
|
getOperationSnapshot: () => this.getActivitySnapshot().operation,
|
|
167
197
|
subscribeOperation: this.subscribeActivity,
|
|
198
|
+
getRegisteredTools: () => this.getRegisteredTools(),
|
|
168
199
|
});
|
|
169
200
|
Object.defineProperty(this, runtimeControllerSymbol, { value: controller });
|
|
170
201
|
}
|
|
@@ -224,6 +255,7 @@ export class ToolRuntimeImplementation extends EventTarget {
|
|
|
224
255
|
disposed = true;
|
|
225
256
|
options.signal?.removeEventListener("abort", dispose);
|
|
226
257
|
this.#bindings.delete(definition.name);
|
|
258
|
+
this.#visibleNavigation.delete(runtimeTool);
|
|
227
259
|
lifecycleController.abort();
|
|
228
260
|
this.dispatchEvent(new DetailEvent("toolchange", Object.freeze({
|
|
229
261
|
toolName: definition.name,
|
|
@@ -337,17 +369,23 @@ export class ToolRuntimeImplementation extends EventTarget {
|
|
|
337
369
|
revision: this.#contextRevision,
|
|
338
370
|
}));
|
|
339
371
|
}
|
|
372
|
+
getRegisteredTools() {
|
|
373
|
+
return [...this.#bindings.values()]
|
|
374
|
+
.map(({ runtimeTool }) => runtimeTool)
|
|
375
|
+
.filter(({ definition }) => !this.#routeSearch || definition !== searchToolDefinition)
|
|
376
|
+
.sort((left, right) => compareStrings(left.definition.name, right.definition.name));
|
|
377
|
+
}
|
|
340
378
|
getWebMcpTools() {
|
|
341
379
|
return [...this.#bindings.values()]
|
|
342
380
|
.map(({ runtimeTool }) => runtimeTool)
|
|
381
|
+
.filter((tool) => !this.#routeSearch || tool.definition.effect !== "navigate" || this.#visibleNavigation.has(tool))
|
|
343
382
|
.sort((left, right) => compareStrings(left.definition.name, right.definition.name));
|
|
344
383
|
}
|
|
345
384
|
isRegistered(name) {
|
|
346
385
|
return this.#bindings.has(name);
|
|
347
386
|
}
|
|
348
387
|
getTools() {
|
|
349
|
-
const applicationTools =
|
|
350
|
-
.map(({ runtimeTool }) => runtimeTool);
|
|
388
|
+
const applicationTools = this.getWebMcpTools();
|
|
351
389
|
const browserTools = (this.#browserToolset?.definitions ?? [])
|
|
352
390
|
.map((definition) => this.#getBrowserRuntimeTool(definition));
|
|
353
391
|
return [...applicationTools, ...browserTools]
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { pageDecisionSymbol, type InternalExecutionOptions } from \"./shared/runtime-execution.js\";\nimport { PageCommandError } from \"./browser/locator.js\";\nimport { measurePagePhase } from \"./browser/diagnostics.js\";\nimport type { PageActionFeedback, PageFeedbackListener } from \"./browser/feedback.js\";\nimport { runtimeControllerSymbol, type RuntimeController, type TaskProgress } from \"./shared/runtime-controller.js\";\nimport { AgentToolError, TOOL_ERROR_CODES } from \"./shared/errors.js\";\nexport { AgentToolError } from \"./shared/errors.js\";\nimport { OperationTracker, type RuntimeActivitySnapshot } from \"./operation-runtime.js\";\nimport { isValidAgentContextName } from \"./definition.js\";\nimport { assertAgentToolInputSchema, validateAgentToolInput } from \"./shared/schema.js\";\nimport type {\n AgentContextEntry,\n AgentContextInput,\n AgentContextRegistration,\n AgentToolDefinition,\n AgentToolExecutor,\n} from \"./types.js\";\nimport type { AgentToolExecutionEvent } from \"./internal-types.js\";\nimport {\n createBrowserToolset,\n type BrowserToolset,\n} from \"./browser/toolset.js\";\n\nexport interface ToolRuntimeOptions {\n readonly pageAutomation?: boolean;\n}\n\nexport interface ToolRuntimeToolChangeEvent {\n readonly toolName: string;\n readonly change: \"registered\" | \"unregistered\";\n}\n\nconst CONTEXT_ERROR_CODES = [\n \"CONTEXT_DISPOSED\",\n \"CONTEXT_NAME_MISMATCH\",\n \"DUPLICATE_CONTEXT\",\n \"INVALID_CONTEXT\",\n] as const;\n\ntype AgentContextErrorCode = typeof CONTEXT_ERROR_CODES[number];\n\nconst CONTEXT_ERROR_CODE_SET = new Set<string>(CONTEXT_ERROR_CODES);\nconst TOOL_ERROR_CODE_SET = new Set<string>(TOOL_ERROR_CODES);\n\nexport function isToolRuntimeError(error: unknown): error is {\n readonly type: \"tool_runtime_error\";\n readonly domain: \"tool\" | \"context\";\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n} {\n if (!error || typeof error !== \"object\") return false;\n const candidate = error as Record<string, unknown>;\n if (\n candidate.type !== \"tool_runtime_error\"\n || typeof candidate.message !== \"string\"\n || typeof candidate.code !== \"string\"\n ) {\n return false;\n }\n if (candidate.domain === \"tool\") {\n return TOOL_ERROR_CODE_SET.has(candidate.code);\n }\n if (candidate.domain === \"context\") {\n return CONTEXT_ERROR_CODE_SET.has(candidate.code);\n }\n return false;\n}\n\nconst toolRuntimeBrand = Symbol.for(\"@nexface/tools/ToolRuntime\");\n\n/**\n * @experimental A logical operation spanning tool calls and human interaction.\n * @beta\n */\nexport interface ToolOperation {\n readonly id: string;\n /**\n * @experimental End the operation and wait for its admitted tool calls to settle.\n * @beta\n * @param options - Final outcome; defaults to completed. Does not cancel execution.\n * @returns A promise that resolves when outstanding calls have settled and the operation is released.\n */\n end(options?: { outcome?: \"completed\" | \"failed\" | \"cancelled\" }): Promise<void>;\n}\n\nexport interface ToolRuntime {\n readonly [toolRuntimeBrand]: true;\n\n /**\n * @experimental Begin a logical operation spanning one complete host-managed task.\n * @beta\n * @param options - Optional callback for cancellation requested from the operation UI.\n * @returns A handle that the host must end on completion, failure, or cancellation.\n * @throws An OPERATION_BUSY error if another operation or unscoped tool call is outstanding.\n * @remarks The host owns cancellation. Pass its signal to execute and external requests, then end the operation.\n */\n beginOperation(options?: { onCancel?: () => void }): ToolOperation;\n getTools(): readonly RuntimeAgentTool[];\n getContexts(options?: {\n signal?: AbortSignal;\n }): Promise<readonly AgentContextEntry[]>;\n /**\n * @experimental Execute a current Runtime Tool through the Runtime queue.\n * @beta\n * @param tool - The current tool object returned by this Runtime's getTools method.\n * @param input - Arguments matching the tool's input schema.\n * @param options - Optional cancellation signal and display-only progress label.\n * @returns The tool result, or a rejected promise when execution fails.\n * @remarks Joins the operation active when submitted. Rejects with OPERATION_BUSY while ending. Does not trigger user confirmation.\n */\n execute<TInput, TResult>(\n tool: RuntimeAgentTool<TInput, TResult>,\n input: TInput,\n options?: { signal?: AbortSignal; progressLabel?: string },\n ): Promise<TResult>;\n on(\n eventName: \"toolchange\",\n listener: (event: ToolRuntimeToolChangeEvent) => void,\n ): () => void;\n /**\n * @experimental Tool execution notifications may change in future releases.\n * @beta\n */\n on(\n eventName: \"toolexecution\",\n listener: (event: AgentToolExecutionEvent) => void,\n ): () => void;\n}\n\ntype RuntimeBinding = {\n resolveTarget?: (input: unknown) => HTMLElement | undefined;\n definition: AgentToolDefinition<any, any>;\n runtimeTool: RuntimeAgentTool<any, any>;\n execute: AgentToolExecutor<any, any>;\n getConfirmation?: () => AgentToolConfirmationConfig | undefined;\n lifecycleController: AbortController;\n};\n\n/**\n * @experimental Human-in-the-loop confirmation configuration.\n * @beta\n */\nexport type AgentToolConfirmationConfig =\n | {\n readonly mode: \"chat\";\n readonly title?: string;\n readonly description?: string;\n readonly confirmLabel?: string;\n readonly rejectLabel?: string;\n }\n | {\n readonly mode: \"page\";\n readonly title?: string;\n readonly description?: string;\n };\n\nexport interface RuntimeAgentTool<TInput = unknown, TResult = unknown> {\n readonly definition: AgentToolDefinition<TInput, TResult>;\n /**\n * @experimental Human-in-the-loop confirmation metadata.\n * @beta\n */\n readonly confirmation?: AgentToolConfirmationConfig | undefined;\n readonly lifecycleSignal: AbortSignal;\n}\n\nfunction compareStrings(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction assertContextName(name: string): void {\n if (!isValidAgentContextName(name)) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `Invalid or reserved context name: ${name}.`,\n );\n }\n}\n\nfunction normalizeContextValue(\n value: unknown,\n path = \"value\",\n seen = new WeakSet<object>(),\n): AgentContextEntry[\"value\"] {\n if (\n value === null\n || typeof value === \"string\"\n || typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} must contain only finite numbers.`,\n );\n }\n return value;\n }\n if (!value || typeof value !== \"object\") {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} must be JSON serializable.`,\n );\n }\n if (seen.has(value)) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} contains a circular reference.`,\n );\n }\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n return value.map((item, index) =>\n normalizeContextValue(item, `${path}[${index}]`, seen));\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} must contain only plain objects.`,\n );\n }\n return Object.fromEntries(\n Object.keys(value)\n .sort(compareStrings)\n .map((key) => [\n key,\n normalizeContextValue(\n (value as Record<string, unknown>)[key],\n `${path}.${key}`,\n seen,\n ),\n ]),\n );\n } finally {\n seen.delete(value);\n }\n}\n\nfunction normalizeContext(context: AgentContextInput): AgentContextEntry {\n assertContextName(context.name);\n if (context.description !== undefined\n && (typeof context.description !== \"string\" || !context.description.trim())) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n \"Context description must be a non-empty string when provided.\",\n );\n }\n return {\n name: context.name,\n ...(context.description === undefined ? {} : { description: context.description }),\n value: normalizeContextValue(context.value),\n };\n}\n\nclass DetailEvent<T> extends Event {\n constructor(type: string, readonly detail: T) {\n super(type);\n }\n}\n\nexport class AgentContextError extends Error {\n readonly type = \"tool_runtime_error\" as const;\n readonly domain = \"context\" as const;\n\n constructor(\n readonly code: AgentContextErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"ToolRuntimeError\";\n }\n}\n\nexport interface InternalToolRuntime extends ToolRuntime, EventTarget {\n beginInternalOperation(options?: { signal?: AbortSignal; onCancel?: () => void; source?: \"host\" | \"webmcp\"; replaceWaiting?: ToolOperation; taskProgress?: TaskProgress }): ToolOperation;\n endBridgeOperation(handle: ToolOperation): Promise<void>;\n setTaskProgress(handle: ToolOperation, progress: TaskProgress): void;\n setOperationWaiting(handle: ToolOperation, waiting: boolean): void;\n getActivitySnapshot(): RuntimeActivitySnapshot;\n subscribeActivity(listener: () => void): () => void;\n requestOperationCancel(id: string): void;\n resolveTarget(tool: RuntimeAgentTool, input: unknown): HTMLElement | undefined;\n setPageActionFeedback(listener: (event: AgentToolExecutionEvent, feedback: PageActionFeedback, signal?: AbortSignal) => void | Promise<void>): () => void;\n register<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options?: {\n signal?: AbortSignal;\n getConfirmation?: () => AgentToolConfirmationConfig | undefined;\n resolveTarget?: (input: unknown) => HTMLElement | undefined;\n },\n ): () => void;\n registerContext(\n input: AgentContextInput,\n options?: { signal?: AbortSignal },\n ): AgentContextRegistration;\n getWebMcpTools(): readonly RuntimeAgentTool[];\n isRegistered(name: string): boolean;\n waitForTool(\n definition: AgentToolDefinition<any, any>,\n options?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<void>;\n getContextRevision(): number;\n getContextsNow(): readonly AgentContextEntry[];\n}\n\nconst runtimeInternals = new WeakMap<\n ToolRuntime,\n ToolRuntimeImplementation\n>();\n\nexport function createToolRuntime(\n options: ToolRuntimeOptions = {},\n): ToolRuntime {\n return new ToolRuntimeImplementation(options);\n}\n\nexport function getInternalToolRuntime(\n runtime: ToolRuntime,\n): InternalToolRuntime {\n const internal = runtimeInternals.get(runtime);\n if (!internal) {\n throw new AgentToolError(\n \"INVALID_TOOL_RUNTIME\",\n \"ToolRuntime must be created by createToolRuntime().\",\n );\n }\n return internal;\n}\n\nexport class ToolRuntimeImplementation\n extends EventTarget\n implements ToolRuntime, InternalToolRuntime\n{\n readonly [toolRuntimeBrand] = true as const;\n\n readonly #bindings = new Map<string, RuntimeBinding>();\n readonly #contexts = new Map<string, AgentContextEntry>();\n #contextRevision = 0;\n readonly #browserToolset: BrowserToolset | undefined;\n readonly #browserRuntimeTools = new WeakMap<\n object,\n RuntimeAgentTool<any, any>\n >();\n #executionTail: Promise<void> | undefined;\n #pageActionFeedback: ((event: AgentToolExecutionEvent, feedback: PageActionFeedback, signal?: AbortSignal) => void | Promise<void>) | undefined;\n readonly #operations = new OperationTracker();\n\n beginOperation(options: { onCancel?: () => void } = {}): ToolOperation {\n return this.#operations.begin(options.onCancel ? { onCancel: options.onCancel } : {});\n }\n beginInternalOperation(options: Parameters<OperationTracker[\"begin\"]>[0] = {}): ToolOperation {\n return this.#operations.begin(options);\n }\n endBridgeOperation(handle: ToolOperation): Promise<void> { return this.#operations.disposeBridge(handle); }\n setTaskProgress = (handle: ToolOperation, progress: TaskProgress): void => this.#operations.setTaskProgress(handle, progress);\n setOperationWaiting = (handle: ToolOperation, waiting: boolean): void => this.#operations.setWaitingForUser(handle, waiting);\n getActivitySnapshot = (): RuntimeActivitySnapshot => this.#operations.getSnapshot();\n subscribeActivity = (listener: () => void): (() => void) => this.#operations.subscribe(listener);\n requestOperationCancel(id: string): void { this.#operations.requestCancel(id); }\n\n setPageActionFeedback(listener: (event: AgentToolExecutionEvent, feedback: PageActionFeedback, signal?: AbortSignal) => void | Promise<void>): () => void {\n this.#pageActionFeedback = listener;\n return () => { if (this.#pageActionFeedback === listener) this.#pageActionFeedback = undefined; };\n }\n\n #emitExecution(event: AgentToolExecutionEvent): void {\n this.#operations.observe(event);\n this.dispatchEvent(new DetailEvent(\"toolexecution\", event));\n }\n\n constructor(options: ToolRuntimeOptions = {}) {\n super();\n if (\n options.pageAutomation !== undefined &&\n typeof options.pageAutomation !== \"boolean\"\n ) {\n throw new AgentToolError(\"INVALID_INPUT\", \"pageAutomation must be a boolean.\");\n }\n this.#browserToolset = options.pageAutomation ? createBrowserToolset() : undefined;\n runtimeInternals.set(this, this);\n const controller = Object.freeze<RuntimeController>({\n beginInternalOperation: (options) => this.beginInternalOperation(options),\n setOperationWaiting: this.setOperationWaiting,\n setTaskProgress: this.setTaskProgress,\n getOperationSnapshot: () => this.getActivitySnapshot().operation,\n subscribeOperation: this.subscribeActivity,\n });\n Object.defineProperty(this, runtimeControllerSymbol, { value: controller });\n }\n\n on(\n eventName: \"toolchange\",\n listener: (event: ToolRuntimeToolChangeEvent) => void,\n ): () => void;\n on(\n eventName: \"toolexecution\",\n listener: (event: AgentToolExecutionEvent) => void,\n ): () => void;\n on(\n eventName: \"toolchange\" | \"toolexecution\",\n listener: ((event: ToolRuntimeToolChangeEvent) => void) | ((event: AgentToolExecutionEvent) => void),\n ): () => void {\n const handleEvent = (event: Event) => {\n if (eventName === \"toolchange\") {\n (listener as (event: ToolRuntimeToolChangeEvent) => void)(\n (event as Event & { detail: ToolRuntimeToolChangeEvent }).detail,\n );\n } else {\n (listener as (event: AgentToolExecutionEvent) => void)(\n (event as Event & { detail: AgentToolExecutionEvent }).detail,\n );\n }\n };\n this.addEventListener(eventName, handleEvent);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n this.removeEventListener(eventName, handleEvent);\n };\n }\n\n register<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options: {\n signal?: AbortSignal;\n getConfirmation?: () => AgentToolConfirmationConfig | undefined;\n resolveTarget?: (input: unknown) => HTMLElement | undefined;\n } = {},\n ): () => void {\n assertAgentToolInputSchema(definition.inputSchema, `Tool \"${definition.name}\".inputSchema`);\n if (this.#bindings.has(definition.name)) {\n throw new AgentToolError(\n \"DUPLICATE_BINDING\",\n `Tool \"${definition.name}\" already has an active binding.`,\n );\n }\n const lifecycleController = new AbortController();\n const runtimeTool = Object.freeze({\n definition,\n get confirmation() {\n const confirmation = options.getConfirmation?.();\n return confirmation === undefined\n ? undefined\n : Object.freeze({ ...confirmation });\n },\n lifecycleSignal: lifecycleController.signal,\n }) satisfies RuntimeAgentTool<TInput, TResult>;\n const binding: RuntimeBinding = {\n ...(options.resolveTarget ? { resolveTarget: options.resolveTarget } : {}),\n definition,\n runtimeTool,\n execute,\n ...(options.getConfirmation\n ? { getConfirmation: options.getConfirmation }\n : {}),\n lifecycleController,\n };\n this.#bindings.set(definition.name, binding);\n this.dispatchEvent(\n new DetailEvent(\"toolchange\", Object.freeze({\n toolName: definition.name,\n change: \"registered\" as const,\n })),\n );\n\n let disposed = false;\n const dispose = () => {\n if (disposed || this.#bindings.get(definition.name) !== binding) return;\n disposed = true;\n options.signal?.removeEventListener(\"abort\", dispose);\n this.#bindings.delete(definition.name);\n lifecycleController.abort();\n this.dispatchEvent(\n new DetailEvent(\"toolchange\", Object.freeze({\n toolName: definition.name,\n change: \"unregistered\" as const,\n })),\n );\n };\n if (options.signal?.aborted) dispose();\n else options.signal?.addEventListener(\"abort\", dispose, { once: true });\n return dispose;\n }\n\n registerContext(\n input: AgentContextInput,\n options: { signal?: AbortSignal } = {},\n ): AgentContextRegistration {\n const initial = normalizeContext(input);\n if (this.#contexts.has(initial.name)) {\n throw new AgentContextError(\n \"DUPLICATE_CONTEXT\",\n `Context \"${initial.name}\" already has an active registration.`,\n );\n }\n this.#contexts.set(initial.name, initial);\n this.#notifyContextChange(initial.name, \"registered\");\n\n let disposed = false;\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n options.signal?.removeEventListener(\"abort\", dispose);\n if (this.#contexts.delete(initial.name)) {\n this.#notifyContextChange(initial.name, \"disposed\");\n }\n };\n const update = (nextInput: AgentContextInput) => {\n if (disposed) {\n throw new AgentContextError(\n \"CONTEXT_DISPOSED\",\n `Context \"${initial.name}\" registration has been disposed.`,\n );\n }\n const next = normalizeContext(nextInput);\n if (next.name !== initial.name) {\n throw new AgentContextError(\n \"CONTEXT_NAME_MISMATCH\",\n `Context registration \"${initial.name}\" cannot be updated to \"${next.name}\".`,\n );\n }\n if (JSON.stringify(this.#contexts.get(initial.name)) === JSON.stringify(next)) return;\n this.#contexts.set(initial.name, next);\n this.#notifyContextChange(initial.name, \"updated\");\n };\n if (options.signal?.aborted) dispose();\n else options.signal?.addEventListener(\"abort\", dispose, { once: true });\n return { update, dispose };\n }\n\n getContextsNow(): readonly AgentContextEntry[] {\n return [...this.#contexts.values()]\n .sort((left, right) => compareStrings(left.name, right.name))\n .map(normalizeContext);\n }\n\n getContextRevision(): number {\n return this.#contextRevision;\n }\n\n async getContexts(\n options: { signal?: AbortSignal } = {},\n ): Promise<readonly AgentContextEntry[]> {\n options.signal?.throwIfAborted();\n await Promise.resolve();\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n let frameId: number | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (frameId !== undefined && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(frameId);\n }\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n const settle = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(options.signal?.reason);\n };\n const afterTask = () => {\n timeoutId = undefined;\n if (typeof requestAnimationFrame !== \"function\") {\n settle();\n return;\n }\n frameId = requestAnimationFrame(settle);\n timeoutId = setTimeout(settle, 50);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted) {\n onAbort();\n return;\n }\n timeoutId = setTimeout(afterTask, 0);\n });\n await Promise.resolve();\n options.signal?.throwIfAborted();\n return this.getContextsNow();\n }\n\n #notifyContextChange(\n name: string,\n change: \"registered\" | \"updated\" | \"disposed\",\n ): void {\n this.#contextRevision += 1;\n this.dispatchEvent(new DetailEvent(\"contextchange\", {\n name,\n change,\n revision: this.#contextRevision,\n }));\n }\n\n getWebMcpTools(): readonly RuntimeAgentTool[] {\n return [...this.#bindings.values()]\n .map(({ runtimeTool }) => runtimeTool)\n .sort((left, right) => compareStrings(\n left.definition.name,\n right.definition.name,\n ));\n }\n\n isRegistered(name: string): boolean {\n return this.#bindings.has(name);\n }\n\n getTools(): readonly RuntimeAgentTool[] {\n const applicationTools = [...this.#bindings.values()]\n .map(({ runtimeTool }) => runtimeTool);\n const browserTools = (this.#browserToolset?.definitions ?? [])\n .map((definition) => this.#getBrowserRuntimeTool(definition));\n return [...applicationTools, ...browserTools]\n .sort((left, right) => compareStrings(\n left.definition.name,\n right.definition.name,\n ));\n }\n\n waitForTool(\n definition: AgentToolDefinition<any, any>,\n options: { signal?: AbortSignal; timeoutMs?: number } = {},\n ): Promise<void> {\n const isTargetRegistered = () => this.#bindings.has(definition.name);\n if (isTargetRegistered()) return Promise.resolve();\n const timeoutMs = Math.max(1, options.timeoutMs ?? 5_000);\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n this.removeEventListener(\"toolchange\", onToolChange);\n options.signal?.removeEventListener(\"abort\", onAbort);\n clearTimeout(timeoutId);\n };\n const settle = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const onToolChange = (event: Event) => {\n const detail = (event as Event & {\n detail?: ToolRuntimeToolChangeEvent;\n }).detail;\n if (\n detail?.toolName !== definition.name\n || detail.change !== \"registered\"\n ) return;\n if (isTargetRegistered()) settle(resolve);\n };\n const onAbort = () => settle(() => reject(options.signal?.reason));\n const timeoutId = setTimeout(() => {\n settle(() =>\n reject(\n new AgentToolError(\n \"TOOL_REGISTRATION_TIMEOUT\",\n `Tool \"${definition.name}\" did not register within ${timeoutMs}ms.`,\n {\n toolName: definition.name,\n timeoutMs,\n retryable: false,\n browserFallbackAllowed: true,\n toolExecuted: false,\n },\n ),\n ));\n }, timeoutMs);\n this.addEventListener(\"toolchange\", onToolChange);\n if (options.signal?.aborted) onAbort();\n else options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (isTargetRegistered()) settle(resolve);\n });\n }\n\n execute<TInput, TResult>(\n tool: RuntimeAgentTool<TInput, TResult>,\n input: TInput,\n options: InternalExecutionOptions = {},\n ): Promise<TResult> {\n const label = options.progressLabel?.trim().replace(/\\s+/g, \" \").slice(0, 48);\n options = { ...(options.signal ? { signal: options.signal } : {}), ...(label ? { progressLabel: label } : {}), ...(options[pageDecisionSymbol] ? { [pageDecisionSymbol]: true } : {}) };\n const definition = tool.definition;\n const name = definition.name;\n const binding = this.#bindings.get(name);\n if (binding) {\n if (binding.runtimeTool !== tool) {\n return Promise.reject(\n new AgentToolError(\n \"CONTRACT_MISMATCH\",\n `Tool \"${name}\" is registered with a different Runtime Tool.`,\n ),\n );\n }\n return this.#enqueue(\n (operationId) => this.#executeApplication(name, input, options, binding, operationId),\n options.signal,\n ) as Promise<TResult>;\n }\n try {\n const browserToolset = this.#browserToolset;\n const browserHandler = browserToolset?.handlers.get(name);\n if (!browserHandler) {\n return Promise.reject(\n new AgentToolError(\"UNKNOWN_TOOL\", `Unknown tool: ${name}.`),\n );\n }\n if (\n !browserToolset?.definitions.some((candidate) => candidate === definition)\n || this.#getBrowserRuntimeTool(definition) !== tool\n ) {\n return Promise.reject(\n new AgentToolError(\n \"CONTRACT_MISMATCH\",\n `Tool \"${name}\" is registered with a different Definition.`,\n ),\n );\n }\n return this.#enqueue((operationId) => this.#observeExecution(tool, input, options.signal, async (onFeedback, assertActive) => {\n const signal = options.signal ?? new AbortController().signal;\n signal.throwIfAborted();\n return browserHandler.execute(input as Record<string, unknown>, {\n signal,\n ...(onFeedback ? { onFeedback } : {}),\n ...(assertActive ? { assertActive } : {}),\n ...(options[pageDecisionSymbol] ? { pageDecision: true } : {}),\n });\n }, options.progressLabel, operationId), options.signal) as Promise<TResult>;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n #enqueue<TResult>(\n execute: (operationId?: string) => Promise<TResult>,\n signal?: AbortSignal,\n ): Promise<TResult> {\n if (signal?.aborted) return Promise.reject(signal.reason);\n let admission: ReturnType<OperationTracker[\"admit\"]>;\n try { admission = this.#operations.admit(); }\n catch (error) { return Promise.reject(error); }\n const previous = this.#executionTail;\n let removeQueuedAbort = () => {};\n const start = async () => {\n removeQueuedAbort();\n try {\n signal?.throwIfAborted();\n return await execute(admission.operationId);\n } finally { admission.release(); }\n };\n // Reserve the tail before invoking executors or notifying synchronous listeners.\n let settleTail!: () => void;\n const tail = new Promise<void>((resolve) => { settleTail = resolve; });\n this.#executionTail = tail;\n const queuedExecution = previous ? previous.then(start) : start();\n let execution = queuedExecution;\n if (previous && signal) {\n execution = new Promise((resolve, reject) => {\n const onAbort = () => {\n removeQueuedAbort();\n admission.release();\n reject(signal.reason);\n };\n removeQueuedAbort = () => signal.removeEventListener(\"abort\", onAbort);\n queuedExecution.then(resolve, reject);\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n void queuedExecution.then(settleTail, settleTail);\n void tail.then(() => {\n if (this.#executionTail === tail) this.#executionTail = undefined;\n });\n return execution;\n }\n\n resolveTarget(tool: RuntimeAgentTool, input: unknown): HTMLElement | undefined {\n const binding = this.#bindings.get(tool.definition.name);\n if (binding?.runtimeTool === tool) {\n const target = binding.resolveTarget?.(input);\n return target?.isConnected ? target : undefined;\n }\n if (this.#browserRuntimeTools.get(tool.definition) !== tool || !input || typeof input !== \"object\") return undefined;\n return this.#browserToolset?.handlers.get(tool.definition.name)?.resolveTarget?.(input as Record<string, unknown>);\n }\n\n async #observeExecution(\n tool: RuntimeAgentTool<any, any>,\n input: unknown,\n signal: AbortSignal | undefined,\n execute: (onFeedback?: PageFeedbackListener, assertActive?: () => void) => Promise<unknown>,\n progressLabel?: string,\n operationId?: string,\n ): Promise<unknown> {\n const running: AgentToolExecutionEvent = {\n ...(operationId ? { operationId } : {}),\n id: globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`,\n name: tool.definition.name,\n tool,\n status: \"running\",\n startedAt: Date.now(),\n input,\n ...(progressLabel ? { progressLabel } : {}),\n };\n const presentation = this.#pageActionFeedback;\n const assertActive = () => {\n signal?.throwIfAborted();\n if (presentation && this.#pageActionFeedback !== presentation) {\n throw new PageCommandError({ code: \"EXECUTION_CANCELLED\", message: \"Page action presentation was detached.\" });\n }\n };\n this.#emitExecution(running);\n try {\n assertActive();\n const result = await execute(async (feedback) => {\n assertActive();\n if (presentation) await measurePagePhase(\"presentation\", async () => { await presentation(running, feedback, signal); });\n assertActive();\n }, assertActive);\n signal?.throwIfAborted();\n this.#emitExecution({\n ...running, status: \"success\", finishedAt: Date.now(), result,\n } satisfies AgentToolExecutionEvent);\n return result;\n } catch (error) {\n this.#emitExecution({\n ...running, status: \"error\", cancelled: signal?.aborted === true,\n finishedAt: Date.now(), error,\n } satisfies AgentToolExecutionEvent);\n throw error;\n }\n }\n\n async #executeApplication(\n name: string,\n input: unknown,\n options: { signal?: AbortSignal; progressLabel?: string },\n binding: RuntimeBinding,\n operationId?: string,\n ): Promise<unknown> {\n const id = globalThis.crypto?.randomUUID?.()\n ?? `${Date.now()}-${Math.random()}`;\n const startedAt = Date.now();\n const running: AgentToolExecutionEvent = {\n ...(operationId ? { operationId } : {}),\n id,\n name,\n tool: binding.runtimeTool,\n ...(options.progressLabel ? { progressLabel: options.progressLabel } : {}),\n status: \"running\",\n startedAt,\n input,\n };\n this.#emitExecution(running);\n try {\n if (this.#bindings.get(name) !== binding) {\n throw new AgentToolError(\n \"UNKNOWN_TOOL\",\n `Tool \"${name}\" is no longer registered for this call.`,\n );\n }\n const errors = validateAgentToolInput(binding.definition.inputSchema, input);\n if (errors.length) {\n throw new AgentToolError(\"INVALID_INPUT\", errors.join(\" \"), { errors });\n }\n const signal = options.signal ?? new AbortController().signal;\n signal.throwIfAborted();\n const result = await binding.execute(input, {\n signal,\n waitForTool: (definition, waitOptions = {}) =>\n this.waitForTool(definition, { signal, ...waitOptions }),\n });\n signal.throwIfAborted();\n this.#emitExecution({\n ...running,\n status: \"success\",\n finishedAt: Date.now(),\n result,\n } satisfies AgentToolExecutionEvent);\n return result;\n } catch (error) {\n this.#emitExecution({\n ...running,\n status: \"error\",\n cancelled: options.signal?.aborted === true,\n finishedAt: Date.now(),\n error,\n } satisfies AgentToolExecutionEvent);\n throw error;\n }\n }\n\n #getBrowserRuntimeTool<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n ): RuntimeAgentTool<TInput, TResult> {\n const existing = this.#browserRuntimeTools.get(definition);\n if (existing) return existing as RuntimeAgentTool<TInput, TResult>;\n const runtimeTool = Object.freeze({\n definition,\n confirmation: undefined,\n lifecycleSignal: new AbortController().signal,\n }) satisfies RuntimeAgentTool<TInput, TResult>;\n this.#browserRuntimeTools.set(definition, runtimeTool);\n return runtimeTool;\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { searchNavigationTools, searchToolDefinition } from \"./tool-search.js\";\nimport { pageDecisionSymbol, type InternalExecutionOptions } from \"./shared/runtime-execution.js\";\nimport { PageCommandError } from \"./browser/locator.js\";\nimport { measurePagePhase } from \"./browser/diagnostics.js\";\nimport type { PageActionFeedback, PageFeedbackListener } from \"./browser/feedback.js\";\nimport { runtimeControllerSymbol, type RuntimeController, type TaskProgress } from \"./shared/runtime-controller.js\";\nimport { AgentToolError, TOOL_ERROR_CODES } from \"./shared/errors.js\";\nexport { AgentToolError } from \"./shared/errors.js\";\nimport { OperationTracker, type RuntimeActivitySnapshot } from \"./operation-runtime.js\";\nimport { isValidAgentContextName } from \"./definition.js\";\nimport { assertAgentToolInputSchema, validateAgentToolInput } from \"./shared/schema.js\";\nimport type {\n AgentContextEntry,\n AgentContextInput,\n AgentContextRegistration,\n AgentToolDefinition,\n AgentToolExecutor,\n} from \"./types.js\";\nimport type { AgentToolExecutionEvent } from \"./internal-types.js\";\nimport {\n createBrowserToolset,\n type BrowserToolset,\n} from \"./browser/toolset.js\";\n\nexport interface ToolRuntimeOptions {\n readonly pageAutomation?: boolean;\n readonly routeSearch?: boolean;\n}\n\nexport interface ToolRuntimeToolChangeEvent {\n readonly toolName: string;\n readonly change: \"registered\" | \"unregistered\" | \"visibility\";\n}\n\nconst CONTEXT_ERROR_CODES = [\n \"CONTEXT_DISPOSED\",\n \"CONTEXT_NAME_MISMATCH\",\n \"DUPLICATE_CONTEXT\",\n \"INVALID_CONTEXT\",\n] as const;\n\ntype AgentContextErrorCode = typeof CONTEXT_ERROR_CODES[number];\n\nconst CONTEXT_ERROR_CODE_SET = new Set<string>(CONTEXT_ERROR_CODES);\nconst TOOL_ERROR_CODE_SET = new Set<string>(TOOL_ERROR_CODES);\n\nexport function isToolRuntimeError(error: unknown): error is {\n readonly type: \"tool_runtime_error\";\n readonly domain: \"tool\" | \"context\";\n readonly code: string;\n readonly message: string;\n readonly details?: unknown;\n} {\n if (!error || typeof error !== \"object\") return false;\n const candidate = error as Record<string, unknown>;\n if (\n candidate.type !== \"tool_runtime_error\"\n || typeof candidate.message !== \"string\"\n || typeof candidate.code !== \"string\"\n ) {\n return false;\n }\n if (candidate.domain === \"tool\") {\n return TOOL_ERROR_CODE_SET.has(candidate.code);\n }\n if (candidate.domain === \"context\") {\n return CONTEXT_ERROR_CODE_SET.has(candidate.code);\n }\n return false;\n}\n\nconst toolRuntimeBrand = Symbol.for(\"@nexface/tools/ToolRuntime\");\n\n/**\n * @experimental A logical operation spanning tool calls and human interaction.\n * @beta\n */\nexport interface ToolOperation {\n readonly id: string;\n /**\n * @experimental End the operation and wait for its admitted tool calls to settle.\n * @beta\n * @param options - Final outcome; defaults to completed. Does not cancel execution.\n * @returns A promise that resolves when outstanding calls have settled and the operation is released.\n */\n end(options?: { outcome?: \"completed\" | \"failed\" | \"cancelled\" }): Promise<void>;\n}\n\nexport interface ToolRuntime {\n readonly [toolRuntimeBrand]: true;\n\n /**\n * @experimental Begin a logical operation spanning one complete host-managed task.\n * @beta\n * @param options - Optional callback for cancellation requested from the operation UI.\n * @returns A handle that the host must end on completion, failure, or cancellation.\n * @throws An OPERATION_BUSY error if another operation or unscoped tool call is outstanding.\n * @remarks The host owns cancellation. Pass its signal to execute and external requests, then end the operation.\n */\n beginOperation(options?: { onCancel?: () => void }): ToolOperation;\n getTools(): readonly RuntimeAgentTool[];\n getContexts(options?: {\n signal?: AbortSignal;\n }): Promise<readonly AgentContextEntry[]>;\n /**\n * @experimental Execute a current Runtime Tool through the Runtime queue.\n * @beta\n * @param tool - The current tool object returned by this Runtime's getTools method.\n * @param input - Arguments matching the tool's input schema.\n * @param options - Optional cancellation signal and display-only progress label.\n * @returns The tool result, or a rejected promise when execution fails.\n * @remarks Joins the operation active when submitted. Rejects with OPERATION_BUSY while ending. Does not trigger user confirmation.\n */\n execute<TInput, TResult>(\n tool: RuntimeAgentTool<TInput, TResult>,\n input: TInput,\n options?: { signal?: AbortSignal; progressLabel?: string },\n ): Promise<TResult>;\n on(\n eventName: \"toolchange\",\n listener: (event: ToolRuntimeToolChangeEvent) => void,\n ): () => void;\n /**\n * @experimental Tool execution notifications may change in future releases.\n * @beta\n */\n on(\n eventName: \"toolexecution\",\n listener: (event: AgentToolExecutionEvent) => void,\n ): () => void;\n}\n\ntype RuntimeBinding = {\n resolveTarget?: (input: unknown) => HTMLElement | undefined;\n definition: AgentToolDefinition<any, any>;\n runtimeTool: RuntimeAgentTool<any, any>;\n execute: AgentToolExecutor<any, any>;\n getConfirmation?: () => AgentToolConfirmationConfig | undefined;\n lifecycleController: AbortController;\n};\n\n/**\n * @experimental Human-in-the-loop confirmation configuration.\n * @beta\n */\nexport type AgentToolConfirmationConfig =\n | {\n readonly mode: \"chat\";\n readonly title?: string;\n readonly description?: string;\n readonly confirmLabel?: string;\n readonly rejectLabel?: string;\n }\n | {\n readonly mode: \"page\";\n readonly title?: string;\n readonly description?: string;\n };\n\nexport interface RuntimeAgentTool<TInput = unknown, TResult = unknown> {\n readonly definition: AgentToolDefinition<TInput, TResult>;\n /**\n * @experimental Human-in-the-loop confirmation metadata.\n * @beta\n */\n readonly confirmation?: AgentToolConfirmationConfig | undefined;\n readonly lifecycleSignal: AbortSignal;\n}\n\nfunction compareStrings(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction assertContextName(name: string): void {\n if (!isValidAgentContextName(name)) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `Invalid or reserved context name: ${name}.`,\n );\n }\n}\n\nfunction normalizeContextValue(\n value: unknown,\n path = \"value\",\n seen = new WeakSet<object>(),\n): AgentContextEntry[\"value\"] {\n if (\n value === null\n || typeof value === \"string\"\n || typeof value === \"boolean\"\n ) {\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} must contain only finite numbers.`,\n );\n }\n return value;\n }\n if (!value || typeof value !== \"object\") {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} must be JSON serializable.`,\n );\n }\n if (seen.has(value)) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} contains a circular reference.`,\n );\n }\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n return value.map((item, index) =>\n normalizeContextValue(item, `${path}[${index}]`, seen));\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n `${path} must contain only plain objects.`,\n );\n }\n return Object.fromEntries(\n Object.keys(value)\n .sort(compareStrings)\n .map((key) => [\n key,\n normalizeContextValue(\n (value as Record<string, unknown>)[key],\n `${path}.${key}`,\n seen,\n ),\n ]),\n );\n } finally {\n seen.delete(value);\n }\n}\n\nfunction normalizeContext(context: AgentContextInput): AgentContextEntry {\n assertContextName(context.name);\n if (context.description !== undefined\n && (typeof context.description !== \"string\" || !context.description.trim())) {\n throw new AgentContextError(\n \"INVALID_CONTEXT\",\n \"Context description must be a non-empty string when provided.\",\n );\n }\n return {\n name: context.name,\n ...(context.description === undefined ? {} : { description: context.description }),\n value: normalizeContextValue(context.value),\n };\n}\n\nclass DetailEvent<T> extends Event {\n constructor(type: string, readonly detail: T) {\n super(type);\n }\n}\n\nexport class AgentContextError extends Error {\n readonly type = \"tool_runtime_error\" as const;\n readonly domain = \"context\" as const;\n\n constructor(\n readonly code: AgentContextErrorCode,\n message: string,\n ) {\n super(message);\n this.name = \"ToolRuntimeError\";\n }\n}\n\nexport interface InternalToolRuntime extends ToolRuntime, EventTarget {\n beginInternalOperation(options?: { signal?: AbortSignal; onCancel?: () => void; source?: \"host\" | \"webmcp\"; replaceWaiting?: ToolOperation; taskProgress?: TaskProgress }): ToolOperation;\n endBridgeOperation(handle: ToolOperation): Promise<void>;\n setTaskProgress(handle: ToolOperation, progress: TaskProgress): void;\n setOperationWaiting(handle: ToolOperation, waiting: boolean): void;\n getActivitySnapshot(): RuntimeActivitySnapshot;\n subscribeActivity(listener: () => void): () => void;\n requestOperationCancel(id: string): void;\n resolveTarget(tool: RuntimeAgentTool, input: unknown): HTMLElement | undefined;\n setPageActionFeedback(listener: (event: AgentToolExecutionEvent, feedback: PageActionFeedback, signal?: AbortSignal) => void | Promise<void>): () => void;\n register<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options?: {\n signal?: AbortSignal;\n getConfirmation?: () => AgentToolConfirmationConfig | undefined;\n resolveTarget?: (input: unknown) => HTMLElement | undefined;\n },\n ): () => void;\n registerContext(\n input: AgentContextInput,\n options?: { signal?: AbortSignal },\n ): AgentContextRegistration;\n getWebMcpTools(): readonly RuntimeAgentTool[];\n isRegistered(name: string): boolean;\n waitForTool(\n definition: AgentToolDefinition<any, any>,\n options?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<void>;\n getContextRevision(): number;\n getContextsNow(): readonly AgentContextEntry[];\n}\n\nconst runtimeInternals = new WeakMap<\n ToolRuntime,\n ToolRuntimeImplementation\n>();\n\nexport function createToolRuntime(\n options: ToolRuntimeOptions = {},\n): ToolRuntime {\n return new ToolRuntimeImplementation(options);\n}\n\nexport function getInternalToolRuntime(\n runtime: ToolRuntime,\n): InternalToolRuntime {\n const internal = runtimeInternals.get(runtime);\n if (!internal) {\n throw new AgentToolError(\n \"INVALID_TOOL_RUNTIME\",\n \"ToolRuntime must be created by createToolRuntime().\",\n );\n }\n return internal;\n}\n\nexport class ToolRuntimeImplementation\n extends EventTarget\n implements ToolRuntime, InternalToolRuntime\n{\n readonly [toolRuntimeBrand] = true as const;\n\n readonly #bindings = new Map<string, RuntimeBinding>();\n readonly #routeSearch: boolean;\n #visibleNavigation = new Set<RuntimeAgentTool>();\n readonly #contexts = new Map<string, AgentContextEntry>();\n #contextRevision = 0;\n readonly #browserToolset: BrowserToolset | undefined;\n readonly #browserRuntimeTools = new WeakMap<\n object,\n RuntimeAgentTool<any, any>\n >();\n #executionTail: Promise<void> | undefined;\n #pageActionFeedback: ((event: AgentToolExecutionEvent, feedback: PageActionFeedback, signal?: AbortSignal) => void | Promise<void>) | undefined;\n readonly #operations = new OperationTracker();\n\n beginOperation(options: { onCancel?: () => void } = {}): ToolOperation {\n return this.#operations.begin(options.onCancel ? { onCancel: options.onCancel } : {});\n }\n beginInternalOperation(options: Parameters<OperationTracker[\"begin\"]>[0] = {}): ToolOperation {\n return this.#operations.begin(options);\n }\n endBridgeOperation(handle: ToolOperation): Promise<void> { return this.#operations.disposeBridge(handle); }\n setTaskProgress = (handle: ToolOperation, progress: TaskProgress): void => this.#operations.setTaskProgress(handle, progress);\n setOperationWaiting = (handle: ToolOperation, waiting: boolean): void => this.#operations.setWaitingForUser(handle, waiting);\n getActivitySnapshot = (): RuntimeActivitySnapshot => this.#operations.getSnapshot();\n subscribeActivity = (listener: () => void): (() => void) => this.#operations.subscribe(listener);\n requestOperationCancel(id: string): void { this.#operations.requestCancel(id); }\n\n setPageActionFeedback(listener: (event: AgentToolExecutionEvent, feedback: PageActionFeedback, signal?: AbortSignal) => void | Promise<void>): () => void {\n this.#pageActionFeedback = listener;\n return () => { if (this.#pageActionFeedback === listener) this.#pageActionFeedback = undefined; };\n }\n\n #emitExecution(event: AgentToolExecutionEvent): void {\n this.#operations.observe(event);\n this.dispatchEvent(new DetailEvent(\"toolexecution\", event));\n }\n\n constructor(options: ToolRuntimeOptions = {}) {\n super();\n if (\n options.pageAutomation !== undefined &&\n typeof options.pageAutomation !== \"boolean\"\n ) {\n throw new AgentToolError(\"INVALID_INPUT\", \"pageAutomation must be a boolean.\");\n }\n if (options.routeSearch !== undefined && typeof options.routeSearch !== \"boolean\") {\n throw new AgentToolError(\"INVALID_INPUT\", \"routeSearch must be a boolean.\");\n }\n this.#routeSearch = options.routeSearch ?? false;\n if (this.#routeSearch) this.register(searchToolDefinition, ({ query, queries }) => {\n if (query !== undefined && queries !== undefined) throw new AgentToolError(\"INVALID_INPUT\", \"Use either query or queries, not both.\");\n const searchQueries = queries === undefined ? (query === undefined ? undefined : [query]) : [...queries];\n if (searchQueries?.some((phrase) => typeof phrase !== \"string\" || !phrase.trim())) throw new AgentToolError(\"INVALID_INPUT\", \"Search queries must contain nonblank strings.\");\n const navigation = this.getRegisteredTools().filter(({ definition }) => definition.effect === \"navigate\");\n const candidates = searchQueries === undefined ? navigation : searchNavigationTools(navigation, searchQueries.map((phrase) => phrase.trim()));\n if (searchQueries !== undefined) {\n const previous = this.#visibleNavigation;\n this.#visibleNavigation = new Set(candidates);\n for (const tool of new Set([...previous, ...candidates])) {\n if (previous.has(tool) === this.#visibleNavigation.has(tool)) continue;\n this.dispatchEvent(new DetailEvent(\"toolchange\", Object.freeze({\n toolName: tool.definition.name,\n change: \"visibility\" as const,\n })));\n }\n }\n return { tools: candidates.map(({ definition: { name, description } }) => ({ name, description })) };\n });\n this.#browserToolset = options.pageAutomation ? createBrowserToolset() : undefined;\n runtimeInternals.set(this, this);\n const controller = Object.freeze<RuntimeController>({\n beginInternalOperation: (options) => this.beginInternalOperation(options),\n setOperationWaiting: this.setOperationWaiting,\n setTaskProgress: this.setTaskProgress,\n getOperationSnapshot: () => this.getActivitySnapshot().operation,\n subscribeOperation: this.subscribeActivity,\n getRegisteredTools: () => this.getRegisteredTools(),\n });\n Object.defineProperty(this, runtimeControllerSymbol, { value: controller });\n }\n\n on(\n eventName: \"toolchange\",\n listener: (event: ToolRuntimeToolChangeEvent) => void,\n ): () => void;\n on(\n eventName: \"toolexecution\",\n listener: (event: AgentToolExecutionEvent) => void,\n ): () => void;\n on(\n eventName: \"toolchange\" | \"toolexecution\",\n listener: ((event: ToolRuntimeToolChangeEvent) => void) | ((event: AgentToolExecutionEvent) => void),\n ): () => void {\n const handleEvent = (event: Event) => {\n if (eventName === \"toolchange\") {\n (listener as (event: ToolRuntimeToolChangeEvent) => void)(\n (event as Event & { detail: ToolRuntimeToolChangeEvent }).detail,\n );\n } else {\n (listener as (event: AgentToolExecutionEvent) => void)(\n (event as Event & { detail: AgentToolExecutionEvent }).detail,\n );\n }\n };\n this.addEventListener(eventName, handleEvent);\n let subscribed = true;\n return () => {\n if (!subscribed) return;\n subscribed = false;\n this.removeEventListener(eventName, handleEvent);\n };\n }\n\n register<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n execute: AgentToolExecutor<TInput, TResult>,\n options: {\n signal?: AbortSignal;\n getConfirmation?: () => AgentToolConfirmationConfig | undefined;\n resolveTarget?: (input: unknown) => HTMLElement | undefined;\n } = {},\n ): () => void {\n assertAgentToolInputSchema(definition.inputSchema, `Tool \"${definition.name}\".inputSchema`);\n if (this.#bindings.has(definition.name)) {\n throw new AgentToolError(\n \"DUPLICATE_BINDING\",\n `Tool \"${definition.name}\" already has an active binding.`,\n );\n }\n const lifecycleController = new AbortController();\n const runtimeTool = Object.freeze({\n definition,\n get confirmation() {\n const confirmation = options.getConfirmation?.();\n return confirmation === undefined\n ? undefined\n : Object.freeze({ ...confirmation });\n },\n lifecycleSignal: lifecycleController.signal,\n }) satisfies RuntimeAgentTool<TInput, TResult>;\n const binding: RuntimeBinding = {\n ...(options.resolveTarget ? { resolveTarget: options.resolveTarget } : {}),\n definition,\n runtimeTool,\n execute,\n ...(options.getConfirmation\n ? { getConfirmation: options.getConfirmation }\n : {}),\n lifecycleController,\n };\n this.#bindings.set(definition.name, binding);\n this.dispatchEvent(\n new DetailEvent(\"toolchange\", Object.freeze({\n toolName: definition.name,\n change: \"registered\" as const,\n })),\n );\n\n let disposed = false;\n const dispose = () => {\n if (disposed || this.#bindings.get(definition.name) !== binding) return;\n disposed = true;\n options.signal?.removeEventListener(\"abort\", dispose);\n this.#bindings.delete(definition.name);\n this.#visibleNavigation.delete(runtimeTool);\n lifecycleController.abort();\n this.dispatchEvent(\n new DetailEvent(\"toolchange\", Object.freeze({\n toolName: definition.name,\n change: \"unregistered\" as const,\n })),\n );\n };\n if (options.signal?.aborted) dispose();\n else options.signal?.addEventListener(\"abort\", dispose, { once: true });\n return dispose;\n }\n\n registerContext(\n input: AgentContextInput,\n options: { signal?: AbortSignal } = {},\n ): AgentContextRegistration {\n const initial = normalizeContext(input);\n if (this.#contexts.has(initial.name)) {\n throw new AgentContextError(\n \"DUPLICATE_CONTEXT\",\n `Context \"${initial.name}\" already has an active registration.`,\n );\n }\n this.#contexts.set(initial.name, initial);\n this.#notifyContextChange(initial.name, \"registered\");\n\n let disposed = false;\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n options.signal?.removeEventListener(\"abort\", dispose);\n if (this.#contexts.delete(initial.name)) {\n this.#notifyContextChange(initial.name, \"disposed\");\n }\n };\n const update = (nextInput: AgentContextInput) => {\n if (disposed) {\n throw new AgentContextError(\n \"CONTEXT_DISPOSED\",\n `Context \"${initial.name}\" registration has been disposed.`,\n );\n }\n const next = normalizeContext(nextInput);\n if (next.name !== initial.name) {\n throw new AgentContextError(\n \"CONTEXT_NAME_MISMATCH\",\n `Context registration \"${initial.name}\" cannot be updated to \"${next.name}\".`,\n );\n }\n if (JSON.stringify(this.#contexts.get(initial.name)) === JSON.stringify(next)) return;\n this.#contexts.set(initial.name, next);\n this.#notifyContextChange(initial.name, \"updated\");\n };\n if (options.signal?.aborted) dispose();\n else options.signal?.addEventListener(\"abort\", dispose, { once: true });\n return { update, dispose };\n }\n\n getContextsNow(): readonly AgentContextEntry[] {\n return [...this.#contexts.values()]\n .sort((left, right) => compareStrings(left.name, right.name))\n .map(normalizeContext);\n }\n\n getContextRevision(): number {\n return this.#contextRevision;\n }\n\n async getContexts(\n options: { signal?: AbortSignal } = {},\n ): Promise<readonly AgentContextEntry[]> {\n options.signal?.throwIfAborted();\n await Promise.resolve();\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n let frameId: number | undefined;\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const cleanup = () => {\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (frameId !== undefined && typeof cancelAnimationFrame === \"function\") {\n cancelAnimationFrame(frameId);\n }\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n };\n const settle = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(options.signal?.reason);\n };\n const afterTask = () => {\n timeoutId = undefined;\n if (typeof requestAnimationFrame !== \"function\") {\n settle();\n return;\n }\n frameId = requestAnimationFrame(settle);\n timeoutId = setTimeout(settle, 50);\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted) {\n onAbort();\n return;\n }\n timeoutId = setTimeout(afterTask, 0);\n });\n await Promise.resolve();\n options.signal?.throwIfAborted();\n return this.getContextsNow();\n }\n\n #notifyContextChange(\n name: string,\n change: \"registered\" | \"updated\" | \"disposed\",\n ): void {\n this.#contextRevision += 1;\n this.dispatchEvent(new DetailEvent(\"contextchange\", {\n name,\n change,\n revision: this.#contextRevision,\n }));\n }\n\n getRegisteredTools(): readonly RuntimeAgentTool[] {\n return [...this.#bindings.values()]\n .map(({ runtimeTool }) => runtimeTool)\n .filter(({ definition }) => !this.#routeSearch || definition !== searchToolDefinition)\n .sort((left, right) => compareStrings(left.definition.name, right.definition.name));\n }\n\n getWebMcpTools(): readonly RuntimeAgentTool[] {\n return [...this.#bindings.values()]\n .map(({ runtimeTool }) => runtimeTool)\n .filter((tool) => !this.#routeSearch || tool.definition.effect !== \"navigate\" || this.#visibleNavigation.has(tool))\n .sort((left, right) => compareStrings(left.definition.name, right.definition.name));\n }\n\n isRegistered(name: string): boolean {\n return this.#bindings.has(name);\n }\n\n getTools(): readonly RuntimeAgentTool[] {\n const applicationTools = this.getWebMcpTools();\n const browserTools = (this.#browserToolset?.definitions ?? [])\n .map((definition) => this.#getBrowserRuntimeTool(definition));\n return [...applicationTools, ...browserTools]\n .sort((left, right) => compareStrings(\n left.definition.name,\n right.definition.name,\n ));\n }\n\n waitForTool(\n definition: AgentToolDefinition<any, any>,\n options: { signal?: AbortSignal; timeoutMs?: number } = {},\n ): Promise<void> {\n const isTargetRegistered = () => this.#bindings.has(definition.name);\n if (isTargetRegistered()) return Promise.resolve();\n const timeoutMs = Math.max(1, options.timeoutMs ?? 5_000);\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n this.removeEventListener(\"toolchange\", onToolChange);\n options.signal?.removeEventListener(\"abort\", onAbort);\n clearTimeout(timeoutId);\n };\n const settle = (callback: () => void) => {\n if (settled) return;\n settled = true;\n cleanup();\n callback();\n };\n const onToolChange = (event: Event) => {\n const detail = (event as Event & {\n detail?: ToolRuntimeToolChangeEvent;\n }).detail;\n if (\n detail?.toolName !== definition.name\n || detail.change !== \"registered\"\n ) return;\n if (isTargetRegistered()) settle(resolve);\n };\n const onAbort = () => settle(() => reject(options.signal?.reason));\n const timeoutId = setTimeout(() => {\n settle(() =>\n reject(\n new AgentToolError(\n \"TOOL_REGISTRATION_TIMEOUT\",\n `Tool \"${definition.name}\" did not register within ${timeoutMs}ms.`,\n {\n toolName: definition.name,\n timeoutMs,\n retryable: false,\n browserFallbackAllowed: true,\n toolExecuted: false,\n },\n ),\n ));\n }, timeoutMs);\n this.addEventListener(\"toolchange\", onToolChange);\n if (options.signal?.aborted) onAbort();\n else options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (isTargetRegistered()) settle(resolve);\n });\n }\n\n execute<TInput, TResult>(\n tool: RuntimeAgentTool<TInput, TResult>,\n input: TInput,\n options: InternalExecutionOptions = {},\n ): Promise<TResult> {\n const label = options.progressLabel?.trim().replace(/\\s+/g, \" \").slice(0, 48);\n options = { ...(options.signal ? { signal: options.signal } : {}), ...(label ? { progressLabel: label } : {}), ...(options[pageDecisionSymbol] ? { [pageDecisionSymbol]: true } : {}) };\n const definition = tool.definition;\n const name = definition.name;\n const binding = this.#bindings.get(name);\n if (binding) {\n if (binding.runtimeTool !== tool) {\n return Promise.reject(\n new AgentToolError(\n \"CONTRACT_MISMATCH\",\n `Tool \"${name}\" is registered with a different Runtime Tool.`,\n ),\n );\n }\n return this.#enqueue(\n (operationId) => this.#executeApplication(name, input, options, binding, operationId),\n options.signal,\n ) as Promise<TResult>;\n }\n try {\n const browserToolset = this.#browserToolset;\n const browserHandler = browserToolset?.handlers.get(name);\n if (!browserHandler) {\n return Promise.reject(\n new AgentToolError(\"UNKNOWN_TOOL\", `Unknown tool: ${name}.`),\n );\n }\n if (\n !browserToolset?.definitions.some((candidate) => candidate === definition)\n || this.#getBrowserRuntimeTool(definition) !== tool\n ) {\n return Promise.reject(\n new AgentToolError(\n \"CONTRACT_MISMATCH\",\n `Tool \"${name}\" is registered with a different Definition.`,\n ),\n );\n }\n return this.#enqueue((operationId) => this.#observeExecution(tool, input, options.signal, async (onFeedback, assertActive) => {\n const signal = options.signal ?? new AbortController().signal;\n signal.throwIfAborted();\n return browserHandler.execute(input as Record<string, unknown>, {\n signal,\n ...(onFeedback ? { onFeedback } : {}),\n ...(assertActive ? { assertActive } : {}),\n ...(options[pageDecisionSymbol] ? { pageDecision: true } : {}),\n });\n }, options.progressLabel, operationId), options.signal) as Promise<TResult>;\n } catch (error) {\n return Promise.reject(error);\n }\n }\n\n #enqueue<TResult>(\n execute: (operationId?: string) => Promise<TResult>,\n signal?: AbortSignal,\n ): Promise<TResult> {\n if (signal?.aborted) return Promise.reject(signal.reason);\n let admission: ReturnType<OperationTracker[\"admit\"]>;\n try { admission = this.#operations.admit(); }\n catch (error) { return Promise.reject(error); }\n const previous = this.#executionTail;\n let removeQueuedAbort = () => {};\n const start = async () => {\n removeQueuedAbort();\n try {\n signal?.throwIfAborted();\n return await execute(admission.operationId);\n } finally { admission.release(); }\n };\n // Reserve the tail before invoking executors or notifying synchronous listeners.\n let settleTail!: () => void;\n const tail = new Promise<void>((resolve) => { settleTail = resolve; });\n this.#executionTail = tail;\n const queuedExecution = previous ? previous.then(start) : start();\n let execution = queuedExecution;\n if (previous && signal) {\n execution = new Promise((resolve, reject) => {\n const onAbort = () => {\n removeQueuedAbort();\n admission.release();\n reject(signal.reason);\n };\n removeQueuedAbort = () => signal.removeEventListener(\"abort\", onAbort);\n queuedExecution.then(resolve, reject);\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n void queuedExecution.then(settleTail, settleTail);\n void tail.then(() => {\n if (this.#executionTail === tail) this.#executionTail = undefined;\n });\n return execution;\n }\n\n resolveTarget(tool: RuntimeAgentTool, input: unknown): HTMLElement | undefined {\n const binding = this.#bindings.get(tool.definition.name);\n if (binding?.runtimeTool === tool) {\n const target = binding.resolveTarget?.(input);\n return target?.isConnected ? target : undefined;\n }\n if (this.#browserRuntimeTools.get(tool.definition) !== tool || !input || typeof input !== \"object\") return undefined;\n return this.#browserToolset?.handlers.get(tool.definition.name)?.resolveTarget?.(input as Record<string, unknown>);\n }\n\n async #observeExecution(\n tool: RuntimeAgentTool<any, any>,\n input: unknown,\n signal: AbortSignal | undefined,\n execute: (onFeedback?: PageFeedbackListener, assertActive?: () => void) => Promise<unknown>,\n progressLabel?: string,\n operationId?: string,\n ): Promise<unknown> {\n const running: AgentToolExecutionEvent = {\n ...(operationId ? { operationId } : {}),\n id: globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`,\n name: tool.definition.name,\n tool,\n status: \"running\",\n startedAt: Date.now(),\n input,\n ...(progressLabel ? { progressLabel } : {}),\n };\n const presentation = this.#pageActionFeedback;\n const assertActive = () => {\n signal?.throwIfAborted();\n if (presentation && this.#pageActionFeedback !== presentation) {\n throw new PageCommandError({ code: \"EXECUTION_CANCELLED\", message: \"Page action presentation was detached.\" });\n }\n };\n this.#emitExecution(running);\n try {\n assertActive();\n const result = await execute(async (feedback) => {\n assertActive();\n if (presentation) await measurePagePhase(\"presentation\", async () => { await presentation(running, feedback, signal); });\n assertActive();\n }, assertActive);\n signal?.throwIfAborted();\n this.#emitExecution({\n ...running, status: \"success\", finishedAt: Date.now(), result,\n } satisfies AgentToolExecutionEvent);\n return result;\n } catch (error) {\n this.#emitExecution({\n ...running, status: \"error\", cancelled: signal?.aborted === true,\n finishedAt: Date.now(), error,\n } satisfies AgentToolExecutionEvent);\n throw error;\n }\n }\n\n async #executeApplication(\n name: string,\n input: unknown,\n options: { signal?: AbortSignal; progressLabel?: string },\n binding: RuntimeBinding,\n operationId?: string,\n ): Promise<unknown> {\n const id = globalThis.crypto?.randomUUID?.()\n ?? `${Date.now()}-${Math.random()}`;\n const startedAt = Date.now();\n const running: AgentToolExecutionEvent = {\n ...(operationId ? { operationId } : {}),\n id,\n name,\n tool: binding.runtimeTool,\n ...(options.progressLabel ? { progressLabel: options.progressLabel } : {}),\n status: \"running\",\n startedAt,\n input,\n };\n this.#emitExecution(running);\n try {\n if (this.#bindings.get(name) !== binding) {\n throw new AgentToolError(\n \"UNKNOWN_TOOL\",\n `Tool \"${name}\" is no longer registered for this call.`,\n );\n }\n const errors = validateAgentToolInput(binding.definition.inputSchema, input);\n if (errors.length) {\n throw new AgentToolError(\"INVALID_INPUT\", errors.join(\" \"), { errors });\n }\n const signal = options.signal ?? new AbortController().signal;\n signal.throwIfAborted();\n const result = await binding.execute(input, {\n signal,\n waitForTool: (definition, waitOptions = {}) =>\n this.waitForTool(definition, { signal, ...waitOptions }),\n });\n signal.throwIfAborted();\n this.#emitExecution({\n ...running,\n status: \"success\",\n finishedAt: Date.now(),\n result,\n } satisfies AgentToolExecutionEvent);\n return result;\n } catch (error) {\n this.#emitExecution({\n ...running,\n status: \"error\",\n cancelled: options.signal?.aborted === true,\n finishedAt: Date.now(),\n error,\n } satisfies AgentToolExecutionEvent);\n throw error;\n }\n }\n\n #getBrowserRuntimeTool<TInput, TResult>(\n definition: AgentToolDefinition<TInput, TResult>,\n ): RuntimeAgentTool<TInput, TResult> {\n const existing = this.#browserRuntimeTools.get(definition);\n if (existing) return existing as RuntimeAgentTool<TInput, TResult>;\n const runtimeTool = Object.freeze({\n definition,\n confirmation: undefined,\n lifecycleSignal: new AbortController().signal,\n }) satisfies RuntimeAgentTool<TInput, TResult>;\n this.#browserRuntimeTools.set(definition, runtimeTool);\n return runtimeTool;\n }\n\n}\n"]}
|
|
@@ -12,6 +12,7 @@ interface OperationSnapshot {
|
|
|
12
12
|
readonly taskProgress?: TaskProgress;
|
|
13
13
|
}
|
|
14
14
|
export interface RuntimeController {
|
|
15
|
+
getRegisteredTools(): ReturnType<ToolRuntime["getTools"]>;
|
|
15
16
|
beginInternalOperation(options?: {
|
|
16
17
|
signal?: AbortSignal;
|
|
17
18
|
onCancel?: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-controller.js","sourceRoot":"","sources":["../../src/shared/runtime-controller.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAGrE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-controller.js","sourceRoot":"","sources":["../../src/shared/runtime-controller.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAGrE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwB7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAEvF,MAAM,UAAU,oBAAoB,CAAC,OAAoB;IACvD,MAAM,UAAU,GAAI,OAA2E,CAAC,uBAAuB,CAAC,CAAC;IACzH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,cAAc,CAAC,sBAAsB,EAAE,iGAAiG,CAAC,CAAC;IACtJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["// Generated from shared/runtime-controller.ts. Do not edit manually.\n\nimport type { ToolOperation, ToolRuntime } from \"../runtime.js\";\nimport { AgentToolError } from \"./errors.js\";\n\nexport type TaskProgress = { readonly phase: \"processing\" } | { readonly phase: \"tool\"; readonly toolCallId: string; readonly progressLabel?: string };\n\ninterface OperationSnapshot {\n readonly id: string;\n readonly status: \"running\" | \"waiting\" | \"cancelling\" | \"ending\";\n readonly taskProgress?: TaskProgress;\n}\n\nexport interface RuntimeController {\n getRegisteredTools(): ReturnType<ToolRuntime[\"getTools\"]>;\n beginInternalOperation(options?: {\n signal?: AbortSignal;\n onCancel?: () => void;\n replaceWaiting?: ToolOperation;\n taskProgress?: TaskProgress;\n }): ToolOperation;\n setOperationWaiting(handle: ToolOperation, waiting: boolean): void;\n setTaskProgress(handle: ToolOperation, progress: TaskProgress): void;\n getOperationSnapshot(): OperationSnapshot | null;\n subscribeOperation(listener: () => void): () => void;\n}\n\nexport const runtimeControllerSymbol = Symbol.for(\"@nexface/tools/runtime-controller\");\n\nexport function getRuntimeController(runtime: ToolRuntime): RuntimeController {\n const controller = (runtime as ToolRuntime & { [runtimeControllerSymbol]?: RuntimeController })[runtimeControllerSymbol];\n if (!controller) {\n throw new AgentToolError(\"INVALID_TOOL_RUNTIME\", \"ToolRuntime does not support internal task coordination. Use matching Nexface package versions.\");\n }\n return controller;\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RuntimeAgentTool } from "./runtime.js";
|
|
2
|
+
export declare const searchToolDefinition: import("./types.js").AgentToolDefinition<{
|
|
3
|
+
query?: string;
|
|
4
|
+
queries?: string[];
|
|
5
|
+
}, {
|
|
6
|
+
tools: Array<{
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
}>;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function searchNavigationTools(tools: readonly RuntimeAgentTool[], query: string | readonly string[]): RuntimeAgentTool[];
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createAgentToolDefinition } from "./shared/definition.js";
|
|
2
|
+
export const searchToolDefinition = createAgentToolDefinition({
|
|
3
|
+
name: "searchTool",
|
|
4
|
+
description: "Search registered navigation tools when opening a page with no suitable callable navigation tool. Use query for one phrase or queries for alternative phrasings of the same task. Results replace visible candidates (max 5). Call a match from the refreshed catalog, then use the page's tools. If none fits, call {} for the directory, then query an exact name.",
|
|
5
|
+
effect: "read",
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
query: { type: "string", description: "Page name, purpose, or exact navigation tool name." },
|
|
10
|
+
queries: { type: "array", description: "Alternative search phrases for the same navigation task. Use instead of query.", minItems: 1, maxItems: 3, items: { type: "string", minLength: 1 } },
|
|
11
|
+
},
|
|
12
|
+
additionalProperties: false,
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
function tokenize(text, segmenter) {
|
|
16
|
+
const normalized = text.normalize("NFKC").replace(/([a-z0-9])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").toLowerCase();
|
|
17
|
+
if (segmenter) {
|
|
18
|
+
return [...segmenter.segment(normalized)].filter((part) => part.isWordLike).map((part) => part.segment);
|
|
19
|
+
}
|
|
20
|
+
return (normalized.match(/\p{Script=Han}+|[\p{L}\p{N}]+/gu) ?? []).flatMap((word) => {
|
|
21
|
+
if (!/^\p{Script=Han}+$/u.test(word))
|
|
22
|
+
return [word];
|
|
23
|
+
const characters = [...word];
|
|
24
|
+
return characters.length < 2 ? characters : characters.slice(1).map((character, index) => characters[index] + character);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function schemaText(value) {
|
|
28
|
+
if (!value || typeof value !== "object")
|
|
29
|
+
return [];
|
|
30
|
+
if (Array.isArray(value))
|
|
31
|
+
return value.flatMap(schemaText);
|
|
32
|
+
const schema = value;
|
|
33
|
+
return Object.entries(schema).flatMap(([key, child]) => {
|
|
34
|
+
if (key === "description" && typeof child === "string")
|
|
35
|
+
return [child];
|
|
36
|
+
if (key === "properties" && child && typeof child === "object") {
|
|
37
|
+
return Object.entries(child).flatMap(([name, property]) => [name, ...schemaText(property)]);
|
|
38
|
+
}
|
|
39
|
+
return child && typeof child === "object" ? schemaText(child) : [];
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export function searchNavigationTools(tools, query) {
|
|
43
|
+
if (typeof query !== "string") {
|
|
44
|
+
const queries = [...new Set(query)];
|
|
45
|
+
if (queries.length === 1)
|
|
46
|
+
return searchNavigationTools(tools, queries[0]);
|
|
47
|
+
// Fuse ranks rather than comparing BM25 scores across different queries.
|
|
48
|
+
const scores = new Map();
|
|
49
|
+
for (const phrase of queries) {
|
|
50
|
+
searchNavigationTools(tools, phrase).forEach((tool, index) => {
|
|
51
|
+
scores.set(tool, (scores.get(tool) ?? 0) + 1 / (60 + index + 1));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return [...scores].sort(([left, a], [right, b]) => {
|
|
55
|
+
const x = left.definition.name;
|
|
56
|
+
const y = right.definition.name;
|
|
57
|
+
return b - a || (x < y ? -1 : x > y ? 1 : 0);
|
|
58
|
+
}).slice(0, 5).map(([tool]) => tool);
|
|
59
|
+
}
|
|
60
|
+
const exact = tools.find((tool) => tool.definition.name === query);
|
|
61
|
+
if (exact)
|
|
62
|
+
return [exact];
|
|
63
|
+
const segmenter = typeof Intl.Segmenter === "function" ? new Intl.Segmenter("zh", { granularity: "word" }) : undefined;
|
|
64
|
+
const terms = [...new Set(tokenize(query, segmenter))];
|
|
65
|
+
if (!terms.length || !tools.length)
|
|
66
|
+
return [];
|
|
67
|
+
const documents = tools.map((tool) => {
|
|
68
|
+
const { name, description, inputSchema } = tool.definition;
|
|
69
|
+
const tokens = tokenize([name, description, ...schemaText(inputSchema)].join(" "), segmenter);
|
|
70
|
+
const frequencies = new Map();
|
|
71
|
+
for (const token of tokens)
|
|
72
|
+
frequencies.set(token, (frequencies.get(token) ?? 0) + 1);
|
|
73
|
+
return { tool, length: tokens.length, frequencies };
|
|
74
|
+
});
|
|
75
|
+
const averageLength = documents.reduce((sum, document) => sum + document.length, 0) / documents.length || 1;
|
|
76
|
+
const idf = new Map(terms.map((term) => {
|
|
77
|
+
const count = documents.filter((document) => document.frequencies.has(term)).length;
|
|
78
|
+
return [term, Math.log(1 + (documents.length - count + 0.5) / (count + 0.5))];
|
|
79
|
+
}));
|
|
80
|
+
return documents.map((document) => {
|
|
81
|
+
const score = terms.reduce((sum, term) => {
|
|
82
|
+
const frequency = document.frequencies.get(term) ?? 0;
|
|
83
|
+
return sum + idf.get(term) * frequency * 2.2 / (frequency + 1.2 * (0.25 + 0.75 * document.length / averageLength));
|
|
84
|
+
}, 0);
|
|
85
|
+
return { tool: document.tool, score };
|
|
86
|
+
}).filter(({ score }) => score > 0).sort((left, right) => {
|
|
87
|
+
const a = left.tool.definition.name;
|
|
88
|
+
const b = right.tool.definition.name;
|
|
89
|
+
return right.score - left.score || (a < b ? -1 : a > b ? 1 : 0);
|
|
90
|
+
}).slice(0, 5).map(({ tool }) => tool);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tool-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-search.js","sourceRoot":"","sources":["../src/tool-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { createAgentToolDefinition } from \"./shared/definition.js\";\nimport type { RuntimeAgentTool } from \"./runtime.js\";\n\nexport const searchToolDefinition = createAgentToolDefinition<{ query?: string; queries?: string[] }, {\n tools: Array<{ name: string; description: string }>;\n}>({\n name: \"searchTool\",\n description: \"Search registered navigation tools when opening a page with no suitable callable navigation tool. Use query for one phrase or queries for alternative phrasings of the same task. Results replace visible candidates (max 5). Call a match from the refreshed catalog, then use the page's tools. If none fits, call {} for the directory, then query an exact name.\",\n effect: \"read\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Page name, purpose, or exact navigation tool name.\" },\n queries: { type: \"array\", description: \"Alternative search phrases for the same navigation task. Use instead of query.\", minItems: 1, maxItems: 3, items: { type: \"string\", minLength: 1 } },\n },\n additionalProperties: false,\n },\n});\n\nfunction tokenize(text: string, segmenter: Intl.Segmenter | undefined): string[] {\n const normalized = text.normalize(\"NFKC\").replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]+/g, \" \").toLowerCase();\n if (segmenter) {\n return [...segmenter.segment(normalized)].filter((part) => part.isWordLike).map((part) => part.segment);\n }\n return (normalized.match(/\\p{Script=Han}+|[\\p{L}\\p{N}]+/gu) ?? []).flatMap((word) => {\n if (!/^\\p{Script=Han}+$/u.test(word)) return [word];\n const characters = [...word];\n return characters.length < 2 ? characters : characters.slice(1).map((character, index) => characters[index]! + character);\n });\n}\n\nfunction schemaText(value: unknown): string[] {\n if (!value || typeof value !== \"object\") return [];\n if (Array.isArray(value)) return value.flatMap(schemaText);\n const schema = value as Record<string, unknown>;\n return Object.entries(schema).flatMap(([key, child]) => {\n if (key === \"description\" && typeof child === \"string\") return [child];\n if (key === \"properties\" && child && typeof child === \"object\") {\n return Object.entries(child).flatMap(([name, property]) => [name, ...schemaText(property)]);\n }\n return child && typeof child === \"object\" ? schemaText(child) : [];\n });\n}\n\nexport function searchNavigationTools(tools: readonly RuntimeAgentTool[], query: string | readonly string[]): RuntimeAgentTool[] {\n if (typeof query !== \"string\") {\n const queries = [...new Set(query)];\n if (queries.length === 1) return searchNavigationTools(tools, queries[0]!);\n // Fuse ranks rather than comparing BM25 scores across different queries.\n const scores = new Map<RuntimeAgentTool, number>();\n for (const phrase of queries) {\n searchNavigationTools(tools, phrase).forEach((tool, index) => {\n scores.set(tool, (scores.get(tool) ?? 0) + 1 / (60 + index + 1));\n });\n }\n return [...scores].sort(([left, a], [right, b]) => {\n const x = left.definition.name;\n const y = right.definition.name;\n return b - a || (x < y ? -1 : x > y ? 1 : 0);\n }).slice(0, 5).map(([tool]) => tool);\n }\n const exact = tools.find((tool) => tool.definition.name === query);\n if (exact) return [exact];\n const segmenter = typeof Intl.Segmenter === \"function\" ? new Intl.Segmenter(\"zh\", { granularity: \"word\" }) : undefined;\n const terms = [...new Set(tokenize(query, segmenter))];\n if (!terms.length || !tools.length) return [];\n const documents = tools.map((tool) => {\n const { name, description, inputSchema } = tool.definition;\n const tokens = tokenize([name, description, ...schemaText(inputSchema)].join(\" \"), segmenter);\n const frequencies = new Map<string, number>();\n for (const token of tokens) frequencies.set(token, (frequencies.get(token) ?? 0) + 1);\n return { tool, length: tokens.length, frequencies };\n });\n const averageLength = documents.reduce((sum, document) => sum + document.length, 0) / documents.length || 1;\n const idf = new Map(terms.map((term) => {\n const count = documents.filter((document) => document.frequencies.has(term)).length;\n return [term, Math.log(1 + (documents.length - count + 0.5) / (count + 0.5))];\n }));\n return documents.map((document) => {\n const score = terms.reduce((sum, term) => {\n const frequency = document.frequencies.get(term) ?? 0;\n return sum + idf.get(term)! * frequency * 2.2 / (frequency + 1.2 * (0.25 + 0.75 * document.length / averageLength));\n }, 0);\n return { tool: document.tool, score };\n }).filter(({ score }) => score > 0).sort((left, right) => {\n const a = left.tool.definition.name;\n const b = right.tool.definition.name;\n return right.score - left.score || (a < b ? -1 : a > b ? 1 : 0);\n }).slice(0, 5).map(({ tool }) => tool);\n}\n"]}
|