nomoreide 0.1.72 → 0.1.74
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/README.md +48 -0
- package/dist/cli/agents.d.ts +2 -0
- package/dist/cli/agents.js +43 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/commands.d.ts +3 -1
- package/dist/cli/commands.js +21 -14
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/daemon.d.ts +15 -0
- package/dist/cli/daemon.js +139 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/profile.d.ts +2 -0
- package/dist/cli/profile.js +167 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/core/agent-env-actions.d.ts +4 -4
- package/dist/core/agent-profiles/registry-config.d.ts +1 -1
- package/dist/core/agent-profiles/registry-config.js +4 -1
- package/dist/core/agent-profiles/registry-config.js.map +1 -1
- package/dist/core/agent-terminal.d.ts +6 -0
- package/dist/core/agent-terminal.js +16 -0
- package/dist/core/agent-terminal.js.map +1 -0
- package/dist/core/app-version.d.ts +2 -0
- package/dist/core/app-version.js +16 -0
- package/dist/core/app-version.js.map +1 -0
- package/dist/core/config-store.js +1 -0
- package/dist/core/config-store.js.map +1 -1
- package/dist/core/daemon-client.d.ts +66 -0
- package/dist/core/daemon-client.js +121 -0
- package/dist/core/daemon-client.js.map +1 -0
- package/dist/core/daemon-lifecycle.d.ts +59 -0
- package/dist/core/daemon-lifecycle.js +147 -0
- package/dist/core/daemon-lifecycle.js.map +1 -0
- package/dist/core/db-peek.d.ts +4 -0
- package/dist/core/db-peek.js +2 -0
- package/dist/core/db-peek.js.map +1 -1
- package/dist/core/repo-onboard.d.ts +8 -8
- package/dist/core/service-health.js +6 -1
- package/dist/core/service-health.js.map +1 -1
- package/dist/core/service-registry.d.ts +5 -3
- package/dist/core/service-registry.js +8 -5
- package/dist/core/service-registry.js.map +1 -1
- package/dist/core/terminal-manager.d.ts +3 -0
- package/dist/core/terminal-manager.js +2 -0
- package/dist/core/terminal-manager.js.map +1 -1
- package/dist/core/terminal-session.d.ts +7 -0
- package/dist/core/terminal-session.js +6 -0
- package/dist/core/terminal-session.js.map +1 -1
- package/dist/core/types.d.ts +6 -0
- package/dist/core/workflows.d.ts +7 -19
- package/dist/core/workflows.js +9 -21
- package/dist/core/workflows.js.map +1 -1
- package/dist/index.js +22 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +11 -7
- package/dist/mcp/server.js +15 -34
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/agent.js +15 -5
- package/dist/mcp/tools/agent.js.map +1 -1
- package/dist/mcp/tools/context.d.ts +6 -8
- package/dist/mcp/tools/context.js.map +1 -1
- package/dist/mcp/tools/database.js +13 -17
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/services.d.ts +5 -0
- package/dist/mcp/tools/services.js +31 -21
- package/dist/mcp/tools/services.js.map +1 -1
- package/dist/tui/app.d.ts +4 -2
- package/dist/tui/app.js +19 -16
- package/dist/tui/app.js.map +1 -1
- package/dist/web/client/assets/{code-editor-fZ2dpXfw.js → code-editor-GK07_DNL.js} +1 -1
- package/dist/web/client/assets/index-C8kH2Crm.css +1 -0
- package/dist/web/client/assets/index-D7ZrdlUm.js +219 -0
- package/dist/web/client/index.html +2 -2
- package/dist/web/routes/agent-chat-routes.d.ts +1 -1
- package/dist/web/routes/agent-chat-routes.js +3 -4
- package/dist/web/routes/agent-chat-routes.js.map +1 -1
- package/dist/web/routes/context.d.ts +6 -0
- package/dist/web/routes/context.js.map +1 -1
- package/dist/web/routes/dashboard-routes.js +27 -1
- package/dist/web/routes/dashboard-routes.js.map +1 -1
- package/dist/web/routes/database-routes.js +3 -0
- package/dist/web/routes/database-routes.js.map +1 -1
- package/dist/web/routes/shell-routes.js +1 -0
- package/dist/web/routes/shell-routes.js.map +1 -1
- package/dist/web/routes/terminal-routes.js +33 -0
- package/dist/web/routes/terminal-routes.js.map +1 -1
- package/dist/web/routes/workflow-routes.d.ts +2 -2
- package/dist/web/routes/workflow-routes.js +2 -2
- package/dist/web/server.d.ts +2 -0
- package/dist/web/server.js +2 -1
- package/dist/web/server.js.map +1 -1
- package/package.json +2 -1
- package/dist/web/client/assets/index-CraqLFuO.js +0 -222
- package/dist/web/client/assets/index-n7aEcfkd.css +0 -1
- package/dist/web/ui-lifecycle.d.ts +0 -30
- package/dist/web/ui-lifecycle.js +0 -129
- package/dist/web/ui-lifecycle.js.map +0 -1
package/dist/mcp/server.js
CHANGED
|
@@ -2,34 +2,26 @@ import { dirname, resolve } from "node:path";
|
|
|
2
2
|
import { FastMCP } from "fastmcp";
|
|
3
3
|
import { AgentSessionStore, createAgentSessionTracker, } from "../core/agent-sessions.js";
|
|
4
4
|
import { ConfigStore, defaultGlobalConfigPath } from "../core/config-store.js";
|
|
5
|
+
import { createDaemonConnection, } from "../core/daemon-client.js";
|
|
5
6
|
import { DbPeek } from "../core/db-peek.js";
|
|
6
7
|
import { ErrorInbox } from "../core/error-inbox.js";
|
|
7
8
|
import { LogStore } from "../core/log-store.js";
|
|
8
|
-
import { ProcessManager } from "../core/process-manager.js";
|
|
9
|
-
import { defaultRuntimeRegistryPath, ServiceRegistry, } from "../core/service-registry.js";
|
|
10
|
-
import { TimelineStore } from "../core/timeline-store.js";
|
|
11
9
|
import { ToolCallStore } from "../core/tool-call-store.js";
|
|
12
|
-
import { createUiLifecycleManager, } from "../web/ui-lifecycle.js";
|
|
13
10
|
import { NOMOREIDE_TOOL_NAMES, registerNoMoreIdeTools, } from "./tools/index.js";
|
|
14
11
|
export { NOMOREIDE_TOOL_NAMES } from "./tools/index.js";
|
|
12
|
+
/**
|
|
13
|
+
* The MCP process is a thin client: service operations go to the shared
|
|
14
|
+
* daemon over HTTP; config, git, db, and agent tooling stay local because
|
|
15
|
+
* they work on global config and files rather than running processes.
|
|
16
|
+
*/
|
|
15
17
|
export function createNoMoreIdeMcpServer(options = {}) {
|
|
16
18
|
const configPath = options.configPath ?? defaultGlobalConfigPath();
|
|
17
19
|
const logDir = options.logDir ?? resolve(process.cwd(), ".nomoreide/logs");
|
|
18
20
|
const configStore = new ConfigStore(configPath);
|
|
19
|
-
const timelineStore = new TimelineStore({
|
|
20
|
-
baseDir: dirname(resolve(logDir)),
|
|
21
|
-
});
|
|
22
21
|
const logStore = new LogStore({
|
|
23
22
|
baseDir: logDir,
|
|
24
|
-
timelineStore,
|
|
25
|
-
});
|
|
26
|
-
const registry = new ServiceRegistry(defaultRuntimeRegistryPath(logDir));
|
|
27
|
-
const manager = new ProcessManager({
|
|
28
|
-
configStore,
|
|
29
|
-
logStore,
|
|
30
|
-
timelineStore,
|
|
31
|
-
registry,
|
|
32
23
|
});
|
|
24
|
+
const daemon = options.daemon ?? createDaemonConnection({ port: options.daemonPort });
|
|
33
25
|
const errorInbox = new ErrorInbox({ logStore, configStore });
|
|
34
26
|
const dbPeek = new DbPeek({ configStore });
|
|
35
27
|
const toolCallStore = new ToolCallStore();
|
|
@@ -37,13 +29,6 @@ export function createNoMoreIdeMcpServer(options = {}) {
|
|
|
37
29
|
store: new AgentSessionStore(resolve(dirname(resolve(logDir)), "agent-sessions.json")),
|
|
38
30
|
configStore,
|
|
39
31
|
});
|
|
40
|
-
const uiLifecycle = options.uiLifecycle ??
|
|
41
|
-
createUiLifecycleManager({
|
|
42
|
-
configPath,
|
|
43
|
-
logDir,
|
|
44
|
-
port: options.uiPort,
|
|
45
|
-
toolCallStore,
|
|
46
|
-
});
|
|
47
32
|
const server = new FastMCP({
|
|
48
33
|
name: "NoMoreIDE MCP",
|
|
49
34
|
version: "0.1.0",
|
|
@@ -51,22 +36,18 @@ export function createNoMoreIdeMcpServer(options = {}) {
|
|
|
51
36
|
registerNoMoreIdeTools({
|
|
52
37
|
server,
|
|
53
38
|
configStore,
|
|
39
|
+
daemon,
|
|
54
40
|
dbPeek,
|
|
55
41
|
errorInbox,
|
|
56
|
-
logStore,
|
|
57
|
-
manager,
|
|
58
|
-
timelineStore,
|
|
59
|
-
uiLifecycle,
|
|
60
42
|
toolCallStore,
|
|
61
43
|
agentSessions,
|
|
62
44
|
});
|
|
63
45
|
return {
|
|
64
46
|
server,
|
|
65
47
|
configStore,
|
|
48
|
+
daemon,
|
|
66
49
|
errorInbox,
|
|
67
50
|
logStore,
|
|
68
|
-
manager,
|
|
69
|
-
uiLifecycle,
|
|
70
51
|
toolCallStore,
|
|
71
52
|
toolNames: NOMOREIDE_TOOL_NAMES,
|
|
72
53
|
};
|
|
@@ -74,16 +55,16 @@ export function createNoMoreIdeMcpServer(options = {}) {
|
|
|
74
55
|
export async function startNoMoreIdeMcpServer(options = {}) {
|
|
75
56
|
const env = options.env ?? process.env;
|
|
76
57
|
const created = options.createServer?.() ?? createNoMoreIdeMcpServer();
|
|
77
|
-
const { server,
|
|
78
|
-
if ("manager" in created) {
|
|
79
|
-
created.manager.installShutdownHandlers();
|
|
80
|
-
}
|
|
58
|
+
const { server, daemon } = created;
|
|
81
59
|
if (env.NOMOREIDE_AUTO_UI !== "0") {
|
|
82
60
|
try {
|
|
83
|
-
await
|
|
61
|
+
const result = await daemon.ensure();
|
|
62
|
+
if (result.versionWarning) {
|
|
63
|
+
process.stderr.write(`nomoreide: ${result.versionWarning}\n`);
|
|
64
|
+
}
|
|
84
65
|
}
|
|
85
66
|
catch (error) {
|
|
86
|
-
process.stderr.write(`nomoreide:
|
|
67
|
+
process.stderr.write(`nomoreide: daemon auto-start failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
87
68
|
}
|
|
88
69
|
}
|
|
89
70
|
await server.start({ transportType: "stdio" });
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EACL,sBAAsB,GAEvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAyBxD;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAA2C,EAAE;IAE7C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,uBAAuB,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,WAAW,CACjC,UAAU,CACX,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAG,yBAAyB,CAAC;QAC9C,KAAK,EAAE,IAAI,iBAAiB,CAC1B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CACzD;QACD,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;QACzB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IACH,sBAAsB,CAAC;QACrB,MAAM;QACN,WAAW;QACX,MAAM;QACN,MAAM;QACN,UAAU;QACV,aAAa;QACb,aAAa;KACd,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,WAAW;QACX,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,SAAS,EAAE,oBAAoB;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAA0C,EAAE;IAE5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,wBAAwB,EAAE,CAAC;IACvE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACnC,IAAI,GAAG,CAAC,iBAAiB,KAAK,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCACE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,IAAI,CACL,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/mcp/tools/agent.js
CHANGED
|
@@ -4,16 +4,26 @@ export const AGENT_TOOL_NAMES = [
|
|
|
4
4
|
"nomoreide_close_ui",
|
|
5
5
|
];
|
|
6
6
|
export function registerAgentTools(server, ctx) {
|
|
7
|
-
const {
|
|
7
|
+
const { daemon } = ctx;
|
|
8
8
|
server.addTool({
|
|
9
9
|
name: "nomoreide_open_ui",
|
|
10
|
-
description: "Open or reuse the
|
|
11
|
-
execute: async () => stringify(await
|
|
10
|
+
description: "Open (or reuse) the machine-global NoMoreIDE daemon and return its web UI URL.",
|
|
11
|
+
execute: async () => stringify(await daemon.ensure()),
|
|
12
12
|
});
|
|
13
13
|
server.addTool({
|
|
14
14
|
name: "nomoreide_close_ui",
|
|
15
|
-
description: "
|
|
16
|
-
execute: async () =>
|
|
15
|
+
description: "Shut down the NoMoreIDE daemon. WARNING: this stops every service it manages, for all sessions on this machine.",
|
|
16
|
+
execute: async () => {
|
|
17
|
+
const client = await daemon.existing();
|
|
18
|
+
if (!client) {
|
|
19
|
+
return stringify({ status: "not_running" });
|
|
20
|
+
}
|
|
21
|
+
await client.shutdown();
|
|
22
|
+
return stringify({
|
|
23
|
+
status: "stopping",
|
|
24
|
+
note: "Daemon is stopping all managed services and exiting.",
|
|
25
|
+
});
|
|
26
|
+
},
|
|
17
27
|
});
|
|
18
28
|
}
|
|
19
29
|
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/mcp/tools/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mBAAmB;IACnB,oBAAoB;CACZ,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,GAAgB;IAClE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/mcp/tools/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mBAAmB;IACnB,oBAAoB;CACZ,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,GAAgB;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,gFAAgF;QAClF,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;KACtD,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,iHAAiH;QACnH,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YAC9C,CAAC;YACD,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;gBACf,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,sDAAsD;aAC7D,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
import type { FastMCP } from "fastmcp";
|
|
2
2
|
import type { AgentSessionTracker } from "../../core/agent-sessions.js";
|
|
3
3
|
import type { ConfigStore } from "../../core/config-store.js";
|
|
4
|
+
import type { DaemonConnection } from "../../core/daemon-client.js";
|
|
4
5
|
import type { DbPeek } from "../../core/db-peek.js";
|
|
5
6
|
import type { ErrorInbox } from "../../core/error-inbox.js";
|
|
6
7
|
import { GitActions } from "../../core/git-actions.js";
|
|
7
8
|
import { GitManager } from "../../core/git-manager.js";
|
|
8
|
-
import type { LogStore } from "../../core/log-store.js";
|
|
9
|
-
import type { ProcessManager } from "../../core/process-manager.js";
|
|
10
|
-
import type { TimelineStore } from "../../core/timeline-store.js";
|
|
11
9
|
import { type ToolCallStore } from "../../core/tool-call-store.js";
|
|
12
|
-
import type { UiLifecycleManager } from "../../web/ui-lifecycle.js";
|
|
13
10
|
/** Shared stateful services every tool group receives. */
|
|
14
11
|
export interface ToolContext {
|
|
15
12
|
configStore: ConfigStore;
|
|
13
|
+
/**
|
|
14
|
+
* Handle to the machine-global daemon that owns all spawned services.
|
|
15
|
+
* Service tools go through it over HTTP; config/git/db tools stay local.
|
|
16
|
+
*/
|
|
17
|
+
daemon: DaemonConnection;
|
|
16
18
|
dbPeek: DbPeek;
|
|
17
19
|
errorInbox: ErrorInbox;
|
|
18
|
-
logStore: LogStore;
|
|
19
|
-
manager: ProcessManager;
|
|
20
|
-
timelineStore: TimelineStore;
|
|
21
|
-
uiLifecycle: UiLifecycleManager;
|
|
22
20
|
}
|
|
23
21
|
/** Each domain registers its tools onto the (optionally recording) server. */
|
|
24
22
|
export type RegisterTools = (server: FastMCP, ctx: ToolContext) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/mcp/tools/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/mcp/tools/context.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAsB,MAAM,+BAA+B,CAAC;AAiBhF,MAAM,UAAU,GAAG,CAAC,GAAY;IAC9B,OAAO,IAAI,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,IAAI,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAe,EACf,KAAoB,EACpB,QAA8B;IAE9B,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,UAA6C,EAAE,EAAE;QAChE,MAAM,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC;QAC3C,MAAM,mBAAmB,GAAG;YAC1B,GAAG,UAAU;YACb,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,OAAgB,EAAE,EAAE;gBACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAO,eAGA,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBACtC,KAAK,CAAC,MAAM,CAAC;wBACX,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,SAAS;wBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC9B,MAAM,EAAE,IAAI;wBACZ,SAAS;wBACT,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;qBACxB,CAAC,CAAC;oBACH,OAAO,MAA4C,CAAC;gBACtD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,KAAK,CAAC,MAAM,CAAC;wBACX,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,SAAS;wBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC9B,MAAM,EAAE,OAAO;wBACf,SAAS;wBACT,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;wBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D,CAAC,CAAC;oBACH,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;SACmC,CAAC;QACvC,OAAO,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACvB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC;YACvC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -3,28 +3,24 @@ import { isReadStatement } from "../../core/db/driver.js";
|
|
|
3
3
|
import { stringify } from "./context.js";
|
|
4
4
|
/**
|
|
5
5
|
* Returned to the agent when a write hits the read-only query path. This is the
|
|
6
|
-
* contextual teach for the
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* parses that block into an "Open in SQL console" button (see the web client's
|
|
10
|
-
* `chat/message-options.tsx`); the write still goes through the human-only
|
|
11
|
-
* console with its unlock + affected-rows preview.
|
|
6
|
+
* contextual teach for the raw-terminal workflow. It costs nothing until the
|
|
7
|
+
* agent actually tries to change data and keeps execution in the human-only,
|
|
8
|
+
* locked SQL console with its affected-rows preview.
|
|
12
9
|
*/
|
|
13
10
|
function writeStagingGuidance(connection) {
|
|
14
11
|
return [
|
|
15
12
|
"This connection is read-only, so that statement was NOT executed.",
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
"`sql-write` followed by the connection name:",
|
|
13
|
+
"Provide the exact SQL statement for the user to review in a standard SQL",
|
|
14
|
+
`fenced block, and identify the target connection as \`${connection}\`:`,
|
|
19
15
|
"",
|
|
20
|
-
"```sql
|
|
16
|
+
"```sql",
|
|
21
17
|
"UPDATE … SET … WHERE …;",
|
|
22
18
|
"```",
|
|
23
19
|
"",
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
20
|
+
"Direct the user to stage and run it through NoMoreIDE's locked SQL console,",
|
|
21
|
+
"where they explicitly unlock writes and review an affected-rows preview",
|
|
22
|
+
"before committing. Emit exactly one statement, and always scope",
|
|
23
|
+
"UPDATE/DELETE with a WHERE clause.",
|
|
28
24
|
].join("\n");
|
|
29
25
|
}
|
|
30
26
|
export const DATABASE_TOOL_NAMES = [
|
|
@@ -94,9 +90,9 @@ export function registerDatabaseTools(server, ctx) {
|
|
|
94
90
|
name: "nomoreide_db_query",
|
|
95
91
|
description: "Run a read-only SQL query against a registered connection and return the rows. " +
|
|
96
92
|
"Read-only at the transaction level — INSERT/UPDATE/DELETE/DDL are rejected. To " +
|
|
97
|
-
"make a change, don't run it here
|
|
98
|
-
"
|
|
99
|
-
"
|
|
93
|
+
"make a change, don't run it here. Provide the exact SQL statement for review, " +
|
|
94
|
+
"identify the connection, and direct the user to stage and run it through " +
|
|
95
|
+
"NoMoreIDE's locked SQL console with its affected-rows preview.",
|
|
100
96
|
parameters: querySchema,
|
|
101
97
|
execute: async ({ connection, sql, limit }) => {
|
|
102
98
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAE3D
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAE3D;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,OAAO;QACL,mEAAmE;QACnE,0EAA0E;QAC1E,yDAAyD,UAAU,KAAK;QACxE,EAAE;QACF,QAAQ;QACR,yBAAyB;QACzB,KAAK;QACL,EAAE;QACF,6EAA6E;QAC7E,yEAAyE;QACzE,iEAAiE;QACjE,oCAAoC;KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,0BAA0B;IAC1B,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;CACZ,CAAC;AAEX,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,gDAAgD,CAAC;CAC9D,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,oEAAoE,CAAC;IACjF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,sEAAsE,CAAC;IACnF,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;CACjD,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAe,EAAE,GAAgB;IACrE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAEvB,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,0BAA0B;QAChC,WAAW,EACT,mGAAmG;QACrG,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;KAC/D,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,gEAAgE;QAC7E,UAAU,EAAE,gBAAgB;QAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAChC,SAAS,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;KACjD,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,6GAA6G;QAC/G,UAAU,EAAE,YAAY;QACxB,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAC9C,SAAS,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC;KACtE,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EACT,iFAAiF;YACjF,iFAAiF;YACjF,gFAAgF;YAChF,2EAA2E;YAC3E,gEAAgE;QAClE,UAAU,EAAE,WAAW;QACvB,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;YAC5C,IAAI,CAAC;gBACH,OAAO,SAAS,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC1E,yEAAyE;gBACzE,gEAAgE;gBAChE,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC7D,OAAO,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBAC1C,CAAC;gBACD,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { FastMCP } from "fastmcp";
|
|
2
2
|
import { type ToolContext } from "./context.js";
|
|
3
3
|
export declare const SERVICE_TOOL_NAMES: readonly ["nomoreide_list_services", "nomoreide_register_service", "nomoreide_start_service", "nomoreide_stop_service", "nomoreide_restart_service", "nomoreide_read_logs", "nomoreide_register_bundle", "nomoreide_start_bundle", "nomoreide_stop_bundle", "nomoreide_status", "nomoreide_service_context", "nomoreide_service_health", "nomoreide_timeline"];
|
|
4
|
+
/**
|
|
5
|
+
* Runtime tools (start/stop/logs/status/…) call the machine-global daemon
|
|
6
|
+
* over HTTP so every session shares the same services; registration tools
|
|
7
|
+
* write config locally — the daemon re-reads it from disk on every operation.
|
|
8
|
+
*/
|
|
4
9
|
export declare function registerServiceTools(server: FastMCP, ctx: ToolContext): void;
|
|
@@ -23,8 +23,13 @@ const serviceNameSchema = z.object({
|
|
|
23
23
|
const bundleNameSchema = z.object({
|
|
24
24
|
name: z.string().min(1).describe("Registered bundle name."),
|
|
25
25
|
});
|
|
26
|
+
/**
|
|
27
|
+
* Runtime tools (start/stop/logs/status/…) call the machine-global daemon
|
|
28
|
+
* over HTTP so every session shares the same services; registration tools
|
|
29
|
+
* write config locally — the daemon re-reads it from disk on every operation.
|
|
30
|
+
*/
|
|
26
31
|
export function registerServiceTools(server, ctx) {
|
|
27
|
-
const { configStore,
|
|
32
|
+
const { configStore, daemon } = ctx;
|
|
28
33
|
server.addTool({
|
|
29
34
|
name: "nomoreide_list_services",
|
|
30
35
|
description: "List registered NoMoreIDE services and bundles.",
|
|
@@ -49,30 +54,30 @@ export function registerServiceTools(server, ctx) {
|
|
|
49
54
|
});
|
|
50
55
|
server.addTool({
|
|
51
56
|
name: "nomoreide_start_service",
|
|
52
|
-
description: "Start a registered service.",
|
|
57
|
+
description: "Start a registered service (runs in the shared daemon, so it survives this session).",
|
|
53
58
|
parameters: serviceNameSchema,
|
|
54
|
-
execute: async ({ name }) => stringify(await
|
|
59
|
+
execute: async ({ name }) => stringify(await (await daemon.client()).startService(name)),
|
|
55
60
|
});
|
|
56
61
|
server.addTool({
|
|
57
62
|
name: "nomoreide_stop_service",
|
|
58
63
|
description: "Stop a running NoMoreIDE service.",
|
|
59
64
|
parameters: serviceNameSchema,
|
|
60
|
-
execute: async ({ name }) => stringify(await
|
|
65
|
+
execute: async ({ name }) => stringify(await (await daemon.client()).stopService(name)),
|
|
61
66
|
});
|
|
62
67
|
server.addTool({
|
|
63
68
|
name: "nomoreide_restart_service",
|
|
64
69
|
description: "Restart a registered service.",
|
|
65
70
|
parameters: serviceNameSchema,
|
|
66
|
-
execute: async ({ name }) => stringify(await
|
|
71
|
+
execute: async ({ name }) => stringify(await (await daemon.client()).restartService(name)),
|
|
67
72
|
});
|
|
68
73
|
server.addTool({
|
|
69
74
|
name: "nomoreide_read_logs",
|
|
70
|
-
description: "Read recent
|
|
75
|
+
description: "Read recent logs for a registered service (from the shared daemon, regardless of which session started it).",
|
|
71
76
|
parameters: z.object({
|
|
72
77
|
name: z.string().min(1),
|
|
73
78
|
limit: z.number().int().positive().max(1000).optional(),
|
|
74
79
|
}),
|
|
75
|
-
execute: async ({ name, limit }) => stringify(
|
|
80
|
+
execute: async ({ name, limit }) => stringify(await (await daemon.client()).logs(name, limit ?? 500)),
|
|
76
81
|
});
|
|
77
82
|
server.addTool({
|
|
78
83
|
name: "nomoreide_register_bundle",
|
|
@@ -87,18 +92,18 @@ export function registerServiceTools(server, ctx) {
|
|
|
87
92
|
name: "nomoreide_start_bundle",
|
|
88
93
|
description: "Start every service in a registered bundle.",
|
|
89
94
|
parameters: bundleNameSchema,
|
|
90
|
-
execute: async ({ name }) => stringify(await
|
|
95
|
+
execute: async ({ name }) => stringify(await (await daemon.client()).startBundle(name)),
|
|
91
96
|
});
|
|
92
97
|
server.addTool({
|
|
93
98
|
name: "nomoreide_stop_bundle",
|
|
94
99
|
description: "Stop every service in a registered bundle.",
|
|
95
100
|
parameters: bundleNameSchema,
|
|
96
|
-
execute: async ({ name }) => stringify(await
|
|
101
|
+
execute: async ({ name }) => stringify(await (await daemon.client()).stopBundle(name)),
|
|
97
102
|
});
|
|
98
103
|
server.addTool({
|
|
99
104
|
name: "nomoreide_status",
|
|
100
105
|
description: "Show current NoMoreIDE runtime status.",
|
|
101
|
-
execute: async () => stringify(
|
|
106
|
+
execute: async () => stringify(await (await daemon.client()).status()),
|
|
102
107
|
});
|
|
103
108
|
server.addTool({
|
|
104
109
|
name: "nomoreide_service_context",
|
|
@@ -110,12 +115,14 @@ export function registerServiceTools(server, ctx) {
|
|
|
110
115
|
if (!definition) {
|
|
111
116
|
throw new Error(`Service "${name}" is not registered.`);
|
|
112
117
|
}
|
|
113
|
-
const
|
|
118
|
+
const client = await daemon.client();
|
|
119
|
+
const [runtime, logs, timelineEvents] = await Promise.all([
|
|
120
|
+
client.status(),
|
|
121
|
+
client.logs(name, 80),
|
|
122
|
+
client.timeline(200),
|
|
123
|
+
]);
|
|
114
124
|
const status = runtime.services[name];
|
|
115
|
-
const
|
|
116
|
-
const timeline = timelineStore
|
|
117
|
-
.read(200)
|
|
118
|
-
.filter((event) => event.service === name);
|
|
125
|
+
const timeline = timelineEvents.filter((event) => event.service === name);
|
|
119
126
|
const health = computeServiceHealth({
|
|
120
127
|
service: definition,
|
|
121
128
|
status,
|
|
@@ -140,21 +147,24 @@ export function registerServiceTools(server, ctx) {
|
|
|
140
147
|
}),
|
|
141
148
|
execute: async ({ service }) => {
|
|
142
149
|
const config = await configStore.load();
|
|
143
|
-
const runtime = await manager.statusWithResources();
|
|
144
|
-
const timeline = timelineStore.read(200);
|
|
145
150
|
const definitions = service
|
|
146
151
|
? config.services.filter((item) => item.name === service)
|
|
147
152
|
: config.services;
|
|
148
153
|
if (service && definitions.length === 0) {
|
|
149
154
|
throw new Error(`Service "${service}" is not registered.`);
|
|
150
155
|
}
|
|
151
|
-
const
|
|
156
|
+
const client = await daemon.client();
|
|
157
|
+
const [runtime, timeline] = await Promise.all([
|
|
158
|
+
client.status(),
|
|
159
|
+
client.timeline(200),
|
|
160
|
+
]);
|
|
161
|
+
const health = await Promise.all(definitions.map(async (definition) => computeServiceHealth({
|
|
152
162
|
service: definition,
|
|
153
163
|
status: runtime.services[definition.name],
|
|
154
|
-
logs:
|
|
164
|
+
logs: await client.logs(definition.name, 80),
|
|
155
165
|
ports: [],
|
|
156
166
|
timeline: timeline.filter((event) => event.service === definition.name),
|
|
157
|
-
}));
|
|
167
|
+
})));
|
|
158
168
|
return stringify(service ? health[0] : health);
|
|
159
169
|
},
|
|
160
170
|
});
|
|
@@ -166,7 +176,7 @@ export function registerServiceTools(server, ctx) {
|
|
|
166
176
|
limit: z.number().int().positive().max(200).default(80),
|
|
167
177
|
}),
|
|
168
178
|
execute: async ({ service, limit }) => {
|
|
169
|
-
const events =
|
|
179
|
+
const events = await (await daemon.client()).timeline(200);
|
|
170
180
|
const filtered = service
|
|
171
181
|
? events.filter((event) => event.service === service)
|
|
172
182
|
: events;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/mcp/tools/services.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,yBAAyB;IACzB,4BAA4B;IAC5B,yBAAyB;IACzB,wBAAwB;IACxB,2BAA2B;IAC3B,qBAAqB;IACrB,2BAA2B;IAC3B,wBAAwB;IACxB,uBAAuB;IACvB,kBAAkB;IAClB,2BAA2B;IAC3B,0BAA0B;IAC1B,oBAAoB;CACZ,CAAC;AAEX,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CAC5D,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAClC,MAAe,EACf,GAAgB;IAEhB,MAAM,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/mcp/tools/services.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/app.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type DaemonConnection } from "../core/daemon-client.js";
|
|
2
|
+
import type { NoMoreIdeStatus } from "../core/process-manager.js";
|
|
2
3
|
import type { NoMoreIdeConfig, LogEntry } from "../core/types.js";
|
|
3
4
|
export type TuiMode = "services" | "bundles" | "logs";
|
|
4
5
|
export interface TuiScreenState {
|
|
@@ -11,7 +12,8 @@ export interface TuiScreenState {
|
|
|
11
12
|
}
|
|
12
13
|
export interface TuiAppOptions {
|
|
13
14
|
configPath?: string;
|
|
14
|
-
|
|
15
|
+
/** Injectable for tests; defaults to the machine-global daemon. */
|
|
16
|
+
daemon?: DaemonConnection;
|
|
15
17
|
}
|
|
16
18
|
export interface TuiApp {
|
|
17
19
|
start(): Promise<void>;
|
package/dist/tui/app.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import readline from "node:readline";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
2
|
import { ConfigStore, defaultGlobalConfigPath } from "../core/config-store.js";
|
|
4
|
-
import {
|
|
5
|
-
import { ProcessManager, } from "../core/process-manager.js";
|
|
3
|
+
import { createDaemonConnection, } from "../core/daemon-client.js";
|
|
6
4
|
export function createTuiApp(options = {}) {
|
|
7
5
|
const configStore = new ConfigStore(options.configPath ?? defaultGlobalConfigPath());
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const manager = new ProcessManager({ configStore, logStore });
|
|
6
|
+
// The TUI is a daemon client: services keep running after it quits and
|
|
7
|
+
// logs/status reflect every session's services, not just this one's.
|
|
8
|
+
const daemon = options.daemon ?? createDaemonConnection();
|
|
12
9
|
return {
|
|
13
10
|
async start() {
|
|
14
|
-
await runTui({ configStore,
|
|
11
|
+
await runTui({ configStore, daemon });
|
|
15
12
|
},
|
|
16
13
|
};
|
|
17
14
|
}
|
|
@@ -61,14 +58,19 @@ async function runTui(options) {
|
|
|
61
58
|
}
|
|
62
59
|
const render = async () => {
|
|
63
60
|
const config = await options.configStore.load();
|
|
61
|
+
const client = await options.daemon.client();
|
|
64
62
|
const currentService = selectedService ?? config.services[Math.max(0, selectedIndex)]?.name;
|
|
63
|
+
const [runtime, logs] = await Promise.all([
|
|
64
|
+
client.status(),
|
|
65
|
+
currentService ? client.logs(currentService) : Promise.resolve([]),
|
|
66
|
+
]);
|
|
65
67
|
const output = renderTuiScreen({
|
|
66
68
|
mode,
|
|
67
69
|
selectedIndex,
|
|
68
70
|
selectedService: currentService,
|
|
69
71
|
config,
|
|
70
|
-
runtime
|
|
71
|
-
logs
|
|
72
|
+
runtime,
|
|
73
|
+
logs,
|
|
72
74
|
});
|
|
73
75
|
process.stdout.write("\x1Bc");
|
|
74
76
|
process.stdout.write(output);
|
|
@@ -85,10 +87,11 @@ async function runTui(options) {
|
|
|
85
87
|
if (process.stdin.isTTY) {
|
|
86
88
|
process.stdin.setRawMode(false);
|
|
87
89
|
}
|
|
88
|
-
|
|
90
|
+
// Services belong to the daemon and keep running after the TUI exits.
|
|
89
91
|
resolve();
|
|
90
92
|
return;
|
|
91
93
|
}
|
|
94
|
+
const client = await options.daemon.client();
|
|
92
95
|
if (key.name === "up") {
|
|
93
96
|
selectedIndex = Math.max(0, selectedIndex - 1);
|
|
94
97
|
}
|
|
@@ -109,23 +112,23 @@ async function runTui(options) {
|
|
|
109
112
|
}
|
|
110
113
|
else if (key.name === "s") {
|
|
111
114
|
if (mode === "bundles" && bundle) {
|
|
112
|
-
await
|
|
115
|
+
await client.startBundle(bundle.name);
|
|
113
116
|
}
|
|
114
117
|
else if (service) {
|
|
115
|
-
await
|
|
118
|
+
await client.startService(service.name);
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
121
|
else if (key.name === "x") {
|
|
119
122
|
if (mode === "bundles" && bundle) {
|
|
120
|
-
await
|
|
123
|
+
await client.stopBundle(bundle.name);
|
|
121
124
|
}
|
|
122
125
|
else if (service) {
|
|
123
|
-
await
|
|
126
|
+
await client.stopService(service.name);
|
|
124
127
|
}
|
|
125
128
|
}
|
|
126
129
|
else if (key.name === "r") {
|
|
127
130
|
if (service) {
|
|
128
|
-
await
|
|
131
|
+
await client.restartService(service.name);
|
|
129
132
|
}
|
|
130
133
|
}
|
|
131
134
|
await render();
|
package/dist/tui/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"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"}
|