@truefoundry/trueforge-ui 0.3.0-rc.2 → 0.3.0-rc.4

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 (107) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +18 -10
  3. package/dist/{AgentCodeSnippets-637HQUXD.js → AgentCodeSnippets-U6KQWVBJ.js} +38 -23
  4. package/dist/AgentCodeSnippets-U6KQWVBJ.js.map +1 -0
  5. package/dist/AgentMetricChart-3D6FUFO6.js +15 -0
  6. package/dist/{AgentOverview-3FJ5EE6N.js → AgentOverview-RLJ6HZCN.js} +7 -7
  7. package/dist/{AgentSessionEventTimeline-VELWUYPR.js → AgentSessionEventTimeline-CDXRRUZQ.js} +8 -8
  8. package/dist/{AgentSessionEventTimeline-VELWUYPR.js.map → AgentSessionEventTimeline-CDXRRUZQ.js.map} +1 -1
  9. package/dist/{AgentSessionEventTimelineChart-CUKETHWM.js → AgentSessionEventTimelineChart-S2WX6ZEA.js} +12 -12
  10. package/dist/AgentSessionEventTimelineChart-S2WX6ZEA.js.map +1 -0
  11. package/dist/{AgentSessions-T7MOGOTZ.js → AgentSessions-UI3L7XY2.js} +72 -24
  12. package/dist/AgentSessions-UI3L7XY2.js.map +1 -0
  13. package/dist/{ConnectorSettings-ESZ2RSRG.js → ConnectorSettings-OIGAC2HU.js} +156 -116
  14. package/dist/ConnectorSettings-OIGAC2HU.js.map +1 -0
  15. package/dist/{DockLayout-NLFNU6F2.js → DockLayout-J5BRKMJZ.js} +10 -10
  16. package/dist/{DrawerLayout-PR3SMKA6.js → DrawerLayout-65YHGHIF.js} +13 -11
  17. package/dist/DrawerLayout-65YHGHIF.js.map +1 -0
  18. package/dist/{ModelSettings-LYW64IRR.js → ModelSettings-VP6WCMGT.js} +10 -10
  19. package/dist/{ModelSettings-LYW64IRR.js.map → ModelSettings-VP6WCMGT.js.map} +1 -1
  20. package/dist/OpenUiFenceBlock-UTDCTNTM.js +9 -0
  21. package/dist/{SandboxSettings-DF64LHYI.js → SandboxSettings-GTZT7LD6.js} +9 -9
  22. package/dist/SchedulesPage-ARWU7BZF.js +15 -0
  23. package/dist/{SettingsBuilder-LSXK2VN4.js → SettingsBuilder-A4BPYIFZ.js} +8 -8
  24. package/dist/{ShellRouteSync-B22IAV2W.js → ShellRouteSync-SSLGM35F.js} +157 -22
  25. package/dist/ShellRouteSync-SSLGM35F.js.map +1 -0
  26. package/dist/{SidebarLayout-XW6LXB7R.js → SidebarLayout-MFDOGAVJ.js} +74 -53
  27. package/dist/SidebarLayout-MFDOGAVJ.js.map +1 -0
  28. package/dist/{SkillSettings-64VXUO6J.js → SkillSettings-WQPUQ5TE.js} +18 -13
  29. package/dist/SkillSettings-WQPUQ5TE.js.map +1 -0
  30. package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js → TrueForgeUIWithRouter-5CDICMCE.js} +9 -9
  31. package/dist/{WidgetLayout-Q5P7PYSJ.js → WidgetLayout-HE7E4UL5.js} +10 -10
  32. package/dist/{chunk-SQGT43Z3.js → chunk-2BDTG544.js} +21 -4
  33. package/dist/chunk-2BDTG544.js.map +1 -0
  34. package/dist/{chunk-YQO2NMJ3.js → chunk-2OKGEU6X.js} +4425 -2982
  35. package/dist/chunk-2OKGEU6X.js.map +1 -0
  36. package/dist/{chunk-FQK2XVVE.js → chunk-6CFZHEYH.js} +225 -72
  37. package/dist/chunk-6CFZHEYH.js.map +1 -0
  38. package/dist/{chunk-QC42MLAK.js → chunk-7AAO4UDQ.js} +4 -3
  39. package/dist/chunk-7AAO4UDQ.js.map +1 -0
  40. package/dist/chunk-E4GVP6PM.js +195 -0
  41. package/dist/chunk-E4GVP6PM.js.map +1 -0
  42. package/dist/{chunk-LGRHHFHN.js → chunk-F7ZAQIRE.js} +166 -45
  43. package/dist/chunk-F7ZAQIRE.js.map +1 -0
  44. package/dist/{chunk-VJ7BZGAF.js → chunk-GTTMLDCI.js} +2 -2
  45. package/dist/{chunk-5I2COQNL.js → chunk-IOPHQEUY.js} +13 -11
  46. package/dist/chunk-IOPHQEUY.js.map +1 -0
  47. package/dist/{chunk-G2TUAD65.js → chunk-KCYBMKQL.js} +235 -108
  48. package/dist/chunk-KCYBMKQL.js.map +1 -0
  49. package/dist/{chunk-H6WTY5PM.js → chunk-MAA7U4RF.js} +17 -227
  50. package/dist/chunk-MAA7U4RF.js.map +1 -0
  51. package/dist/{chunk-GXYAOAK5.js → chunk-MJULWIPI.js} +224 -162
  52. package/dist/chunk-MJULWIPI.js.map +1 -0
  53. package/dist/chunk-P7J2ABEP.js +587 -0
  54. package/dist/chunk-P7J2ABEP.js.map +1 -0
  55. package/dist/{chunk-VUMGMGKZ.js → chunk-TGKQRK3S.js} +52 -8
  56. package/dist/chunk-TGKQRK3S.js.map +1 -0
  57. package/dist/{chunk-I3AL54MA.js → chunk-VXKNS7FH.js} +28 -24
  58. package/dist/chunk-VXKNS7FH.js.map +1 -0
  59. package/dist/chunk-XO3FYN2W.js +517 -0
  60. package/dist/chunk-XO3FYN2W.js.map +1 -0
  61. package/dist/{createTrueFoundryServer-CmZnBh_l.d.ts → createTrueFoundryServer-B_FYhSdn.d.ts} +8 -5
  62. package/dist/index.d.ts +300 -89
  63. package/dist/index.js +65 -488
  64. package/dist/index.js.map +1 -1
  65. package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +44 -13
  66. package/dist/plugins/trueforge-agent-server-adapter/index.js +73 -37
  67. package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
  68. package/dist/styles.css +1 -1
  69. package/package.json +3 -3
  70. package/dist/AgentCodeSnippets-637HQUXD.js.map +0 -1
  71. package/dist/AgentMetricChart-4FYECRIN.js +0 -15
  72. package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +0 -1
  73. package/dist/AgentSessions-T7MOGOTZ.js.map +0 -1
  74. package/dist/ConnectorSettings-ESZ2RSRG.js.map +0 -1
  75. package/dist/DrawerLayout-PR3SMKA6.js.map +0 -1
  76. package/dist/OpenUiFenceBlock-JEPNPJ7U.js +0 -9
  77. package/dist/SchedulesPage-WQU4H25F.js +0 -15
  78. package/dist/ShellRouteSync-B22IAV2W.js.map +0 -1
  79. package/dist/SidebarLayout-XW6LXB7R.js.map +0 -1
  80. package/dist/SkillSettings-64VXUO6J.js.map +0 -1
  81. package/dist/chunk-5I2COQNL.js.map +0 -1
  82. package/dist/chunk-BWHOZFIV.js +0 -587
  83. package/dist/chunk-BWHOZFIV.js.map +0 -1
  84. package/dist/chunk-FQK2XVVE.js.map +0 -1
  85. package/dist/chunk-G2TUAD65.js.map +0 -1
  86. package/dist/chunk-GXYAOAK5.js.map +0 -1
  87. package/dist/chunk-H6WTY5PM.js.map +0 -1
  88. package/dist/chunk-I3AL54MA.js.map +0 -1
  89. package/dist/chunk-LGRHHFHN.js.map +0 -1
  90. package/dist/chunk-NHHSZB5N.js +0 -74
  91. package/dist/chunk-NHHSZB5N.js.map +0 -1
  92. package/dist/chunk-QC42MLAK.js.map +0 -1
  93. package/dist/chunk-SFZNIO6U.js +0 -18
  94. package/dist/chunk-SFZNIO6U.js.map +0 -1
  95. package/dist/chunk-SQGT43Z3.js.map +0 -1
  96. package/dist/chunk-VUMGMGKZ.js.map +0 -1
  97. package/dist/chunk-YQO2NMJ3.js.map +0 -1
  98. /package/dist/{AgentMetricChart-4FYECRIN.js.map → AgentMetricChart-3D6FUFO6.js.map} +0 -0
  99. /package/dist/{AgentOverview-3FJ5EE6N.js.map → AgentOverview-RLJ6HZCN.js.map} +0 -0
  100. /package/dist/{DockLayout-NLFNU6F2.js.map → DockLayout-J5BRKMJZ.js.map} +0 -0
  101. /package/dist/{OpenUiFenceBlock-JEPNPJ7U.js.map → OpenUiFenceBlock-UTDCTNTM.js.map} +0 -0
  102. /package/dist/{SandboxSettings-DF64LHYI.js.map → SandboxSettings-GTZT7LD6.js.map} +0 -0
  103. /package/dist/{SchedulesPage-WQU4H25F.js.map → SchedulesPage-ARWU7BZF.js.map} +0 -0
  104. /package/dist/{SettingsBuilder-LSXK2VN4.js.map → SettingsBuilder-A4BPYIFZ.js.map} +0 -0
  105. /package/dist/{TrueForgeUIWithRouter-3TSLV22Q.js.map → TrueForgeUIWithRouter-5CDICMCE.js.map} +0 -0
  106. /package/dist/{WidgetLayout-Q5P7PYSJ.js.map → WidgetLayout-HE7E4UL5.js.map} +0 -0
  107. /package/dist/{chunk-VJ7BZGAF.js.map → chunk-GTTMLDCI.js.map} +0 -0
@@ -7,41 +7,45 @@ import {
7
7
  auiInputClass,
8
8
  useMCPAuth,
9
9
  useToasterOptional
10
- } from "./chunk-YQO2NMJ3.js";
11
- import "./chunk-NHHSZB5N.js";
10
+ } from "./chunk-2OKGEU6X.js";
11
+ import "./chunk-E4GVP6PM.js";
12
12
  import {
13
- Icon,
14
- getErrorMessage
15
- } from "./chunk-H6WTY5PM.js";
13
+ Icon
14
+ } from "./chunk-MAA7U4RF.js";
16
15
  import {
16
+ getErrorMessage,
17
17
  useCatalogServer
18
- } from "./chunk-FQK2XVVE.js";
18
+ } from "./chunk-6CFZHEYH.js";
19
19
  import "./chunk-M6MHLVSO.js";
20
- import "./chunk-VJ7BZGAF.js";
20
+ import "./chunk-GTTMLDCI.js";
21
21
  import {
22
22
  cn
23
- } from "./chunk-BWHOZFIV.js";
23
+ } from "./chunk-P7J2ABEP.js";
24
24
 
25
25
  // src/containers/SettingsBuilder/ConnectorSettings.tsx
26
- import { useCallback, useEffect as useEffect2, useMemo, useState as useState3 } from "react";
26
+ import { useCallback, useEffect as useEffect3, useMemo, useState as useState3 } from "react";
27
27
 
28
28
  // src/containers/SettingsBuilder/AddMcpServerForm.tsx
29
- import { useState } from "react";
29
+ import { useEffect, useState } from "react";
30
30
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
31
31
  var AUTH_OPTIONS = [
32
- { value: "dcr", label: "OAuth" },
33
32
  { value: "none", label: "None" },
34
- { value: "header", label: "API Key" }
33
+ { value: "header", label: "API Key" },
34
+ { value: "dcr", label: "OAuth" }
35
35
  ];
36
36
  var inputClassName = auiInputClass("h-11 shadow-sm");
37
37
  var RequiredMark = () => /* @__PURE__ */ jsx("span", { className: "ml-0.5 text-failure-bg", "aria-hidden": true, children: "*" });
38
- var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
38
+ var AddMcpServerForm = ({ open, onOpenChange, onSubmit, connector, busy = false, error }) => {
39
39
  const [name, setName] = useState("");
40
40
  const [url, setUrl] = useState("");
41
41
  const [description, setDescription] = useState("");
42
42
  const [authType, setAuthType] = useState("dcr");
43
43
  const [apiKey, setApiKey] = useState("");
44
44
  const [headerName, setHeaderName] = useState("");
45
+ const isEditing = connector !== void 0;
46
+ const nameInputClassName = auiInputClass(
47
+ `h-11 shadow-sm ${isEditing ? "cursor-not-allowed bg-secondary-bg/60 text-text-secondary opacity-40" : ""}`
48
+ );
45
49
  const resetForm = () => {
46
50
  setName("");
47
51
  setUrl("");
@@ -50,11 +54,21 @@ var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
50
54
  setApiKey("");
51
55
  setHeaderName("");
52
56
  };
57
+ useEffect(() => {
58
+ if (!open) return;
59
+ setName(connector?.name ?? "");
60
+ setUrl(connector?.url ?? "");
61
+ setDescription(connector?.description ?? "");
62
+ setAuthType(connector?.auth.type ?? "dcr");
63
+ setApiKey("");
64
+ setHeaderName(connector?.auth.type === "header" ? connector.auth.headerName ?? "" : "");
65
+ }, [connector, open]);
53
66
  const handleOpenChange = (nextOpen) => {
54
67
  if (!nextOpen) resetForm();
55
68
  onOpenChange(nextOpen);
56
69
  };
57
- const isValid = !!name.trim() && !!description.trim() && !!url.trim() && (authType !== "header" || !!apiKey.trim());
70
+ const hasApiKey = !!apiKey.trim() || connector?.auth.type === "header";
71
+ const isValid = !!name.trim() && !!description.trim() && !!url.trim() && (authType !== "header" || hasApiKey);
58
72
  const handleSubmit = async (event) => {
59
73
  event.preventDefault();
60
74
  if (!isValid || busy) return;
@@ -64,7 +78,7 @@ var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
64
78
  ...headerName.trim() ? { headerName: headerName.trim() } : {}
65
79
  } : { type: authType };
66
80
  try {
67
- await onAdd({
81
+ await onSubmit({
68
82
  name: name.trim(),
69
83
  url: url.trim(),
70
84
  description: description.trim(),
@@ -80,8 +94,8 @@ var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
80
94
  {
81
95
  open,
82
96
  onOpenChange: handleOpenChange,
83
- title: "Add MCP server",
84
- description: "Point at a remote MCP endpoint. It then behaves like any other connector.",
97
+ title: isEditing ? "Edit MCP server" : "Add MCP server",
98
+ description: isEditing ? "Update how this connector authenticates." : "Point at a remote MCP endpoint. It then behaves like any other connector.",
85
99
  contentSized: true,
86
100
  headerIcon: /* @__PURE__ */ jsx(
87
101
  "span",
@@ -105,12 +119,14 @@ var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
105
119
  type: "text",
106
120
  required: true,
107
121
  value: name,
122
+ readOnly: isEditing,
123
+ "aria-disabled": isEditing,
108
124
  onChange: (event) => {
109
125
  setName(event.target.value);
110
126
  },
111
127
  placeholder: "analytics-postgres-mcp",
112
- autoFocus: true,
113
- className: inputClassName
128
+ autoFocus: !isEditing,
129
+ className: nameInputClassName
114
130
  }
115
131
  )
116
132
  ] }),
@@ -191,14 +207,14 @@ var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
191
207
  /* @__PURE__ */ jsxs("div", { children: [
192
208
  /* @__PURE__ */ jsxs("label", { htmlFor: "mcp-server-api-key", className: "mb-1.5 block text-sm font-medium text-text-primary", children: [
193
209
  "API key",
194
- /* @__PURE__ */ jsx(RequiredMark, {})
210
+ connector?.auth.type === "header" ? /* @__PURE__ */ jsx("span", { className: "font-normal text-text-secondary", children: " (leave blank to keep current)" }) : /* @__PURE__ */ jsx(RequiredMark, {})
195
211
  ] }),
196
212
  /* @__PURE__ */ jsx(
197
213
  "input",
198
214
  {
199
215
  id: "mcp-server-api-key",
200
216
  type: "password",
201
- required: true,
217
+ required: connector?.auth.type !== "header",
202
218
  value: apiKey,
203
219
  onChange: (event) => {
204
220
  setApiKey(event.target.value);
@@ -231,7 +247,7 @@ var AddMcpServerForm = ({ open, onOpenChange, onAdd, busy = false, error }) => {
231
247
  ] }),
232
248
  /* @__PURE__ */ jsxs("div", { className: "mt-6 space-y-3", children: [
233
249
  error ? /* @__PURE__ */ jsx("p", { className: "text-failure-bg text-sm", children: error }) : null,
234
- /* @__PURE__ */ jsx(Button.Primary, { type: "submit", size: "large", disabled: !isValid || busy, className: "w-full shrink-0", children: "Add" })
250
+ /* @__PURE__ */ jsx(Button.Primary, { type: "submit", size: "large", disabled: !isValid || busy, className: "w-full shrink-0", children: isEditing ? "Save" : "Add" })
235
251
  ] })
236
252
  ] })
237
253
  }
@@ -247,7 +263,7 @@ var AUTH_TYPE_LABELS = {
247
263
  };
248
264
 
249
265
  // src/containers/SettingsBuilder/ConnectorDetails.tsx
250
- import { useEffect, useLayoutEffect, useRef, useState as useState2 } from "react";
266
+ import { useEffect as useEffect2, useLayoutEffect, useRef, useState as useState2 } from "react";
251
267
  import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
252
268
  function ExpandableDescription({ text }) {
253
269
  const contentRef = useRef(null);
@@ -321,6 +337,7 @@ var ConnectorDetails = ({
321
337
  connector,
322
338
  onBack,
323
339
  onConnectorRefreshed,
340
+ onEdit,
324
341
  onDisconnect,
325
342
  busy = false
326
343
  }) => {
@@ -330,7 +347,7 @@ var ConnectorDetails = ({
330
347
  const [toolsLoading, setToolsLoading] = useState2(true);
331
348
  const [toolsError, setToolsError] = useState2(null);
332
349
  const [refreshingAfterAuth, setRefreshingAfterAuth] = useState2(false);
333
- useEffect(() => {
350
+ useEffect2(() => {
334
351
  let cancelled = false;
335
352
  setTools([]);
336
353
  setToolsError(null);
@@ -385,13 +402,14 @@ var ConnectorDetails = ({
385
402
  }
386
403
  ),
387
404
  /* @__PURE__ */ jsxs2("div", { className: "min-w-0 flex-1", children: [
388
- /* @__PURE__ */ jsx2("h4", { className: "text-lg font-semibold text-text-primary", children: connector.name }),
389
- /* @__PURE__ */ jsxs2("div", { className: "mt-0.5 flex flex-wrap items-center gap-x-2 gap-y-1 text-sm", children: [
405
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2", children: [
406
+ /* @__PURE__ */ jsx2("h4", { className: "text-lg font-semibold text-text-primary", children: connector.name }),
407
+ /* @__PURE__ */ jsx2("span", { className: "inline-flex items-center rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium text-text-secondary", children: AUTH_TYPE_LABELS[connector.auth.type] ?? AUTH_TYPE_LABELS.none }),
390
408
  /* @__PURE__ */ jsxs2(
391
409
  "span",
392
410
  {
393
411
  className: cn(
394
- "flex items-center gap-1.5 text-xs font-medium",
412
+ "flex items-center gap-1.5 rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium",
395
413
  connector.authenticated ? "text-success-bg" : "text-text-primary"
396
414
  ),
397
415
  children: [
@@ -407,28 +425,30 @@ var ConnectorDetails = ({
407
425
  connector.authenticated ? "Connected" : "Not authenticated"
408
426
  ]
409
427
  }
410
- ),
411
- /* @__PURE__ */ jsxs2("span", { className: "text-text-secondary", children: [
412
- "\xB7 ",
413
- connector.description
414
- ] })
428
+ )
415
429
  ] }),
416
- /* @__PURE__ */ jsx2("span", { className: "mt-2 inline-flex items-center rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium text-text-secondary", children: AUTH_TYPE_LABELS[connector.auth.type] ?? AUTH_TYPE_LABELS.none })
430
+ /* @__PURE__ */ jsx2("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1 text-sm", children: /* @__PURE__ */ jsx2("span", { className: "text-text-secondary", children: connector.description }) })
417
431
  ] }),
418
- connector.auth.type === "dcr" && !connector.authenticated ? /* @__PURE__ */ jsx2(
419
- Button.Secondary,
420
- {
421
- size: "small",
422
- type: "button",
423
- disabled: busy || connecting,
424
- onClick: () => {
425
- void handleAuthorize(connector.id, (isSuccess) => {
426
- if (isSuccess) void refreshAfterAuthentication();
427
- });
428
- },
429
- children: connecting ? "Connecting\u2026" : "Connect"
430
- }
431
- ) : connector.auth.type === "dcr" && !connector.requiresAuth ? /* @__PURE__ */ jsx2(Button.Secondary, { size: "small", type: "button", disabled: busy, onClick: onDisconnect, children: "Disconnect" }) : null
432
+ /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2", children: [
433
+ /* @__PURE__ */ jsxs2(Button.Secondary, { size: "small", type: "button", disabled: busy, onClick: onEdit, children: [
434
+ /* @__PURE__ */ jsx2(Icon, { name: "pencil", className: "size-3" }),
435
+ "Edit"
436
+ ] }),
437
+ connector.auth.type === "dcr" && !connector.authenticated ? /* @__PURE__ */ jsx2(
438
+ Button.Secondary,
439
+ {
440
+ size: "small",
441
+ type: "button",
442
+ disabled: busy || connecting,
443
+ onClick: () => {
444
+ void handleAuthorize(connector.id, (isSuccess) => {
445
+ if (isSuccess) void refreshAfterAuthentication();
446
+ });
447
+ },
448
+ children: connecting ? "Connecting\u2026" : "Connect"
449
+ }
450
+ ) : connector.auth.type === "dcr" && !connector.requiresAuth ? /* @__PURE__ */ jsx2(Button.Secondary, { size: "small", type: "button", disabled: busy, onClick: onDisconnect, children: "Disconnect" }) : null
451
+ ] })
432
452
  ] }),
433
453
  /* @__PURE__ */ jsx2("section", { className: "mt-6", "aria-labelledby": "connector-tools-heading", children: toolsLoading ? /* @__PURE__ */ jsx2("div", { className: "rounded-xl border border-dashed border-border p-6 text-center text-sm text-text-secondary", children: "Loading tools\u2026" }) : toolsError ? /* @__PURE__ */ jsxs2("div", { className: "rounded-xl border border-failure-bg/30 bg-failure-bg/10 p-6 text-center text-sm text-failure-bg", children: [
434
454
  toolsError,
@@ -474,6 +494,7 @@ var ConnectorSettings = () => {
474
494
  const [busy, setBusy] = useState3(false);
475
495
  const [catalog, setCatalog] = useState3([]);
476
496
  const [addMcpServerFormOpen, setAddMcpServerFormOpen] = useState3(false);
497
+ const [editingConnector, setEditingConnector] = useState3(null);
477
498
  const [connectorAwaitingKey, setConnectorAwaitingKey] = useState3(null);
478
499
  const [selectedConnector, setSelectedConnector] = useState3(null);
479
500
  const [apiKey, setApiKey] = useState3("");
@@ -514,7 +535,7 @@ var ConnectorSettings = () => {
514
535
  setLoading(false);
515
536
  }
516
537
  }, [connectorCatalog]);
517
- useEffect2(() => {
538
+ useEffect3(() => {
518
539
  void refresh();
519
540
  }, [refresh]);
520
541
  const normalizedQuery = query.trim().toLowerCase();
@@ -596,35 +617,27 @@ var ConnectorSettings = () => {
596
617
  apiKey: apiKey.trim(),
597
618
  ...entry.auth.type === "header" && entry.auth.headerName ? { headerName: entry.auth.headerName } : {}
598
619
  };
599
- const existing = connectors.ordered.find(({ connector }) => connector.id === entry.id);
600
- const existingConnector = existing?.isConfigured ? existing.connector : void 0;
601
- if (existingConnector) {
602
- await connectorCatalog.updateConnector({
603
- id: existingConnector.id,
604
- name: existingConnector.name,
605
- description: existingConnector.description,
606
- url: existingConnector.url,
607
- auth
608
- });
609
- } else {
610
- await createFromCatalog(entry, auth);
611
- }
620
+ await createFromCatalog(entry, auth);
612
621
  closeApiKeyModal();
613
622
  setTimeout(() => {
614
623
  toaster?.showSuccess({
615
- title: `${entry.name} ${existingConnector ? "updated" : "connected"}`
624
+ title: `${entry.name} connected`
616
625
  });
617
626
  }, 100);
618
627
  }, setFormError).catch(() => {
619
628
  });
620
629
  };
621
- const handleAddMcpServer = async (draft) => {
630
+ const handleMcpServerSubmit = async (draft) => {
622
631
  setFormError(null);
623
632
  await runMutation(async () => {
624
- await connectorCatalog.createConnector({ ...draft });
633
+ if (editingConnector) {
634
+ await connectorCatalog.updateConnector({ id: editingConnector.id, ...draft });
635
+ } else {
636
+ await connectorCatalog.createConnector({ ...draft });
637
+ }
625
638
  }, setFormError);
626
639
  setTimeout(() => {
627
- toaster?.showSuccess({ title: `${draft.name} added` });
640
+ toaster?.showSuccess({ title: `${draft.name} ${editingConnector ? "updated" : "added"}` });
628
641
  }, 0);
629
642
  };
630
643
  const handleDisconnect = (connector) => {
@@ -659,7 +672,30 @@ var ConnectorSettings = () => {
659
672
  }
660
673
  ),
661
674
  /* @__PURE__ */ jsxs3("div", { className: "min-w-0 flex-1", children: [
662
- /* @__PURE__ */ jsx3("h5", { className: "truncate text-sm font-medium text-text-primary", children: connector.name }),
675
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2", children: [
676
+ /* @__PURE__ */ jsx3("h5", { className: "truncate text-sm font-medium text-text-primary", children: connector.name }),
677
+ /* @__PURE__ */ jsx3("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxs3(
678
+ "span",
679
+ {
680
+ className: cn(
681
+ "flex items-center gap-1.5 rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium",
682
+ connector.authenticated ? "text-success-bg" : "text-text-primary"
683
+ ),
684
+ children: [
685
+ /* @__PURE__ */ jsx3(
686
+ "span",
687
+ {
688
+ className: cn(
689
+ "h-1.5 w-1.5 rounded-full",
690
+ connector.authenticated ? "bg-success-bg" : "bg-primary-button-bg"
691
+ )
692
+ }
693
+ ),
694
+ connector.authenticated ? "Connected" : "Added"
695
+ ]
696
+ }
697
+ ) })
698
+ ] }),
663
699
  /* @__PURE__ */ jsx3("p", { className: "mt-0.5 line-clamp-2 text-sm text-text-secondary sm:truncate", children: connector.description })
664
700
  ] })
665
701
  ] });
@@ -675,28 +711,7 @@ var ConnectorSettings = () => {
675
711
  children: [
676
712
  /* @__PURE__ */ jsx3("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: content }),
677
713
  /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-2", children: [
678
- /* @__PURE__ */ jsx3("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxs3(
679
- "span",
680
- {
681
- className: cn(
682
- "flex items-center gap-1.5 rounded-full border border-border bg-secondary-bg/40 px-2 py-0.5 text-xs font-medium",
683
- connector.authenticated ? "text-success-bg" : "text-text-primary"
684
- ),
685
- children: [
686
- /* @__PURE__ */ jsx3(
687
- "span",
688
- {
689
- className: cn(
690
- "h-1.5 w-1.5 rounded-full",
691
- connector.authenticated ? "bg-success-bg" : "bg-primary-button-bg"
692
- )
693
- }
694
- ),
695
- connector.authenticated ? "Connected" : "Added"
696
- ]
697
- }
698
- ) }),
699
- connector.auth.type === "header" ? /* @__PURE__ */ jsxs3(
714
+ /* @__PURE__ */ jsxs3(
700
715
  Button.Secondary,
701
716
  {
702
717
  size: "small",
@@ -704,15 +719,16 @@ var ConnectorSettings = () => {
704
719
  disabled: busy,
705
720
  onClick: (event) => {
706
721
  event.stopPropagation();
707
- setApiKey("");
708
- setConnectorAwaitingKey(connector);
722
+ setFormError(null);
723
+ setEditingConnector(connector);
724
+ setAddMcpServerFormOpen(true);
709
725
  },
710
726
  children: [
711
- /* @__PURE__ */ jsx3(Icon, { name: "wrench", className: "size-3" }),
712
- "Replace Key"
727
+ /* @__PURE__ */ jsx3(Icon, { name: "pencil", className: "size-3" }),
728
+ "Edit"
713
729
  ]
714
730
  }
715
- ) : null,
731
+ ),
716
732
  /* @__PURE__ */ jsx3(Icon, { name: "chevron-right", className: "size-4" })
717
733
  ] })
718
734
  ]
@@ -761,26 +777,45 @@ var ConnectorSettings = () => {
761
777
  entry.id
762
778
  );
763
779
  };
764
- const isReplacingKey = useMemo(() => {
765
- return connectorAwaitingKey !== null && connectors.ordered.some(
766
- (item) => item.isConfigured && item.connector.id === connectorAwaitingKey.id
767
- );
768
- }, [connectorAwaitingKey, connectors.ordered]);
769
780
  if (selectedConnector) {
770
- return /* @__PURE__ */ jsx3(
771
- ConnectorDetails_default,
772
- {
773
- connector: selectedConnector,
774
- busy,
775
- onBack: () => {
776
- setSelectedConnector(null);
777
- },
778
- onConnectorRefreshed: handleConnectorRefreshed,
779
- onDisconnect: () => {
780
- handleDisconnect(selectedConnector);
781
+ return /* @__PURE__ */ jsxs3(Fragment3, { children: [
782
+ /* @__PURE__ */ jsx3(
783
+ ConnectorDetails_default,
784
+ {
785
+ connector: selectedConnector,
786
+ busy,
787
+ onBack: () => {
788
+ setSelectedConnector(null);
789
+ },
790
+ onConnectorRefreshed: handleConnectorRefreshed,
791
+ onEdit: () => {
792
+ setFormError(null);
793
+ setEditingConnector(selectedConnector);
794
+ setAddMcpServerFormOpen(true);
795
+ },
796
+ onDisconnect: () => {
797
+ handleDisconnect(selectedConnector);
798
+ }
781
799
  }
782
- }
783
- );
800
+ ),
801
+ /* @__PURE__ */ jsx3(
802
+ AddMcpServerForm_default,
803
+ {
804
+ open: addMcpServerFormOpen,
805
+ onOpenChange: (open) => {
806
+ setAddMcpServerFormOpen(open);
807
+ if (!open) {
808
+ setEditingConnector(null);
809
+ setFormError(null);
810
+ }
811
+ },
812
+ onSubmit: handleMcpServerSubmit,
813
+ connector: editingConnector ?? void 0,
814
+ busy,
815
+ error: formError
816
+ }
817
+ )
818
+ ] });
784
819
  }
785
820
  const hasMatches = matchingConnected.length > 0 || availableConnectors.length > 0;
786
821
  return /* @__PURE__ */ jsxs3(Fragment3, { children: [
@@ -796,6 +831,7 @@ var ConnectorSettings = () => {
796
831
  type: "button",
797
832
  onClick: () => {
798
833
  setFormError(null);
834
+ setEditingConnector(null);
799
835
  setAddMcpServerFormOpen(true);
800
836
  },
801
837
  children: [
@@ -844,7 +880,7 @@ var ConnectorSettings = () => {
844
880
  onOpenChange: (open) => {
845
881
  if (!open) closeApiKeyModal();
846
882
  },
847
- title: `${isReplacingKey ? "Replace key for" : "Connect"} ${connectorAwaitingKey?.name ?? "connector"}`,
883
+ title: `Connect ${connectorAwaitingKey?.name ?? "connector"}`,
848
884
  description: connectorAwaitingKey?.url,
849
885
  contentSized: true,
850
886
  className: "md:max-w-xl",
@@ -893,7 +929,7 @@ var ConnectorSettings = () => {
893
929
  ] }),
894
930
  /* @__PURE__ */ jsxs3("footer", { className: "flex justify-end gap-2 border-t border-border px-5 py-4", children: [
895
931
  /* @__PURE__ */ jsx3(Button.Ghost, { type: "button", onClick: closeApiKeyModal, disabled: busy, children: "Cancel" }),
896
- /* @__PURE__ */ jsx3(Button.Primary, { type: "submit", disabled: !apiKey.trim() || busy, children: isReplacingKey ? "Replace Key" : "Connect" })
932
+ /* @__PURE__ */ jsx3(Button.Primary, { type: "submit", disabled: !apiKey.trim() || busy, children: "Connect" })
897
933
  ] })
898
934
  ] })
899
935
  }
@@ -904,9 +940,13 @@ var ConnectorSettings = () => {
904
940
  open: addMcpServerFormOpen,
905
941
  onOpenChange: (open) => {
906
942
  setAddMcpServerFormOpen(open);
907
- if (!open) setFormError(null);
943
+ if (!open) {
944
+ setEditingConnector(null);
945
+ setFormError(null);
946
+ }
908
947
  },
909
- onAdd: handleAddMcpServer,
948
+ onSubmit: handleMcpServerSubmit,
949
+ connector: editingConnector ?? void 0,
910
950
  busy,
911
951
  error: formError
912
952
  }
@@ -918,4 +958,4 @@ var ConnectorSettings_default = ConnectorSettings;
918
958
  export {
919
959
  ConnectorSettings_default as default
920
960
  };
921
- //# sourceMappingURL=ConnectorSettings-ESZ2RSRG.js.map
961
+ //# sourceMappingURL=ConnectorSettings-OIGAC2HU.js.map