@assistant-ui/react-mcp 0.1.17 → 0.1.18

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