@nexface/tools 0.1.1-alpha.0 → 0.1.1-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/browser/controller.js +5 -4
  2. package/dist/browser/controller.js.map +1 -1
  3. package/dist/browser/dom.js +1 -2
  4. package/dist/browser/dom.js.map +1 -1
  5. package/dist/browser/feedback.js.map +1 -1
  6. package/dist/browser/focus.d.ts +2 -0
  7. package/dist/browser/focus.js +15 -0
  8. package/dist/browser/focus.js.map +1 -0
  9. package/dist/browser/locator.js.map +1 -1
  10. package/dist/browser/prompt.d.ts +1 -1
  11. package/dist/browser/prompt.generated.d.ts +1 -1
  12. package/dist/browser/prompt.generated.js +2 -2
  13. package/dist/browser/prompt.generated.js.map +1 -1
  14. package/dist/browser/prompt.js.map +1 -1
  15. package/dist/browser/snapshot.js.map +1 -1
  16. package/dist/browser/toolset.d.ts +12 -6
  17. package/dist/browser/toolset.js +18 -7
  18. package/dist/browser/toolset.js.map +1 -1
  19. package/dist/browser/types.js.map +1 -1
  20. package/dist/browser/worker-runner.js.map +1 -1
  21. package/dist/definition.js +10 -5
  22. package/dist/definition.js.map +1 -1
  23. package/dist/errors.d.ts +10 -0
  24. package/dist/errors.js +34 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.browser.d.ts +3 -0
  27. package/dist/index.browser.js +4 -0
  28. package/dist/index.browser.js.map +1 -0
  29. package/dist/index.d.ts +4 -5
  30. package/dist/index.js +2 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/internal-react.d.ts +1 -1
  33. package/dist/internal-react.js +0 -1
  34. package/dist/internal-react.js.map +1 -1
  35. package/dist/internal-types.d.ts +9 -0
  36. package/dist/internal-types.js.map +1 -1
  37. package/dist/internal.d.ts +3 -2
  38. package/dist/internal.js +1 -0
  39. package/dist/internal.js.map +1 -1
  40. package/dist/navigation.js.map +1 -1
  41. package/dist/operation-lock.d.ts +3 -0
  42. package/dist/operation-lock.js +46 -0
  43. package/dist/operation-lock.js.map +1 -0
  44. package/dist/operation-runtime.d.ts +44 -0
  45. package/dist/operation-runtime.js +153 -0
  46. package/dist/operation-runtime.js.map +1 -0
  47. package/dist/operation-surface.d.ts +2 -2
  48. package/dist/operation-surface.js +110 -65
  49. package/dist/operation-surface.js.map +1 -1
  50. package/dist/operation-types.d.ts +1 -1
  51. package/dist/operation-types.js.map +1 -1
  52. package/dist/operation-view.d.ts +8 -2
  53. package/dist/operation-view.js +30 -61
  54. package/dist/operation-view.js.map +1 -1
  55. package/dist/react.d.ts +24 -0
  56. package/dist/react.js.map +1 -1
  57. package/dist/registration.d.ts +11 -0
  58. package/dist/registration.js +12 -0
  59. package/dist/registration.js.map +1 -0
  60. package/dist/runtime.d.ts +58 -13
  61. package/dist/runtime.js +73 -81
  62. package/dist/runtime.js.map +1 -1
  63. package/dist/schema.d.ts +1 -0
  64. package/dist/schema.js +185 -32
  65. package/dist/schema.js.map +1 -1
  66. package/dist/styles.css +11 -7
  67. package/dist/types.d.ts +11 -1
  68. package/dist/types.js.map +1 -1
  69. package/dist/webmcp.js +163 -9
  70. package/dist/webmcp.js.map +1 -1
  71. package/package.json +7 -12
  72. package/dist/operation-host.d.ts +0 -17
  73. package/dist/operation-host.js +0 -9
  74. package/dist/operation-host.js.map +0 -1
package/dist/webmcp.js CHANGED
@@ -2,19 +2,145 @@ function getWebMcpModelContext() {
2
2
  if (typeof document === "undefined")
3
3
  return undefined;
4
4
  const modelContext = document.modelContext;
5
- return typeof modelContext?.registerTool === "function"
6
- ? modelContext
7
- : undefined;
5
+ if (typeof modelContext?.registerTool === "function")
6
+ return modelContext;
7
+ if (typeof navigator === "undefined")
8
+ return undefined;
9
+ const legacy = navigator.modelContext;
10
+ if (typeof legacy?.registerTool !== "function" || typeof legacy.unregisterTool !== "function")
11
+ return undefined;
12
+ return adaptLegacyModelContext(legacy);
13
+ }
14
+ function adaptLegacyModelContext(legacy) {
15
+ return {
16
+ registerTool(tool, options = {}) {
17
+ const { signal } = options;
18
+ signal?.throwIfAborted();
19
+ // The legacy callback receives an agent, not execution cancellation options.
20
+ legacy.registerTool({ ...tool, execute: (input) => tool.execute(input) });
21
+ const unregister = () => {
22
+ try {
23
+ legacy.unregisterTool(tool.name);
24
+ }
25
+ catch (error) {
26
+ console.warn(`Unable to unregister WebMCP Tool "${tool.name}".`, error);
27
+ }
28
+ };
29
+ // Only a successful registration owns the name and may unregister it.
30
+ if (signal?.aborted)
31
+ unregister();
32
+ else
33
+ signal?.addEventListener("abort", unregister, { once: true });
34
+ return Promise.resolve();
35
+ },
36
+ };
8
37
  }
9
38
  function warnWebMcpRegistration(name, error) {
10
39
  console.warn(`Unable to register WebMCP Tool "${name}".`, error);
11
40
  }
41
+ const connections = new WeakMap();
42
+ const pendingDisposals = new Map();
43
+ function disposeUnusedConnection(runtime, connection) {
44
+ if (connection.refs || connections.get(runtime) !== connection)
45
+ return;
46
+ pendingDisposals.delete(runtime);
47
+ connections.delete(runtime);
48
+ connection.dispose();
49
+ }
12
50
  export function connectToolRuntimeToWebMcp(runtime) {
13
- const modelContext = getWebMcpModelContext();
14
- if (!modelContext)
15
- return () => undefined;
51
+ let connection = connections.get(runtime);
52
+ if (!connection) {
53
+ const modelContext = getWebMcpModelContext();
54
+ if (!modelContext)
55
+ return () => undefined;
56
+ // Release names before a replacement Runtime starts publishing its tools.
57
+ for (const [previousRuntime, previous] of pendingDisposals) {
58
+ disposeUnusedConnection(previousRuntime, previous);
59
+ }
60
+ // Install the shared connection before registration can synchronously notify listeners.
61
+ connection = { refs: 0, dispose: () => { } };
62
+ connections.set(runtime, connection);
63
+ connection.dispose = createConnection(runtime, modelContext);
64
+ }
65
+ pendingDisposals.delete(runtime);
66
+ connection.refs += 1;
67
+ const current = connection;
68
+ let released = false;
69
+ return () => {
70
+ if (released)
71
+ return;
72
+ released = true;
73
+ current.refs -= 1;
74
+ if (current.refs)
75
+ return;
76
+ // A same-Runtime reconnect can still reuse this connection in Strict Mode.
77
+ pendingDisposals.set(runtime, current);
78
+ queueMicrotask(() => disposeUnusedConnection(runtime, current));
79
+ };
80
+ }
81
+ function createConnection(runtime, modelContext) {
16
82
  const registrations = new Map();
17
83
  let disposed = false;
84
+ let operation;
85
+ const controls = new AbortController();
86
+ const begin = {
87
+ name: "beginOperation",
88
+ description: "Begin a continuous page operation before using page tools. Call endOperation with the returned operationId when all page work is done, before your final response. Repeated begin returns the same active operation. Omitting begin shows feedback only while each tool executes.",
89
+ inputSchema: { type: "object", properties: {}, additionalProperties: false },
90
+ execute: async (input, options = {}) => {
91
+ options.signal?.throwIfAborted();
92
+ controls.signal.throwIfAborted();
93
+ if (!input || typeof input !== "object" || Array.isArray(input) || Object.keys(input).length)
94
+ throw new TypeError("beginOperation requires {}.");
95
+ const current = runtime.getActivitySnapshot().operation;
96
+ if (operation && current?.id === operation.id) {
97
+ return { status: current.status === "ending" ? "ending" : "active", operationId: operation.id };
98
+ }
99
+ operation = undefined;
100
+ try {
101
+ operation = runtime.beginInternalOperation({ source: "webmcp" });
102
+ }
103
+ catch (error) {
104
+ if (error.code === "OPERATION_BUSY")
105
+ return { status: "busy" };
106
+ throw error;
107
+ }
108
+ return { status: "active", operationId: operation.id };
109
+ },
110
+ };
111
+ const end = {
112
+ name: "endOperation",
113
+ description: "End the page operation identified by operationId after all page work. Waits for its admitted tools to settle. Does not stop an external agent or undo changes.",
114
+ inputSchema: { type: "object", properties: { operationId: { type: "string" } }, required: ["operationId"], additionalProperties: false },
115
+ execute: async (input, options = {}) => {
116
+ options.signal?.throwIfAborted();
117
+ controls.signal.throwIfAborted();
118
+ const args = input;
119
+ if (!args || typeof args !== "object" || Array.isArray(args) || typeof args.operationId !== "string" || Object.keys(args).some((key) => key !== "operationId"))
120
+ throw new TypeError("endOperation requires { operationId: string }.");
121
+ const operationId = args.operationId;
122
+ const owned = operation;
123
+ if (!owned || owned.id !== operationId || runtime.getActivitySnapshot().operation?.id !== operationId)
124
+ return { status: "not_active", operationId };
125
+ await owned.end();
126
+ if (operation === owned)
127
+ operation = undefined;
128
+ return { status: "ended", operationId };
129
+ },
130
+ };
131
+ const registerControls = async () => {
132
+ try {
133
+ await modelContext.registerTool(end, { signal: controls.signal });
134
+ controls.signal.throwIfAborted();
135
+ await modelContext.registerTool(begin, { signal: controls.signal });
136
+ }
137
+ catch (error) {
138
+ const aborted = controls.signal.aborted;
139
+ controls.abort();
140
+ if (!disposed && !aborted)
141
+ warnWebMcpRegistration("beginOperation/endOperation", error);
142
+ }
143
+ };
18
144
  const register = (tool) => {
19
145
  const { definition } = tool;
20
146
  const controller = new AbortController();
@@ -25,8 +151,31 @@ export function connectToolRuntimeToWebMcp(runtime) {
25
151
  result = modelContext.registerTool({
26
152
  name: definition.name,
27
153
  description: definition.description,
28
- inputSchema: definition.inputSchema,
29
- execute: async (input) => runtime.execute(tool, input),
154
+ inputSchema: {
155
+ type: "object",
156
+ properties: {
157
+ input: definition.inputSchema ?? { type: "object", properties: {}, additionalProperties: false },
158
+ progressLabel: {
159
+ type: "string",
160
+ description: "Briefly describe this tool action in the user’s language. Do not expose internal identifiers or claim success before completion.",
161
+ },
162
+ },
163
+ required: ["input"],
164
+ additionalProperties: false,
165
+ },
166
+ execute: async (parameters, options = {}) => {
167
+ const args = parameters;
168
+ if (!args || typeof args !== "object" || Array.isArray(args)
169
+ || !args.input || typeof args.input !== "object" || Array.isArray(args.input)
170
+ || Object.keys(args).some((key) => key !== "input" && key !== "progressLabel")
171
+ || (args.progressLabel !== undefined && typeof args.progressLabel !== "string")) {
172
+ throw new TypeError("WebMCP tools require { input: object, progressLabel?: string }.");
173
+ }
174
+ return runtime.executeWithProgress(tool, args.input, {
175
+ ...(options.signal ? { signal: options.signal } : {}),
176
+ ...(typeof args.progressLabel === "string" ? { progressLabel: args.progressLabel } : {}),
177
+ });
178
+ },
30
179
  }, { signal: controller.signal });
31
180
  }
32
181
  catch (error) {
@@ -44,7 +193,7 @@ export function connectToolRuntimeToWebMcp(runtime) {
44
193
  });
45
194
  };
46
195
  const reconcile = () => {
47
- const tools = new Map(runtime.getWebMcpTools().map((tool) => [tool.definition.name, tool]));
196
+ const tools = new Map(runtime.getWebMcpTools().filter((tool) => !["beginOperation", "endOperation"].includes(tool.definition.name)).map((tool) => [tool.definition.name, tool]));
48
197
  for (const [name, registration] of registrations) {
49
198
  if (tools.get(name) === registration.tool)
50
199
  continue;
@@ -59,10 +208,15 @@ export function connectToolRuntimeToWebMcp(runtime) {
59
208
  const unsubscribeRuntime = runtime.on("toolchange", reconcile);
60
209
  modelContext.addEventListener?.("toolchange", reconcile);
61
210
  reconcile();
211
+ void registerControls();
62
212
  return () => {
63
213
  if (disposed)
64
214
  return;
65
215
  disposed = true;
216
+ controls.abort();
217
+ if (operation)
218
+ void runtime.endBridgeOperation(operation);
219
+ operation = undefined;
66
220
  unsubscribeRuntime();
67
221
  modelContext.removeEventListener?.("toolchange", reconcile);
68
222
  for (const registration of registrations.values()) {
@@ -1 +1 @@
1
- {"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"AA8BA,SAAS,qBAAqB;IAC5B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,YAAY,GAAI,QAEpB,CAAC,YAAY,CAAC;IAChB,IAAI,OAAO,YAAY,EAAE,YAAY,KAAK,UAAU;QAAE,OAAO,YAAkC,CAAC;IAChG,IAAI,OAAO,SAAS,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACvD,MAAM,MAAM,GAAI,SAEd,CAAC,YAAY,CAAC;IAChB,IAAI,OAAO,MAAM,EAAE,YAAY,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAChH,OAAO,uBAAuB,CAAC,MAAkC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAgC;IAC/D,OAAO;QACL,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE;YAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAC3B,MAAM,EAAE,cAAc,EAAE,CAAC;YACzB,6EAA6E;YAC7E,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1E,MAAM,UAAU,GAAG,GAAG,EAAE;gBACtB,IAAI,CAAC;oBAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAAC,CAAC;gBACzC,OAAO,KAAK,EAAE,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAC,CAAC;YAC5F,CAAC,CAAC;YACF,sEAAsE;YACtE,IAAI,MAAM,EAAE,OAAO;gBAAE,UAAU,EAAE,CAAC;;gBAC7B,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,KAAc;IAC1D,OAAO,CAAC,IAAI,CAAC,mCAAmC,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAID,MAAM,WAAW,GAAG,IAAI,OAAO,EAAyC,CAAC;AACzE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyC,CAAC;AAE1E,SAAS,uBAAuB,CAAC,OAA4B,EAAE,UAA4B;IACzF,IAAI,UAAU,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU;QAAE,OAAO;IACvE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5B,UAAU,CAAC,OAAO,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAA4B;IACrE,IAAI,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC;QAC7C,IAAI,CAAC,YAAY;YAAE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;QAC1C,0EAA0E;QAC1E,KAAK,MAAM,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAC3D,uBAAuB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;QACD,wFAAwF;QACxF,UAAU,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;QAC5C,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrC,UAAU,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IACD,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC;IAC3B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;QAClB,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO;QACzB,2EAA2E;QAC3E,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvC,cAAc,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA4B,EAAE,YAAgC;IAEtF,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAoC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,MAAM,KAAK,GAAe;QACxB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,mRAAmR;QAChS,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAC5E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;YACrC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;gBAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACjJ,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,SAAS,CAAC;YACxD,IAAI,SAAS,IAAI,OAAO,EAAE,EAAE,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC;gBAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;YAClG,CAAC;YACD,SAAS,GAAG,SAAS,CAAC;YACtB,IAAI,CAAC;gBAAC,SAAS,GAAG,OAAO,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAAC,CAAC;YACzE,OAAO,KAAK,EAAE,CAAC;gBACb,IAAK,KAA2B,CAAC,IAAI,KAAK,gBAAgB;oBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBACtF,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC;QACzD,CAAC;KACF,CAAC;IACF,MAAM,GAAG,GAAe;QACtB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,gKAAgK;QAC7K,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,oBAAoB,EAAE,KAAK,EAAE;QACxI,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;YACrC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;YACjC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,KAAkC,CAAC;YAChD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;YACtO,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,WAAW;gBAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YACpJ,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,IAAI,SAAS,KAAK,KAAK;gBAAE,SAAS,GAAG,SAAS,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAC1C,CAAC;KACF,CAAC;IACF,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACjC,MAAM,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;YACxC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;gBAAE,sBAAsB,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,IAAsB,EAAE,EAAE;QAC1C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC1C,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACjD,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC;gBACjC,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;wBAChG,aAAa,EAAE;4BACb,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,kIAAkI;yBAChJ;qBACF;oBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;oBACnB,oBAAoB,EAAE,KAAK;iBAC5B;gBACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;oBAC1C,MAAM,IAAI,GAAG,UAA0D,CAAC;oBACxE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;2BACvD,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;2BAC1E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,eAAe,CAAC;2BAC3E,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,EAAE,CAAC;wBAClF,MAAM,IAAI,SAAS,CAAC,iEAAiE,CAAC,CAAC;oBACzF,CAAC;oBACD,OAAO,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE;wBACnD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrD,GAAG,CAAC,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACzF,CAAC,CAAC;gBACL,CAAC;aACF,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtC,sBAAsB,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC/C,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,QAAQ;gBAAE,OAAO;YAClD,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,YAAY,EAAE,CAAC;gBACxD,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,sBAAsB,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAC1J,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,aAAa,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,IAAI;gBAAE,SAAS;YACpD,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAChC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC/D,YAAY,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACzD,SAAS,EAAE,CAAC;IACZ,KAAK,gBAAgB,EAAE,CAAC;IAExB,OAAO,GAAG,EAAE;QACV,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,SAAS;YAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1D,SAAS,GAAG,SAAS,CAAC;QACtB,kBAAkB,EAAE,CAAC;QACrB,YAAY,CAAC,mBAAmB,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC5D,KAAK,MAAM,YAAY,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAClD,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { InternalToolRuntime, RuntimeAgentTool, ToolOperation } from \"./runtime.js\";\n\ninterface WebMcpTool {\n name: string;\n description: string;\n inputSchema: object;\n execute(input: object, options?: { signal?: AbortSignal }): Promise<unknown>;\n}\n\ninterface WebMcpModelContext {\n addEventListener?(type: \"toolchange\", listener: EventListener): void;\n removeEventListener?(type: \"toolchange\", listener: EventListener): void;\n registerTool(\n tool: WebMcpTool,\n options?: { signal?: AbortSignal },\n ): Promise<void>;\n}\n\ninterface LegacyWebMcpModelContext {\n registerTool(tool: Omit<WebMcpTool, \"execute\"> & {\n execute(input: object, agent?: unknown): Promise<unknown>;\n }): void;\n unregisterTool(name: string): void;\n}\n\ntype WebMcpRegistration = {\n controller: AbortController;\n tool: RuntimeAgentTool;\n};\n\nfunction getWebMcpModelContext(): WebMcpModelContext | undefined {\n if (typeof document === \"undefined\") return undefined;\n const modelContext = (document as Document & {\n modelContext?: Partial<WebMcpModelContext>;\n }).modelContext;\n if (typeof modelContext?.registerTool === \"function\") return modelContext as WebMcpModelContext;\n if (typeof navigator === \"undefined\") return undefined;\n const legacy = (navigator as Navigator & {\n modelContext?: Partial<LegacyWebMcpModelContext>;\n }).modelContext;\n if (typeof legacy?.registerTool !== \"function\" || typeof legacy.unregisterTool !== \"function\") return undefined;\n return adaptLegacyModelContext(legacy as LegacyWebMcpModelContext);\n}\n\nfunction adaptLegacyModelContext(legacy: LegacyWebMcpModelContext): WebMcpModelContext {\n return {\n registerTool(tool, options = {}) {\n const { signal } = options;\n signal?.throwIfAborted();\n // The legacy callback receives an agent, not execution cancellation options.\n legacy.registerTool({ ...tool, execute: (input) => tool.execute(input) });\n const unregister = () => {\n try { legacy.unregisterTool(tool.name); }\n catch (error) { console.warn(`Unable to unregister WebMCP Tool \"${tool.name}\".`, error); }\n };\n // Only a successful registration owns the name and may unregister it.\n if (signal?.aborted) unregister();\n else signal?.addEventListener(\"abort\", unregister, { once: true });\n return Promise.resolve();\n },\n };\n}\n\nfunction warnWebMcpRegistration(name: string, error: unknown): void {\n console.warn(`Unable to register WebMCP Tool \"${name}\".`, error);\n}\n\ntype WebMcpConnection = { refs: number; dispose(): void };\n\nconst connections = new WeakMap<InternalToolRuntime, WebMcpConnection>();\nconst pendingDisposals = new Map<InternalToolRuntime, WebMcpConnection>();\n\nfunction disposeUnusedConnection(runtime: InternalToolRuntime, connection: WebMcpConnection): void {\n if (connection.refs || connections.get(runtime) !== connection) return;\n pendingDisposals.delete(runtime);\n connections.delete(runtime);\n connection.dispose();\n}\n\nexport function connectToolRuntimeToWebMcp(runtime: InternalToolRuntime): () => void {\n let connection = connections.get(runtime);\n if (!connection) {\n const modelContext = getWebMcpModelContext();\n if (!modelContext) return () => undefined;\n // Release names before a replacement Runtime starts publishing its tools.\n for (const [previousRuntime, previous] of pendingDisposals) {\n disposeUnusedConnection(previousRuntime, previous);\n }\n // Install the shared connection before registration can synchronously notify listeners.\n connection = { refs: 0, dispose: () => {} };\n connections.set(runtime, connection);\n connection.dispose = createConnection(runtime, modelContext);\n }\n pendingDisposals.delete(runtime);\n connection.refs += 1;\n const current = connection;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n current.refs -= 1;\n if (current.refs) return;\n // A same-Runtime reconnect can still reuse this connection in Strict Mode.\n pendingDisposals.set(runtime, current);\n queueMicrotask(() => disposeUnusedConnection(runtime, current));\n };\n}\n\nfunction createConnection(runtime: InternalToolRuntime, modelContext: WebMcpModelContext): () => void {\n\n const registrations = new Map<string, WebMcpRegistration>();\n let disposed = false;\n let operation: ToolOperation | undefined;\n const controls = new AbortController();\n const begin: WebMcpTool = {\n name: \"beginOperation\",\n description: \"Begin a continuous page operation before using page tools. Call endOperation with the returned operationId when all page work is done, before your final response. Repeated begin returns the same active operation. Omitting begin shows feedback only while each tool executes.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n execute: async (input, options = {}) => {\n options.signal?.throwIfAborted();\n controls.signal.throwIfAborted();\n if (!input || typeof input !== \"object\" || Array.isArray(input) || Object.keys(input).length) throw new TypeError(\"beginOperation requires {}.\");\n const current = runtime.getActivitySnapshot().operation;\n if (operation && current?.id === operation.id) {\n return { status: current.status === \"ending\" ? \"ending\" : \"active\", operationId: operation.id };\n }\n operation = undefined;\n try { operation = runtime.beginInternalOperation({ source: \"webmcp\" }); }\n catch (error) {\n if ((error as { code?: string }).code === \"OPERATION_BUSY\") return { status: \"busy\" };\n throw error;\n }\n return { status: \"active\", operationId: operation.id };\n },\n };\n const end: WebMcpTool = {\n name: \"endOperation\",\n description: \"End the page operation identified by operationId after all page work. Waits for its admitted tools to settle. Does not stop an external agent or undo changes.\",\n inputSchema: { type: \"object\", properties: { operationId: { type: \"string\" } }, required: [\"operationId\"], additionalProperties: false },\n execute: async (input, options = {}) => {\n options.signal?.throwIfAborted();\n controls.signal.throwIfAborted();\n const args = input as { operationId?: unknown };\n if (!args || typeof args !== \"object\" || Array.isArray(args) || typeof args.operationId !== \"string\" || Object.keys(args).some((key) => key !== \"operationId\")) throw new TypeError(\"endOperation requires { operationId: string }.\");\n const operationId = args.operationId;\n const owned = operation;\n if (!owned || owned.id !== operationId || runtime.getActivitySnapshot().operation?.id !== operationId) return { status: \"not_active\", operationId };\n await owned.end();\n if (operation === owned) operation = undefined;\n return { status: \"ended\", operationId };\n },\n };\n const registerControls = async () => {\n try {\n await modelContext.registerTool(end, { signal: controls.signal });\n controls.signal.throwIfAborted();\n await modelContext.registerTool(begin, { signal: controls.signal });\n } catch (error) {\n const aborted = controls.signal.aborted;\n controls.abort();\n if (!disposed && !aborted) warnWebMcpRegistration(\"beginOperation/endOperation\", error);\n }\n };\n\n const register = (tool: RuntimeAgentTool) => {\n const { definition } = tool;\n const controller = new AbortController();\n const registration = { controller, tool };\n registrations.set(definition.name, registration);\n let result: Promise<void>;\n try {\n result = modelContext.registerTool({\n name: definition.name,\n description: definition.description,\n inputSchema: {\n type: \"object\",\n properties: {\n input: definition.inputSchema ?? { type: \"object\", properties: {}, additionalProperties: false },\n progressLabel: {\n type: \"string\",\n description: \"Briefly describe this tool action in the user’s language. Do not expose internal identifiers or claim success before completion.\",\n },\n },\n required: [\"input\"],\n additionalProperties: false,\n },\n execute: async (parameters, options = {}) => {\n const args = parameters as { input?: unknown; progressLabel?: unknown };\n if (!args || typeof args !== \"object\" || Array.isArray(args)\n || !args.input || typeof args.input !== \"object\" || Array.isArray(args.input)\n || Object.keys(args).some((key) => key !== \"input\" && key !== \"progressLabel\")\n || (args.progressLabel !== undefined && typeof args.progressLabel !== \"string\")) {\n throw new TypeError(\"WebMCP tools require { input: object, progressLabel?: string }.\");\n }\n return runtime.executeWithProgress(tool, args.input, {\n ...(options.signal ? { signal: options.signal } : {}),\n ...(typeof args.progressLabel === \"string\" ? { progressLabel: args.progressLabel } : {}),\n });\n },\n }, { signal: controller.signal });\n } catch (error) {\n registrations.delete(definition.name);\n warnWebMcpRegistration(definition.name, error);\n return;\n }\n Promise.resolve(result).catch((error: unknown) => {\n if (controller.signal.aborted || disposed) return;\n if (registrations.get(definition.name) === registration) {\n registrations.delete(definition.name);\n }\n warnWebMcpRegistration(definition.name, error);\n });\n };\n\n const reconcile = () => {\n const tools = new Map(\n runtime.getWebMcpTools().filter((tool) => ![\"beginOperation\", \"endOperation\"].includes(tool.definition.name)).map((tool) => [tool.definition.name, tool]),\n );\n for (const [name, registration] of registrations) {\n if (tools.get(name) === registration.tool) continue;\n registration.controller.abort();\n registrations.delete(name);\n }\n for (const tool of tools.values()) {\n if (!registrations.has(tool.definition.name)) register(tool);\n }\n };\n\n const unsubscribeRuntime = runtime.on(\"toolchange\", reconcile);\n modelContext.addEventListener?.(\"toolchange\", reconcile);\n reconcile();\n void registerControls();\n\n return () => {\n if (disposed) return;\n disposed = true;\n controls.abort();\n if (operation) void runtime.endBridgeOperation(operation);\n operation = undefined;\n unsubscribeRuntime();\n modelContext.removeEventListener?.(\"toolchange\", reconcile);\n for (const registration of registrations.values()) {\n registration.controller.abort();\n }\n registrations.clear();\n };\n}\n"]}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@nexface/tools",
3
- "version": "0.1.1-alpha.0",
3
+ "version": "0.1.1-alpha.10",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
8
- "default": "./dist/index.js"
8
+ "node": "./dist/index.js",
9
+ "default": "./dist/index.browser.js"
9
10
  },
10
- "./styles.css": "./dist/styles.css",
11
11
  "./internal": {
12
12
  "types": "./dist/internal.d.ts",
13
13
  "default": "./dist/internal.js"
@@ -17,10 +17,6 @@
17
17
  "default": "./dist/internal-react.js"
18
18
  }
19
19
  },
20
- "scripts": {
21
- "build": "node ../../scripts/generate-browser-tools-skill.mjs --check && tsc -p tsconfig.json && cp src/styles.css dist/styles.css",
22
- "typecheck": "node ../../scripts/generate-browser-tools-skill.mjs --check && tsc -p tsconfig.json --noEmit"
23
- },
24
20
  "dependencies": {
25
21
  "@phosphor-icons/react": "^2.1.10"
26
22
  },
@@ -39,9 +35,8 @@
39
35
  "files": [
40
36
  "dist"
41
37
  ],
42
- "publishConfig": {
43
- "registry": "https://registry.npmjs.org",
44
- "tag": "alpha",
45
- "access": "public"
38
+ "scripts": {
39
+ "build": "node ../../scripts/generate-browser-tools-skill.mjs --check && tsc -p tsconfig.json && cp src/styles.css dist/styles.css",
40
+ "typecheck": "node ../../scripts/generate-browser-tools-skill.mjs --check && tsc -p tsconfig.json --noEmit"
46
41
  }
47
- }
42
+ }
@@ -1,17 +0,0 @@
1
- import type { ToolRuntime } from "./runtime.js";
2
- interface OperationHost {
3
- toolRuntime: ToolRuntime;
4
- operationSurface: {
5
- current: object | null;
6
- };
7
- sessionId: string;
8
- turnId: string;
9
- taskLabel?: string;
10
- running: boolean;
11
- waiting: boolean;
12
- failed: boolean;
13
- cancel(): void;
14
- }
15
- export declare const OperationHostContext: import("react").Context<OperationHost | null>;
16
- export declare function useOperationHost(): OperationHost;
17
- export {};
@@ -1,9 +0,0 @@
1
- import { createContext, useContext } from "react";
2
- export const OperationHostContext = createContext(null);
3
- export function useOperationHost() {
4
- const host = useContext(OperationHostContext);
5
- if (!host)
6
- throw new Error("AgentOperationSurface must be rendered inside NexfaceProvider.");
7
- return host;
8
- }
9
- //# sourceMappingURL=operation-host.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"operation-host.js","sourceRoot":"","sources":["../src/operation-host.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAelD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAuB,IAAI,CAAC,CAAC;AAE9E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC;AACd,CAAC"}