@nxisai/agent-harness 0.4.1 → 0.6.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 (137) hide show
  1. package/README.md +25 -2
  2. package/dist/handoff/a2a.d.ts +152 -0
  3. package/dist/handoff/a2a.d.ts.map +1 -0
  4. package/dist/handoff/a2a.js +227 -0
  5. package/dist/handoff/a2a.js.map +1 -0
  6. package/dist/handoff/controller.d.ts +181 -0
  7. package/dist/handoff/controller.d.ts.map +1 -0
  8. package/dist/handoff/controller.js +543 -0
  9. package/dist/handoff/controller.js.map +1 -0
  10. package/dist/handoff/envelope.d.ts +130 -0
  11. package/dist/handoff/envelope.d.ts.map +1 -0
  12. package/dist/handoff/envelope.js +178 -0
  13. package/dist/handoff/envelope.js.map +1 -0
  14. package/dist/handoff/index.d.ts +16 -0
  15. package/dist/handoff/index.d.ts.map +1 -0
  16. package/dist/handoff/index.js +12 -0
  17. package/dist/handoff/index.js.map +1 -0
  18. package/dist/handoff/tools.d.ts +36 -0
  19. package/dist/handoff/tools.d.ts.map +1 -0
  20. package/dist/handoff/tools.js +148 -0
  21. package/dist/handoff/tools.js.map +1 -0
  22. package/dist/harness/harness.d.ts +4 -2
  23. package/dist/harness/harness.d.ts.map +1 -1
  24. package/dist/harness/harness.js +61 -16
  25. package/dist/harness/harness.js.map +1 -1
  26. package/dist/harness/router/coordinator.d.ts +13 -0
  27. package/dist/harness/router/coordinator.d.ts.map +1 -1
  28. package/dist/harness/router/coordinator.js +7 -0
  29. package/dist/harness/router/coordinator.js.map +1 -1
  30. package/dist/harness/tools/action-tools.d.ts.map +1 -1
  31. package/dist/harness/tools/action-tools.js +7 -5
  32. package/dist/harness/tools/action-tools.js.map +1 -1
  33. package/dist/harness/tools/bridge.d.ts.map +1 -1
  34. package/dist/harness/tools/bridge.js +33 -12
  35. package/dist/harness/tools/bridge.js.map +1 -1
  36. package/dist/harness/tools/discovery.d.ts +12 -1
  37. package/dist/harness/tools/discovery.d.ts.map +1 -1
  38. package/dist/harness/tools/discovery.js +19 -1
  39. package/dist/harness/tools/discovery.js.map +1 -1
  40. package/dist/harness/tools/local-context.d.ts +49 -9
  41. package/dist/harness/tools/local-context.d.ts.map +1 -1
  42. package/dist/harness/tools/local-context.js +377 -22
  43. package/dist/harness/tools/local-context.js.map +1 -1
  44. package/dist/harness/tools/open-page.d.ts +16 -0
  45. package/dist/harness/tools/open-page.d.ts.map +1 -1
  46. package/dist/harness/tools/open-page.js +45 -9
  47. package/dist/harness/tools/open-page.js.map +1 -1
  48. package/dist/harness/tools/retry.d.ts +53 -0
  49. package/dist/harness/tools/retry.d.ts.map +1 -0
  50. package/dist/harness/tools/retry.js +96 -0
  51. package/dist/harness/tools/retry.js.map +1 -0
  52. package/dist/harness/tools/schema.d.ts +18 -0
  53. package/dist/harness/tools/schema.d.ts.map +1 -1
  54. package/dist/harness/tools/schema.js +38 -0
  55. package/dist/harness/tools/schema.js.map +1 -1
  56. package/dist/harness/tools/site-actions.d.ts.map +1 -1
  57. package/dist/harness/tools/site-actions.js +3 -2
  58. package/dist/harness/tools/site-actions.js.map +1 -1
  59. package/dist/harness/tools/site-nav.d.ts +168 -0
  60. package/dist/harness/tools/site-nav.d.ts.map +1 -0
  61. package/dist/harness/tools/site-nav.js +316 -0
  62. package/dist/harness/tools/site-nav.js.map +1 -0
  63. package/dist/harness/tools/site-pages.d.ts +4 -0
  64. package/dist/harness/tools/site-pages.d.ts.map +1 -1
  65. package/dist/harness/tools/site-pages.js +19 -3
  66. package/dist/harness/tools/site-pages.js.map +1 -1
  67. package/dist/harness/tools/source.d.ts +9 -0
  68. package/dist/harness/tools/source.d.ts.map +1 -1
  69. package/dist/harness/tools/source.js +54 -14
  70. package/dist/harness/tools/source.js.map +1 -1
  71. package/dist/harness/tools/webmcp.d.ts +39 -3
  72. package/dist/harness/tools/webmcp.d.ts.map +1 -1
  73. package/dist/harness/tools/webmcp.js +93 -14
  74. package/dist/harness/tools/webmcp.js.map +1 -1
  75. package/dist/index.d.ts +6 -1
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +5 -1
  78. package/dist/index.js.map +1 -1
  79. package/dist/types.d.ts +2 -0
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/ui/agent-fullscreen.d.ts.map +1 -1
  82. package/dist/ui/agent-fullscreen.js +276 -2
  83. package/dist/ui/agent-fullscreen.js.map +1 -1
  84. package/dist/ui/tailwind.generated.d.ts +1 -1
  85. package/dist/ui/tailwind.generated.d.ts.map +1 -1
  86. package/dist/ui/tailwind.generated.js +1 -1
  87. package/dist/ui/tailwind.generated.js.map +1 -1
  88. package/package.json +2 -1
  89. package/src/a2ui/cards.ts +177 -0
  90. package/src/a2ui/emit.ts +147 -0
  91. package/src/a2ui/form.ts +117 -0
  92. package/src/a2ui/host.ts +73 -0
  93. package/src/a2ui/index.ts +22 -0
  94. package/src/a2ui/stepper.ts +211 -0
  95. package/src/a2ui/theme.ts +134 -0
  96. package/src/a2ui/to-v09.ts +118 -0
  97. package/src/engine.ts +701 -0
  98. package/src/handoff/a2a.ts +326 -0
  99. package/src/handoff/controller.ts +661 -0
  100. package/src/handoff/envelope.ts +216 -0
  101. package/src/handoff/index.ts +53 -0
  102. package/src/handoff/tools.ts +178 -0
  103. package/src/harness/harness.ts +981 -0
  104. package/src/harness/plan.ts +91 -0
  105. package/src/harness/policy.ts +59 -0
  106. package/src/harness/renderer.ts +208 -0
  107. package/src/harness/router/coordinator.ts +241 -0
  108. package/src/harness/router/rules.ts +65 -0
  109. package/src/harness/slots.ts +117 -0
  110. package/src/harness/steps.ts +156 -0
  111. package/src/harness/tools/action-tools.ts +870 -0
  112. package/src/harness/tools/bridge.ts +393 -0
  113. package/src/harness/tools/client.ts +26 -0
  114. package/src/harness/tools/discovery.ts +73 -0
  115. package/src/harness/tools/local-context.ts +480 -0
  116. package/src/harness/tools/open-page.ts +273 -0
  117. package/src/harness/tools/pending-action.ts +232 -0
  118. package/src/harness/tools/resume.ts +134 -0
  119. package/src/harness/tools/retry.ts +117 -0
  120. package/src/harness/tools/schema.ts +245 -0
  121. package/src/harness/tools/site-actions.ts +356 -0
  122. package/src/harness/tools/site-nav.ts +432 -0
  123. package/src/harness/tools/site-pages.ts +288 -0
  124. package/src/harness/tools/source.ts +353 -0
  125. package/src/harness/tools/webmcp.ts +200 -0
  126. package/src/index.ts +196 -0
  127. package/src/providers/capability.ts +167 -0
  128. package/src/providers/proxy.ts +191 -0
  129. package/src/providers/types.ts +150 -0
  130. package/src/types.ts +258 -0
  131. package/src/ui/agent-fullscreen.ts +4262 -0
  132. package/src/ui/agent.tw.css +49 -0
  133. package/src/ui/config.ts +138 -0
  134. package/src/ui/index.ts +32 -0
  135. package/src/ui/journey.ts +57 -0
  136. package/src/ui/tailwind.generated.ts +2 -0
  137. package/src/webmcp-contract.ts +65 -0
@@ -8,7 +8,18 @@
8
8
  *
9
9
  * @module
10
10
  */
11
- import type { McpServerInfo } from '../../types.js';
11
+ import type { CatalogEntry, CatalogFile, McpServerInfo } from '../../types.js';
12
+ /**
13
+ * The catalog entry for the MCP server card.
14
+ *
15
+ * A catalog can list more than the MCP server: an A2A Agent Card for a
16
+ * handoff target, say. An entry typed as an MCP server card wins; an entry
17
+ * typed as anything else is never taken for one; an untyped entry is taken
18
+ * only when nothing is typed, as older catalogs have no types at all.
19
+ *
20
+ * @returns The entry, or undefined when the catalog lists no MCP server.
21
+ */
22
+ export declare function mcpCatalogEntry(catalog: CatalogFile): CatalogEntry | undefined;
12
23
  /** Discover the remote MCP server: card URL → endpoint, auth, public tools. */
13
24
  export declare function discoverMcpServer(): Promise<McpServerInfo>;
14
25
  //# sourceMappingURL=discovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAe,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAuB7E,+EAA+E;AAC/E,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAoBhE"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAQ3F;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,CAM9E;AAiBD,+EAA+E;AAC/E,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAoBhE"}
@@ -4,13 +4,31 @@ async function fetchJson(url) {
4
4
  throw new Error(`GET ${url} → ${res.status}`);
5
5
  return (await res.json());
6
6
  }
7
+ /**
8
+ * The catalog entry for the MCP server card.
9
+ *
10
+ * A catalog can list more than the MCP server: an A2A Agent Card for a
11
+ * handoff target, say. An entry typed as an MCP server card wins; an entry
12
+ * typed as anything else is never taken for one; an untyped entry is taken
13
+ * only when nothing is typed, as older catalogs have no types at all.
14
+ *
15
+ * @returns The entry, or undefined when the catalog lists no MCP server.
16
+ */
17
+ export function mcpCatalogEntry(catalog) {
18
+ const entries = (catalog.entries ?? []).filter((e) => !!e.url);
19
+ const typeOf = (e) => (e.type ?? e.mediaType ?? '').toLowerCase();
20
+ const typed = entries.find((e) => /\bmcp\b|mcp-server/.test(typeOf(e)));
21
+ if (typed)
22
+ return typed;
23
+ return entries.find((e) => !typeOf(e));
24
+ }
7
25
  /** Find the server-card URL by reading the well-known catalogs in order. */
8
26
  async function resolveServerCardUrl() {
9
27
  const catalogs = ['/.well-known/ai-catalog.json', '/.well-known/mcp/catalog.json'];
10
28
  for (const path of catalogs) {
11
29
  try {
12
30
  const catalog = await fetchJson(path);
13
- const entry = catalog.entries?.find((e) => !!e.url);
31
+ const entry = mcpCatalogEntry(catalog);
14
32
  if (entry?.url)
15
33
  return entry.url;
16
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/harness/tools/discovery.ts"],"names":[],"mappings":"AAYA,KAAK,UAAU,SAAS,CAAI,GAAW;IACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;AACjC,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,oBAAoB;IACjC,MAAM,QAAQ,GAAG,CAAC,8BAA8B,EAAE,+BAA+B,CAAC,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAc,IAAI,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,KAAK,EAAE,GAAG;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC1E,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAa,OAAO,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,CAAC,MAAM,EAAE,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,6BAA6B,CAAC,CAAC;IAE1F,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAI,IAAI,CAAC,qBAAqB,CAA0B,IAAI,EAAE,CAAC;IAEhF,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,GAAG;QACpB,cAAc,EAAE,UAAU,EAAE,IAAI;QAChC,YAAY,EAAE,UAAU,EAAE,UAAU,IAAI,KAAK;QAC7C,WAAW;QACX,gBAAgB,EAAE,MAAM,CAAC,yBAAyB,IAAI,EAAE;QACxD,OAAO;QACP,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/harness/tools/discovery.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,44 @@
1
1
  /**
2
- * A minimal WebMCP registry, for pages that have none of their own.
2
+ * A WebMCP registry for pages that have none of their own.
3
3
  *
4
- * `document.modelContext` is normally installed by a page script or a browser
5
- * extension. Where neither is present, discovered remote tools would have
4
+ * `document.modelContext` is normally installed by the browser, a page script
5
+ * or an extension. Where none is present, discovered remote tools would have
6
6
  * nowhere to be registered, and a site with a working MCP server would still
7
7
  * offer the agent no tools.
8
8
  *
9
- * Implements only register, list and execute. It does not expose the page's own
10
- * forms, which come from the page's own script.
9
+ * '''It is built to the WebMCP spec''' (https://webmachinelearning.github.io/webmcp/),
10
+ * step for step, as `@nxisai/webmcp` is, and `npm run conformance` there checks
11
+ * both against it. A registry kinder than the spec lets code pass every test
12
+ * here and fail in a browser that follows it — which is how an answer in words
13
+ * once reached visitors as an empty "No results found." card. In short:
14
+ *
15
+ * - `registerTool` never throws; every failure rejects. A missing `name`,
16
+ * `description` or `execute`, or an `inputSchema` that is not an object, is a
17
+ * `TypeError`; a duplicate name, one outside 1–128 of `[A-Za-z0-9_.-]`, or an
18
+ * empty description is an `InvalidStateError`. It resolves after `toolchange`.
19
+ * - `getTools` lists tools sorted by name, with `title` (`""` when absent),
20
+ * `origin` and `window`; `inputSchema` and `annotations` only when given, the
21
+ * annotations as the spec's four hints.
22
+ * - `executeTool` takes a tool as `getTools` reports it and an input object —
23
+ * required. The tool gets a copy of the input through JSON, and `{ signal }`.
24
+ * The result comes back serialized as JSON, so a string arrives quoted; a
25
+ * tool that throws, or returns what JSON cannot hold (`undefined`), rejects
26
+ * with `UnknownError`. Input is not checked against the schema.
27
+ * - `toolactivated` fires as a tool starts, `toolcancel` when a caller aborts it.
28
+ *
29
+ * Browsers are not there yet: Chrome 155 returns strings unquoted, `"undefined"`
30
+ * for nothing, accepts an omitted input and fires neither new event; Chrome 153
31
+ * wants the input as a JSON string. {@link executeRegistered} and
32
+ * {@link asResponse} take all of them.
11
33
  *
12
34
  * @module
13
35
  */
14
36
  import type { ModelContext, ModelContextTool, ModelContextToolInfo, ModelContextToolResponse } from '../../types.js';
15
37
  /** Set on the instance so a later, real provider can be told apart from ours. */
16
38
  export declare const LOCAL_CONTEXT_FLAG = "__nxisLocalModelContext";
39
+ type Handler = ((event: Event) => unknown) | null;
17
40
  /**
18
- * A minimal in-memory tool registry implementing {@link ModelContext}.
41
+ * An in-memory tool registry built to the WebMCP spec.
19
42
  *
20
43
  * Installed by {@link ensureModelContext} on pages that have no registry of
21
44
  * their own, so that discovered remote tools have somewhere to live.
@@ -23,9 +46,25 @@ export declare const LOCAL_CONTEXT_FLAG = "__nxisLocalModelContext";
23
46
  export declare class LocalModelContext extends EventTarget implements ModelContext {
24
47
  readonly [LOCAL_CONTEXT_FLAG] = true;
25
48
  private readonly _tools;
26
- registerTool(tool: ModelContextTool): void;
27
- getTools(): Promise<ModelContextToolInfo[]>;
28
- executeTool(nameOrTool: string | object, input?: string | Record<string, unknown> | null): Promise<ModelContextToolResponse>;
49
+ private readonly _pending;
50
+ private readonly _handlers;
51
+ private readonly _listeners;
52
+ get ontoolchange(): Handler;
53
+ set ontoolchange(handler: Handler);
54
+ get ontoolactivated(): Handler;
55
+ set ontoolactivated(handler: Handler);
56
+ get ontoolcancel(): Handler;
57
+ set ontoolcancel(handler: Handler);
58
+ registerTool(tool: ModelContextTool, options?: unknown): Promise<void>;
59
+ getTools(options?: unknown): Promise<ModelContextToolInfo[]>;
60
+ executeTool(tool: string | object, inputObject?: unknown, options?: unknown): Promise<ModelContextToolResponse>;
61
+ /** The spec's tool execute steps, then its imperative execute steps. */
62
+ private _runTool;
63
+ /** The spec's "cancel a pending tool execution". */
64
+ private _cancel;
65
+ private _notifyToolChange;
66
+ /** An event handler attribute: one listener, kept in its place however often the handler changes. */
67
+ private _setHandler;
29
68
  }
30
69
  /**
31
70
  * Install a {@link LocalModelContext} on `document` if the page has no registry.
@@ -35,4 +74,5 @@ export declare class LocalModelContext extends EventTarget implements ModelConte
35
74
  * @returns The page's registry, whether pre-existing or newly installed.
36
75
  */
37
76
  export declare function ensureModelContext(): ModelContext;
77
+ export {};
38
78
  //# sourceMappingURL=local-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-context.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/local-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAExB,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,YAAY;IACxE,QAAQ,CAAC,CAAC,kBAAkB,CAAC,QAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAM1C,QAAQ,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAWrC,WAAW,CACf,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC9C,OAAO,CAAC,wBAAwB,CAAC;CAUrC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAMjD"}
1
+ {"version":3,"file":"local-context.d.ts","sourceRoot":"","sources":["../../../src/harness/tools/local-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAExB,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAmH5D,KAAK,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;AAYlD;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,YAAY;IACxE,QAAQ,CAAC,CAAC,kBAAkB,CAAC,QAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;IAEhE,IAAI,YAAY,IAAI,OAAO,CAE1B;IACD,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,EAEhC;IACD,IAAI,eAAe,IAAI,OAAO,CAE7B;IACD,IAAI,eAAe,CAAC,OAAO,EAAE,OAAO,EAEnC;IACD,IAAI,YAAY,IAAI,OAAO,CAE1B;IACD,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,EAEhC;IAED,YAAY,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAE,OAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4E1E,QAAQ,CAAC,OAAO,GAAE,OAAY,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA4BhE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,OAAY,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAmFnH,wEAAwE;IACxE,OAAO,CAAC,QAAQ;IA0ChB,oDAAoD;IACpD,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,iBAAiB;IAIzB,qGAAqG;IACrG,OAAO,CAAC,WAAW;CAcpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAMjD"}
@@ -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":";AA0CA,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAwB5D,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAE5C,SAAS,YAAY,CAAC,OAAe,EAAE,IAAY;IACjD,IAAI,OAAO,YAAY,KAAK,UAAU;QAAE,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,wEAAwE;AACxE,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAQ,EAAE,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAEzE,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CACnD,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;AAE/E,kGAAkG;AAClG,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACvF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,IAAY;IAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,IAAI,IAAI,CAAC,CAAC;IAC1F,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,IAA6B,EAAE,MAAc,EAAE,IAAY;IAC3E,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,uBAAuB,MAAM,oBAAoB,IAAI,kCAAkC,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO;QACL,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC5C,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;QAC5B,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC;QAClC,oBAAoB,EAAE,IAAI,CAAC,sBAAsB,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,WAAW,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,SAAS,CAAC,wFAAwF,CAAC,CAAC;IAChH,CAAC;IACD,OAAO,KAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACtF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAW,EAAE,CAC3C,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAK,KAA8B,CAAC,MAAM,KAAK,KAAK,CAAC;AAC7H,gGAAgG;AAChG,MAAM,SAAS,GAAG,GAAW,EAAE,CAAC,CAAC,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAEzG,SAAS,aAAa,CAAC,GAAQ;IAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,OAAO,CAAC;AACvH,CAAC;AAED,yFAAyF;AACzF,SAAS,YAAY,CAAC,OAAgB,EAAE,MAAc;IACpD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAQ,OAAsC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,UAAU,EAAE,CAAC;QACzG,MAAM,IAAI,SAAS,CAAC,uBAAuB,MAAM,mEAAmE,CAAC,CAAC;IACxH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAA4B,EAAE,CAAC;QAClD,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,MAAgB,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,YAAY,CAAC,IAAI,MAAM,0BAA0B,EAAE,eAAe,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAAE,MAAM,YAAY,CAAC,IAAI,MAAM,4CAA4C,EAAE,eAAe,CAAC,CAAC;IACvH,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,WAAW;IAClB,MAAM,KAAK,GAAI,UAA+C,CAAC,kBAAkB,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,KAAK,KAAK,KAAK,IAAI,MAAM,KAAK,OAAO;QAC1C,CAAC,CAAC,YAAY,CAAC,gDAAgD,EAAE,eAAe,CAAC;QACjF,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAID,yFAAyF;AACzF,MAAM,SAAU,SAAQ,KAAK;IAC3B,YACE,IAAY,EACH,QAAgB;QAEzB,KAAK,CAAC,IAAI,CAAC,CAAC;QAFH,aAAQ,GAAR,QAAQ,CAAQ;IAG3B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAAlD;;QACW,QAAoB,GAAG,IAAI,CAAC;QACpB,WAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;QAC3C,aAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;QAC/C,cAAS,GAA4B,EAAE,CAAC;QACxC,eAAU,GAAkC,EAAE,CAAC;IA2RlE,CAAC;IAzRC,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC;IAC3C,CAAC;IACD,IAAI,YAAY,CAAC,OAAgB;QAC/B,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAI,IAAI,CAAC;IAC9C,CAAC;IACD,IAAI,eAAe,CAAC,OAAgB;QAClC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,IAAI,IAAI,CAAC;IAC3C,CAAC;IACD,IAAI,YAAY,CAAC,OAAgB;QAC/B,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,YAAY,CAAC,IAAsB,EAAE,UAAmB,EAAE;QACxD,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAChC,IAAI,UAA0B,CAAC;QAC/B,IAAI,MAA+B,CAAC;QACpC,IAAI,MAAe,CAAC;QACpB,IAAI,SAAkB,CAAC;QACvB,IAAI,CAAC;YACH,mEAAmE;YACnE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAW,EAAE,CAAC;YACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAChD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,IAAI,SAAS,CAAC,+CAA+C,IAAI,0CAA0C,CAAC,CAAC;YACrH,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;YAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,SAAS,CAAC,mDAAmD,IAAI,gDAAgD,CAAC,CAAC;YAC/H,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAW,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAe,EAAE,CAAC;YAC1E,UAAU,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,OAAoC,EAAE,CAAC;YACvH,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,iCAAiC,CAAC,CAAC;YACpE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,IAAI,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,iBAAiB,IAAI,0BAA0B,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC,MAAM,CACnB,YAAY,CAAC,IAAI,IAAI,8EAA8E,EAAE,mBAAmB,CAAC,CAC1H,CAAC;QACJ,CAAC;QACD,IAAI,UAAU,CAAC,WAAW,KAAK,EAAE,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,yCAAyC,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACtG,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,UAAU,CAAC,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,MAAmE,CAAC;QACxE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACvF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,MAAM,CAAC;YACjB,CAAC,CAAC,gBAAgB,CAChB,OAAO,EACP,GAAG,EAAE;gBACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,QAAQ,CAAC,UAAmB,EAAE;QAC5B,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,IAAI,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChD,4FAA4F;gBAC5F,MAAM,IAAI,GAA4B,EAAE,CAAC;gBACzC,IAAI,CAAC,CAAC,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC3D,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;gBACjC,IAAI,CAAC,CAAC,WAAW,KAAK,EAAE;oBAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBACvE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;gBAClB,OAAO,IAAuC,CAAC;YACjD,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,IAAqB,EAAE,WAAqB,EAAE,UAAmB,EAAE;QAC7E,MAAM,IAAI,GAAG,gBAAgB,CAAC;QAC9B,IAAI,IAAY,CAAC;QACjB,IAAI,MAAc,CAAC;QACnB,IAAI,GAAY,CAAC;QACjB,IAAI,MAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9D,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,SAAS,CAAC,mDAAmD,IAAI,gDAAgD,CAAC,CAAC;YAC/H,CAAC;YACD,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAW,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAW,EAAE,CAAC;YACvD,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,IAAI,SAAS,CAAC,8CAA8C,IAAI,gDAAgD,CAAC,CAAC;YAC1H,CAAC;YACD,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,IAAI,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE1C,IAAI,cAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,cAAc,KAAK,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,qCAAqC,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAC/H,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,gFAAgF,CAAC,CAAC,CAAC;QACzH,CAAC;QACD,IAAI,cAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,cAAc,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,MAAgF,CAAC;QACrF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACzF,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,MAAM,CAAC;YACjB,CAAC,CAAC,gBAAgB,CAChB,OAAO,EACP,GAAG,EAAE;gBACH,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACxB,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACtC,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,iCAAiC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;QACnH,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,GAAG,KAAK,SAAS,EAAE,IAAI,SAAS,EAAE,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,EAAE,CAAC;YACnG,MAAM,SAAS,GAAqB;gBAClC,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI,eAAe,EAAE;gBACjC,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;oBAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;wBAAE,OAAO;oBACxC,SAAS,CAAC,GAAG,EAAE,CACb,OAAO;wBACL,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAgB,CAAC;wBAClC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC,CAChF,CAAC;gBACJ,CAAC;aACF,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACnC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,8FAA8F;QAC9F,6BAA6B;QAC7B,OAAO,OAAuD,CAAC;IACjE,CAAC;IAED,wEAAwE;IAChE,QAAQ,CAAC,IAAY,EAAE,cAAsB,EAAE,SAA2B;QAChF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7D,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,IAAI,WAA6B,CAAC;QAClC,IAAI,CAAC;YACH,+EAA+E;YAC/E,WAAW,GAAG,OAAO,CAAC,OAAO,CAC3B,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAgC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAC9G,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,WAAW,CAAC,IAAI,CACd,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO,CAAC,oCAAoC;YACpE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,IAAI,UAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;YACD,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC,EACD,GAAG,EAAE;YACH,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO;YAC/B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CACF,CAAC;IACJ,CAAC;IAED,oDAAoD;IAC5C,OAAO,CAAC,IAAY;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,OAAO;YAC/B,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB;QACvB,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,qGAAqG;IAC7F,WAAW,CAAC,IAAY,EAAE,OAAgB;QAChD,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAkB,CAAC,KAAK,EAAE,EAAE;gBACxC,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK;oBAAE,KAAK,CAAC,cAAc,EAAE,CAAC;YAChF,CAAC,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;KA/RW,kBAAkB;AAiS9B;;;;;;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,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 = {