@assistant-ui/react-mcp 0.1.17 → 0.1.19

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 (170) hide show
  1. package/dist/auth/buildHeaders.d.ts +1 -2
  2. package/dist/auth/buildHeaders.d.ts.map +1 -1
  3. package/dist/auth/createOAuthProvider.d.ts +5 -6
  4. package/dist/auth/createOAuthProvider.d.ts.map +1 -1
  5. package/dist/auth/types.d.ts +1 -2
  6. package/dist/auth/types.d.ts.map +1 -1
  7. package/dist/connector.d.ts +1 -2
  8. package/dist/connector.d.ts.map +1 -1
  9. package/dist/context/McpConnectorByIndexProvider.d.ts +1 -2
  10. package/dist/context/McpConnectorByIndexProvider.d.ts.map +1 -1
  11. package/dist/context/McpCustomServerByIndexProvider.d.ts +1 -2
  12. package/dist/context/McpCustomServerByIndexProvider.d.ts.map +1 -1
  13. package/dist/context/McpServerByIdProvider.d.ts +1 -2
  14. package/dist/context/McpServerByIdProvider.d.ts.map +1 -1
  15. package/dist/hooks/useMcpOAuthCallback.d.ts +5 -6
  16. package/dist/hooks/useMcpOAuthCallback.d.ts.map +1 -1
  17. package/dist/hooks/useMcpOAuthCallback.js +4 -0
  18. package/dist/hooks/useMcpOAuthCallback.js.map +1 -1
  19. package/dist/mcp-scope.d.ts +14 -15
  20. package/dist/mcp-scope.d.ts.map +1 -1
  21. package/dist/primitives/addForm/McpAddFormAuthFields.d.ts +4 -4
  22. package/dist/primitives/addForm/McpAddFormAuthFields.d.ts.map +1 -1
  23. package/dist/primitives/addForm/McpAddFormAuthFields.js +28 -38
  24. package/dist/primitives/addForm/McpAddFormAuthFields.js.map +1 -1
  25. package/dist/primitives/addForm/McpAddFormAuthSelect.d.ts +2 -3
  26. package/dist/primitives/addForm/McpAddFormAuthSelect.d.ts.map +1 -1
  27. package/dist/primitives/addForm/McpAddFormBearerTokenField.d.ts +10 -0
  28. package/dist/primitives/addForm/McpAddFormBearerTokenField.d.ts.map +1 -0
  29. package/dist/primitives/addForm/McpAddFormBearerTokenField.js +50 -0
  30. package/dist/primitives/addForm/McpAddFormBearerTokenField.js.map +1 -0
  31. package/dist/primitives/addForm/McpAddFormCancel.d.ts +2 -3
  32. package/dist/primitives/addForm/McpAddFormCancel.d.ts.map +1 -1
  33. package/dist/primitives/addForm/McpAddFormError.d.ts +2 -3
  34. package/dist/primitives/addForm/McpAddFormError.d.ts.map +1 -1
  35. package/dist/primitives/addForm/McpAddFormError.js +30 -10
  36. package/dist/primitives/addForm/McpAddFormError.js.map +1 -1
  37. package/dist/primitives/addForm/McpAddFormNameField.d.ts +2 -3
  38. package/dist/primitives/addForm/McpAddFormNameField.d.ts.map +1 -1
  39. package/dist/primitives/addForm/McpAddFormNameField.js +31 -18
  40. package/dist/primitives/addForm/McpAddFormNameField.js.map +1 -1
  41. package/dist/primitives/addForm/McpAddFormRoot.d.ts +2 -3
  42. package/dist/primitives/addForm/McpAddFormRoot.d.ts.map +1 -1
  43. package/dist/primitives/addForm/McpAddFormRoot.js +32 -11
  44. package/dist/primitives/addForm/McpAddFormRoot.js.map +1 -1
  45. package/dist/primitives/addForm/McpAddFormScopesField.d.ts +10 -0
  46. package/dist/primitives/addForm/McpAddFormScopesField.d.ts.map +1 -0
  47. package/dist/primitives/addForm/McpAddFormScopesField.js +38 -0
  48. package/dist/primitives/addForm/McpAddFormScopesField.js.map +1 -0
  49. package/dist/primitives/addForm/McpAddFormSubmit.d.ts +2 -3
  50. package/dist/primitives/addForm/McpAddFormSubmit.d.ts.map +1 -1
  51. package/dist/primitives/addForm/McpAddFormUrlField.d.ts +2 -3
  52. package/dist/primitives/addForm/McpAddFormUrlField.d.ts.map +1 -1
  53. package/dist/primitives/addForm/McpAddFormUrlField.js +31 -18
  54. package/dist/primitives/addForm/McpAddFormUrlField.js.map +1 -1
  55. package/dist/primitives/addForm/context.d.ts +13 -6
  56. package/dist/primitives/addForm/context.d.ts.map +1 -1
  57. package/dist/primitives/addForm/context.js.map +1 -1
  58. package/dist/primitives/addForm.d.ts +4 -2
  59. package/dist/primitives/addForm.js +5 -1
  60. package/dist/primitives/addForm.js.map +1 -1
  61. package/dist/primitives/elicitation/McpElicitationPrimitiveAccept.d.ts +2 -3
  62. package/dist/primitives/elicitation/McpElicitationPrimitiveAccept.d.ts.map +1 -1
  63. package/dist/primitives/elicitation/McpElicitationPrimitiveCancel.d.ts +2 -3
  64. package/dist/primitives/elicitation/McpElicitationPrimitiveCancel.d.ts.map +1 -1
  65. package/dist/primitives/elicitation/McpElicitationPrimitiveDecline.d.ts +2 -3
  66. package/dist/primitives/elicitation/McpElicitationPrimitiveDecline.d.ts.map +1 -1
  67. package/dist/primitives/elicitation/McpElicitationPrimitiveError.d.ts +2 -3
  68. package/dist/primitives/elicitation/McpElicitationPrimitiveError.d.ts.map +1 -1
  69. package/dist/primitives/elicitation/McpElicitationPrimitiveFields.d.ts +3 -3
  70. package/dist/primitives/elicitation/McpElicitationPrimitiveFields.d.ts.map +1 -1
  71. package/dist/primitives/elicitation/McpElicitationPrimitiveItems.d.ts +3 -3
  72. package/dist/primitives/elicitation/McpElicitationPrimitiveItems.d.ts.map +1 -1
  73. package/dist/primitives/elicitation/McpElicitationPrimitiveMessage.d.ts +2 -3
  74. package/dist/primitives/elicitation/McpElicitationPrimitiveMessage.d.ts.map +1 -1
  75. package/dist/primitives/elicitation/McpElicitationPrimitiveRoot.d.ts +2 -3
  76. package/dist/primitives/elicitation/McpElicitationPrimitiveRoot.d.ts.map +1 -1
  77. package/dist/primitives/elicitation/context.d.ts +7 -8
  78. package/dist/primitives/elicitation/context.d.ts.map +1 -1
  79. package/dist/primitives/elicitation/initialElicitationDraft.d.ts +1 -2
  80. package/dist/primitives/elicitation/initialElicitationDraft.d.ts.map +1 -1
  81. package/dist/primitives/elicitation/prepareElicitationContent.d.ts +1 -2
  82. package/dist/primitives/elicitation/prepareElicitationContent.d.ts.map +1 -1
  83. package/dist/primitives/elicitation/prepareElicitationContent.js +5 -1
  84. package/dist/primitives/elicitation/prepareElicitationContent.js.map +1 -1
  85. package/dist/primitives/manager/McpManagerAddCustomTrigger.d.ts +2 -3
  86. package/dist/primitives/manager/McpManagerAddCustomTrigger.d.ts.map +1 -1
  87. package/dist/primitives/manager/McpManagerConnectors.d.ts +2 -3
  88. package/dist/primitives/manager/McpManagerConnectors.d.ts.map +1 -1
  89. package/dist/primitives/manager/McpManagerCustomServers.d.ts +2 -3
  90. package/dist/primitives/manager/McpManagerCustomServers.d.ts.map +1 -1
  91. package/dist/primitives/manager/McpManagerRoot.d.ts +2 -3
  92. package/dist/primitives/manager/McpManagerRoot.d.ts.map +1 -1
  93. package/dist/primitives/server/McpServerConnectButton.d.ts +2 -3
  94. package/dist/primitives/server/McpServerConnectButton.d.ts.map +1 -1
  95. package/dist/primitives/server/McpServerDisconnectButton.d.ts +2 -3
  96. package/dist/primitives/server/McpServerDisconnectButton.d.ts.map +1 -1
  97. package/dist/primitives/server/McpServerError.d.ts +2 -3
  98. package/dist/primitives/server/McpServerError.d.ts.map +1 -1
  99. package/dist/primitives/server/McpServerIcon.d.ts +2 -3
  100. package/dist/primitives/server/McpServerIcon.d.ts.map +1 -1
  101. package/dist/primitives/server/McpServerName.d.ts +2 -3
  102. package/dist/primitives/server/McpServerName.d.ts.map +1 -1
  103. package/dist/primitives/server/McpServerOAuthLink.d.ts +2 -3
  104. package/dist/primitives/server/McpServerOAuthLink.d.ts.map +1 -1
  105. package/dist/primitives/server/McpServerRemoveButton.d.ts +2 -3
  106. package/dist/primitives/server/McpServerRemoveButton.d.ts.map +1 -1
  107. package/dist/primitives/server/McpServerRoot.d.ts +2 -3
  108. package/dist/primitives/server/McpServerRoot.d.ts.map +1 -1
  109. package/dist/primitives/server/McpServerStatus.d.ts +2 -3
  110. package/dist/primitives/server/McpServerStatus.d.ts.map +1 -1
  111. package/dist/primitives/server/McpServerToolName.d.ts +2 -3
  112. package/dist/primitives/server/McpServerToolName.d.ts.map +1 -1
  113. package/dist/primitives/server/McpServerTools.d.ts +3 -4
  114. package/dist/primitives/server/McpServerTools.d.ts.map +1 -1
  115. package/dist/resources/McpManagerResource.d.ts +2 -3
  116. package/dist/resources/McpManagerResource.d.ts.map +1 -1
  117. package/dist/resources/McpManagerResource.js +358 -244
  118. package/dist/resources/McpManagerResource.js.map +1 -1
  119. package/dist/resources/McpServerRemovalFence.d.ts +6 -0
  120. package/dist/resources/McpServerRemovalFence.d.ts.map +1 -0
  121. package/dist/resources/McpServerRemovalFence.js +11 -0
  122. package/dist/resources/McpServerRemovalFence.js.map +1 -0
  123. package/dist/resources/McpServerResource.d.ts +3 -4
  124. package/dist/resources/McpServerResource.d.ts.map +1 -1
  125. package/dist/resources/McpServerResource.js +9 -5
  126. package/dist/resources/McpServerResource.js.map +1 -1
  127. package/dist/resources/storage/McpCustomStorage.d.ts +1 -2
  128. package/dist/resources/storage/McpCustomStorage.d.ts.map +1 -1
  129. package/dist/resources/storage/McpLocalStorage.d.ts +4 -5
  130. package/dist/resources/storage/McpLocalStorage.d.ts.map +1 -1
  131. package/dist/resources/storage/McpLocalStorage.js +2 -1
  132. package/dist/resources/storage/McpLocalStorage.js.map +1 -1
  133. package/dist/resources/storage/McpMemoryStorage.d.ts +1 -2
  134. package/dist/resources/storage/McpMemoryStorage.d.ts.map +1 -1
  135. package/dist/resources/storage/types.d.ts +12 -11
  136. package/dist/resources/storage/types.d.ts.map +1 -1
  137. package/dist/resources/validateElicitationContent.d.ts +1 -2
  138. package/dist/resources/validateElicitationContent.d.ts.map +1 -1
  139. package/dist/utils/createMcpId.d.ts +1 -2
  140. package/dist/utils/createMcpId.d.ts.map +1 -1
  141. package/dist/utils/invokeMcpCallback.d.ts +1 -2
  142. package/dist/utils/invokeMcpCallback.d.ts.map +1 -1
  143. package/dist/utils/serverId.d.ts +2 -3
  144. package/dist/utils/serverId.d.ts.map +1 -1
  145. package/dist/utils/serverUrl.d.ts +3 -4
  146. package/dist/utils/serverUrl.d.ts.map +1 -1
  147. package/package.json +11 -10
  148. package/src/hooks/useMcpOAuthCallback.test.ts +53 -0
  149. package/src/hooks/useMcpOAuthCallback.tsx +12 -0
  150. package/src/index.ts +2 -1
  151. package/src/primitives/addForm/McpAddFormAccessibility.test.tsx +310 -0
  152. package/src/primitives/addForm/McpAddFormAuthFields.tsx +26 -16
  153. package/src/primitives/addForm/McpAddFormBearerTokenField.tsx +46 -0
  154. package/src/primitives/addForm/McpAddFormError.tsx +17 -3
  155. package/src/primitives/addForm/McpAddFormNameField.tsx +13 -1
  156. package/src/primitives/addForm/McpAddFormRoot.test.tsx +65 -0
  157. package/src/primitives/addForm/McpAddFormRoot.tsx +51 -8
  158. package/src/primitives/addForm/McpAddFormScopesField.tsx +34 -0
  159. package/src/primitives/addForm/McpAddFormUrlField.tsx +12 -1
  160. package/src/primitives/addForm/context.tsx +10 -0
  161. package/src/primitives/addForm.ts +2 -0
  162. package/src/primitives/elicitation/prepareElicitationContent.ts +8 -6
  163. package/src/resources/McpManagerResource.test.ts +797 -9
  164. package/src/resources/McpManagerResource.ts +242 -60
  165. package/src/resources/McpServerRemovalFence.ts +21 -0
  166. package/src/resources/McpServerResource.test.ts +9 -6
  167. package/src/resources/McpServerResource.ts +11 -6
  168. package/src/resources/storage/McpLocalStorage.test.ts +2 -0
  169. package/src/resources/storage/McpLocalStorage.ts +2 -1
  170. package/src/resources/storage/types.ts +10 -8
@@ -1,6 +1,7 @@
1
1
  import { assertUniqueServerIds } from "../utils/serverId.js";
2
2
  import { createMcpId } from "../utils/createMcpId.js";
3
3
  import { clearOAuthProviderAuthState } from "../auth/createOAuthProvider.js";
4
+ import { withMcpServerRemovalFence } from "./McpServerRemovalFence.js";
4
5
  import { McpServerResource } from "./McpServerResource.js";
5
6
  import { McpLocalStorage } from "./storage/McpLocalStorage.js";
6
7
  import { attachTransformScopes, useAssistantClientRef, useClientLookup } from "@assistant-ui/store";
@@ -18,6 +19,9 @@ const NO_CONNECTORS = [];
18
19
  const reportCustomStorageFailure = (operation, error) => {
19
20
  console.error(`[assistant-ui/react-mcp] failed to ${operation} custom servers:`, error);
20
21
  };
22
+ const reportBlockedCustomServerPersistence = () => {
23
+ console.error("[assistant-ui/react-mcp] custom server changes remain in memory because loading the persisted list failed; remount the manager to retry");
24
+ };
21
25
  const persistCustomServers = async (storage, records) => {
22
26
  try {
23
27
  await storage.saveCustomServers(records);
@@ -25,8 +29,173 @@ const persistCustomServers = async (storage, records) => {
25
29
  reportCustomStorageFailure("save", error);
26
30
  }
27
31
  };
32
+ const enqueueCustomServerTask = (persistenceQueues, scopeKey, task) => {
33
+ const next = (persistenceQueues.get(scopeKey) ?? Promise.resolve()).then(task);
34
+ persistenceQueues.set(scopeKey, next);
35
+ next.then(() => {
36
+ if (persistenceQueues.get(scopeKey) === next) persistenceQueues.delete(scopeKey);
37
+ });
38
+ };
39
+ const enqueueCustomServerPersistence = (persistenceQueues, scopeKey, storage, records) => enqueueCustomServerTask(persistenceQueues, scopeKey, () => persistCustomServers(storage, records));
40
+ const holdCustomServerPersistence = (persistenceQueues, scopeKey) => {
41
+ let release = () => {};
42
+ const gate = new Promise((resolve) => {
43
+ release = resolve;
44
+ });
45
+ enqueueCustomServerTask(persistenceQueues, scopeKey, () => gate);
46
+ return release;
47
+ };
48
+ const deduplicateCustomServers = (records) => {
49
+ const seen = /* @__PURE__ */ new Set();
50
+ return records.filter((record) => {
51
+ if (seen.has(record.id)) {
52
+ console.error(`[assistant-ui/react-mcp] ignored duplicate custom server id "${record.id}" loaded from storage`);
53
+ return false;
54
+ }
55
+ seen.add(record.id);
56
+ return true;
57
+ });
58
+ };
59
+ const useMcpCustomServersResource = (t0) => {
60
+ const $ = c(22);
61
+ const { storage, scopeKey, persistenceQueues } = t0;
62
+ let t1;
63
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
64
+ t1 = [];
65
+ $[0] = t1;
66
+ } else t1 = $[0];
67
+ const [customServers, setCustomServers] = useState(t1);
68
+ const [isHydrated, setIsHydrated] = useState(false);
69
+ let t2;
70
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
71
+ t2 = [];
72
+ $[1] = t2;
73
+ } else t2 = $[1];
74
+ const customServersRef = useRef(t2);
75
+ const hydrationStateRef = useRef("pending");
76
+ const hasPendingMutationRef = useRef(false);
77
+ const [removedBeforeHydration] = useState(_temp);
78
+ const reportedBlockedPersistenceRef = useRef(false);
79
+ let t3;
80
+ if ($[2] !== persistenceQueues || $[3] !== removedBeforeHydration || $[4] !== scopeKey || $[5] !== storage) {
81
+ t3 = async (signal) => {
82
+ while (true) {
83
+ const pendingPersistence = persistenceQueues.get(scopeKey);
84
+ if (!pendingPersistence) break;
85
+ await pendingPersistence;
86
+ if (signal.cancelled) return;
87
+ if (persistenceQueues.get(scopeKey) === pendingPersistence) break;
88
+ }
89
+ let records;
90
+ try {
91
+ const loadedRecords = await storage.loadCustomServers();
92
+ records = deduplicateCustomServers(loadedRecords);
93
+ } catch (t4) {
94
+ const error = t4;
95
+ if (!signal.cancelled) {
96
+ reportCustomStorageFailure("load", error);
97
+ hydrationStateRef.current = "failed";
98
+ if (hasPendingMutationRef.current) {
99
+ reportBlockedCustomServerPersistence();
100
+ reportedBlockedPersistenceRef.current = true;
101
+ }
102
+ setIsHydrated(true);
103
+ }
104
+ return;
105
+ }
106
+ const hadPendingMutation = hasPendingMutationRef.current;
107
+ const hydratedRecords = records.filter((record) => !removedBeforeHydration.has(record.id));
108
+ const mergedRecords = (() => {
109
+ const prev = customServersRef.current;
110
+ if (prev.length === 0) return hydratedRecords;
111
+ const persistedIds = new Set(hydratedRecords.map(_temp2));
112
+ return [...hydratedRecords, ...prev.filter((r_0) => !persistedIds.has(r_0.id))];
113
+ })();
114
+ customServersRef.current = mergedRecords;
115
+ hydrationStateRef.current = "succeeded";
116
+ hasPendingMutationRef.current = false;
117
+ if (hadPendingMutation) enqueueCustomServerPersistence(persistenceQueues, scopeKey, storage, mergedRecords);
118
+ if (signal.cancelled) return;
119
+ setCustomServers(mergedRecords);
120
+ setIsHydrated(true);
121
+ };
122
+ $[2] = persistenceQueues;
123
+ $[3] = removedBeforeHydration;
124
+ $[4] = scopeKey;
125
+ $[5] = storage;
126
+ $[6] = t3;
127
+ } else t3 = $[6];
128
+ const hydrate = useEffectEvent(t3);
129
+ let t4;
130
+ if ($[7] !== hydrate) {
131
+ t4 = () => {
132
+ const signal_0 = { cancelled: false };
133
+ hydrate(signal_0);
134
+ return () => {
135
+ signal_0.cancelled = true;
136
+ };
137
+ };
138
+ $[7] = hydrate;
139
+ $[8] = t4;
140
+ } else t4 = $[8];
141
+ let t5;
142
+ if ($[9] === Symbol.for("react.memo_cache_sentinel")) {
143
+ t5 = [];
144
+ $[9] = t5;
145
+ } else t5 = $[9];
146
+ useEffect(t4, t5);
147
+ let t6;
148
+ if ($[10] !== persistenceQueues || $[11] !== scopeKey || $[12] !== storage) {
149
+ t6 = (updater) => {
150
+ const next = updater(customServersRef.current);
151
+ customServersRef.current = next;
152
+ setCustomServers(next);
153
+ if (hydrationStateRef.current === "succeeded") {
154
+ enqueueCustomServerPersistence(persistenceQueues, scopeKey, storage, next);
155
+ return;
156
+ }
157
+ hasPendingMutationRef.current = true;
158
+ if (hydrationStateRef.current === "failed" && !reportedBlockedPersistenceRef.current) {
159
+ reportBlockedCustomServerPersistence();
160
+ reportedBlockedPersistenceRef.current = true;
161
+ }
162
+ };
163
+ $[10] = persistenceQueues;
164
+ $[11] = scopeKey;
165
+ $[12] = storage;
166
+ $[13] = t6;
167
+ } else t6 = $[13];
168
+ const updateCustomServers = t6;
169
+ let t7;
170
+ if ($[14] !== removedBeforeHydration || $[15] !== updateCustomServers) {
171
+ t7 = (id) => {
172
+ if (hydrationStateRef.current === "pending") removedBeforeHydration.add(id);
173
+ updateCustomServers((prev_0) => prev_0.filter((record_0) => record_0.id !== id));
174
+ };
175
+ $[14] = removedBeforeHydration;
176
+ $[15] = updateCustomServers;
177
+ $[16] = t7;
178
+ } else t7 = $[16];
179
+ const removeCustomServer = t7;
180
+ let t8;
181
+ if ($[17] !== customServers || $[18] !== isHydrated || $[19] !== removeCustomServer || $[20] !== updateCustomServers) {
182
+ t8 = {
183
+ customServers,
184
+ isHydrated,
185
+ updateCustomServers,
186
+ removeCustomServer
187
+ };
188
+ $[17] = customServers;
189
+ $[18] = isHydrated;
190
+ $[19] = removeCustomServer;
191
+ $[20] = updateCustomServers;
192
+ $[21] = t8;
193
+ } else t8 = $[21];
194
+ return t8;
195
+ };
196
+ const McpCustomServersResource = resource(useMcpCustomServersResource);
28
197
  const useMcpManagerResource = (props) => {
29
- const $ = c(73);
198
+ const $ = c(75);
30
199
  const connectors = props.connectors ?? NO_CONNECTORS;
31
200
  const autoConnect = props.autoConnect ?? true;
32
201
  let t0;
@@ -44,107 +213,27 @@ const useMcpManagerResource = (props) => {
44
213
  $[3] = t1;
45
214
  } else t1 = $[3];
46
215
  const storage = useResource(t1);
216
+ const [persistenceQueues] = useState(_temp3);
217
+ const storageScopeKey = storage.scopeId === void 0 ? "unscoped" : `scoped:${storage.scopeId}`;
47
218
  let t2;
48
- if ($[4] === Symbol.for("react.memo_cache_sentinel")) {
49
- t2 = [];
50
- $[4] = t2;
51
- } else t2 = $[4];
52
- const [customServers, setCustomServers] = useState(t2);
53
- const [isHydrated, setIsHydrated] = useState(false);
54
- const hydratedRef = useRef(false);
55
- const storageRef = useRef(storage);
219
+ if ($[4] !== persistenceQueues || $[5] !== storage || $[6] !== storageScopeKey) {
220
+ t2 = withKey(storageScopeKey, McpCustomServersResource({
221
+ storage,
222
+ scopeKey: storageScopeKey,
223
+ persistenceQueues
224
+ }));
225
+ $[4] = persistenceQueues;
226
+ $[5] = storage;
227
+ $[6] = storageScopeKey;
228
+ $[7] = t2;
229
+ } else t2 = $[7];
230
+ const { customServers, isHydrated, updateCustomServers, removeCustomServer } = useResource(t2);
231
+ assertUniqueServerIds([...connectors.map(_temp4), ...customServers.map(_temp5)]);
56
232
  let t3;
57
- if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
58
- t3 = Promise.resolve();
59
- $[5] = t3;
60
- } else t3 = $[5];
61
- const persistenceQueueRef = useRef(t3);
62
- let t4;
63
- let t5;
64
- if ($[6] !== storage) {
65
- t4 = () => {
66
- storageRef.current = storage;
67
- };
68
- t5 = [storage];
69
- $[6] = storage;
70
- $[7] = t4;
71
- $[8] = t5;
72
- } else {
73
- t4 = $[7];
74
- t5 = $[8];
75
- }
76
- useEffect(t4, t5);
77
- let t6;
78
- if ($[9] !== storage) {
79
- t6 = async (signal) => {
80
- const markHydrated = () => {
81
- if (!signal.cancelled) {
82
- hydratedRef.current = true;
83
- setIsHydrated(true);
84
- }
85
- };
86
- let records;
87
- try {
88
- records = await storage.loadCustomServers();
89
- } catch (t7) {
90
- const error = t7;
91
- if (!signal.cancelled) reportCustomStorageFailure("load", error);
92
- markHydrated();
93
- return;
94
- }
95
- if (signal.cancelled) return;
96
- setCustomServers((prev) => {
97
- if (prev.length === 0) return records;
98
- const persistedIds = new Set(records.map(_temp));
99
- return [...records, ...prev.filter((r_0) => !persistedIds.has(r_0.id))];
100
- });
101
- markHydrated();
102
- };
103
- $[9] = storage;
104
- $[10] = t6;
105
- } else t6 = $[10];
106
- const hydrate = useEffectEvent(t6);
107
- let t7;
108
- if ($[11] !== hydrate) {
109
- t7 = () => {
110
- const signal_0 = { cancelled: false };
111
- hydrate(signal_0);
112
- return () => {
113
- signal_0.cancelled = true;
114
- };
115
- };
116
- $[11] = hydrate;
117
- $[12] = t7;
118
- } else t7 = $[12];
119
- let t8;
120
- if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
121
- t8 = [];
122
- $[13] = t8;
123
- } else t8 = $[13];
124
- useEffect(t7, t8);
125
- let t10;
126
- let t9;
127
- if ($[14] !== customServers) {
128
- t9 = () => {
129
- if (!hydratedRef.current) return;
130
- const targetStorage = storageRef.current;
131
- persistenceQueueRef.current = persistenceQueueRef.current.then(() => persistCustomServers(targetStorage, customServers));
132
- };
133
- t10 = [customServers];
134
- $[14] = customServers;
135
- $[15] = t10;
136
- $[16] = t9;
137
- } else {
138
- t10 = $[15];
139
- t9 = $[16];
140
- }
141
- useEffect(t9, t10);
142
- assertUniqueServerIds([...connectors.map(_temp2), ...customServers.map(_temp3)]);
143
- let t11;
144
- if ($[17] !== autoConnect || $[18] !== connectionTimeout || $[19] !== connectors || $[20] !== customServers || $[21] !== redirectUri || $[22] !== storage) {
145
- let t12;
146
- if ($[24] !== autoConnect || $[25] !== connectionTimeout || $[26] !== redirectUri || $[27] !== storage) {
147
- t12 = (c_0) => withKey(c_0.id, McpServerResource({
233
+ if ($[8] !== autoConnect || $[9] !== connectionTimeout || $[10] !== connectors || $[11] !== customServers || $[12] !== persistenceQueues || $[13] !== redirectUri || $[14] !== removeCustomServer || $[15] !== storage || $[16] !== storageScopeKey) {
234
+ let t4;
235
+ if ($[18] !== autoConnect || $[19] !== connectionTimeout || $[20] !== redirectUri || $[21] !== storage) {
236
+ t4 = (c_0) => withKey(c_0.id, McpServerResource({
148
237
  id: c_0.id,
149
238
  kind: "connector",
150
239
  name: c_0.name,
@@ -157,18 +246,18 @@ const useMcpManagerResource = (props) => {
157
246
  connectionTimeout: c_0.connectionTimeout ?? connectionTimeout,
158
247
  ...c_0.cache !== void 0 ? { cache: c_0.cache } : {},
159
248
  ...c_0.elicitation !== void 0 ? { elicitation: c_0.elicitation } : {},
160
- onRemove: _temp4
249
+ onRemove: _temp6
161
250
  }));
162
- $[24] = autoConnect;
163
- $[25] = connectionTimeout;
164
- $[26] = redirectUri;
165
- $[27] = storage;
166
- $[28] = t12;
167
- } else t12 = $[28];
168
- const connectorElements = connectors.map(t12);
169
- let t13;
170
- if ($[29] !== autoConnect || $[30] !== connectionTimeout || $[31] !== redirectUri || $[32] !== storage) {
171
- t13 = (s_0) => withKey(s_0.id, McpServerResource({
251
+ $[18] = autoConnect;
252
+ $[19] = connectionTimeout;
253
+ $[20] = redirectUri;
254
+ $[21] = storage;
255
+ $[22] = t4;
256
+ } else t4 = $[22];
257
+ const connectorElements = connectors.map(t4);
258
+ let t5;
259
+ if ($[23] !== autoConnect || $[24] !== connectionTimeout || $[25] !== persistenceQueues || $[26] !== redirectUri || $[27] !== removeCustomServer || $[28] !== storage || $[29] !== storageScopeKey) {
260
+ t5 = (s_0) => withKey(s_0.id, McpServerResource(withMcpServerRemovalFence({
172
261
  id: s_0.id,
173
262
  kind: "custom",
174
263
  name: s_0.name,
@@ -181,56 +270,62 @@ const useMcpManagerResource = (props) => {
181
270
  ...s_0.cache !== void 0 ? { cache: s_0.cache } : {},
182
271
  ...s_0.elicitation !== void 0 ? { elicitation: s_0.elicitation } : {},
183
272
  onRemove: async () => {
184
- setCustomServers((prev_0) => prev_0.filter((x) => x.id !== s_0.id));
273
+ removeCustomServer(s_0.id);
185
274
  }
186
- }));
187
- $[29] = autoConnect;
188
- $[30] = connectionTimeout;
189
- $[31] = redirectUri;
190
- $[32] = storage;
191
- $[33] = t13;
192
- } else t13 = $[33];
193
- const customElements = customServers.map(t13);
194
- t11 = [...connectorElements, ...customElements];
195
- $[17] = autoConnect;
196
- $[18] = connectionTimeout;
197
- $[19] = connectors;
198
- $[20] = customServers;
199
- $[21] = redirectUri;
200
- $[22] = storage;
201
- $[23] = t11;
202
- } else t11 = $[23];
203
- const lookup = useClientLookup(t11);
275
+ }, () => holdCustomServerPersistence(persistenceQueues, storageScopeKey))));
276
+ $[23] = autoConnect;
277
+ $[24] = connectionTimeout;
278
+ $[25] = persistenceQueues;
279
+ $[26] = redirectUri;
280
+ $[27] = removeCustomServer;
281
+ $[28] = storage;
282
+ $[29] = storageScopeKey;
283
+ $[30] = t5;
284
+ } else t5 = $[30];
285
+ const customElements = customServers.map(t5);
286
+ t3 = [...connectorElements, ...customElements];
287
+ $[8] = autoConnect;
288
+ $[9] = connectionTimeout;
289
+ $[10] = connectors;
290
+ $[11] = customServers;
291
+ $[12] = persistenceQueues;
292
+ $[13] = redirectUri;
293
+ $[14] = removeCustomServer;
294
+ $[15] = storage;
295
+ $[16] = storageScopeKey;
296
+ $[17] = t3;
297
+ } else t3 = $[17];
298
+ const lookup = useClientLookup(t3);
204
299
  const all = lookup.state;
205
- let t12;
206
- if ($[34] !== all) {
207
- t12 = all.filter(_temp5);
208
- $[34] = all;
209
- $[35] = t12;
210
- } else t12 = $[35];
211
- let t13;
212
- if ($[36] !== all) {
213
- t13 = all.filter(_temp6);
214
- $[36] = all;
215
- $[37] = t13;
216
- } else t13 = $[37];
217
- let t14;
218
- if ($[38] !== all || $[39] !== isHydrated || $[40] !== t12 || $[41] !== t13) {
219
- t14 = {
300
+ let t4;
301
+ if ($[31] !== all) {
302
+ t4 = all.filter(_temp7);
303
+ $[31] = all;
304
+ $[32] = t4;
305
+ } else t4 = $[32];
306
+ let t5;
307
+ if ($[33] !== all) {
308
+ t5 = all.filter(_temp8);
309
+ $[33] = all;
310
+ $[34] = t5;
311
+ } else t5 = $[34];
312
+ let t6;
313
+ if ($[35] !== all || $[36] !== isHydrated || $[37] !== t4 || $[38] !== t5) {
314
+ t6 = {
220
315
  servers: all,
221
- connectors: t12,
222
- customServers: t13,
316
+ connectors: t4,
317
+ customServers: t5,
223
318
  isHydrated
224
319
  };
225
- $[38] = all;
226
- $[39] = isHydrated;
227
- $[40] = t12;
228
- $[41] = t13;
229
- $[42] = t14;
230
- } else t14 = $[42];
231
- const state = t14;
320
+ $[35] = all;
321
+ $[36] = isHydrated;
322
+ $[37] = t4;
323
+ $[38] = t5;
324
+ $[39] = t6;
325
+ } else t6 = $[39];
326
+ const state = t6;
232
327
  let out;
233
- if ($[43] !== lookup || $[44] !== state.servers) {
328
+ if ($[40] !== lookup || $[41] !== state.servers) {
234
329
  out = {};
235
330
  for (const server of state.servers) {
236
331
  if (server.connectionState !== "connected") continue;
@@ -244,81 +339,81 @@ const useMcpManagerResource = (props) => {
244
339
  };
245
340
  }
246
341
  }
247
- $[43] = lookup;
248
- $[44] = state.servers;
249
- $[45] = out;
250
- } else out = $[45];
342
+ $[40] = lookup;
343
+ $[41] = state.servers;
344
+ $[42] = out;
345
+ } else out = $[42];
251
346
  const toolkit = out;
252
347
  const clientRef = useAssistantClientRef();
253
- let t15;
254
- if ($[46] !== clientRef || $[47] !== toolkit) {
255
- t15 = () => {
348
+ let t7;
349
+ if ($[43] !== clientRef || $[44] !== toolkit) {
350
+ t7 = () => {
256
351
  const client = clientRef.current;
257
352
  if (!client) return;
258
353
  return client.modelContext.register({ getModelContext: () => ({ tools: toolkit }) });
259
354
  };
260
- $[46] = clientRef;
261
- $[47] = toolkit;
262
- $[48] = t15;
263
- } else t15 = $[48];
264
- let t16;
265
- if ($[49] !== toolkit) {
266
- t16 = [toolkit];
267
- $[49] = toolkit;
268
- $[50] = t16;
269
- } else t16 = $[50];
270
- useAssistantScopeEffect("modelContext", t15, t16);
271
- let t17;
272
- if ($[51] !== lookup || $[52] !== state) {
273
- t17 = (kind, index) => {
355
+ $[43] = clientRef;
356
+ $[44] = toolkit;
357
+ $[45] = t7;
358
+ } else t7 = $[45];
359
+ let t8;
360
+ if ($[46] !== toolkit) {
361
+ t8 = [toolkit];
362
+ $[46] = toolkit;
363
+ $[47] = t8;
364
+ } else t8 = $[47];
365
+ useAssistantScopeEffect("modelContext", t7, t8);
366
+ let t9;
367
+ if ($[48] !== lookup || $[49] !== state) {
368
+ t9 = (kind, index) => {
274
369
  const list = kind === "connector" ? state.connectors : state.customServers;
275
370
  const entry = list[index];
276
371
  if (!entry) throw new Error(`McpManagerResource: no ${kind} at index ${index} (length ${list.length})`);
277
372
  return lookup.get({ key: entry.id });
278
373
  };
279
- $[51] = lookup;
280
- $[52] = state;
281
- $[53] = t17;
282
- } else t17 = $[53];
283
- const serverByKind = t17;
284
- let t18;
285
- if ($[54] !== state) {
286
- t18 = () => state;
287
- $[54] = state;
288
- $[55] = t18;
289
- } else t18 = $[55];
290
- let t19;
291
- if ($[56] !== lookup || $[57] !== serverByKind) {
292
- t19 = (query) => {
374
+ $[48] = lookup;
375
+ $[49] = state;
376
+ $[50] = t9;
377
+ } else t9 = $[50];
378
+ const serverByKind = t9;
379
+ let t10;
380
+ if ($[51] !== state) {
381
+ t10 = () => state;
382
+ $[51] = state;
383
+ $[52] = t10;
384
+ } else t10 = $[52];
385
+ let t11;
386
+ if ($[53] !== lookup || $[54] !== serverByKind) {
387
+ t11 = (query) => {
293
388
  if ("id" in query) return lookup.get({ key: query.id });
294
389
  return serverByKind(query.kind, query.index);
295
390
  };
296
- $[56] = lookup;
297
- $[57] = serverByKind;
298
- $[58] = t19;
299
- } else t19 = $[58];
300
- let t20;
301
- let t21;
302
- if ($[59] !== serverByKind) {
303
- t20 = (t22) => {
304
- const { index: index_0 } = t22;
391
+ $[53] = lookup;
392
+ $[54] = serverByKind;
393
+ $[55] = t11;
394
+ } else t11 = $[55];
395
+ let t12;
396
+ let t13;
397
+ if ($[56] !== serverByKind) {
398
+ t12 = (t14) => {
399
+ const { index: index_0 } = t14;
305
400
  return serverByKind("connector", index_0);
306
401
  };
307
- t21 = (t23) => {
308
- const { index: index_1 } = t23;
402
+ t13 = (t15) => {
403
+ const { index: index_1 } = t15;
309
404
  return serverByKind("custom", index_1);
310
405
  };
311
- $[59] = serverByKind;
312
- $[60] = t20;
313
- $[61] = t21;
406
+ $[56] = serverByKind;
407
+ $[57] = t12;
408
+ $[58] = t13;
314
409
  } else {
315
- t20 = $[60];
316
- t21 = $[61];
410
+ t12 = $[57];
411
+ t13 = $[58];
317
412
  }
318
- let t22;
319
- if ($[62] === Symbol.for("react.memo_cache_sentinel")) {
320
- t22 = async (t23) => {
321
- const { name, url, auth, connectionTimeout: connectionTimeout_0, cache, elicitation } = t23;
413
+ let t14;
414
+ if ($[59] !== updateCustomServers) {
415
+ t14 = async (t15) => {
416
+ const { name, url, auth, connectionTimeout: connectionTimeout_0, cache, elicitation } = t15;
322
417
  const record = {
323
418
  id: createMcpId(),
324
419
  name,
@@ -329,64 +424,83 @@ const useMcpManagerResource = (props) => {
329
424
  ...elicitation !== void 0 ? { elicitation } : {},
330
425
  createdAt: Date.now()
331
426
  };
332
- setCustomServers((prev_1) => [...prev_1, record]);
427
+ updateCustomServers((prev) => [...prev, record]);
333
428
  return record.id;
334
429
  };
335
- $[62] = t22;
336
- } else t22 = $[62];
337
- let t23;
338
- if ($[63] !== lookup || $[64] !== state || $[65] !== storage) {
339
- t23 = async (id) => {
430
+ $[59] = updateCustomServers;
431
+ $[60] = t14;
432
+ } else t14 = $[60];
433
+ let t15;
434
+ if ($[61] !== lookup || $[62] !== persistenceQueues || $[63] !== removeCustomServer || $[64] !== state || $[65] !== storage || $[66] !== storageScopeKey) {
435
+ t15 = async (id) => {
340
436
  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.`);
341
437
  try {
342
438
  await lookup.get({ key: id }).remove();
343
439
  } catch {
344
- await clearOAuthProviderAuthState(storage, id);
345
- setCustomServers((prev_2) => prev_2.filter((s_3) => s_3.id !== id));
440
+ const releasePersistence = holdCustomServerPersistence(persistenceQueues, storageScopeKey);
441
+ try {
442
+ await clearOAuthProviderAuthState(storage, id);
443
+ removeCustomServer(id);
444
+ } catch (t16) {
445
+ const error = t16;
446
+ releasePersistence();
447
+ throw error;
448
+ }
449
+ releasePersistence();
346
450
  }
347
451
  };
348
- $[63] = lookup;
452
+ $[61] = lookup;
453
+ $[62] = persistenceQueues;
454
+ $[63] = removeCustomServer;
349
455
  $[64] = state;
350
456
  $[65] = storage;
351
- $[66] = t23;
352
- } else t23 = $[66];
353
- let t24;
354
- if ($[67] !== t18 || $[68] !== t19 || $[69] !== t20 || $[70] !== t21 || $[71] !== t23) {
355
- t24 = {
356
- getState: t18,
357
- server: t19,
358
- connector: t20,
359
- customServer: t21,
360
- addCustomServer: t22,
361
- removeServer: t23
457
+ $[66] = storageScopeKey;
458
+ $[67] = t15;
459
+ } else t15 = $[67];
460
+ let t16;
461
+ if ($[68] !== t10 || $[69] !== t11 || $[70] !== t12 || $[71] !== t13 || $[72] !== t14 || $[73] !== t15) {
462
+ t16 = {
463
+ getState: t10,
464
+ server: t11,
465
+ connector: t12,
466
+ customServer: t13,
467
+ addCustomServer: t14,
468
+ removeServer: t15
362
469
  };
363
- $[67] = t18;
364
- $[68] = t19;
365
- $[69] = t20;
366
- $[70] = t21;
367
- $[71] = t23;
368
- $[72] = t24;
369
- } else t24 = $[72];
370
- return t24;
470
+ $[68] = t10;
471
+ $[69] = t11;
472
+ $[70] = t12;
473
+ $[71] = t13;
474
+ $[72] = t14;
475
+ $[73] = t15;
476
+ $[74] = t16;
477
+ } else t16 = $[74];
478
+ return t16;
371
479
  };
372
480
  const McpManagerResource = resource(useMcpManagerResource);
373
481
  attachTransformScopes(useMcpManagerResource, (scopes, parent) => {
374
482
  if (!scopes.modelContext && parent.modelContext.source === null) scopes.modelContext = ModelContext();
375
483
  });
376
- function _temp(r) {
484
+ function _temp() {
485
+ return /* @__PURE__ */ new Set();
486
+ }
487
+ function _temp2(r) {
377
488
  return r.id;
378
489
  }
379
- function _temp2(c) {
490
+ function _temp3() {
491
+ return /* @__PURE__ */ new Map();
492
+ }
493
+ function _temp4(c) {
380
494
  return c.id;
381
495
  }
382
- function _temp3(s) {
496
+ function _temp5(s) {
383
497
  return s.id;
384
498
  }
385
- async function _temp4() {}
386
- function _temp5(s_1) {
499
+ async function _temp6() {}
500
+ function _temp7(s_1) {
387
501
  return s_1.kind === "connector";
388
502
  }
389
- function _temp6(s_2) {
503
+ function _temp8(s_2) {
390
504
  return s_2.kind === "custom";
391
505
  }
392
506
  //#endregion