rrce-workflow 0.2.40 → 0.2.41
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.
- package/dist/index.js +109 -100
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2113,67 +2113,29 @@ var init_Header = __esm({
|
|
|
2113
2113
|
}
|
|
2114
2114
|
});
|
|
2115
2115
|
|
|
2116
|
-
// src/mcp/ui/
|
|
2116
|
+
// src/mcp/ui/Overview.tsx
|
|
2117
2117
|
import "react";
|
|
2118
2118
|
import { Box as Box2, Text as Text2 } from "ink";
|
|
2119
2119
|
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
2120
|
-
var StatusBoard;
|
|
2121
|
-
var init_StatusBoard = __esm({
|
|
2122
|
-
"src/mcp/ui/StatusBoard.tsx"() {
|
|
2123
|
-
"use strict";
|
|
2124
|
-
StatusBoard = ({ exposedLabel, port, pid, running }) => {
|
|
2125
|
-
return /* @__PURE__ */ jsx2(Box2, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: /* @__PURE__ */ jsxs(Text2, { children: [
|
|
2126
|
-
running ? /* @__PURE__ */ jsx2(Text2, { color: "green", children: "\u25CF RUNNING" }) : /* @__PURE__ */ jsx2(Text2, { color: "red", children: "\u25CF STOPPED" }),
|
|
2127
|
-
" ",
|
|
2128
|
-
"\u2502",
|
|
2129
|
-
" \u{1F4CB} ",
|
|
2130
|
-
/* @__PURE__ */ jsx2(Text2, { color: "yellow", children: exposedLabel }),
|
|
2131
|
-
" ",
|
|
2132
|
-
"\u2502",
|
|
2133
|
-
" Port: ",
|
|
2134
|
-
/* @__PURE__ */ jsx2(Text2, { color: "green", children: port }),
|
|
2135
|
-
" ",
|
|
2136
|
-
"\u2502",
|
|
2137
|
-
" PID: ",
|
|
2138
|
-
/* @__PURE__ */ jsx2(Text2, { color: "green", children: pid })
|
|
2139
|
-
] }) });
|
|
2140
|
-
};
|
|
2141
|
-
}
|
|
2142
|
-
});
|
|
2143
|
-
|
|
2144
|
-
// src/mcp/ui/Overview.tsx
|
|
2145
|
-
import "react";
|
|
2146
|
-
import { Box as Box3, Text as Text3 } from "ink";
|
|
2147
|
-
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
2148
2120
|
var Overview;
|
|
2149
2121
|
var init_Overview = __esm({
|
|
2150
2122
|
"src/mcp/ui/Overview.tsx"() {
|
|
2151
2123
|
"use strict";
|
|
2152
2124
|
init_Header();
|
|
2153
|
-
init_StatusBoard();
|
|
2154
2125
|
Overview = ({ serverStatus, stats }) => {
|
|
2155
|
-
return /* @__PURE__ */
|
|
2156
|
-
/* @__PURE__ */
|
|
2157
|
-
/* @__PURE__ */
|
|
2158
|
-
|
|
2159
|
-
{
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
pid: serverStatus.pid,
|
|
2163
|
-
running: serverStatus.running
|
|
2164
|
-
}
|
|
2165
|
-
) }),
|
|
2166
|
-
/* @__PURE__ */ jsxs2(Box3, { borderStyle: "round", padding: 1, borderColor: "white", flexDirection: "column", children: [
|
|
2167
|
-
/* @__PURE__ */ jsx3(Text3, { bold: true, underline: true, children: "System Status" }),
|
|
2168
|
-
/* @__PURE__ */ jsxs2(Box3, { marginTop: 1, children: [
|
|
2169
|
-
/* @__PURE__ */ jsx3(Text3, { children: "Integrations Installed: " }),
|
|
2170
|
-
/* @__PURE__ */ jsx3(Text3, { color: stats.installedIntegrations > 0 ? "green" : "yellow", children: stats.installedIntegrations })
|
|
2126
|
+
return /* @__PURE__ */ jsxs(Box2, { flexDirection: "column", flexGrow: 1, children: [
|
|
2127
|
+
/* @__PURE__ */ jsx2(Header, {}),
|
|
2128
|
+
/* @__PURE__ */ jsxs(Box2, { borderStyle: "round", padding: 1, borderColor: "white", flexDirection: "column", flexGrow: 1, children: [
|
|
2129
|
+
/* @__PURE__ */ jsx2(Text2, { bold: true, underline: true, children: "System Status" }),
|
|
2130
|
+
/* @__PURE__ */ jsxs(Box2, { marginTop: 1, children: [
|
|
2131
|
+
/* @__PURE__ */ jsx2(Text2, { children: "Integrations Installed: " }),
|
|
2132
|
+
/* @__PURE__ */ jsx2(Text2, { color: stats.installedIntegrations > 0 ? "green" : "yellow", children: stats.installedIntegrations })
|
|
2171
2133
|
] }),
|
|
2172
|
-
/* @__PURE__ */
|
|
2173
|
-
/* @__PURE__ */
|
|
2174
|
-
/* @__PURE__ */
|
|
2134
|
+
/* @__PURE__ */ jsxs(Box2, { children: [
|
|
2135
|
+
/* @__PURE__ */ jsx2(Text2, { children: "Server Port: " }),
|
|
2136
|
+
/* @__PURE__ */ jsx2(Text2, { color: "cyan", children: serverStatus.port })
|
|
2175
2137
|
] }),
|
|
2176
|
-
/* @__PURE__ */
|
|
2138
|
+
/* @__PURE__ */ jsx2(Box2, { marginTop: 1, children: /* @__PURE__ */ jsx2(Text2, { color: "dim", children: "Press 'q' to stop server and exit." }) })
|
|
2177
2139
|
] })
|
|
2178
2140
|
] });
|
|
2179
2141
|
};
|
|
@@ -2182,8 +2144,8 @@ var init_Overview = __esm({
|
|
|
2182
2144
|
|
|
2183
2145
|
// src/mcp/ui/components/SimpleSelect.tsx
|
|
2184
2146
|
import { useState } from "react";
|
|
2185
|
-
import { Box as
|
|
2186
|
-
import { jsx as
|
|
2147
|
+
import { Box as Box3, Text as Text3, useInput } from "ink";
|
|
2148
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
2187
2149
|
function SimpleSelect({
|
|
2188
2150
|
items,
|
|
2189
2151
|
onSelect,
|
|
@@ -2226,18 +2188,18 @@ function SimpleSelect({
|
|
|
2226
2188
|
onCancel?.();
|
|
2227
2189
|
}
|
|
2228
2190
|
});
|
|
2229
|
-
return /* @__PURE__ */
|
|
2230
|
-
message && /* @__PURE__ */
|
|
2191
|
+
return /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1, children: [
|
|
2192
|
+
message && /* @__PURE__ */ jsx3(Box3, { marginBottom: 1, children: /* @__PURE__ */ jsx3(Text3, { bold: true, children: message }) }),
|
|
2231
2193
|
items.map((item, index) => {
|
|
2232
2194
|
const isSelected = index === selectedIndex;
|
|
2233
2195
|
const isChecked = isMulti && selectedValues.has(item.value);
|
|
2234
|
-
return /* @__PURE__ */
|
|
2235
|
-
/* @__PURE__ */
|
|
2236
|
-
isMulti && /* @__PURE__ */
|
|
2237
|
-
/* @__PURE__ */
|
|
2196
|
+
return /* @__PURE__ */ jsxs2(Box3, { children: [
|
|
2197
|
+
/* @__PURE__ */ jsx3(Text3, { color: isSelected ? "cyan" : "white", children: isSelected ? "> " : " " }),
|
|
2198
|
+
isMulti && /* @__PURE__ */ jsx3(Text3, { color: isChecked ? "green" : "gray", children: isChecked ? "[x] " : "[ ] " }),
|
|
2199
|
+
/* @__PURE__ */ jsx3(Text3, { color: isSelected ? "cyan" : "white", children: item.label })
|
|
2238
2200
|
] }, item.key || String(item.value));
|
|
2239
2201
|
}),
|
|
2240
|
-
/* @__PURE__ */
|
|
2202
|
+
/* @__PURE__ */ jsx3(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx3(Text3, { color: "gray", children: isMulti ? "Space to toggle, Enter to confirm, Esc to cancel" : "Enter to select, Esc to cancel" }) })
|
|
2241
2203
|
] });
|
|
2242
2204
|
}
|
|
2243
2205
|
var init_SimpleSelect = __esm({
|
|
@@ -2248,8 +2210,8 @@ var init_SimpleSelect = __esm({
|
|
|
2248
2210
|
|
|
2249
2211
|
// src/mcp/ui/ProjectsView.tsx
|
|
2250
2212
|
import { useState as useState2 } from "react";
|
|
2251
|
-
import { Box as
|
|
2252
|
-
import { jsx as
|
|
2213
|
+
import { Box as Box4, Text as Text4 } from "ink";
|
|
2214
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
2253
2215
|
var ProjectsView;
|
|
2254
2216
|
var init_ProjectsView = __esm({
|
|
2255
2217
|
"src/mcp/ui/ProjectsView.tsx"() {
|
|
@@ -2257,7 +2219,7 @@ var init_ProjectsView = __esm({
|
|
|
2257
2219
|
init_SimpleSelect();
|
|
2258
2220
|
init_config();
|
|
2259
2221
|
init_detection();
|
|
2260
|
-
ProjectsView = () => {
|
|
2222
|
+
ProjectsView = ({ onConfigChange }) => {
|
|
2261
2223
|
const [config, setConfig] = useState2(loadMCPConfig());
|
|
2262
2224
|
const allProjects = scanForProjects();
|
|
2263
2225
|
const projectItems = allProjects.map((p) => {
|
|
@@ -2291,11 +2253,12 @@ var init_ProjectsView = __esm({
|
|
|
2291
2253
|
});
|
|
2292
2254
|
saveMCPConfig(newConfig);
|
|
2293
2255
|
setConfig(newConfig);
|
|
2256
|
+
if (onConfigChange) onConfigChange();
|
|
2294
2257
|
};
|
|
2295
|
-
return /* @__PURE__ */
|
|
2296
|
-
/* @__PURE__ */
|
|
2297
|
-
/* @__PURE__ */
|
|
2298
|
-
/* @__PURE__ */
|
|
2258
|
+
return /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "cyan", children: [
|
|
2259
|
+
/* @__PURE__ */ jsx4(Text4, { bold: true, color: "cyan", children: " Exposed Projects " }),
|
|
2260
|
+
/* @__PURE__ */ jsx4(Text4, { color: "dim", children: " Select projects to expose via the MCP server. Use Space to toggle, Enter to save." }),
|
|
2261
|
+
/* @__PURE__ */ jsx4(Box4, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx4(
|
|
2299
2262
|
SimpleSelect,
|
|
2300
2263
|
{
|
|
2301
2264
|
message: "",
|
|
@@ -2306,8 +2269,7 @@ var init_ProjectsView = __esm({
|
|
|
2306
2269
|
},
|
|
2307
2270
|
onSubmit: handleSubmit,
|
|
2308
2271
|
onCancel: () => {
|
|
2309
|
-
}
|
|
2310
|
-
itemLimit: 10
|
|
2272
|
+
}
|
|
2311
2273
|
},
|
|
2312
2274
|
JSON.stringify(initialSelected)
|
|
2313
2275
|
) })
|
|
@@ -2318,8 +2280,8 @@ var init_ProjectsView = __esm({
|
|
|
2318
2280
|
|
|
2319
2281
|
// src/mcp/ui/components/InstallWizard.tsx
|
|
2320
2282
|
import { useState as useState3 } from "react";
|
|
2321
|
-
import { Box as
|
|
2322
|
-
import { jsx as
|
|
2283
|
+
import { Box as Box5, Text as Text5 } from "ink";
|
|
2284
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2323
2285
|
var InstallWizard;
|
|
2324
2286
|
var init_InstallWizard = __esm({
|
|
2325
2287
|
"src/mcp/ui/components/InstallWizard.tsx"() {
|
|
@@ -2372,9 +2334,9 @@ var init_InstallWizard = __esm({
|
|
|
2372
2334
|
onComplete();
|
|
2373
2335
|
}, 2e3);
|
|
2374
2336
|
};
|
|
2375
|
-
return /* @__PURE__ */
|
|
2376
|
-
message && /* @__PURE__ */
|
|
2377
|
-
/* @__PURE__ */
|
|
2337
|
+
return /* @__PURE__ */ jsxs4(Box5, { flexDirection: "column", children: [
|
|
2338
|
+
message && /* @__PURE__ */ jsx5(Text5, { color: "green", children: message }),
|
|
2339
|
+
/* @__PURE__ */ jsx5(
|
|
2378
2340
|
SimpleSelect,
|
|
2379
2341
|
{
|
|
2380
2342
|
message: "Select integrations to install:",
|
|
@@ -2398,8 +2360,8 @@ var init_InstallWizard = __esm({
|
|
|
2398
2360
|
|
|
2399
2361
|
// src/mcp/ui/InstallView.tsx
|
|
2400
2362
|
import "react";
|
|
2401
|
-
import { Box as
|
|
2402
|
-
import { jsx as
|
|
2363
|
+
import { Box as Box6, Text as Text6 } from "ink";
|
|
2364
|
+
import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
2403
2365
|
var InstallView;
|
|
2404
2366
|
var init_InstallView = __esm({
|
|
2405
2367
|
"src/mcp/ui/InstallView.tsx"() {
|
|
@@ -2408,10 +2370,10 @@ var init_InstallView = __esm({
|
|
|
2408
2370
|
init_paths();
|
|
2409
2371
|
InstallView = () => {
|
|
2410
2372
|
const workspacePath = detectWorkspaceRoot();
|
|
2411
|
-
return /* @__PURE__ */
|
|
2412
|
-
/* @__PURE__ */
|
|
2413
|
-
/* @__PURE__ */
|
|
2414
|
-
/* @__PURE__ */
|
|
2373
|
+
return /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", padding: 1, borderStyle: "round", borderColor: "magenta", children: [
|
|
2374
|
+
/* @__PURE__ */ jsx6(Text6, { bold: true, color: "magenta", children: " Installation & Configuration " }),
|
|
2375
|
+
/* @__PURE__ */ jsx6(Text6, { color: "dim", children: " Configure IDE integrations for VSCode, Claude, and Antigravity." }),
|
|
2376
|
+
/* @__PURE__ */ jsx6(Box6, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx6(
|
|
2415
2377
|
InstallWizard,
|
|
2416
2378
|
{
|
|
2417
2379
|
workspacePath,
|
|
@@ -2428,8 +2390,8 @@ var init_InstallView = __esm({
|
|
|
2428
2390
|
|
|
2429
2391
|
// src/mcp/ui/LogViewer.tsx
|
|
2430
2392
|
import "react";
|
|
2431
|
-
import { Box as
|
|
2432
|
-
import { jsx as
|
|
2393
|
+
import { Box as Box7, Text as Text7 } from "ink";
|
|
2394
|
+
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
2433
2395
|
var LogViewer;
|
|
2434
2396
|
var init_LogViewer = __esm({
|
|
2435
2397
|
"src/mcp/ui/LogViewer.tsx"() {
|
|
@@ -2439,20 +2401,48 @@ var init_LogViewer = __esm({
|
|
|
2439
2401
|
const emptyLines = Math.max(0, height - visibleLogs.length);
|
|
2440
2402
|
const padding = Array(emptyLines).fill("");
|
|
2441
2403
|
const formatLog = (log) => {
|
|
2442
|
-
if (log.includes("[ERROR]")) return /* @__PURE__ */
|
|
2443
|
-
if (log.includes("[WARN]")) return /* @__PURE__ */
|
|
2444
|
-
if (log.includes("[INFO]")) return /* @__PURE__ */
|
|
2445
|
-
if (log.includes("Success")) return /* @__PURE__ */
|
|
2446
|
-
return /* @__PURE__ */
|
|
2404
|
+
if (log.includes("[ERROR]")) return /* @__PURE__ */ jsx7(Text7, { color: "red", children: log });
|
|
2405
|
+
if (log.includes("[WARN]")) return /* @__PURE__ */ jsx7(Text7, { color: "yellow", children: log });
|
|
2406
|
+
if (log.includes("[INFO]")) return /* @__PURE__ */ jsx7(Text7, { color: "green", children: log });
|
|
2407
|
+
if (log.includes("Success")) return /* @__PURE__ */ jsx7(Text7, { color: "green", children: log });
|
|
2408
|
+
return /* @__PURE__ */ jsx7(Text7, { children: log });
|
|
2447
2409
|
};
|
|
2448
|
-
return /* @__PURE__ */
|
|
2449
|
-
padding.map((_, i) => /* @__PURE__ */
|
|
2450
|
-
visibleLogs.map((log, i) => /* @__PURE__ */
|
|
2410
|
+
return /* @__PURE__ */ jsxs6(Box7, { flexDirection: "column", borderStyle: "round", borderColor: "dim", paddingX: 1, height: height + 2, flexGrow: 1, children: [
|
|
2411
|
+
padding.map((_, i) => /* @__PURE__ */ jsx7(Text7, { children: " " }, `empty-${i}`)),
|
|
2412
|
+
visibleLogs.map((log, i) => /* @__PURE__ */ jsx7(Box7, { children: formatLog(log) }, `log-${i}`))
|
|
2451
2413
|
] });
|
|
2452
2414
|
};
|
|
2453
2415
|
}
|
|
2454
2416
|
});
|
|
2455
2417
|
|
|
2418
|
+
// src/mcp/ui/StatusBoard.tsx
|
|
2419
|
+
import "react";
|
|
2420
|
+
import { Box as Box8, Text as Text8 } from "ink";
|
|
2421
|
+
import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2422
|
+
var StatusBoard;
|
|
2423
|
+
var init_StatusBoard = __esm({
|
|
2424
|
+
"src/mcp/ui/StatusBoard.tsx"() {
|
|
2425
|
+
"use strict";
|
|
2426
|
+
StatusBoard = ({ exposedLabel, port, pid, running }) => {
|
|
2427
|
+
return /* @__PURE__ */ jsx8(Box8, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: /* @__PURE__ */ jsxs7(Text8, { children: [
|
|
2428
|
+
running ? /* @__PURE__ */ jsx8(Text8, { color: "green", children: "\u25CF RUNNING" }) : /* @__PURE__ */ jsx8(Text8, { color: "red", children: "\u25CF STOPPED" }),
|
|
2429
|
+
" ",
|
|
2430
|
+
"\u2502",
|
|
2431
|
+
" \u{1F4CB} ",
|
|
2432
|
+
/* @__PURE__ */ jsx8(Text8, { color: "yellow", children: exposedLabel }),
|
|
2433
|
+
" ",
|
|
2434
|
+
"\u2502",
|
|
2435
|
+
" Port: ",
|
|
2436
|
+
/* @__PURE__ */ jsx8(Text8, { color: "green", children: port }),
|
|
2437
|
+
" ",
|
|
2438
|
+
"\u2502",
|
|
2439
|
+
" PID: ",
|
|
2440
|
+
/* @__PURE__ */ jsx8(Text8, { color: "green", children: pid })
|
|
2441
|
+
] }) });
|
|
2442
|
+
};
|
|
2443
|
+
}
|
|
2444
|
+
});
|
|
2445
|
+
|
|
2456
2446
|
// src/mcp/ui/components/TabBar.tsx
|
|
2457
2447
|
import "react";
|
|
2458
2448
|
import { Box as Box9, Text as Text9, useInput as useInput2 } from "ink";
|
|
@@ -2465,17 +2455,22 @@ var init_TabBar = __esm({
|
|
|
2465
2455
|
useInput2((input, key) => {
|
|
2466
2456
|
if (key.leftArrow) {
|
|
2467
2457
|
const index = tabs.findIndex((t) => t.id === activeTab);
|
|
2468
|
-
|
|
2469
|
-
|
|
2458
|
+
if (index !== -1) {
|
|
2459
|
+
const nextIndex = (index - 1 + tabs.length) % tabs.length;
|
|
2460
|
+
onChange(tabs[nextIndex]?.id || tabs[0].id);
|
|
2461
|
+
}
|
|
2470
2462
|
}
|
|
2471
2463
|
if (key.rightArrow) {
|
|
2472
2464
|
const index = tabs.findIndex((t) => t.id === activeTab);
|
|
2473
|
-
|
|
2474
|
-
|
|
2465
|
+
if (index !== -1) {
|
|
2466
|
+
const nextIndex = (index + 1) % tabs.length;
|
|
2467
|
+
onChange(tabs[nextIndex]?.id || tabs[0].id);
|
|
2468
|
+
}
|
|
2475
2469
|
}
|
|
2476
2470
|
const num = parseInt(input);
|
|
2477
2471
|
if (!isNaN(num) && num > 0 && num <= tabs.length) {
|
|
2478
|
-
|
|
2472
|
+
const tab = tabs[num - 1];
|
|
2473
|
+
if (tab) onChange(tab.id);
|
|
2479
2474
|
}
|
|
2480
2475
|
});
|
|
2481
2476
|
return /* @__PURE__ */ jsxs8(Box9, { borderStyle: "single", paddingX: 1, borderColor: "gray", children: [
|
|
@@ -2484,7 +2479,7 @@ var init_TabBar = __esm({
|
|
|
2484
2479
|
return /* @__PURE__ */ jsx9(Box9, { marginRight: 2, children: /* @__PURE__ */ jsx9(
|
|
2485
2480
|
Text9,
|
|
2486
2481
|
{
|
|
2487
|
-
color: isActive ? "cyan" : "
|
|
2482
|
+
color: isActive ? "cyan" : "white",
|
|
2488
2483
|
bold: isActive,
|
|
2489
2484
|
backgroundColor: isActive ? "black" : void 0,
|
|
2490
2485
|
children: isActive ? `[ ${tab.label} ]` : ` ${tab.label} `
|
|
@@ -2515,6 +2510,7 @@ var init_App = __esm({
|
|
|
2515
2510
|
init_ProjectsView();
|
|
2516
2511
|
init_InstallView();
|
|
2517
2512
|
init_LogViewer();
|
|
2513
|
+
init_StatusBoard();
|
|
2518
2514
|
init_TabBar();
|
|
2519
2515
|
init_config();
|
|
2520
2516
|
init_detection();
|
|
@@ -2524,19 +2520,20 @@ var init_App = __esm({
|
|
|
2524
2520
|
init_paths();
|
|
2525
2521
|
TABS = [
|
|
2526
2522
|
{ id: "overview", label: "Overview" },
|
|
2523
|
+
{ id: "logs", label: "Logs" },
|
|
2527
2524
|
{ id: "projects", label: "Projects" },
|
|
2528
|
-
{ id: "install", label: "Install" }
|
|
2529
|
-
{ id: "logs", label: "Logs" }
|
|
2525
|
+
{ id: "install", label: "Install" }
|
|
2530
2526
|
];
|
|
2531
2527
|
App = ({ onExit, initialPort }) => {
|
|
2532
2528
|
const { exit } = useApp();
|
|
2533
|
-
const [activeTab, setActiveTab] = useState4("
|
|
2529
|
+
const [activeTab, setActiveTab] = useState4("logs");
|
|
2534
2530
|
const [logs, setLogs] = useState4([]);
|
|
2535
2531
|
const [serverInfo, setServerInfo] = useState4({
|
|
2536
2532
|
port: initialPort,
|
|
2537
2533
|
pid: process.pid,
|
|
2538
2534
|
running: false
|
|
2539
2535
|
});
|
|
2536
|
+
const [configVersion, setConfigVersion] = useState4(0);
|
|
2540
2537
|
const config = loadMCPConfig();
|
|
2541
2538
|
const projects = scanForProjects();
|
|
2542
2539
|
const exposedProjects = projects.filter((p) => {
|
|
@@ -2605,6 +2602,9 @@ var init_App = __esm({
|
|
|
2605
2602
|
});
|
|
2606
2603
|
const termHeight = process.stdout.rows || 24;
|
|
2607
2604
|
const contentHeight = termHeight - 8;
|
|
2605
|
+
const handleConfigChange = () => {
|
|
2606
|
+
setConfigVersion((prev) => prev + 1);
|
|
2607
|
+
};
|
|
2608
2608
|
return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", padding: 0, height: termHeight, children: [
|
|
2609
2609
|
/* @__PURE__ */ jsx10(TabBar, { tabs: TABS, activeTab, onChange: setActiveTab }),
|
|
2610
2610
|
/* @__PURE__ */ jsxs9(Box10, { marginTop: 1, flexGrow: 1, children: [
|
|
@@ -2619,10 +2619,19 @@ var init_App = __esm({
|
|
|
2619
2619
|
}
|
|
2620
2620
|
}
|
|
2621
2621
|
),
|
|
2622
|
-
activeTab === "projects" && /* @__PURE__ */ jsx10(ProjectsView, {}),
|
|
2622
|
+
activeTab === "projects" && /* @__PURE__ */ jsx10(ProjectsView, { onConfigChange: handleConfigChange }),
|
|
2623
2623
|
activeTab === "install" && /* @__PURE__ */ jsx10(InstallView, {}),
|
|
2624
2624
|
activeTab === "logs" && /* @__PURE__ */ jsx10(LogViewer, { logs, height: contentHeight })
|
|
2625
|
-
] })
|
|
2625
|
+
] }),
|
|
2626
|
+
/* @__PURE__ */ jsx10(Box10, { marginTop: 0, children: /* @__PURE__ */ jsx10(
|
|
2627
|
+
StatusBoard,
|
|
2628
|
+
{
|
|
2629
|
+
exposedLabel: `${exposedProjects.length} / ${projects.length} projects`,
|
|
2630
|
+
port: serverInfo.port,
|
|
2631
|
+
pid: serverInfo.pid,
|
|
2632
|
+
running: serverInfo.running
|
|
2633
|
+
}
|
|
2634
|
+
) })
|
|
2626
2635
|
] });
|
|
2627
2636
|
};
|
|
2628
2637
|
}
|