@assistant-ui/react-mcp 0.0.15 → 0.0.17

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.
@@ -19,12 +19,14 @@ type MCPConnector = {
19
19
  url: string;
20
20
  icon?: string | undefined;
21
21
  auth: MCPAuthConfig;
22
+ connectionTimeout?: number | undefined;
22
23
  };
23
24
  type MCPCustomServerRecord = {
24
25
  id: string;
25
26
  name: string;
26
27
  url: string;
27
28
  auth: MCPAuthConfig;
29
+ connectionTimeout?: number | undefined;
28
30
  createdAt: number;
29
31
  };
30
32
  type MCPServerKind = "connector" | "custom";
@@ -84,6 +86,7 @@ type MCPManagerMethods = {
84
86
  name: string;
85
87
  url: string;
86
88
  auth: MCPAuthConfig;
89
+ connectionTimeout?: number | undefined;
87
90
  }) => Promise<string>;
88
91
  removeServer: (id: string) => Promise<void>;
89
92
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-scope.d.ts","names":[],"sources":["../src/mcp-scope.ts"],"mappings":";KAEY,aAAA;EACN,IAAA;AAAA;EACA,IAAA;EAAgB,KAAA;AAAA;EAEhB,IAAA;EACA,MAAA;EACA,qBAAA;EACA,aAAA;EACA,oBAAA;EACA,QAAA;EACA,YAAA;AAAA;AAAA,KAGM,YAAA;EACV,EAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA,EAAM,aAAa;AAAA;AAAA,KAGT,qBAAA;EACV,EAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA,EAAM,aAAa;EACnB,SAAA;AAAA;AAAA,KAGU,aAAA;AAAA,KAEA,kBAAA;AAAA,KAQA,WAAA;EACV,IAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,KAGU,cAAA;EACV,EAAA;EACA,IAAA,EAAM,aAAA;EACN,IAAA;EACA,GAAA;EACA,IAAA;EACA,eAAA,EAAiB,kBAAA;EACjB,SAAA;IAAa,OAAA;EAAA;EACb,KAAA,EAAO,WAAA;EACP,gBAAA;AAAA;AAAA,KAGU,eAAA;EACV,OAAA,EAAS,cAAA;EACT,UAAA,EAAY,cAAA;EACZ,aAAA,EAAe,cAAA;EACf,UAAA;AAAA;AAAA,KAGU,gBAAA;EACV,QAAA,QAAgB,cAAA;EAChB,OAAA,QAAe,OAAA;EACf,UAAA,QAAkB,OAAA;EAClB,MAAA,QAAc,OAAA;EACd,QAAA,GAAW,IAAA,UAAc,IAAA,cAAkB,OAAA,WA3BhC;EA6BX,YAAA,GAAe,GAAA,aAAgB,OAAA,WA1BP;EA4BxB,YAAA,GAAe,WAAA,aAAwB,OAAA;AAAA;AAAA,KAG7B,cAAA;EACN,EAAA;AAAA;EACA,IAAA;EAAmB,KAAA;AAAA;EACnB,IAAA;EAAgB,KAAA;AAAA;AAAA,KAEV,iBAAA;EACV,QAAA,QAAgB,eAAA,EA/BC;EAiCjB,MAAA,GAAS,KAAA,EAAO,cAAA,KAAmB,gBAAA,EAhCtB;EAkCb,SAAA,GAAY,KAAA;IAAS,KAAA;EAAA,MAAoB,gBAAA,EAhCzB;EAkChB,YAAA,GAAe,KAAA;IAAS,KAAA;EAAA,MAAoB,gBAAA;EAC5C,eAAA,GAAkB,KAAA;IAChB,IAAA;IACA,GAAA;IACA,IAAA,EAAM,aAAA;EAAA,MACF,OAAA;EACN,YAAA,GAAe,EAAA,aAAe,OAAA;AAAA;AAAA;EAAA,UAIpB,aAAA;IACR,GAAA;MACE,OAAA,EAAS,iBAAA;IAAA;IAEX,SAAA;MACE,OAAA,EAAS,gBAAA;MACT,IAAA;QAAQ,MAAA;QAAe,KAAA,EAAO,cAAA;MAAA;IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"mcp-scope.d.ts","names":[],"sources":["../src/mcp-scope.ts"],"mappings":";KAEY,aAAA;EACN,IAAA;AAAA;EACA,IAAA;EAAgB,KAAA;AAAA;EAEhB,IAAA;EACA,MAAA;EACA,qBAAA;EACA,aAAA;EACA,oBAAA;EACA,QAAA;EACA,YAAA;AAAA;AAAA,KAGM,YAAA;EACV,EAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA,EAAM,aAAa;EACnB,iBAAA;AAAA;AAAA,KAGU,qBAAA;EACV,EAAA;EACA,IAAA;EACA,GAAA;EACA,IAAA,EAAM,aAAa;EACnB,iBAAA;EACA,SAAA;AAAA;AAAA,KAGU,aAAA;AAAA,KAEA,kBAAA;AAAA,KAQA,WAAA;EACV,IAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,KAGU,cAAA;EACV,EAAA;EACA,IAAA,EAAM,aAAA;EACN,IAAA;EACA,GAAA;EACA,IAAA;EACA,eAAA,EAAiB,kBAAA;EACjB,SAAA;IAAa,OAAA;EAAA;EACb,KAAA,EAAO,WAAA;EACP,gBAAA;AAAA;AAAA,KAGU,eAAA;EACV,OAAA,EAAS,cAAA;EACT,UAAA,EAAY,cAAA;EACZ,aAAA,EAAe,cAAA;EACf,UAAA;AAAA;AAAA,KAGU,gBAAA;EACV,QAAA,QAAgB,cAAA;EAChB,OAAA,QAAe,OAAA;EACf,UAAA,QAAkB,OAAA;EAClB,MAAA,QAAc,OAAA;EACd,QAAA,GAAW,IAAA,UAAc,IAAA,cAAkB,OAAA,WA3BhC;EA6BX,YAAA,GAAe,GAAA,aAAgB,OAAA,WA1BP;EA4BxB,YAAA,GAAe,WAAA,aAAwB,OAAA;AAAA;AAAA,KAG7B,cAAA;EACN,EAAA;AAAA;EACA,IAAA;EAAmB,KAAA;AAAA;EACnB,IAAA;EAAgB,KAAA;AAAA;AAAA,KAEV,iBAAA;EACV,QAAA,QAAgB,eAAA,EA/BC;EAiCjB,MAAA,GAAS,KAAA,EAAO,cAAA,KAAmB,gBAAA,EAhCtB;EAkCb,SAAA,GAAY,KAAA;IAAS,KAAA;EAAA,MAAoB,gBAAA,EAhCzB;EAkChB,YAAA,GAAe,KAAA;IAAS,KAAA;EAAA,MAAoB,gBAAA;EAC5C,eAAA,GAAkB,KAAA;IAChB,IAAA;IACA,GAAA;IACA,IAAA,EAAM,aAAA;IACN,iBAAA;EAAA,MACI,OAAA;EACN,YAAA,GAAe,EAAA,aAAe,OAAA;AAAA;AAAA;EAAA,UAIpB,aAAA;IACR,GAAA;MACE,OAAA,EAAS,iBAAA;IAAA;IAEX,SAAA;MACE,OAAA,EAAS,gBAAA;MACT,IAAA;QAAQ,MAAA;QAAe,KAAA,EAAO,cAAA;MAAA;IAAA;EAAA;AAAA"}
@@ -4,7 +4,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
4
4
  import { Primitive } from "@radix-ui/react-primitive";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/primitives/addForm/McpAddFormAuthSelect.tsx
7
- const AUTH_TYPES = new Set([
7
+ const AUTH_TYPES = /* @__PURE__ */ new Set([
8
8
  "none",
9
9
  "bearer",
10
10
  "oauth"
@@ -1 +1 @@
1
- {"version":3,"file":"McpAddFormAuthSelect.js","names":["ComponentPropsWithoutRef","ComponentRef","forwardRef","Primitive","useAddForm","AddFormAuthType","AUTH_TYPES","ReadonlySet","Set","asAuthType","value","has","McpAddFormPrimitiveAuthSelect","Element","select","Props","Omit","props","ref","$","_c","state","setField","t0","e","next","target","t1","children","t2","authType","displayName"],"sources":["../../../src/primitives/addForm/McpAddFormAuthSelect.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useAddForm, type AddFormAuthType } from \"./context\";\n\nconst AUTH_TYPES: ReadonlySet<AddFormAuthType> = new Set([\n \"none\",\n \"bearer\",\n \"oauth\",\n]);\n\nfunction asAuthType(value: string): AddFormAuthType | null {\n return (AUTH_TYPES as ReadonlySet<string>).has(value)\n ? (value as AddFormAuthType)\n : null;\n}\n\nexport namespace McpAddFormPrimitiveAuthSelect {\n export type Element = ComponentRef<typeof Primitive.select>;\n export type Props = Omit<\n ComponentPropsWithoutRef<typeof Primitive.select>,\n \"value\" | \"onChange\"\n >;\n}\n\nexport const McpAddFormPrimitiveAuthSelect = forwardRef<\n McpAddFormPrimitiveAuthSelect.Element,\n McpAddFormPrimitiveAuthSelect.Props\n>((props, ref) => {\n const { state, setField } = useAddForm();\n return (\n <Primitive.select\n {...props}\n ref={ref}\n value={state.authType}\n onChange={(e) => {\n const next = asAuthType(e.target.value);\n if (next) setField(\"authType\", next);\n }}\n >\n {props.children ?? (\n <>\n <option value=\"oauth\">OAuth</option>\n <option value=\"bearer\">Bearer token</option>\n <option value=\"none\">None</option>\n </>\n )}\n </Primitive.select>\n );\n});\n\nMcpAddFormPrimitiveAuthSelect.displayName = \"McpAddFormPrimitive.AuthSelect\";\n"],"mappings":";;;;;;AAQA,MAAMM,aAA2C,IAAIE,IAAI;CACvD;CACA;CACA;AAAO,CACR;AAED,SAASC,WAAWC,OAAuC;CACzD,OAAQJ,WAAmCK,IAAID,KAAK,IAC/CA,QACD;AACN;AAUA,MAAaE,gCAAgCV,YAG3Ce,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACA,MAAA,EAAAC,OAAAC,aAA4BlB,WAAW;CAAE,IAAAmB;CAAA,IAAAJ,EAAA,OAAAG,UAAA;EAM3BC,MAAAC,MAAA;GACR,MAAAC,OAAahB,WAAWe,EAACE,OAAOhB,KAAM;GACtC,IAAIe,MAAMH,SAAS,YAAYG,IAAI;EAAE;EACtCN,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAQ;CAAA,IAAAR,EAAA,OAAAF,MAAAW,UAAA;EAEAD,KAAAV,MAAKW,YAAL,qBAAA,UAAA,EAAA,UAAA;GAEG,oBAAA,UAAA;IAAc,OAAA;cAAQ;GAAc,CAAA;GACpC,oBAAA,UAAA;IAAc,OAAA;cAAS;GAAqB,CAAA;GAC5C,oBAAA,UAAA;IAAc,OAAA;cAAO;GAAa,CAAA;EAAA,EAAA,CAAA;EAErCT,EAAA,KAAAF,MAAAW;EAAAT,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAU;CAAA,IAAAV,EAAA,OAAAF,SAAAE,EAAA,OAAAD,OAAAC,EAAA,OAAAE,MAAAS,YAAAX,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,IAAA;EAfHE,KAAA,oBAAA,UAAA,QAAA;GAAA,GACMZ;GACCC;GACE,OAAAG,MAAKS;GACF,UAAAP;aAKTI;EAOH,CAAA;EAAmBR,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAE,MAAAS;EAAAX,EAAA,KAAAI;EAAAJ,EAAA,KAAAQ;EAAAR,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAA,OAhBnBU;AAgBmB,CAEtB;AAEDjB,8BAA8BmB,cAAc"}
1
+ {"version":3,"file":"McpAddFormAuthSelect.js","names":["ComponentPropsWithoutRef","ComponentRef","forwardRef","Primitive","useAddForm","AddFormAuthType","AUTH_TYPES","ReadonlySet","Set","asAuthType","value","has","McpAddFormPrimitiveAuthSelect","Element","select","Props","Omit","props","ref","$","_c","state","setField","t0","e","next","target","t1","children","t2","authType","displayName"],"sources":["../../../src/primitives/addForm/McpAddFormAuthSelect.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useAddForm, type AddFormAuthType } from \"./context\";\n\nconst AUTH_TYPES: ReadonlySet<AddFormAuthType> = new Set([\n \"none\",\n \"bearer\",\n \"oauth\",\n]);\n\nfunction asAuthType(value: string): AddFormAuthType | null {\n return (AUTH_TYPES as ReadonlySet<string>).has(value)\n ? (value as AddFormAuthType)\n : null;\n}\n\nexport namespace McpAddFormPrimitiveAuthSelect {\n export type Element = ComponentRef<typeof Primitive.select>;\n export type Props = Omit<\n ComponentPropsWithoutRef<typeof Primitive.select>,\n \"value\" | \"onChange\"\n >;\n}\n\nexport const McpAddFormPrimitiveAuthSelect = forwardRef<\n McpAddFormPrimitiveAuthSelect.Element,\n McpAddFormPrimitiveAuthSelect.Props\n>((props, ref) => {\n const { state, setField } = useAddForm();\n return (\n <Primitive.select\n {...props}\n ref={ref}\n value={state.authType}\n onChange={(e) => {\n const next = asAuthType(e.target.value);\n if (next) setField(\"authType\", next);\n }}\n >\n {props.children ?? (\n <>\n <option value=\"oauth\">OAuth</option>\n <option value=\"bearer\">Bearer token</option>\n <option value=\"none\">None</option>\n </>\n )}\n </Primitive.select>\n );\n});\n\nMcpAddFormPrimitiveAuthSelect.displayName = \"McpAddFormPrimitive.AuthSelect\";\n"],"mappings":";;;;;;AAQA,MAAMM,6BAA2C,IAAIE,IAAI;CACvD;CACA;CACA;AAAO,CACR;AAED,SAASC,WAAWC,OAAuC;CACzD,OAAQJ,WAAmCK,IAAID,KAAK,IAC/CA,QACD;AACN;AAUA,MAAaE,gCAAgCV,YAG3Ce,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CACA,MAAA,EAAAC,OAAAC,aAA4BlB,WAAW;CAAE,IAAAmB;CAAA,IAAAJ,EAAA,OAAAG,UAAA;EAM3BC,MAAAC,MAAA;GACR,MAAAC,OAAahB,WAAWe,EAACE,OAAOhB,KAAM;GACtC,IAAIe,MAAMH,SAAS,YAAYG,IAAI;EAAE;EACtCN,EAAA,KAAAG;EAAAH,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAQ;CAAA,IAAAR,EAAA,OAAAF,MAAAW,UAAA;EAEAD,KAAAV,MAAKW,YAAL,qBAAA,UAAA,EAAA,UAAA;GAEG,oBAAA,UAAA;IAAc,OAAA;cAAQ;GAAc,CAAA;GACpC,oBAAA,UAAA;IAAc,OAAA;cAAS;GAAqB,CAAA;GAC5C,oBAAA,UAAA;IAAc,OAAA;cAAO;GAAa,CAAA;EAAA,EAAA,CAAA;EAErCT,EAAA,KAAAF,MAAAW;EAAAT,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAU;CAAA,IAAAV,EAAA,OAAAF,SAAAE,EAAA,OAAAD,OAAAC,EAAA,OAAAE,MAAAS,YAAAX,EAAA,OAAAI,MAAAJ,EAAA,OAAAQ,IAAA;EAfHE,KAAA,oBAAA,UAAA,QAAA;GAAA,GACMZ;GACCC;GACE,OAAAG,MAAKS;GACF,UAAAP;aAKTI;EAOH,CAAA;EAAmBR,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAE,MAAAS;EAAAX,EAAA,KAAAI;EAAAJ,EAAA,KAAAQ;EAAAR,EAAA,KAAAU;CAAA,OAAAA,KAAAV,EAAA;CAAA,OAhBnBU;AAgBmB,CAEtB;AAEDjB,8BAA8BmB,cAAc"}
@@ -4,7 +4,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
4
4
  import { Primitive } from "@radix-ui/react-primitive";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/primitives/server/McpServerConnectButton.tsx
7
- const CONNECTABLE = new Set([
7
+ const CONNECTABLE = /* @__PURE__ */ new Set([
8
8
  "disconnected",
9
9
  "error",
10
10
  "authRequired"
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerConnectButton.js","names":["ComponentPropsWithoutRef","ComponentRef","forwardRef","Primitive","useAui","useAuiState","McpServerPrimitiveConnectButton","Element","button","Props","CONNECTABLE","Set","props","ref","$","_c","state","_temp","aui","has","t0","undefined","t1","e","onClick","defaultPrevented","mcpServer","connect","t2","displayName","s","connectionState"],"sources":["../../../src/primitives/server/McpServerConnectButton.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\nexport namespace McpServerPrimitiveConnectButton {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\nconst CONNECTABLE = new Set([\"disconnected\", \"error\", \"authRequired\"]);\n\nexport const McpServerPrimitiveConnectButton = forwardRef<\n McpServerPrimitiveConnectButton.Element,\n McpServerPrimitiveConnectButton.Props\n>((props, ref) => {\n const state = useAuiState((s) => s.mcpServer.connectionState);\n const aui = useAui();\n if (!CONNECTABLE.has(state)) return null;\n return (\n <Primitive.button\n {...props}\n type=\"button\"\n ref={ref}\n data-state-hint={state === \"authRequired\" ? \"auth-required\" : undefined}\n onClick={(e) => {\n props.onClick?.(e);\n if (e.defaultPrevented) return;\n void aui.mcpServer().connect();\n }}\n />\n );\n});\n\nMcpServerPrimitiveConnectButton.displayName =\n \"McpServerPrimitive.ConnectButton\";\n"],"mappings":";;;;;;AAaA,MAAMU,cAAc,IAAIC,IAAI;CAAC;CAAgB;CAAS;AAAc,CAAC;AAErE,MAAaL,kCAAkCJ,YAG7CU,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACA,MAAAC,QAAcX,YAAYY,KAAkC;CAC5D,MAAAC,MAAYd,OAAO;CACnB,IAAI,CAACM,YAAWS,IAAKH,KAAK,GAAC,OAAS;CAMf,MAAAI,KAAAJ,UAAU,iBAAV,kBAAAK,KAAAA;CAAsD,IAAAC;CAAA,IAAAR,EAAA,OAAAI,OAAAJ,EAAA,OAAAF,OAAA;EAC9DU,MAAAC,MAAA;GACPX,MAAKY,UAAWD,CAAC;GACjB,IAAIA,EAACE,kBAAiB;GACjBP,IAAGQ,UAAW,CAAC,CAAAC,QAAS;EAAC;EAC/Bb,EAAA,KAAAI;EAAAJ,EAAA,KAAAF;EAAAE,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAAF,SAAAE,EAAA,OAAAD,OAAAC,EAAA,OAAAM,MAAAN,EAAA,OAAAQ,IAAA;EATHM,KAAA,oBAAA,UAAA,QAAA;GAAA,GACMhB;GACC,MAAA;GACAC;GACY,mBAAAO;GACR,SAAAE;EAIR,CAAA;EACDR,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAQ;EAAAR,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAVFc;AAUE,CAEL;AAEDtB,gCAAgCuB,cAC9B;AApBA,SAAAZ,MAAAa,GAAA;CAAA,OACiCA,EAACJ,UAAUK;AAAgB"}
1
+ {"version":3,"file":"McpServerConnectButton.js","names":["ComponentPropsWithoutRef","ComponentRef","forwardRef","Primitive","useAui","useAuiState","McpServerPrimitiveConnectButton","Element","button","Props","CONNECTABLE","Set","props","ref","$","_c","state","_temp","aui","has","t0","undefined","t1","e","onClick","defaultPrevented","mcpServer","connect","t2","displayName","s","connectionState"],"sources":["../../../src/primitives/server/McpServerConnectButton.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\nexport namespace McpServerPrimitiveConnectButton {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\nconst CONNECTABLE = new Set([\"disconnected\", \"error\", \"authRequired\"]);\n\nexport const McpServerPrimitiveConnectButton = forwardRef<\n McpServerPrimitiveConnectButton.Element,\n McpServerPrimitiveConnectButton.Props\n>((props, ref) => {\n const state = useAuiState((s) => s.mcpServer.connectionState);\n const aui = useAui();\n if (!CONNECTABLE.has(state)) return null;\n return (\n <Primitive.button\n {...props}\n type=\"button\"\n ref={ref}\n data-state-hint={state === \"authRequired\" ? \"auth-required\" : undefined}\n onClick={(e) => {\n props.onClick?.(e);\n if (e.defaultPrevented) return;\n void aui.mcpServer().connect();\n }}\n />\n );\n});\n\nMcpServerPrimitiveConnectButton.displayName =\n \"McpServerPrimitive.ConnectButton\";\n"],"mappings":";;;;;;AAaA,MAAMU,8BAAc,IAAIC,IAAI;CAAC;CAAgB;CAAS;AAAc,CAAC;AAErE,MAAaL,kCAAkCJ,YAG7CU,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACA,MAAAC,QAAcX,YAAYY,KAAkC;CAC5D,MAAAC,MAAYd,OAAO;CACnB,IAAI,CAACM,YAAWS,IAAKH,KAAK,GAAC,OAAS;CAMf,MAAAI,KAAAJ,UAAU,iBAAV,kBAAAK,KAAAA;CAAsD,IAAAC;CAAA,IAAAR,EAAA,OAAAI,OAAAJ,EAAA,OAAAF,OAAA;EAC9DU,MAAAC,MAAA;GACPX,MAAKY,UAAWD,CAAC;GACjB,IAAIA,EAACE,kBAAiB;GACjBP,IAAGQ,UAAW,CAAC,CAAAC,QAAS;EAAC;EAC/Bb,EAAA,KAAAI;EAAAJ,EAAA,KAAAF;EAAAE,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAAF,SAAAE,EAAA,OAAAD,OAAAC,EAAA,OAAAM,MAAAN,EAAA,OAAAQ,IAAA;EATHM,KAAA,oBAAA,UAAA,QAAA;GAAA,GACMhB;GACC,MAAA;GACAC;GACY,mBAAAO;GACR,SAAAE;EAIR,CAAA;EACDR,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAQ;EAAAR,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAVFc;AAUE,CAEL;AAEDtB,gCAAgCuB,cAC9B;AApBA,SAAAZ,MAAAa,GAAA;CAAA,OACiCA,EAACJ,UAAUK;AAAgB"}
@@ -4,7 +4,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
4
4
  import { Primitive } from "@radix-ui/react-primitive";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/primitives/server/McpServerDisconnectButton.tsx
7
- const DISCONNECTABLE = new Set([
7
+ const DISCONNECTABLE = /* @__PURE__ */ new Set([
8
8
  "connected",
9
9
  "connecting",
10
10
  "authPending"
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerDisconnectButton.js","names":["ComponentPropsWithoutRef","ComponentRef","forwardRef","Primitive","useAui","useAuiState","McpServerPrimitiveDisconnectButton","Element","button","Props","DISCONNECTABLE","Set","props","ref","$","_c","state","_temp","aui","has","t0","e","onClick","defaultPrevented","mcpServer","disconnect","t1","displayName","s","connectionState"],"sources":["../../../src/primitives/server/McpServerDisconnectButton.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\nexport namespace McpServerPrimitiveDisconnectButton {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\nconst DISCONNECTABLE = new Set([\"connected\", \"connecting\", \"authPending\"]);\n\nexport const McpServerPrimitiveDisconnectButton = forwardRef<\n McpServerPrimitiveDisconnectButton.Element,\n McpServerPrimitiveDisconnectButton.Props\n>((props, ref) => {\n const state = useAuiState((s) => s.mcpServer.connectionState);\n const aui = useAui();\n if (!DISCONNECTABLE.has(state)) return null;\n return (\n <Primitive.button\n {...props}\n type=\"button\"\n ref={ref}\n onClick={(e) => {\n props.onClick?.(e);\n if (e.defaultPrevented) return;\n void aui.mcpServer().disconnect();\n }}\n />\n );\n});\n\nMcpServerPrimitiveDisconnectButton.displayName =\n \"McpServerPrimitive.DisconnectButton\";\n"],"mappings":";;;;;;AAaA,MAAMU,iBAAiB,IAAIC,IAAI;CAAC;CAAa;CAAc;AAAa,CAAC;AAEzE,MAAaL,qCAAqCJ,YAGhDU,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACA,MAAAC,QAAcX,YAAYY,KAAkC;CAC5D,MAAAC,MAAYd,OAAO;CACnB,IAAI,CAACM,eAAcS,IAAKH,KAAK,GAAC,OAAS;CAAK,IAAAI;CAAA,IAAAN,EAAA,OAAAI,OAAAJ,EAAA,OAAAF,OAAA;EAM/BQ,MAAAC,MAAA;GACPT,MAAKU,UAAWD,CAAC;GACjB,IAAIA,EAACE,kBAAiB;GACjBL,IAAGM,UAAW,CAAC,CAAAC,WAAY;EAAC;EAClCX,EAAA,KAAAI;EAAAJ,EAAA,KAAAF;EAAAE,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAAF,SAAAE,EAAA,OAAAD,OAAAC,EAAA,OAAAM,IAAA;EARHM,KAAA,oBAAA,UAAA,QAAA;GAAA,GACMd;GACC,MAAA;GACAC;GACI,SAAAO;EAIR,CAAA;EACDN,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,OATFY;AASE,CAEL;AAEDpB,mCAAmCqB,cACjC;AAnBA,SAAAV,MAAAW,GAAA;CAAA,OACiCA,EAACJ,UAAUK;AAAgB"}
1
+ {"version":3,"file":"McpServerDisconnectButton.js","names":["ComponentPropsWithoutRef","ComponentRef","forwardRef","Primitive","useAui","useAuiState","McpServerPrimitiveDisconnectButton","Element","button","Props","DISCONNECTABLE","Set","props","ref","$","_c","state","_temp","aui","has","t0","e","onClick","defaultPrevented","mcpServer","disconnect","t1","displayName","s","connectionState"],"sources":["../../../src/primitives/server/McpServerDisconnectButton.tsx"],"sourcesContent":["import {\n type ComponentPropsWithoutRef,\n type ComponentRef,\n forwardRef,\n} from \"react\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\n\nexport namespace McpServerPrimitiveDisconnectButton {\n export type Element = ComponentRef<typeof Primitive.button>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;\n}\n\nconst DISCONNECTABLE = new Set([\"connected\", \"connecting\", \"authPending\"]);\n\nexport const McpServerPrimitiveDisconnectButton = forwardRef<\n McpServerPrimitiveDisconnectButton.Element,\n McpServerPrimitiveDisconnectButton.Props\n>((props, ref) => {\n const state = useAuiState((s) => s.mcpServer.connectionState);\n const aui = useAui();\n if (!DISCONNECTABLE.has(state)) return null;\n return (\n <Primitive.button\n {...props}\n type=\"button\"\n ref={ref}\n onClick={(e) => {\n props.onClick?.(e);\n if (e.defaultPrevented) return;\n void aui.mcpServer().disconnect();\n }}\n />\n );\n});\n\nMcpServerPrimitiveDisconnectButton.displayName =\n \"McpServerPrimitive.DisconnectButton\";\n"],"mappings":";;;;;;AAaA,MAAMU,iCAAiB,IAAIC,IAAI;CAAC;CAAa;CAAc;AAAa,CAAC;AAEzE,MAAaL,qCAAqCJ,YAGhDU,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACA,MAAAC,QAAcX,YAAYY,KAAkC;CAC5D,MAAAC,MAAYd,OAAO;CACnB,IAAI,CAACM,eAAcS,IAAKH,KAAK,GAAC,OAAS;CAAK,IAAAI;CAAA,IAAAN,EAAA,OAAAI,OAAAJ,EAAA,OAAAF,OAAA;EAM/BQ,MAAAC,MAAA;GACPT,MAAKU,UAAWD,CAAC;GACjB,IAAIA,EAACE,kBAAiB;GACjBL,IAAGM,UAAW,CAAC,CAAAC,WAAY;EAAC;EAClCX,EAAA,KAAAI;EAAAJ,EAAA,KAAAF;EAAAE,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,OAAAF,SAAAE,EAAA,OAAAD,OAAAC,EAAA,OAAAM,IAAA;EARHM,KAAA,oBAAA,UAAA,QAAA;GAAA,GACMd;GACC,MAAA;GACAC;GACI,SAAAO;EAIR,CAAA;EACDN,EAAA,KAAAF;EAAAE,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,OATFY;AASE,CAEL;AAEDpB,mCAAmCqB,cACjC;AAnBA,SAAAV,MAAAW,GAAA;CAAA,OACiCA,EAACJ,UAAUK;AAAgB"}
@@ -7,7 +7,8 @@ type McpManagerResourceProps = {
7
7
  connectors?: MCPConnector[] | undefined;
8
8
  storage?: MCPStorageElement | undefined; /** OAuth redirect target. Defaults to `${origin}/mcp/callback`. */
9
9
  oauthRedirectUri?: string | undefined; /** Connect on mount when usable auth exists. Default true. */
10
- autoConnect?: boolean | undefined;
10
+ autoConnect?: boolean | undefined; /** Optional timeout in milliseconds for connect/listTools calls. Disabled by default. */
11
+ connectionTimeout?: number | undefined;
11
12
  };
12
13
  declare const McpManagerResource: import("@assistant-ui/tap").Resource<ClientOutput<"mcp">, [props: McpManagerResourceProps]>;
13
14
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"McpManagerResource.d.ts","names":[],"sources":["../../src/resources/McpManagerResource.ts"],"mappings":";;;;;KAoBY,uBAAA;EACV,UAAA,GAAa,YAAA;EACb,OAAA,GAAU,iBAAiB,cAFM;EAIjC,gBAAA,uBAF2B;EAI3B,WAAA;AAAA;AAAA,cA4NW,kBAAA,8BAAkB,QAAA,CAAA,YAAA,UAAA,KAAA,EAAA,uBAAA"}
1
+ {"version":3,"file":"McpManagerResource.d.ts","names":[],"sources":["../../src/resources/McpManagerResource.ts"],"mappings":";;;;;KAqBY,uBAAA;EACV,UAAA,GAAa,YAAA;EACb,OAAA,GAAU,iBAAiB,cAFM;EAIjC,gBAAA,uBAF2B;EAI3B,WAAA,wBALa;EAOb,iBAAA;AAAA;AAAA,cA4OW,kBAAA,8BAAkB,QAAA,CAAA,YAAA,UAAA,KAAA,EAAA,uBAAA"}
@@ -1,3 +1,4 @@
1
+ import { assertUniqueServerIds } from "../utils/serverId.js";
1
2
  import { McpServerResource } from "./McpServerResource.js";
2
3
  import { McpLocalStorage } from "./storage/McpLocalStorage.js";
3
4
  import { attachTransformScopes, useAssistantClientRef, useClientLookup } from "@assistant-ui/store";
@@ -12,7 +13,7 @@ function defaultRedirectUri() {
12
13
  }
13
14
  const NO_CONNECTORS = [];
14
15
  const useMcpManagerResource = (props) => {
15
- const $ = c(69);
16
+ const $ = c(72);
16
17
  const connectors = props.connectors ?? NO_CONNECTORS;
17
18
  const autoConnect = props.autoConnect ?? true;
18
19
  let t0;
@@ -22,6 +23,7 @@ const useMcpManagerResource = (props) => {
22
23
  $[1] = t0;
23
24
  } else t0 = $[1];
24
25
  const redirectUri = t0;
26
+ const connectionTimeout = props.connectionTimeout;
25
27
  let t1;
26
28
  if ($[2] !== props.storage) {
27
29
  t1 = props.storage ?? McpLocalStorage();
@@ -110,88 +112,94 @@ const useMcpManagerResource = (props) => {
110
112
  $[16] = t8;
111
113
  } else t8 = $[16];
112
114
  useEffect(t7, t8);
115
+ assertUniqueServerIds([...connectors.map(_temp2), ...customServers.map(_temp3)]);
113
116
  let t9;
114
- if ($[17] !== autoConnect || $[18] !== connectors || $[19] !== customServers || $[20] !== redirectUri || $[21] !== storage) {
117
+ if ($[17] !== autoConnect || $[18] !== connectionTimeout || $[19] !== connectors || $[20] !== customServers || $[21] !== redirectUri || $[22] !== storage) {
115
118
  let t10;
116
- if ($[23] !== autoConnect || $[24] !== redirectUri || $[25] !== storage) {
117
- t10 = (c) => withKey(c.id, McpServerResource({
118
- id: c.id,
119
+ if ($[24] !== autoConnect || $[25] !== connectionTimeout || $[26] !== redirectUri || $[27] !== storage) {
120
+ t10 = (c_0) => withKey(c_0.id, McpServerResource({
121
+ id: c_0.id,
119
122
  kind: "connector",
120
- name: c.name,
121
- url: c.url,
122
- icon: c.icon,
123
- auth: c.auth,
123
+ name: c_0.name,
124
+ url: c_0.url,
125
+ icon: c_0.icon,
126
+ auth: c_0.auth,
124
127
  storage,
125
128
  redirectUri,
126
129
  autoConnect,
127
- onRemove: _temp2
130
+ connectionTimeout: c_0.connectionTimeout ?? connectionTimeout,
131
+ onRemove: _temp4
128
132
  }));
129
- $[23] = autoConnect;
130
- $[24] = redirectUri;
131
- $[25] = storage;
132
- $[26] = t10;
133
- } else t10 = $[26];
133
+ $[24] = autoConnect;
134
+ $[25] = connectionTimeout;
135
+ $[26] = redirectUri;
136
+ $[27] = storage;
137
+ $[28] = t10;
138
+ } else t10 = $[28];
134
139
  const connectorElements = connectors.map(t10);
135
140
  let t11;
136
- if ($[27] !== autoConnect || $[28] !== redirectUri || $[29] !== storage) {
137
- t11 = (s) => withKey(s.id, McpServerResource({
138
- id: s.id,
141
+ if ($[29] !== autoConnect || $[30] !== connectionTimeout || $[31] !== redirectUri || $[32] !== storage) {
142
+ t11 = (s_0) => withKey(s_0.id, McpServerResource({
143
+ id: s_0.id,
139
144
  kind: "custom",
140
- name: s.name,
141
- url: s.url,
142
- auth: s.auth,
145
+ name: s_0.name,
146
+ url: s_0.url,
147
+ auth: s_0.auth,
143
148
  storage,
144
149
  redirectUri,
145
150
  autoConnect,
151
+ connectionTimeout: s_0.connectionTimeout ?? connectionTimeout,
146
152
  onRemove: async () => {
147
- setCustomServers((prev_0) => prev_0.filter((x) => x.id !== s.id));
153
+ setCustomServers((prev_0) => prev_0.filter((x) => x.id !== s_0.id));
148
154
  }
149
155
  }));
150
- $[27] = autoConnect;
151
- $[28] = redirectUri;
152
- $[29] = storage;
153
- $[30] = t11;
154
- } else t11 = $[30];
156
+ $[29] = autoConnect;
157
+ $[30] = connectionTimeout;
158
+ $[31] = redirectUri;
159
+ $[32] = storage;
160
+ $[33] = t11;
161
+ } else t11 = $[33];
155
162
  const customElements = customServers.map(t11);
156
163
  t9 = [...connectorElements, ...customElements];
157
164
  $[17] = autoConnect;
158
- $[18] = connectors;
159
- $[19] = customServers;
160
- $[20] = redirectUri;
161
- $[21] = storage;
162
- $[22] = t9;
163
- } else t9 = $[22];
165
+ $[18] = connectionTimeout;
166
+ $[19] = connectors;
167
+ $[20] = customServers;
168
+ $[21] = redirectUri;
169
+ $[22] = storage;
170
+ $[23] = t9;
171
+ } else t9 = $[23];
164
172
  const lookup = useClientLookup(t9);
165
173
  const all = lookup.state;
166
174
  let t10;
167
- if ($[31] !== all) {
168
- t10 = all.filter(_temp3);
169
- $[31] = all;
170
- $[32] = t10;
171
- } else t10 = $[32];
175
+ if ($[34] !== all) {
176
+ t10 = all.filter(_temp5);
177
+ $[34] = all;
178
+ $[35] = t10;
179
+ } else t10 = $[35];
172
180
  let t11;
173
- if ($[33] !== all) {
174
- t11 = all.filter(_temp4);
175
- $[33] = all;
176
- $[34] = t11;
177
- } else t11 = $[34];
181
+ if ($[36] !== all) {
182
+ t11 = all.filter(_temp6);
183
+ $[36] = all;
184
+ $[37] = t11;
185
+ } else t11 = $[37];
178
186
  let t12;
179
- if ($[35] !== all || $[36] !== isHydrated || $[37] !== t10 || $[38] !== t11) {
187
+ if ($[38] !== all || $[39] !== isHydrated || $[40] !== t10 || $[41] !== t11) {
180
188
  t12 = {
181
189
  servers: all,
182
190
  connectors: t10,
183
191
  customServers: t11,
184
192
  isHydrated
185
193
  };
186
- $[35] = all;
187
- $[36] = isHydrated;
188
- $[37] = t10;
189
- $[38] = t11;
190
- $[39] = t12;
191
- } else t12 = $[39];
194
+ $[38] = all;
195
+ $[39] = isHydrated;
196
+ $[40] = t10;
197
+ $[41] = t11;
198
+ $[42] = t12;
199
+ } else t12 = $[42];
192
200
  const state = t12;
193
201
  let out;
194
- if ($[40] !== lookup || $[41] !== state.servers) {
202
+ if ($[43] !== lookup || $[44] !== state.servers) {
195
203
  out = {};
196
204
  for (const server of state.servers) {
197
205
  if (server.connectionState !== "connected") continue;
@@ -205,62 +213,62 @@ const useMcpManagerResource = (props) => {
205
213
  };
206
214
  }
207
215
  }
208
- $[40] = lookup;
209
- $[41] = state.servers;
210
- $[42] = out;
211
- } else out = $[42];
216
+ $[43] = lookup;
217
+ $[44] = state.servers;
218
+ $[45] = out;
219
+ } else out = $[45];
212
220
  const toolkit = out;
213
221
  const clientRef = useAssistantClientRef();
214
222
  let t13;
215
223
  let t14;
216
- if ($[43] !== clientRef || $[44] !== toolkit) {
224
+ if ($[46] !== clientRef || $[47] !== toolkit) {
217
225
  t13 = () => {
218
226
  const client = clientRef.current;
219
227
  if (!client) return;
220
228
  return client.modelContext().register({ getModelContext: () => ({ tools: toolkit }) });
221
229
  };
222
230
  t14 = [toolkit, clientRef];
223
- $[43] = clientRef;
224
- $[44] = toolkit;
225
- $[45] = t13;
226
- $[46] = t14;
231
+ $[46] = clientRef;
232
+ $[47] = toolkit;
233
+ $[48] = t13;
234
+ $[49] = t14;
227
235
  } else {
228
- t13 = $[45];
229
- t14 = $[46];
236
+ t13 = $[48];
237
+ t14 = $[49];
230
238
  }
231
239
  useEffect(t13, t14);
232
240
  let t15;
233
- if ($[47] !== lookup || $[48] !== state) {
241
+ if ($[50] !== lookup || $[51] !== state) {
234
242
  t15 = (kind, index) => {
235
243
  const list = kind === "connector" ? state.connectors : state.customServers;
236
244
  const entry = list[index];
237
245
  if (!entry) throw new Error(`McpManagerResource: no ${kind} at index ${index} (length ${list.length})`);
238
246
  return lookup.get({ key: entry.id });
239
247
  };
240
- $[47] = lookup;
241
- $[48] = state;
242
- $[49] = t15;
243
- } else t15 = $[49];
248
+ $[50] = lookup;
249
+ $[51] = state;
250
+ $[52] = t15;
251
+ } else t15 = $[52];
244
252
  const serverByKind = t15;
245
253
  let t16;
246
- if ($[50] !== state) {
254
+ if ($[53] !== state) {
247
255
  t16 = () => state;
248
- $[50] = state;
249
- $[51] = t16;
250
- } else t16 = $[51];
256
+ $[53] = state;
257
+ $[54] = t16;
258
+ } else t16 = $[54];
251
259
  let t17;
252
- if ($[52] !== lookup || $[53] !== serverByKind) {
260
+ if ($[55] !== lookup || $[56] !== serverByKind) {
253
261
  t17 = (query) => {
254
262
  if ("id" in query) return lookup.get({ key: query.id });
255
263
  return serverByKind(query.kind, query.index);
256
264
  };
257
- $[52] = lookup;
258
- $[53] = serverByKind;
259
- $[54] = t17;
260
- } else t17 = $[54];
265
+ $[55] = lookup;
266
+ $[56] = serverByKind;
267
+ $[57] = t17;
268
+ } else t17 = $[57];
261
269
  let t18;
262
270
  let t19;
263
- if ($[55] !== serverByKind) {
271
+ if ($[58] !== serverByKind) {
264
272
  t18 = (t20) => {
265
273
  const { index: index_0 } = t20;
266
274
  return serverByKind("connector", index_0);
@@ -269,47 +277,48 @@ const useMcpManagerResource = (props) => {
269
277
  const { index: index_1 } = t21;
270
278
  return serverByKind("custom", index_1);
271
279
  };
272
- $[55] = serverByKind;
273
- $[56] = t18;
274
- $[57] = t19;
280
+ $[58] = serverByKind;
281
+ $[59] = t18;
282
+ $[60] = t19;
275
283
  } else {
276
- t18 = $[56];
277
- t19 = $[57];
284
+ t18 = $[59];
285
+ t19 = $[60];
278
286
  }
279
287
  let t20;
280
- if ($[58] === Symbol.for("react.memo_cache_sentinel")) {
288
+ if ($[61] === Symbol.for("react.memo_cache_sentinel")) {
281
289
  t20 = async (t21) => {
282
- const { name, url, auth } = t21;
290
+ const { name, url, auth, connectionTimeout: connectionTimeout_0 } = t21;
283
291
  const record = {
284
292
  id: typeof crypto !== "undefined" && "randomUUID" in crypto ? crypto.randomUUID() : `mcp-${Date.now()}-${Math.random().toString(36).slice(2)}`,
285
293
  name,
286
294
  url,
287
295
  auth,
296
+ connectionTimeout: connectionTimeout_0,
288
297
  createdAt: Date.now()
289
298
  };
290
299
  setCustomServers((prev_1) => [...prev_1, record]);
291
300
  return record.id;
292
301
  };
293
- $[58] = t20;
294
- } else t20 = $[58];
302
+ $[61] = t20;
303
+ } else t20 = $[61];
295
304
  let t21;
296
- if ($[59] !== lookup || $[60] !== state || $[61] !== storage) {
305
+ if ($[62] !== lookup || $[63] !== state || $[64] !== storage) {
297
306
  t21 = async (id) => {
298
- if (state.connectors.some((c_0) => c_0.id === id)) throw new Error(`Cannot remove connector "${id}" — connectors are app-defined and not removable. Use a custom server id instead.`);
307
+ if (state.connectors.some((c_1) => c_1.id === id)) throw new Error(`Cannot remove connector "${id}" — connectors are app-defined and not removable. Use a custom server id instead.`);
299
308
  try {
300
309
  await lookup.get({ key: id }).remove();
301
310
  } catch {
302
311
  await storage.clearAuthState(id);
303
- setCustomServers((prev_2) => prev_2.filter((s_2) => s_2.id !== id));
312
+ setCustomServers((prev_2) => prev_2.filter((s_3) => s_3.id !== id));
304
313
  }
305
314
  };
306
- $[59] = lookup;
307
- $[60] = state;
308
- $[61] = storage;
309
- $[62] = t21;
310
- } else t21 = $[62];
315
+ $[62] = lookup;
316
+ $[63] = state;
317
+ $[64] = storage;
318
+ $[65] = t21;
319
+ } else t21 = $[65];
311
320
  let t22;
312
- if ($[63] !== t16 || $[64] !== t17 || $[65] !== t18 || $[66] !== t19 || $[67] !== t21) {
321
+ if ($[66] !== t16 || $[67] !== t17 || $[68] !== t18 || $[69] !== t19 || $[70] !== t21) {
313
322
  t22 = {
314
323
  getState: t16,
315
324
  server: t17,
@@ -318,13 +327,13 @@ const useMcpManagerResource = (props) => {
318
327
  addCustomServer: t20,
319
328
  removeServer: t21
320
329
  };
321
- $[63] = t16;
322
- $[64] = t17;
323
- $[65] = t18;
324
- $[66] = t19;
325
- $[67] = t21;
326
- $[68] = t22;
327
- } else t22 = $[68];
330
+ $[66] = t16;
331
+ $[67] = t17;
332
+ $[68] = t18;
333
+ $[69] = t19;
334
+ $[70] = t21;
335
+ $[71] = t22;
336
+ } else t22 = $[71];
328
337
  return t22;
329
338
  };
330
339
  const McpManagerResource = resource(useMcpManagerResource);
@@ -334,12 +343,18 @@ attachTransformScopes(useMcpManagerResource, (scopes, parent) => {
334
343
  function _temp(r) {
335
344
  return r.id;
336
345
  }
337
- async function _temp2() {}
338
- function _temp3(s_0) {
339
- return s_0.kind === "connector";
346
+ function _temp2(c) {
347
+ return c.id;
340
348
  }
341
- function _temp4(s_1) {
342
- return s_1.kind === "custom";
349
+ function _temp3(s) {
350
+ return s.id;
351
+ }
352
+ async function _temp4() {}
353
+ function _temp5(s_1) {
354
+ return s_1.kind === "connector";
355
+ }
356
+ function _temp6(s_2) {
357
+ return s_2.kind === "custom";
343
358
  }
344
359
  //#endregion
345
360
  export { McpManagerResource };
@@ -1 +1 @@
1
- {"version":3,"file":"McpManagerResource.js","names":["useState","useEffect","useMemo","useEffectEvent","useRef","useResource","resource","withKey","useClientLookup","useAssistantClientRef","attachTransformScopes","ClientOutput","ModelContext","Tool","McpServerResource","McpLocalStorage","MCPStorageElement","MCPAuthConfig","MCPConnector","MCPCustomServerRecord","MCPManagerState","McpManagerResourceProps","connectors","storage","oauthRedirectUri","autoConnect","defaultRedirectUri","window","location","origin","NO_CONNECTORS","useMcpManagerResource","props","$","_c","t0","redirectUri","t1","storageElement","t2","Symbol","for","customServers","setCustomServers","isHydrated","setIsHydrated","hydratedRef","t3","signal","markHydrated","cancelled","current","records","loadCustomServers","t4","error","prev","length","persistedIds","Set","map","_temp","filter","r_0","has","r","id","hydrate","signal_0","t5","t6","records_0","saveCustomServers","persistCustomServers","t7","t8","t9","t10","c","kind","name","url","icon","auth","onRemove","_temp2","connectorElements","t11","s","prev_0","x","customElements","serverElements","lookup","all","state","_temp3","_temp4","t12","servers","out","server","connectionState","tool","tools","fullName","type","description","undefined","parameters","inputSchema","execute","args","get","key","callTool","toolkit","clientRef","t13","t14","client","modelContext","register","getModelContext","t15","index","list","entry","Error","serverByKind","t16","t17","query","t18","t19","t20","index_0","t21","index_1","record","crypto","randomUUID","Date","now","Math","random","toString","slice","createdAt","prev_1","some","c_0","remove","clearAuthState","prev_2","s_2","t22","getState","connector","customServer","addCustomServer","removeServer","McpManagerResource","scopes","parent","source","s_0","s_1"],"sources":["../../src/resources/McpManagerResource.ts"],"sourcesContent":["import { useState, useEffect, useMemo, useEffectEvent, useRef } from \"react\";\nimport { useResource, resource, withKey } from \"@assistant-ui/tap\";\nimport {\n useClientLookup,\n useAssistantClientRef,\n attachTransformScopes,\n type ClientOutput,\n} from \"@assistant-ui/store\";\nimport { ModelContext } from \"@assistant-ui/core/store\";\nimport type { Tool } from \"assistant-stream\";\nimport { McpServerResource } from \"./McpServerResource\";\nimport { McpLocalStorage } from \"./storage/McpLocalStorage\";\nimport type { MCPStorageElement } from \"./storage/types\";\nimport type {\n MCPAuthConfig,\n MCPConnector,\n MCPCustomServerRecord,\n MCPManagerState,\n} from \"../mcp-scope\";\n\nexport type McpManagerResourceProps = {\n connectors?: MCPConnector[] | undefined;\n storage?: MCPStorageElement | undefined;\n /** OAuth redirect target. Defaults to `${origin}/mcp/callback`. */\n oauthRedirectUri?: string | undefined;\n /** Connect on mount when usable auth exists. Default true. */\n autoConnect?: boolean | undefined;\n};\n\nfunction defaultRedirectUri(): string {\n if (typeof window === \"undefined\") return \"\";\n return `${window.location.origin}/mcp/callback`;\n}\n\n// Stable empty fallback so an absent `connectors` prop doesn't produce a fresh\n// array each render (which would invalidate the serverElements memo below).\nconst NO_CONNECTORS: MCPConnector[] = [];\n\nconst useMcpManagerResource = (\n props: McpManagerResourceProps,\n): ClientOutput<\"mcp\"> => {\n const connectors = props.connectors ?? NO_CONNECTORS;\n const autoConnect = props.autoConnect ?? true;\n const redirectUri = props.oauthRedirectUri ?? defaultRedirectUri();\n\n const storageElement = props.storage ?? McpLocalStorage();\n const storage = useResource(storageElement);\n\n const [customServers, setCustomServers] = useState<MCPCustomServerRecord[]>(\n [],\n );\n const [isHydrated, setIsHydrated] = useState(false);\n\n const hydratedRef = useRef(false);\n\n const hydrate = useEffectEvent(async (signal: { cancelled: boolean }) => {\n const markHydrated = () => {\n if (!signal.cancelled) {\n hydratedRef.current = true;\n setIsHydrated(true);\n }\n };\n\n let records: Awaited<ReturnType<typeof storage.loadCustomServers>>;\n try {\n records = await storage.loadCustomServers();\n } catch (error) {\n markHydrated();\n throw error;\n }\n\n if (signal.cancelled) return;\n // Merge rather than replace so any addCustomServer calls that\n // happened before hydration resolved aren't silently overwritten.\n // Persisted order wins; pre-hydration locals append.\n setCustomServers((prev) => {\n if (prev.length === 0) return records;\n const persistedIds = new Set(records.map((r) => r.id));\n return [...records, ...prev.filter((r) => !persistedIds.has(r.id))];\n });\n markHydrated();\n });\n\n useEffect(() => {\n const signal = { cancelled: false };\n void hydrate(signal);\n return () => {\n signal.cancelled = true;\n };\n }, []);\n\n const persistCustomServers = useEffectEvent(\n async (records: MCPCustomServerRecord[]) => {\n if (!hydratedRef.current) return;\n await storage.saveCustomServers(records);\n },\n );\n\n useEffect(() => {\n void persistCustomServers(customServers);\n }, [customServers]);\n\n const serverElements = useMemo(() => {\n const connectorElements = connectors.map((c) =>\n withKey(\n c.id,\n McpServerResource({\n id: c.id,\n kind: \"connector\",\n name: c.name,\n url: c.url,\n icon: c.icon,\n auth: c.auth,\n storage,\n redirectUri,\n autoConnect,\n onRemove: async () => {\n // connectors cannot be removed\n },\n }),\n ),\n );\n const customElements = customServers.map((s) =>\n withKey(\n s.id,\n McpServerResource({\n id: s.id,\n kind: \"custom\",\n name: s.name,\n url: s.url,\n auth: s.auth,\n storage,\n redirectUri,\n autoConnect,\n onRemove: async () => {\n setCustomServers((prev) => prev.filter((x) => x.id !== s.id));\n },\n }),\n ),\n );\n return [...connectorElements, ...customElements];\n }, [connectors, customServers, storage, redirectUri, autoConnect]);\n\n const lookup = useClientLookup(serverElements);\n\n const state = useMemo<MCPManagerState>(() => {\n const all = lookup.state;\n return {\n servers: all,\n connectors: all.filter((s) => s.kind === \"connector\"),\n customServers: all.filter((s) => s.kind === \"custom\"),\n isHydrated,\n };\n }, [lookup.state, isHydrated]);\n\n // ─── Auto-register MCP tools as frontend tools in modelContext ─────\n // Build the toolkit from connected servers; re-register when the visible\n // tool surface changes. Tool names are prefixed with the server id to\n // avoid collisions across connected servers — connector ids must not\n // contain `__` (enforced by `defineConnector`); `addCustomServer`\n // generates UUIDs that satisfy the constraint by construction.\n const toolkit = useMemo<Record<string, Tool<any, any>>>(() => {\n const out: Record<string, Tool<any, any>> = {};\n for (const server of state.servers) {\n if (server.connectionState !== \"connected\") continue;\n for (const tool of server.tools) {\n const fullName = `${server.id}__${tool.name}`;\n out[fullName] = {\n type: \"frontend\",\n ...(tool.description !== undefined\n ? { description: tool.description }\n : {}),\n parameters: tool.inputSchema as never,\n execute: (args) =>\n lookup.get({ key: server.id }).callTool(tool.name, args as unknown),\n };\n }\n }\n return out;\n }, [state, lookup]);\n\n const clientRef = useAssistantClientRef();\n\n useEffect(() => {\n const client = clientRef.current;\n if (!client) return;\n return client.modelContext().register({\n getModelContext: () => ({ tools: toolkit }),\n });\n }, [toolkit, clientRef]);\n\n const serverByKind = (kind: \"connector\" | \"custom\", index: number) => {\n const list = kind === \"connector\" ? state.connectors : state.customServers;\n const entry = list[index];\n if (!entry) {\n throw new Error(\n `McpManagerResource: no ${kind} at index ${index} (length ${list.length})`,\n );\n }\n return lookup.get({ key: entry.id });\n };\n\n return {\n getState: () => state,\n server: (query) => {\n if (\"id\" in query) return lookup.get({ key: query.id });\n return serverByKind(query.kind, query.index);\n },\n connector: ({ index }) => serverByKind(\"connector\", index),\n customServer: ({ index }) => serverByKind(\"custom\", index),\n addCustomServer: async ({ name, url, auth }) => {\n const record: MCPCustomServerRecord = {\n id:\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `mcp-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n url,\n auth: auth as MCPAuthConfig,\n createdAt: Date.now(),\n };\n setCustomServers((prev) => [...prev, record]);\n return record.id;\n },\n removeServer: async (id) => {\n // removeServer is custom-server only — connectors are app-defined\n // and not user-removable. Refuse rather than silently no-op.\n if (state.connectors.some((c) => c.id === id)) {\n throw new Error(\n `Cannot remove connector \"${id}\" — connectors are app-defined and not removable. Use a custom server id instead.`,\n );\n }\n // Delegate to McpServerResource.remove() which disconnects,\n // clears auth state, and unregisters from customServers in one\n // place. Fallback to manual cleanup if the lookup is empty\n // (server already gone).\n try {\n await lookup.get({ key: id }).remove();\n } catch {\n await storage.clearAuthState(id);\n setCustomServers((prev) => prev.filter((s) => s.id !== id));\n }\n },\n };\n};\n\nexport const McpManagerResource = resource(useMcpManagerResource);\n\n// Ensure modelContext exists as a sibling when the manager mounts. If an\n// ancestor (e.g. a chat runtime) already provides modelContext, this is a\n// no-op; otherwise it's auto-mounted alongside `mcp`.\nattachTransformScopes(useMcpManagerResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"McpManagerResource.js","names":["useState","useEffect","useMemo","useEffectEvent","useRef","useResource","resource","withKey","useClientLookup","useAssistantClientRef","attachTransformScopes","ClientOutput","ModelContext","Tool","McpServerResource","McpLocalStorage","MCPStorageElement","assertUniqueServerIds","MCPAuthConfig","MCPConnector","MCPCustomServerRecord","MCPManagerState","McpManagerResourceProps","connectors","storage","oauthRedirectUri","autoConnect","connectionTimeout","defaultRedirectUri","window","location","origin","NO_CONNECTORS","useMcpManagerResource","props","$","_c","t0","redirectUri","t1","storageElement","t2","Symbol","for","customServers","setCustomServers","isHydrated","setIsHydrated","hydratedRef","t3","signal","markHydrated","cancelled","current","records","loadCustomServers","t4","error","prev","length","persistedIds","Set","map","_temp","filter","r_0","has","r","id","hydrate","signal_0","t5","t6","records_0","saveCustomServers","persistCustomServers","t7","t8","_temp2","_temp3","t9","t10","c_0","c","kind","name","url","icon","auth","onRemove","_temp4","connectorElements","t11","s_0","s","prev_0","x","customElements","serverElements","lookup","all","state","_temp5","_temp6","t12","servers","out","server","connectionState","tool","tools","fullName","type","description","undefined","parameters","inputSchema","execute","args","get","key","callTool","toolkit","clientRef","t13","t14","client","modelContext","register","getModelContext","t15","index","list","entry","Error","serverByKind","t16","t17","query","t18","t19","t20","index_0","t21","index_1","connectionTimeout_0","record","crypto","randomUUID","Date","now","Math","random","toString","slice","createdAt","prev_1","some","c_1","remove","clearAuthState","prev_2","s_3","t22","getState","connector","customServer","addCustomServer","removeServer","McpManagerResource","scopes","parent","source","s_1","s_2"],"sources":["../../src/resources/McpManagerResource.ts"],"sourcesContent":["import { useState, useEffect, useMemo, useEffectEvent, useRef } from \"react\";\nimport { useResource, resource, withKey } from \"@assistant-ui/tap\";\nimport {\n useClientLookup,\n useAssistantClientRef,\n attachTransformScopes,\n type ClientOutput,\n} from \"@assistant-ui/store\";\nimport { ModelContext } from \"@assistant-ui/core/store\";\nimport type { Tool } from \"assistant-stream\";\nimport { McpServerResource } from \"./McpServerResource\";\nimport { McpLocalStorage } from \"./storage/McpLocalStorage\";\nimport type { MCPStorageElement } from \"./storage/types\";\nimport { assertUniqueServerIds } from \"../utils/serverId\";\nimport type {\n MCPAuthConfig,\n MCPConnector,\n MCPCustomServerRecord,\n MCPManagerState,\n} from \"../mcp-scope\";\n\nexport type McpManagerResourceProps = {\n connectors?: MCPConnector[] | undefined;\n storage?: MCPStorageElement | undefined;\n /** OAuth redirect target. Defaults to `${origin}/mcp/callback`. */\n oauthRedirectUri?: string | undefined;\n /** Connect on mount when usable auth exists. Default true. */\n autoConnect?: boolean | undefined;\n /** Optional timeout in milliseconds for connect/listTools calls. Disabled by default. */\n connectionTimeout?: number | undefined;\n};\n\nfunction defaultRedirectUri(): string {\n if (typeof window === \"undefined\") return \"\";\n return `${window.location.origin}/mcp/callback`;\n}\n\n// Stable empty fallback so an absent `connectors` prop doesn't produce a fresh\n// array each render (which would invalidate the serverElements memo below).\nconst NO_CONNECTORS: MCPConnector[] = [];\n\nconst useMcpManagerResource = (\n props: McpManagerResourceProps,\n): ClientOutput<\"mcp\"> => {\n const connectors = props.connectors ?? NO_CONNECTORS;\n const autoConnect = props.autoConnect ?? true;\n const redirectUri = props.oauthRedirectUri ?? defaultRedirectUri();\n const connectionTimeout = props.connectionTimeout;\n\n const storageElement = props.storage ?? McpLocalStorage();\n const storage = useResource(storageElement);\n\n const [customServers, setCustomServers] = useState<MCPCustomServerRecord[]>(\n [],\n );\n const [isHydrated, setIsHydrated] = useState(false);\n\n const hydratedRef = useRef(false);\n\n const hydrate = useEffectEvent(async (signal: { cancelled: boolean }) => {\n const markHydrated = () => {\n if (!signal.cancelled) {\n hydratedRef.current = true;\n setIsHydrated(true);\n }\n };\n\n let records: Awaited<ReturnType<typeof storage.loadCustomServers>>;\n try {\n records = await storage.loadCustomServers();\n } catch (error) {\n markHydrated();\n throw error;\n }\n\n if (signal.cancelled) return;\n // Merge rather than replace so any addCustomServer calls that\n // happened before hydration resolved aren't silently overwritten.\n // Persisted order wins; pre-hydration locals append.\n setCustomServers((prev) => {\n if (prev.length === 0) return records;\n const persistedIds = new Set(records.map((r) => r.id));\n return [...records, ...prev.filter((r) => !persistedIds.has(r.id))];\n });\n markHydrated();\n });\n\n useEffect(() => {\n const signal = { cancelled: false };\n void hydrate(signal);\n return () => {\n signal.cancelled = true;\n };\n }, []);\n\n const persistCustomServers = useEffectEvent(\n async (records: MCPCustomServerRecord[]) => {\n if (!hydratedRef.current) return;\n await storage.saveCustomServers(records);\n },\n );\n\n useEffect(() => {\n void persistCustomServers(customServers);\n }, [customServers]);\n\n const serverElements = useMemo(() => {\n assertUniqueServerIds([\n ...connectors.map((c) => c.id),\n ...customServers.map((s) => s.id),\n ]);\n\n const connectorElements = connectors.map((c) =>\n withKey(\n c.id,\n McpServerResource({\n id: c.id,\n kind: \"connector\",\n name: c.name,\n url: c.url,\n icon: c.icon,\n auth: c.auth,\n storage,\n redirectUri,\n autoConnect,\n connectionTimeout: c.connectionTimeout ?? connectionTimeout,\n onRemove: async () => {\n // connectors cannot be removed\n },\n }),\n ),\n );\n const customElements = customServers.map((s) =>\n withKey(\n s.id,\n McpServerResource({\n id: s.id,\n kind: \"custom\",\n name: s.name,\n url: s.url,\n auth: s.auth,\n storage,\n redirectUri,\n autoConnect,\n connectionTimeout: s.connectionTimeout ?? connectionTimeout,\n onRemove: async () => {\n setCustomServers((prev) => prev.filter((x) => x.id !== s.id));\n },\n }),\n ),\n );\n return [...connectorElements, ...customElements];\n }, [\n connectors,\n customServers,\n storage,\n redirectUri,\n autoConnect,\n connectionTimeout,\n ]);\n\n const lookup = useClientLookup(serverElements);\n\n const state = useMemo<MCPManagerState>(() => {\n const all = lookup.state;\n return {\n servers: all,\n connectors: all.filter((s) => s.kind === \"connector\"),\n customServers: all.filter((s) => s.kind === \"custom\"),\n isHydrated,\n };\n }, [lookup.state, isHydrated]);\n\n // ─── Auto-register MCP tools as frontend tools in modelContext ─────\n // Build the toolkit from connected servers; re-register when the visible\n // tool surface changes. Tool names are prefixed with the server id to\n // avoid collisions across connected servers — connector ids must not\n // contain `__` (enforced by `defineConnector`); `addCustomServer`\n // generates UUIDs that satisfy the constraint by construction.\n const toolkit = useMemo<Record<string, Tool<any, any>>>(() => {\n const out: Record<string, Tool<any, any>> = {};\n for (const server of state.servers) {\n if (server.connectionState !== \"connected\") continue;\n for (const tool of server.tools) {\n const fullName = `${server.id}__${tool.name}`;\n out[fullName] = {\n type: \"frontend\",\n ...(tool.description !== undefined\n ? { description: tool.description }\n : {}),\n parameters: tool.inputSchema as never,\n execute: (args) =>\n lookup.get({ key: server.id }).callTool(tool.name, args as unknown),\n };\n }\n }\n return out;\n }, [state, lookup]);\n\n const clientRef = useAssistantClientRef();\n\n useEffect(() => {\n const client = clientRef.current;\n if (!client) return;\n return client.modelContext().register({\n getModelContext: () => ({ tools: toolkit }),\n });\n }, [toolkit, clientRef]);\n\n const serverByKind = (kind: \"connector\" | \"custom\", index: number) => {\n const list = kind === \"connector\" ? state.connectors : state.customServers;\n const entry = list[index];\n if (!entry) {\n throw new Error(\n `McpManagerResource: no ${kind} at index ${index} (length ${list.length})`,\n );\n }\n return lookup.get({ key: entry.id });\n };\n\n return {\n getState: () => state,\n server: (query) => {\n if (\"id\" in query) return lookup.get({ key: query.id });\n return serverByKind(query.kind, query.index);\n },\n connector: ({ index }) => serverByKind(\"connector\", index),\n customServer: ({ index }) => serverByKind(\"custom\", index),\n addCustomServer: async ({ name, url, auth, connectionTimeout }) => {\n const record: MCPCustomServerRecord = {\n id:\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `mcp-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n url,\n auth: auth as MCPAuthConfig,\n connectionTimeout,\n createdAt: Date.now(),\n };\n setCustomServers((prev) => [...prev, record]);\n return record.id;\n },\n removeServer: async (id) => {\n // removeServer is custom-server only — connectors are app-defined\n // and not user-removable. Refuse rather than silently no-op.\n if (state.connectors.some((c) => c.id === id)) {\n throw new Error(\n `Cannot remove connector \"${id}\" — connectors are app-defined and not removable. Use a custom server id instead.`,\n );\n }\n // Delegate to McpServerResource.remove() which disconnects,\n // clears auth state, and unregisters from customServers in one\n // place. Fallback to manual cleanup if the lookup is empty\n // (server already gone).\n try {\n await lookup.get({ key: id }).remove();\n } catch {\n await storage.clearAuthState(id);\n setCustomServers((prev) => prev.filter((s) => s.id !== id));\n }\n },\n };\n};\n\nexport const McpManagerResource = resource(useMcpManagerResource);\n\n// Ensure modelContext exists as a sibling when the manager mounts. If an\n// ancestor (e.g. a chat runtime) already provides modelContext, this is a\n// no-op; otherwise it's auto-mounted alongside `mcp`.\nattachTransformScopes(useMcpManagerResource, (scopes, parent) => {\n if (!scopes.modelContext && parent.modelContext.source === null) {\n scopes.modelContext = ModelContext();\n }\n});\n"],"mappings":"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"}
@@ -13,6 +13,7 @@ type McpServerResourceProps = {
13
13
  storage: MCPStorage;
14
14
  redirectUri: string;
15
15
  autoConnect: boolean;
16
+ connectionTimeout?: number | undefined;
16
17
  onRemove: () => Promise<void>;
17
18
  };
18
19
  declare const McpServerResource: import("@assistant-ui/tap").Resource<ClientOutput<"mcpServer">, [props: McpServerResourceProps]>;
@@ -1 +1 @@
1
- {"version":3,"file":"McpServerResource.d.ts","names":[],"sources":["../../src/resources/McpServerResource.ts"],"mappings":";;;;;KAsBY,sBAAA;EACV,EAAA;EACA,IAAA,EAAM,aAAA;EACN,IAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA,EAAM,aAAA;EACN,OAAA,EAAS,UAAA;EACT,WAAA;EACA,WAAA;EACA,QAAA,QAAgB,OAAA;AAAA;AAAA,cA0PL,iBAAA,8BAAiB,QAAA,CAAA,YAAA,gBAAA,KAAA,EAAA,sBAAA"}
1
+ {"version":3,"file":"McpServerResource.d.ts","names":[],"sources":["../../src/resources/McpServerResource.ts"],"mappings":";;;;;KAsBY,sBAAA;EACV,EAAA;EACA,IAAA,EAAM,aAAA;EACN,IAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA,EAAM,aAAA;EACN,OAAA,EAAS,UAAA;EACT,WAAA;EACA,WAAA;EACA,iBAAA;EACA,QAAA,QAAgB,OAAA;AAAA;AAAA,cAgSL,iBAAA,8BAAiB,QAAA,CAAA,YAAA,gBAAA,KAAA,EAAA,sBAAA"}