@nxisai/agent-harness 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +3 -1
  2. package/dist/harness/harness.d.ts.map +1 -1
  3. package/dist/harness/harness.js +31 -9
  4. package/dist/harness/harness.js.map +1 -1
  5. package/dist/harness/tools/action-tools.d.ts.map +1 -1
  6. package/dist/harness/tools/action-tools.js +7 -5
  7. package/dist/harness/tools/action-tools.js.map +1 -1
  8. package/dist/harness/tools/bridge.d.ts.map +1 -1
  9. package/dist/harness/tools/bridge.js +33 -12
  10. package/dist/harness/tools/bridge.js.map +1 -1
  11. package/dist/harness/tools/local-context.d.ts +49 -9
  12. package/dist/harness/tools/local-context.d.ts.map +1 -1
  13. package/dist/harness/tools/local-context.js +377 -22
  14. package/dist/harness/tools/local-context.js.map +1 -1
  15. package/dist/harness/tools/open-page.d.ts +16 -0
  16. package/dist/harness/tools/open-page.d.ts.map +1 -1
  17. package/dist/harness/tools/open-page.js +45 -9
  18. package/dist/harness/tools/open-page.js.map +1 -1
  19. package/dist/harness/tools/retry.d.ts +53 -0
  20. package/dist/harness/tools/retry.d.ts.map +1 -0
  21. package/dist/harness/tools/retry.js +96 -0
  22. package/dist/harness/tools/retry.js.map +1 -0
  23. package/dist/harness/tools/schema.d.ts +18 -0
  24. package/dist/harness/tools/schema.d.ts.map +1 -1
  25. package/dist/harness/tools/schema.js +38 -0
  26. package/dist/harness/tools/schema.js.map +1 -1
  27. package/dist/harness/tools/site-actions.d.ts.map +1 -1
  28. package/dist/harness/tools/site-actions.js +3 -2
  29. package/dist/harness/tools/site-actions.js.map +1 -1
  30. package/dist/harness/tools/site-nav.d.ts +168 -0
  31. package/dist/harness/tools/site-nav.d.ts.map +1 -0
  32. package/dist/harness/tools/site-nav.js +316 -0
  33. package/dist/harness/tools/site-nav.js.map +1 -0
  34. package/dist/harness/tools/site-pages.d.ts +4 -0
  35. package/dist/harness/tools/site-pages.d.ts.map +1 -1
  36. package/dist/harness/tools/site-pages.js +19 -3
  37. package/dist/harness/tools/site-pages.js.map +1 -1
  38. package/dist/harness/tools/source.d.ts +9 -0
  39. package/dist/harness/tools/source.d.ts.map +1 -1
  40. package/dist/harness/tools/source.js +54 -14
  41. package/dist/harness/tools/source.js.map +1 -1
  42. package/dist/harness/tools/webmcp.d.ts +39 -3
  43. package/dist/harness/tools/webmcp.d.ts.map +1 -1
  44. package/dist/harness/tools/webmcp.js +93 -14
  45. package/dist/harness/tools/webmcp.js.map +1 -1
  46. package/dist/index.d.ts +5 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +3 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/types.d.ts +2 -0
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/ui/agent-fullscreen.d.ts.map +1 -1
  53. package/dist/ui/agent-fullscreen.js +12 -1
  54. package/dist/ui/agent-fullscreen.js.map +1 -1
  55. package/dist/ui/tailwind.generated.d.ts +1 -1
  56. package/dist/ui/tailwind.generated.d.ts.map +1 -1
  57. package/dist/ui/tailwind.generated.js +1 -1
  58. package/dist/ui/tailwind.generated.js.map +1 -1
  59. package/package.json +2 -1
  60. package/src/a2ui/cards.ts +177 -0
  61. package/src/a2ui/emit.ts +147 -0
  62. package/src/a2ui/form.ts +117 -0
  63. package/src/a2ui/host.ts +73 -0
  64. package/src/a2ui/index.ts +22 -0
  65. package/src/a2ui/stepper.ts +211 -0
  66. package/src/a2ui/theme.ts +134 -0
  67. package/src/a2ui/to-v09.ts +118 -0
  68. package/src/engine.ts +701 -0
  69. package/src/harness/harness.ts +956 -0
  70. package/src/harness/plan.ts +91 -0
  71. package/src/harness/policy.ts +59 -0
  72. package/src/harness/renderer.ts +208 -0
  73. package/src/harness/router/coordinator.ts +220 -0
  74. package/src/harness/router/rules.ts +65 -0
  75. package/src/harness/slots.ts +117 -0
  76. package/src/harness/steps.ts +156 -0
  77. package/src/harness/tools/action-tools.ts +870 -0
  78. package/src/harness/tools/bridge.ts +393 -0
  79. package/src/harness/tools/client.ts +26 -0
  80. package/src/harness/tools/discovery.ts +55 -0
  81. package/src/harness/tools/local-context.ts +480 -0
  82. package/src/harness/tools/open-page.ts +273 -0
  83. package/src/harness/tools/pending-action.ts +232 -0
  84. package/src/harness/tools/resume.ts +134 -0
  85. package/src/harness/tools/retry.ts +117 -0
  86. package/src/harness/tools/schema.ts +245 -0
  87. package/src/harness/tools/site-actions.ts +356 -0
  88. package/src/harness/tools/site-nav.ts +432 -0
  89. package/src/harness/tools/site-pages.ts +288 -0
  90. package/src/harness/tools/source.ts +353 -0
  91. package/src/harness/tools/webmcp.ts +200 -0
  92. package/src/index.ts +193 -0
  93. package/src/providers/capability.ts +167 -0
  94. package/src/providers/proxy.ts +191 -0
  95. package/src/providers/types.ts +150 -0
  96. package/src/types.ts +258 -0
  97. package/src/ui/agent-fullscreen.ts +3984 -0
  98. package/src/ui/agent.tw.css +49 -0
  99. package/src/ui/config.ts +138 -0
  100. package/src/ui/index.ts +32 -0
  101. package/src/ui/journey.ts +57 -0
  102. package/src/ui/tailwind.generated.ts +2 -0
  103. package/src/webmcp-contract.ts +65 -0
@@ -1,8 +1,101 @@
1
1
  var _a;
2
2
  /** Set on the instance so a later, real provider can be told apart from ours. */
3
3
  export const LOCAL_CONTEXT_FLAG = '__nxisLocalModelContext';
4
+ const TOOL_NAME = /^[A-Za-z0-9_.-]{1,128}$/;
5
+ function domException(message, name) {
6
+ if (typeof DOMException === 'function')
7
+ return new DOMException(message, name);
8
+ return Object.assign(new Error(message), { name });
9
+ }
10
+ /** "Queue a global task": after the current task and its microtasks. */
11
+ const queueTask = (steps) => void setTimeout(steps, 0);
12
+ const isObject = (value) => (typeof value === 'object' && value !== null) || typeof value === 'function';
13
+ /** `JSON.stringify`, with a `TypeError` where it yields nothing, as Infra's serializer has it. */
14
+ function serializeJSON(value) {
15
+ const json = JSON.stringify(value);
16
+ if (json === undefined)
17
+ throw new TypeError('The value cannot be serialized as JSON.');
18
+ return json;
19
+ }
20
+ function dictionary(value, type) {
21
+ if (value === undefined || value === null)
22
+ return {};
23
+ if (!isObject(value))
24
+ throw new TypeError(`The provided value is not of type '${type}'.`);
25
+ return value;
26
+ }
27
+ function required(dict, member, type) {
28
+ if (dict[member] === undefined) {
29
+ throw new TypeError(`Failed to read the '${member}' property from '${type}': Required member is undefined.`);
30
+ }
31
+ return dict[member];
32
+ }
33
+ function toHints(value) {
34
+ const dict = dictionary(value, 'ToolAnnotations');
35
+ const hint = (key) => (dict[key] === undefined ? false : Boolean(dict[key]));
36
+ return {
37
+ consequentialHint: hint('consequentialHint'),
38
+ debugging: hint('debugging'),
39
+ readOnlyHint: hint('readOnlyHint'),
40
+ untrustedContentHint: hint('untrustedContentHint'),
41
+ };
42
+ }
43
+ function toSignal(value) {
44
+ if (value === undefined)
45
+ return undefined;
46
+ if (typeof AbortSignal === 'function' && !(value instanceof AbortSignal)) {
47
+ throw new TypeError("Failed to read the 'signal' property: The provided value is not of type 'AbortSignal'.");
48
+ }
49
+ return value;
50
+ }
51
+ const ownWindow = () => (typeof window !== 'undefined' ? window : globalThis);
52
+ const isWindow = (value) => typeof window === 'undefined' ? value === globalThis : isObject(value) && value.window === value;
53
+ /** Outside a browser `http://localhost` stands in: an opaque origin would refuse every call. */
54
+ const ownOrigin = () => (typeof location !== 'undefined' ? location.origin : 'http://localhost');
55
+ function isTrustworthy(url) {
56
+ if (url.origin === 'null')
57
+ return false;
58
+ if (url.protocol === 'https:' || url.protocol === 'wss:')
59
+ return true;
60
+ const host = url.hostname;
61
+ return host === 'localhost' || host.endsWith('.localhost') || /^127(?:\.\d{1,3}){3}$/.test(host) || host === '[::1]';
62
+ }
63
+ /** `SecurityError` for an origin that doesn't parse or isn't potentially trustworthy. */
64
+ function checkOrigins(origins, member) {
65
+ if (origins === undefined)
66
+ return;
67
+ if (!isObject(origins) || typeof origins[Symbol.iterator] !== 'function') {
68
+ throw new TypeError(`Failed to read the '${member}' property: The provided value cannot be converted to a sequence.`);
69
+ }
70
+ for (const origin of origins) {
71
+ let url;
72
+ try {
73
+ url = new URL(`${origin}`);
74
+ }
75
+ catch {
76
+ throw domException(`"${origin}" is not a valid origin.`, 'SecurityError');
77
+ }
78
+ if (!isTrustworthy(url))
79
+ throw domException(`"${origin}" is not a potentially trustworthy origin.`, 'SecurityError');
80
+ }
81
+ }
82
+ /** The spec's opening checks: an origin-keyed agent cluster, unless the page is a `file:` one. */
83
+ function accessError() {
84
+ const keyed = globalThis.originAgentCluster;
85
+ const scheme = typeof location !== 'undefined' ? location.protocol : '';
86
+ return keyed === false && scheme !== 'file:'
87
+ ? domException("This page's agent cluster is not origin-keyed.", 'SecurityError')
88
+ : null;
89
+ }
90
+ /** An event carrying the name of the tool it concerns: `toolactivated`, `toolcancel`. */
91
+ class ToolEvent extends Event {
92
+ constructor(type, toolName) {
93
+ super(type);
94
+ this.toolName = toolName;
95
+ }
96
+ }
4
97
  /**
5
- * A minimal in-memory tool registry implementing {@link ModelContext}.
98
+ * An in-memory tool registry built to the WebMCP spec.
6
99
  *
7
100
  * Installed by {@link ensureModelContext} on pages that have no registry of
8
101
  * their own, so that discovered remote tools have somewhere to live.
@@ -12,28 +105,290 @@ export class LocalModelContext extends EventTarget {
12
105
  super(...arguments);
13
106
  this[_a] = true;
14
107
  this._tools = new Map();
108
+ this._pending = new Map();
109
+ this._handlers = {};
110
+ this._listeners = {};
111
+ }
112
+ get ontoolchange() {
113
+ return this._handlers.toolchange ?? null;
114
+ }
115
+ set ontoolchange(handler) {
116
+ this._setHandler('toolchange', handler);
117
+ }
118
+ get ontoolactivated() {
119
+ return this._handlers.toolactivated ?? null;
120
+ }
121
+ set ontoolactivated(handler) {
122
+ this._setHandler('toolactivated', handler);
123
+ }
124
+ get ontoolcancel() {
125
+ return this._handlers.toolcancel ?? null;
126
+ }
127
+ set ontoolcancel(handler) {
128
+ this._setHandler('toolcancel', handler);
129
+ }
130
+ registerTool(tool, options = {}) {
131
+ const type = 'ModelContextTool';
132
+ let definition;
133
+ let signal;
134
+ let schema;
135
+ let exposedTo;
136
+ try {
137
+ // Members in lexicographic order, as WebIDL converts a dictionary.
138
+ const dict = dictionary(tool, type);
139
+ const annotations = dict.annotations === undefined ? null : toHints(dict.annotations);
140
+ const description = `${required(dict, 'description', type)}`;
141
+ const execute = required(dict, 'execute', type);
142
+ if (typeof execute !== 'function') {
143
+ throw new TypeError(`Failed to read the 'execute' property from '${type}': The provided value is not a function.`);
144
+ }
145
+ schema = dict.inputSchema;
146
+ if (schema !== undefined && !isObject(schema)) {
147
+ throw new TypeError(`Failed to read the 'inputSchema' property from '${type}': The provided value is not of type 'object'.`);
148
+ }
149
+ const name = `${required(dict, 'name', type)}`;
150
+ const title = dict.title === undefined ? null : `${dict.title}`;
151
+ definition = { name, title, description, inputSchema: '', annotations, execute: execute };
152
+ const opts = dictionary(options, 'ModelContextRegisterToolOptions');
153
+ exposedTo = opts.exposedTo;
154
+ signal = toSignal(opts.signal);
155
+ }
156
+ catch (error) {
157
+ return Promise.reject(error);
158
+ }
159
+ const denied = accessError();
160
+ if (denied)
161
+ return Promise.reject(denied);
162
+ const { name } = definition;
163
+ if (this._tools.has(name)) {
164
+ return Promise.reject(domException(`A tool named "${name}" is already registered.`, 'InvalidStateError'));
165
+ }
166
+ if (!TOOL_NAME.test(name)) {
167
+ return Promise.reject(domException(`"${name}" is not a valid tool name: 1 to 128 ASCII letters, digits, "_", "-" or ".".`, 'InvalidStateError'));
168
+ }
169
+ if (definition.description === '') {
170
+ return Promise.reject(domException("A tool's description must not be empty.", 'InvalidStateError'));
171
+ }
172
+ if (schema !== undefined) {
173
+ try {
174
+ definition.inputSchema = serializeJSON(schema);
175
+ }
176
+ catch (error) {
177
+ return Promise.reject(error);
178
+ }
179
+ }
180
+ if (signal?.aborted)
181
+ return Promise.reject(signal.reason);
182
+ try {
183
+ checkOrigins(exposedTo, 'exposedTo');
184
+ }
185
+ catch (error) {
186
+ return Promise.reject(error);
187
+ }
188
+ let settle;
189
+ const promise = new Promise((resolve, reject) => (settle = { resolve, reject }));
190
+ if (signal) {
191
+ const s = signal;
192
+ s.addEventListener('abort', () => {
193
+ if (this._tools.delete(name))
194
+ this._notifyToolChange();
195
+ settle.reject(s.reason);
196
+ }, { once: true });
197
+ }
198
+ this._tools.set(name, definition);
199
+ this._notifyToolChange();
200
+ queueTask(() => settle.resolve());
201
+ return promise;
202
+ }
203
+ getTools(options = {}) {
204
+ try {
205
+ checkOrigins(dictionary(options, 'ModelContextGetToolOptions').fromOrigins, 'fromOrigins');
206
+ }
207
+ catch (error) {
208
+ return Promise.reject(error);
209
+ }
210
+ const denied = accessError();
211
+ if (denied)
212
+ return Promise.reject(denied);
213
+ return new Promise((resolve) => {
214
+ const origin = ownOrigin();
215
+ const win = ownWindow();
216
+ const tools = [...this._tools.values()].map((t) => {
217
+ // Members in lexicographic order, as WebIDL creates a dictionary; absent ones are left out.
218
+ const info = {};
219
+ if (t.annotations)
220
+ info.annotations = { ...t.annotations };
221
+ info.description = t.description;
222
+ if (t.inputSchema !== '')
223
+ info.inputSchema = JSON.parse(t.inputSchema);
224
+ info.name = t.name;
225
+ info.origin = origin;
226
+ info.title = t.title ?? '';
227
+ info.window = win;
228
+ return info;
229
+ });
230
+ tools.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
231
+ queueTask(() => resolve(tools));
232
+ });
15
233
  }
16
- registerTool(tool) {
17
- this._tools.set(tool.name, tool);
18
- // Tool discovery listens for this rather than polling to its timeout.
19
- this.dispatchEvent(new Event('toolchange'));
20
- }
21
- getTools() {
22
- return Promise.resolve([...this._tools.values()].map((t) => ({
23
- name: t.name,
24
- description: t.description,
25
- inputSchema: t.inputSchema,
26
- annotations: t.annotations,
27
- })));
28
- }
29
- async executeTool(nameOrTool, input) {
30
- const name = typeof nameOrTool === 'string' ? nameOrTool : nameOrTool.name;
31
- const tool = this._tools.get(name);
32
- if (!tool) {
33
- return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
34
- }
35
- const args = typeof input === 'string' ? JSON.parse(input || '{}') : input ?? {};
36
- return tool.execute(args);
234
+ executeTool(tool, inputObject, options = {}) {
235
+ const type = 'RegisteredTool';
236
+ let name;
237
+ let origin;
238
+ let win;
239
+ let signal;
240
+ try {
241
+ const dict = dictionary(tool, type);
242
+ if (dict.annotations !== undefined)
243
+ toHints(dict.annotations);
244
+ required(dict, 'description', type);
245
+ if (dict.inputSchema !== undefined && !isObject(dict.inputSchema)) {
246
+ throw new TypeError(`Failed to read the 'inputSchema' property from '${type}': The provided value is not of type 'object'.`);
247
+ }
248
+ name = `${required(dict, 'name', type)}`;
249
+ origin = `${required(dict, 'origin', type)}`;
250
+ win = required(dict, 'window', type);
251
+ if (!isWindow(win)) {
252
+ throw new TypeError(`Failed to read the 'window' property from '${type}': The provided value is not of type 'Window'.`);
253
+ }
254
+ signal = toSignal(dictionary(options, 'ModelContextExecuteToolOptions').signal);
255
+ }
256
+ catch (error) {
257
+ return Promise.reject(error);
258
+ }
259
+ const denied = accessError();
260
+ if (denied)
261
+ return Promise.reject(denied);
262
+ let expectedOrigin;
263
+ try {
264
+ expectedOrigin = new URL(origin).origin;
265
+ }
266
+ catch {
267
+ return Promise.reject(domException(`"${origin}" is not a valid origin.`, 'NotSupportedError'));
268
+ }
269
+ if (expectedOrigin === 'null')
270
+ return Promise.reject(domException("A tool's origin must not be opaque.", 'NotSupportedError'));
271
+ if (!isObject(inputObject)) {
272
+ return Promise.reject(new TypeError("Failed to execute 'executeTool' on 'ModelContext': The input is not an object."));
273
+ }
274
+ let inputArguments;
275
+ try {
276
+ inputArguments = serializeJSON(inputObject);
277
+ }
278
+ catch (error) {
279
+ return Promise.reject(error);
280
+ }
281
+ let settle;
282
+ const promise = new Promise((resolve, reject) => (settle = { resolve, reject }));
283
+ const uuid = Symbol('tool execution');
284
+ if (signal) {
285
+ if (signal.aborted)
286
+ return Promise.reject(signal.reason);
287
+ const s = signal;
288
+ s.addEventListener('abort', () => {
289
+ settle.reject(s.reason);
290
+ queueTask(() => this._cancel(uuid));
291
+ }, { once: true });
292
+ }
293
+ const fail = () => queueTask(() => settle.reject(domException('The tool could not be executed.', 'UnknownError')));
294
+ queueTask(() => {
295
+ if (win !== ownWindow() || ownOrigin() !== expectedOrigin || !this._tools.has(name))
296
+ return fail();
297
+ const execution = {
298
+ toolName: name,
299
+ controller: new AbortController(),
300
+ started: false,
301
+ complete: (result, success) => {
302
+ if (!this._pending.delete(uuid))
303
+ return;
304
+ queueTask(() => success
305
+ ? settle.resolve(result)
306
+ : settle.reject(domException("The tool's execution failed.", 'UnknownError')));
307
+ },
308
+ };
309
+ this._pending.set(uuid, execution);
310
+ queueTask(() => this._runTool(name, inputArguments, execution));
311
+ });
312
+ // A string, as the spec resolves it. Typed as a response for the callers that read it through
313
+ // `asResponse` in webmcp.ts.
314
+ return promise;
315
+ }
316
+ /** The spec's tool execute steps, then its imperative execute steps. */
317
+ _runTool(name, inputArguments, execution) {
318
+ const definition = this._tools.get(name);
319
+ if (!definition)
320
+ return execution.complete(null, false);
321
+ let input;
322
+ try {
323
+ input = JSON.parse(inputArguments);
324
+ }
325
+ catch {
326
+ return execution.complete(null, false);
327
+ }
328
+ if (!isObject(input))
329
+ return execution.complete(null, false);
330
+ this.dispatchEvent(new ToolEvent('toolactivated', name));
331
+ execution.started = true;
332
+ let toolPromise;
333
+ try {
334
+ // A WebIDL callback: `this` undefined, and a synchronous throw is a rejection.
335
+ toolPromise = Promise.resolve(definition.execute.call(undefined, input, { signal: execution.controller.signal }));
336
+ }
337
+ catch (error) {
338
+ toolPromise = Promise.reject(error);
339
+ }
340
+ toolPromise.then((value) => {
341
+ if (!execution.started)
342
+ return; // cancelled before the tool settled
343
+ execution.started = false;
344
+ let serialized;
345
+ try {
346
+ serialized = serializeJSON(value);
347
+ }
348
+ catch {
349
+ return execution.complete(null, false);
350
+ }
351
+ execution.complete(serialized, true);
352
+ }, () => {
353
+ if (!execution.started)
354
+ return;
355
+ execution.started = false;
356
+ execution.complete(null, false);
357
+ });
358
+ }
359
+ /** The spec's "cancel a pending tool execution". */
360
+ _cancel(uuid) {
361
+ const execution = this._pending.get(uuid);
362
+ if (!execution)
363
+ return;
364
+ this._pending.delete(uuid);
365
+ queueTask(() => {
366
+ if (!execution.started)
367
+ return;
368
+ execution.started = false;
369
+ execution.controller.abort();
370
+ this.dispatchEvent(new ToolEvent('toolcancel', execution.toolName));
371
+ });
372
+ }
373
+ _notifyToolChange() {
374
+ queueTask(() => this.dispatchEvent(new Event('toolchange')));
375
+ }
376
+ /** An event handler attribute: one listener, kept in its place however often the handler changes. */
377
+ _setHandler(type, handler) {
378
+ const value = typeof handler === 'function' ? handler : null;
379
+ this._handlers[type] = value;
380
+ if (value && !this._listeners[type]) {
381
+ const listener = (event) => {
382
+ if (this._handlers[type]?.call(this, event) === false)
383
+ event.preventDefault();
384
+ };
385
+ this._listeners[type] = listener;
386
+ this.addEventListener(type, listener);
387
+ }
388
+ else if (!value && this._listeners[type]) {
389
+ this.removeEventListener(type, this._listeners[type]);
390
+ delete this._listeners[type];
391
+ }
37
392
  }
38
393
  }
39
394
  _a = LOCAL_CONTEXT_FLAG;
@@ -1 +1 @@
1
- {"version":3,"file":"local-context.js","sourceRoot":"","sources":["../../../src/harness/tools/local-context.ts"],"names":[],"mappings":";AAoBA,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAAlD;;QACW,QAAoB,GAAG,IAAI,CAAC;QACpB,WAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAgChE,CAAC;IA9BC,YAAY,CAAC,IAAsB;QACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjC,sEAAsE;QACtE,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ;QACN,OAAO,OAAO,CAAC,OAAO,CACpB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,UAA2B,EAC3B,KAA+C;QAE/C,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAE,UAA+B,CAAC,IAAI,CAAC;QACjG,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvF,CAAC;QACD,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAA6B,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF;KAjCW,kBAAkB;AAmC9B;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,IAAI,IAAI,CAAC;IACzE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"local-context.js","sourceRoot":"","sources":["../../../src/harness/tools/local-context.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type SitePage } from './site-pages.js';
2
+ import { type SiteNav } from './site-nav.js';
2
3
  import type { ModelContext, ModelContextTool, ModelContextToolInfo } from '../../types.js';
3
4
  /** The tool's registered name. */
4
5
  export declare const OPEN_PAGE_TOOL = "open_page";
@@ -18,6 +19,21 @@ export interface OpenPageOptions {
18
19
  referrer?: () => string;
19
20
  /** The conversation to continue on arrival. Read when the tool runs. */
20
21
  conversationId?: () => string | undefined;
22
+ /**
23
+ * The site's graph, from its breadcrumb trails and page links.
24
+ *
25
+ * What makes "up a level" and "the section above" mean something, and what
26
+ * keeps the tool's list of destinations to the pages near this one rather
27
+ * than every page on the site.
28
+ */
29
+ nav?: SiteNav;
30
+ /**
31
+ * Fetch the trails the graph is missing, if they have not been fetched yet.
32
+ *
33
+ * Awaited when the tool runs, not at connect: the fetch is a read, and a
34
+ * site's rate limit counts reads. Going somewhere is what makes it worth one.
35
+ */
36
+ loadNav?: () => Promise<SiteNav>;
21
37
  }
22
38
  /** Where a request to open a page resolves: a page, and whether it is reached by going back. */
23
39
  export type Destination = {
@@ -1 +1 @@
1
- {"version":3,"file":"open-page.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/open-page.ts"],"names":[],"mappings":"AAeA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI1D,OAAO,KAAK,EAAc,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAA4B,MAAM,gBAAgB,CAAC;AAEjI,kCAAkC;AAClC,eAAO,MAAM,cAAc,cAAc,CAAC;AAK1C,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;IAClB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC3C;AAYD,gGAAgG;AAChG,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAerC;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,eAAoB,GACzB,WAAW,CAkCb;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,gBAAgB,CAsCjG;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,EACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAK3C;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,QAAQ,EAAE,EACjB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,OAAO,CAAC,CAelB"}
1
+ {"version":3,"file":"open-page.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/open-page.ts"],"names":[],"mappings":"AAeA,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAA0C,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAIrF,OAAO,KAAK,EAAc,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAA4B,MAAM,gBAAgB,CAAC;AAEjI,kCAAkC;AAClC,eAAO,MAAM,cAAc,cAAc,CAAC;AAK1C,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC;IAClB,gGAAgG;IAChG,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC1C;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAClC;AAgBD,gGAAgG;AAChG,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAerC;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,eAAoB,GACzB,WAAW,CAiDb;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,gBAAgB,CA8CjG;AAeD;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,EACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,CAAC,EAAE,MAAM,GACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAK3C;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,QAAQ,EAAE,EACjB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,OAAO,CAAC,CAgBlB"}
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { samePage } from './site-actions.js';
16
16
  import { findPage } from './site-pages.js';
17
+ import { nameOf, navFor, parentOf } from './site-nav.js';
17
18
  import { savePendingVisit } from './pending-action.js';
18
19
  import { HANDOFF_RESULT } from './action-tools.js';
19
20
  import { journeySteps } from '../steps.js';
@@ -25,6 +26,8 @@ const MAX_LISTED = 40;
25
26
  const HOME = /^(?:(?:go|take\s+me|return)\s+(?:to\s+)?)?(?:the\s+)?(?:home|homepage|home\s*page|start(?:\s*page)?|main\s*page|front\s*page|landing\s*page|index)$/i;
26
27
  /** What the visitor says for the page they came from: "back", "go back to the previous page". */
27
28
  const BACK = /^(?:(?:go|take\s+me|return|head)\s+)?back(?:\s+to)?(?:\s+(?:the\s+)?(?:previous|last)\s+page)?$|^(?:the\s+)?(?:previous|last)\s+page$|^where\s+i\s+was$/i;
29
+ /** What the visitor says for the page above this one: "up", "the section above". */
30
+ const UP = /^(?:(?:go|take\s+me|move)\s+)?(?:up|upward)(?:\s+(?:a|one)\s+level)?$|^(?:the\s+)?(?:parent|section|category)(?:\s+(?:page|above))?$|^(?:go\s+)?up\s+to\s+(?:the\s+)?(?:parent|section|category)$/i;
28
31
  /** A page's name compared the way a person would. */
29
32
  const normalName = (s) => s.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, ' ').trim();
30
33
  /** The pages and options the tool was built with, so the harness can name a destination. */
@@ -55,6 +58,18 @@ export function resolveDestination(wanted, pages, origin, opts = {}) {
55
58
  const exact = pages.filter((p) => normalName(p.name) === normalName(w));
56
59
  if (exact.length === 1)
57
60
  return { kind: 'page', url: exact[0].url, label: exact[0].name };
61
+ if (UP.test(w)) {
62
+ const above = opts.nav && parentOf(here(opts.href), opts.nav);
63
+ return above
64
+ ? { kind: 'page', url: above, label: nameOf(above, opts.nav) }
65
+ : { kind: 'none', reason: 'This page is not under a section I know of.' };
66
+ }
67
+ // Somewhere this page leads: a section above it, a page beside it, or a page it links to. Named
68
+ // by the site's own name for it, which is how the visitor heard of it.
69
+ const near = opts.nav ? nearby(opts.nav, here(opts.href)) : [];
70
+ const calledThat = near.filter((l) => normalName(l.name) === normalName(w));
71
+ if (calledThat.length === 1)
72
+ return { kind: 'page', url: calledThat[0].url, label: calledThat[0].name };
58
73
  if (BACK.test(w)) {
59
74
  const from = referrerOf(opts);
60
75
  let sameSite = false;
@@ -76,7 +91,10 @@ export function resolveDestination(wanted, pages, origin, opts = {}) {
76
91
  const found = findPage(w, pages, origin);
77
92
  if (found)
78
93
  return { kind: 'page', url: found.url, label: found.name };
79
- const some = [...new Set(pages.map((p) => p.name))].slice(0, 8).join(', ');
94
+ const loose = near.filter((l) => normalName(l.name).includes(normalName(w)));
95
+ if (loose.length === 1)
96
+ return { kind: 'page', url: loose[0].url, label: loose[0].name };
97
+ const some = [...new Set([...near.map((l) => l.name), ...pages.map((p) => p.name)])].slice(0, 8).join(', ');
80
98
  return {
81
99
  kind: 'none',
82
100
  reason: `There is no page called "${w}" on this site${some ? `. Pages include: ${some}` : ''}.`,
@@ -92,16 +110,20 @@ export function resolveDestination(wanted, pages, origin, opts = {}) {
92
110
  export function buildOpenPageTool(pages, opts = {}) {
93
111
  const origin = originOf(opts.origin);
94
112
  known = { pages, origin, opts };
95
- const names = [...new Set(pages.map((p) => p.name))];
113
+ // Near first: a page's own surroundings are what a visitor asks for, and every name here reaches
114
+ // the prompt. The rest of the site stays reachable by name, and the description says so.
115
+ const near = opts.nav ? nearby(opts.nav, here(opts.href)).map((l) => l.name) : [];
116
+ const names = [...new Set([...near, ...pages.map((p) => p.name)])];
117
+ const listed = names.length <= MAX_LISTED ? names : [...new Set(near)].slice(0, MAX_LISTED);
96
118
  const page = {
97
119
  type: 'string',
98
120
  description: (names.length <= MAX_LISTED
99
121
  ? 'The page to open, by name.'
100
- : 'The page to open: the name of the business, listing or record it is about.') +
101
- ' Use "home" for the home page and "back" for the page the visitor was on before.',
122
+ : 'The page to open: the name of the business, listing or record it is about. Any page of the site by name, not only those listed.') +
123
+ ' Use "home" for the home page, "back" for the page the visitor was on before, and "up" for the section above this page.',
102
124
  };
103
- if (names.length && names.length <= MAX_LISTED)
104
- page.enum = ['home', 'back', ...names];
125
+ if (listed.length)
126
+ page.enum = ['home', 'back', ...(opts.nav || opts.loadNav ? ['up'] : []), ...listed];
105
127
  return {
106
128
  name: OPEN_PAGE_TOOL,
107
129
  description: 'Take the visitor to a page on this site. Use when they ask to go to, open, visit or see a page — ' +
@@ -109,7 +131,11 @@ export function buildOpenPageTool(pages, opts = {}) {
109
131
  inputSchema: { type: 'object', properties: { page }, required: ['page'] },
110
132
  annotations: { readOnlyHint: true },
111
133
  execute: async (input) => {
112
- const to = resolveDestination(String(input?.page ?? ''), pages, origin, opts);
134
+ const filled = await opts.loadNav?.().catch(() => opts.nav);
135
+ const to = resolveDestination(String(input?.page ?? ''), pages, origin, {
136
+ ...opts,
137
+ nav: filled ?? opts.nav,
138
+ });
113
139
  if (to.kind === 'none')
114
140
  return text(to.reason, true);
115
141
  if (samePage(to.url, here(opts.href)))
@@ -126,6 +152,16 @@ export function buildOpenPageTool(pages, opts = {}) {
126
152
  },
127
153
  };
128
154
  }
155
+ /**
156
+ * Everywhere this page leads: the sections above it, the pages beside and under
157
+ * it, and the pages it points at. Ancestors first, because "up" and "the
158
+ * section" are what a visitor asks for most.
159
+ */
160
+ function nearby(nav, href) {
161
+ const { ancestors, siblings, children, links } = navFor(nav, href);
162
+ const seen = new Set();
163
+ return [...ancestors, ...children, ...links, ...siblings].filter((l) => seen.has(l.url) ? false : (seen.add(l.url), true));
164
+ }
129
165
  /**
130
166
  * Where a call to the page-opening tool goes, before it runs.
131
167
  *
@@ -146,8 +182,8 @@ export function visitFor(tool, values, href) {
146
182
  * @returns Whether it was registered.
147
183
  */
148
184
  export async function registerOpenPageTool(mc, pages, opts = {}) {
149
- if (!pages.length)
150
- return false;
185
+ // Registered with no pages too: "home" and "back" need no list, and a site whose page records
186
+ // could not be read is exactly where a visitor still wants to get home.
151
187
  const tool = buildOpenPageTool(pages, opts);
152
188
  try {
153
189
  if ((await mc.getTools()).some((t) => t.name === OPEN_PAGE_TOOL))
@@ -1 +1 @@
1
- {"version":3,"file":"open-page.js","sourceRoot":"","sources":["../../../src/harness/tools/open-page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open-page.js","sourceRoot":"","sources":["../../../src/harness/tools/open-page.ts"],"names":[],"mappings":"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"}