nomoreide 0.1.73 → 0.1.75
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/cli/commands.d.ts +3 -1
- package/dist/cli/commands.js +13 -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/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 +10 -4
- 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-DetFymBD.js → code-editor-BVKeCW-z.js} +1 -1
- package/dist/web/client/assets/index-BID_uTML.js +219 -0
- package/dist/web/client/assets/index-DQyGjwM5.css +1 -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 +2 -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-ZEkxfpgl.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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { defaultDaemonStatePath, ensureDaemon, probeDaemon, readDaemonState, resolveDaemonPort, } from "./daemon-lifecycle.js";
|
|
2
|
+
/** Non-2xx daemon response that isn't a port conflict. */
|
|
3
|
+
export class DaemonRequestError extends Error {
|
|
4
|
+
httpStatus;
|
|
5
|
+
constructor(message, httpStatus) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.httpStatus = httpStatus;
|
|
8
|
+
this.name = "DaemonRequestError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Mirrors the daemon's serialized PortConflictError (HTTP 409 + conflict body). */
|
|
12
|
+
export class DaemonPortConflictError extends Error {
|
|
13
|
+
port;
|
|
14
|
+
holder;
|
|
15
|
+
code = "PORT_IN_USE";
|
|
16
|
+
constructor(message, port, holder) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.port = port;
|
|
19
|
+
this.holder = holder;
|
|
20
|
+
this.name = "DaemonPortConflictError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Typed fetch client for the daemon's existing HTTP API. Thin by design:
|
|
25
|
+
* every method maps 1:1 onto a route the web UI already uses.
|
|
26
|
+
*/
|
|
27
|
+
export class DaemonClient {
|
|
28
|
+
url;
|
|
29
|
+
fetchFn;
|
|
30
|
+
constructor(url, options = {}) {
|
|
31
|
+
this.url = url;
|
|
32
|
+
this.fetchFn = options.fetch ?? fetch;
|
|
33
|
+
}
|
|
34
|
+
async status() {
|
|
35
|
+
const body = await this.request("GET", "/api/status");
|
|
36
|
+
return body.status;
|
|
37
|
+
}
|
|
38
|
+
async dashboard() {
|
|
39
|
+
return await this.request("GET", "/api/dashboard");
|
|
40
|
+
}
|
|
41
|
+
async logs(name, lines = 200) {
|
|
42
|
+
const body = await this.request("GET", `/api/services/${encodeURIComponent(name)}/logs?lines=${lines}`);
|
|
43
|
+
return body.logs;
|
|
44
|
+
}
|
|
45
|
+
async timeline(limit = 120) {
|
|
46
|
+
const body = await this.request("GET", `/api/timeline?limit=${limit}`);
|
|
47
|
+
return body.timeline;
|
|
48
|
+
}
|
|
49
|
+
async startService(name, options = {}) {
|
|
50
|
+
return await this.serviceAction(name, "start", options);
|
|
51
|
+
}
|
|
52
|
+
async stopService(name) {
|
|
53
|
+
return await this.serviceAction(name, "stop");
|
|
54
|
+
}
|
|
55
|
+
async restartService(name, options = {}) {
|
|
56
|
+
return await this.serviceAction(name, "restart", options);
|
|
57
|
+
}
|
|
58
|
+
async startBundle(name) {
|
|
59
|
+
return await this.bundleAction(name, "start");
|
|
60
|
+
}
|
|
61
|
+
async stopBundle(name) {
|
|
62
|
+
return await this.bundleAction(name, "stop");
|
|
63
|
+
}
|
|
64
|
+
async restartBundle(name) {
|
|
65
|
+
return await this.bundleAction(name, "restart");
|
|
66
|
+
}
|
|
67
|
+
/** Asks the daemon to stop every service and exit. */
|
|
68
|
+
async shutdown() {
|
|
69
|
+
await this.request("POST", "/api/daemon/shutdown");
|
|
70
|
+
}
|
|
71
|
+
async serviceAction(name, action, options = {}) {
|
|
72
|
+
const form = new URLSearchParams();
|
|
73
|
+
if (options.killHolder)
|
|
74
|
+
form.set("strategy", "killHolder");
|
|
75
|
+
const body = await this.request("POST", `/api/services/${encodeURIComponent(name)}/${action}`, form);
|
|
76
|
+
return body.status;
|
|
77
|
+
}
|
|
78
|
+
async bundleAction(name, action) {
|
|
79
|
+
const body = await this.request("POST", `/api/bundles/${encodeURIComponent(name)}/${action}`);
|
|
80
|
+
return body.statuses;
|
|
81
|
+
}
|
|
82
|
+
async request(method, path, form) {
|
|
83
|
+
const response = await this.fetchFn(new URL(path, this.url), {
|
|
84
|
+
method,
|
|
85
|
+
...(form
|
|
86
|
+
? {
|
|
87
|
+
body: form.toString(),
|
|
88
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
89
|
+
}
|
|
90
|
+
: {}),
|
|
91
|
+
});
|
|
92
|
+
const body = (await response.json().catch(() => ({})));
|
|
93
|
+
if (!response.ok || body.ok === false) {
|
|
94
|
+
const message = body.error ?? `Daemon request failed (${response.status})`;
|
|
95
|
+
if (body.conflict?.code === "PORT_IN_USE") {
|
|
96
|
+
throw new DaemonPortConflictError(message, body.conflict.port ?? 0, body.conflict.holder ?? null);
|
|
97
|
+
}
|
|
98
|
+
throw new DaemonRequestError(message, response.status);
|
|
99
|
+
}
|
|
100
|
+
return body;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export function createDaemonConnection(options = {}) {
|
|
104
|
+
return {
|
|
105
|
+
ensure: () => ensureDaemon(options),
|
|
106
|
+
async client() {
|
|
107
|
+
const ensured = await ensureDaemon(options);
|
|
108
|
+
return new DaemonClient(ensured.url, { fetch: options.fetch });
|
|
109
|
+
},
|
|
110
|
+
async existing() {
|
|
111
|
+
const state = await readDaemonState(options.statePath ?? defaultDaemonStatePath());
|
|
112
|
+
const url = state?.url ??
|
|
113
|
+
`http://127.0.0.1:${options.port ?? resolveDaemonPort(options.env)}`;
|
|
114
|
+
const probe = await probeDaemon(url, options.fetch);
|
|
115
|
+
if (probe.kind !== "nomoreide")
|
|
116
|
+
return null;
|
|
117
|
+
return new DaemonClient(url, { fetch: options.fetch });
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=daemon-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/core/daemon-client.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,GAGlB,MAAM,uBAAuB,CAAC;AAE/B,0DAA0D;AAC1D,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGhC;IAFX,YACE,OAAe,EACN,UAAkB;QAE3B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,eAAU,GAAV,UAAU,CAAQ;QAG3B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,oFAAoF;AACpF,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAKrC;IACA;IALF,IAAI,GAAG,aAAa,CAAC;IAE9B,YACE,OAAe,EACN,IAAY,EACZ,MAAyB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAmB;QAGlC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAmBD;;;GAGG;AACH,MAAM,OAAO,YAAY;IAIZ;IAHM,OAAO,CAAe;IAEvC,YACW,GAAW,EACpB,UAA+B,EAAE;QADxB,QAAG,GAAH,GAAG,CAAQ;QAGpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,KAAK,EACL,aAAa,CACd,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,MAAM,IAAI,CAAC,OAAO,CAAkB,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,KAAK,GAAG,GAAG;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,KAAK,EACL,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,eAAe,KAAK,EAAE,CAChE,CAAC;QACF,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,KAAK,EACL,uBAAuB,KAAK,EAAE,CAC/B,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,UAAwB,EAAE;QACzD,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,UAAwB,EAAE;QAC3D,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,OAAO,CAAkB,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,IAAY,EACZ,MAAoC,EACpC,UAAwB,EAAE;QAE1B,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,UAAU;YAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,MAAM,EACN,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,EACrD,IAAI,CACL,CAAC;QACF,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,IAAY,EACZ,MAAoC;QAEpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,MAAM,EACN,gBAAgB,kBAAkB,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CACrD,CAAC;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAsB,EACtB,IAAY,EACZ,IAAsB;QAEtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE;YAC3D,MAAM;YACN,GAAG,CAAC,IAAI;gBACN,CAAC,CAAC;oBACE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;oBACrB,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;iBACjE;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAIpD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,0BAA0B,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC3E,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC1C,MAAM,IAAI,uBAAuB,CAC/B,OAAO,EACP,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EACvB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAC7B,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAcD,MAAM,UAAU,sBAAsB,CACpC,UAAkC,EAAE;IAEpC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;QACnC,KAAK,CAAC,MAAM;YACV,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,MAAM,KAAK,GAAG,MAAM,eAAe,CACjC,OAAO,CAAC,SAAS,IAAI,sBAAsB,EAAE,CAC9C,CAAC;YACF,MAAM,GAAG,GACP,KAAK,EAAE,GAAG;gBACV,oBAAoB,OAAO,CAAC,IAAI,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO,IAAI,CAAC;YAC5C,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery/spawn of the single machine-global NoMoreIDE daemon (the web
|
|
3
|
+
* server started detached via `nomoreide daemon`). Every session — MCP, CLI,
|
|
4
|
+
* TUI, `nomoreide web` — calls {@link ensureDaemon} and talks HTTP to the
|
|
5
|
+
* winner instead of owning its own ProcessManager, so spawned services
|
|
6
|
+
* survive session exits and are visible everywhere.
|
|
7
|
+
*/
|
|
8
|
+
export interface DaemonState {
|
|
9
|
+
pid: number;
|
|
10
|
+
url: string;
|
|
11
|
+
port: number;
|
|
12
|
+
version?: string;
|
|
13
|
+
startedAt: string;
|
|
14
|
+
}
|
|
15
|
+
/** Shape `/api/health` answers with (daemon adds version + pid). */
|
|
16
|
+
export interface DaemonHealth {
|
|
17
|
+
version?: string;
|
|
18
|
+
pid?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface EnsureDaemonResult {
|
|
21
|
+
status: "already_running" | "adopted" | "started";
|
|
22
|
+
url: string;
|
|
23
|
+
port: number;
|
|
24
|
+
/** Daemon pid — 0 when the daemon predates health `pid` reporting. */
|
|
25
|
+
pid: number;
|
|
26
|
+
/** Set when the daemon runs a different nomoreide version than this client. */
|
|
27
|
+
versionWarning?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface DaemonLifecycleOptions {
|
|
30
|
+
/** Defaults to `~/.nomoreide/daemon.json`. */
|
|
31
|
+
statePath?: string;
|
|
32
|
+
/** Defaults to `NOMOREIDE_DAEMON_PORT` or 4317. */
|
|
33
|
+
port?: number;
|
|
34
|
+
env?: NodeJS.ProcessEnv;
|
|
35
|
+
fetch?: typeof fetch;
|
|
36
|
+
/** Injectable for tests; defaults to detaching `node <entry> daemon`. */
|
|
37
|
+
spawnDaemon?: (entryPath: string, port: number) => void;
|
|
38
|
+
/** Compiled CLI entry (`dist/index.js`); resolved from this module by default. */
|
|
39
|
+
entryPath?: string;
|
|
40
|
+
pollTimeoutMs?: number;
|
|
41
|
+
pollIntervalMs?: number;
|
|
42
|
+
/** Pid-liveness probe, injectable for tests. */
|
|
43
|
+
isPidAlive?: (pid: number) => boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare function defaultDaemonStatePath(): string;
|
|
46
|
+
export declare function resolveDaemonPort(env?: NodeJS.ProcessEnv): number;
|
|
47
|
+
export declare function ensureDaemon(options?: DaemonLifecycleOptions): Promise<EnsureDaemonResult>;
|
|
48
|
+
export declare function readDaemonState(statePath: string): Promise<DaemonState | null>;
|
|
49
|
+
type DaemonProbe = {
|
|
50
|
+
kind: "nomoreide";
|
|
51
|
+
health: DaemonHealth;
|
|
52
|
+
} | {
|
|
53
|
+
kind: "foreign";
|
|
54
|
+
} | {
|
|
55
|
+
kind: "down";
|
|
56
|
+
};
|
|
57
|
+
/** `nomoreide` when `/api/health` answers with our shape, `foreign` when something else holds the port. */
|
|
58
|
+
export declare function probeDaemon(url: string, fetchFn?: typeof fetch): Promise<DaemonProbe>;
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { readFile, rm } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { appVersion } from "./app-version.js";
|
|
8
|
+
import { isPidAlive } from "./service-registry.js";
|
|
9
|
+
export function defaultDaemonStatePath() {
|
|
10
|
+
return join(homedir(), ".nomoreide", "daemon.json");
|
|
11
|
+
}
|
|
12
|
+
export function resolveDaemonPort(env = process.env) {
|
|
13
|
+
const fromEnv = Number(env.NOMOREIDE_DAEMON_PORT);
|
|
14
|
+
return Number.isInteger(fromEnv) && fromEnv > 0 ? fromEnv : 4317;
|
|
15
|
+
}
|
|
16
|
+
export async function ensureDaemon(options = {}) {
|
|
17
|
+
const statePath = options.statePath ?? defaultDaemonStatePath();
|
|
18
|
+
const port = options.port ?? resolveDaemonPort(options.env);
|
|
19
|
+
const fetchFn = options.fetch ?? fetch;
|
|
20
|
+
const pidAlive = options.isPidAlive ?? isPidAlive;
|
|
21
|
+
const url = `http://127.0.0.1:${port}`;
|
|
22
|
+
const state = await readDaemonState(statePath);
|
|
23
|
+
if (state && pidAlive(state.pid)) {
|
|
24
|
+
const probe = await probeDaemon(state.url, fetchFn);
|
|
25
|
+
if (probe.kind === "nomoreide") {
|
|
26
|
+
return {
|
|
27
|
+
status: "already_running",
|
|
28
|
+
url: state.url,
|
|
29
|
+
port: state.port,
|
|
30
|
+
pid: probe.health.pid ?? state.pid,
|
|
31
|
+
versionWarning: versionWarning(probe.health),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (state) {
|
|
36
|
+
await rm(statePath, { force: true });
|
|
37
|
+
}
|
|
38
|
+
const probe = await probeDaemon(url, fetchFn);
|
|
39
|
+
if (probe.kind === "nomoreide") {
|
|
40
|
+
return {
|
|
41
|
+
status: "adopted",
|
|
42
|
+
url,
|
|
43
|
+
port,
|
|
44
|
+
pid: probe.health.pid ?? 0,
|
|
45
|
+
versionWarning: versionWarning(probe.health),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (probe.kind === "foreign") {
|
|
49
|
+
throw new Error(foreignPortMessage(port));
|
|
50
|
+
}
|
|
51
|
+
const spawnFn = options.spawnDaemon ?? spawnDetachedDaemon;
|
|
52
|
+
spawnFn(resolveEntryPath(options.entryPath), port);
|
|
53
|
+
const timeoutMs = options.pollTimeoutMs ?? 10_000;
|
|
54
|
+
const intervalMs = options.pollIntervalMs ?? 250;
|
|
55
|
+
const deadline = Date.now() + timeoutMs;
|
|
56
|
+
// If two sessions raced, the loser's daemon exits on the port conflict and
|
|
57
|
+
// this poll simply adopts whichever daemon won the bind.
|
|
58
|
+
while (Date.now() < deadline) {
|
|
59
|
+
const attempt = await probeDaemon(url, fetchFn);
|
|
60
|
+
if (attempt.kind === "nomoreide") {
|
|
61
|
+
return {
|
|
62
|
+
status: "started",
|
|
63
|
+
url,
|
|
64
|
+
port,
|
|
65
|
+
pid: attempt.health.pid ?? 0,
|
|
66
|
+
versionWarning: versionWarning(attempt.health),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (attempt.kind === "foreign") {
|
|
70
|
+
throw new Error(foreignPortMessage(port));
|
|
71
|
+
}
|
|
72
|
+
await sleep(intervalMs);
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`NoMoreIDE daemon did not become healthy on port ${port} within ${timeoutMs}ms. ` +
|
|
75
|
+
`Check \`nomoreide daemon\` output or pick another port via NOMOREIDE_DAEMON_PORT.`);
|
|
76
|
+
}
|
|
77
|
+
export async function readDaemonState(statePath) {
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(await readFile(statePath, "utf8"));
|
|
80
|
+
if (typeof parsed.pid !== "number" ||
|
|
81
|
+
typeof parsed.url !== "string" ||
|
|
82
|
+
typeof parsed.port !== "number") {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return parsed;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** `nomoreide` when `/api/health` answers with our shape, `foreign` when something else holds the port. */
|
|
92
|
+
export async function probeDaemon(url, fetchFn = fetch) {
|
|
93
|
+
let response;
|
|
94
|
+
try {
|
|
95
|
+
response = await fetchFn(new URL("/api/health", url));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return { kind: "down" };
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const body = (await response.json());
|
|
102
|
+
if (!response.ok || body.ok !== true || body.app !== "nomoreide") {
|
|
103
|
+
return { kind: "foreign" };
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
kind: "nomoreide",
|
|
107
|
+
health: {
|
|
108
|
+
version: typeof body.version === "string" ? body.version : undefined,
|
|
109
|
+
pid: typeof body.pid === "number" ? body.pid : undefined,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return { kind: "foreign" };
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function versionWarning(health) {
|
|
118
|
+
const clientVersion = appVersion();
|
|
119
|
+
if (!health.version || health.version === clientVersion)
|
|
120
|
+
return undefined;
|
|
121
|
+
// Never auto-kill on skew — the daemon owns running services.
|
|
122
|
+
return (`NoMoreIDE daemon is v${health.version} but this client is v${clientVersion}. ` +
|
|
123
|
+
`Run \`nomoreide daemon restart\` to update it (this stops the services it manages).`);
|
|
124
|
+
}
|
|
125
|
+
function foreignPortMessage(port) {
|
|
126
|
+
return (`Port ${port} is held by a process that is not a NoMoreIDE daemon. ` +
|
|
127
|
+
`Stop it or set NOMOREIDE_DAEMON_PORT to use a different port.`);
|
|
128
|
+
}
|
|
129
|
+
function resolveEntryPath(override) {
|
|
130
|
+
const entryPath = override ?? fileURLToPath(new URL("../index.js", import.meta.url));
|
|
131
|
+
if (!existsSync(entryPath)) {
|
|
132
|
+
throw new Error(`Cannot find the nomoreide entry point at ${entryPath} to spawn the daemon ` +
|
|
133
|
+
`(running from source? build first or run \`nomoreide daemon\` yourself).`);
|
|
134
|
+
}
|
|
135
|
+
return entryPath;
|
|
136
|
+
}
|
|
137
|
+
function spawnDetachedDaemon(entryPath, port) {
|
|
138
|
+
const child = spawn(process.execPath, [entryPath, "daemon", `--port=${port}`], {
|
|
139
|
+
detached: true,
|
|
140
|
+
stdio: "ignore",
|
|
141
|
+
});
|
|
142
|
+
child.unref();
|
|
143
|
+
}
|
|
144
|
+
function sleep(ms) {
|
|
145
|
+
return new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=daemon-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-lifecycle.js","sourceRoot":"","sources":["../../src/core/daemon-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/core/db-peek.d.ts
CHANGED
|
@@ -8,10 +8,14 @@ export interface MaskedConnection {
|
|
|
8
8
|
url: string;
|
|
9
9
|
/** Whether the user has unlocked write access for this connection. */
|
|
10
10
|
writeUnlocked: boolean;
|
|
11
|
+
/** Project directory the connection is classified under, if any. */
|
|
12
|
+
projectPath?: string;
|
|
11
13
|
}
|
|
12
14
|
/** A DB connection string discovered in a service's `.env` file. */
|
|
13
15
|
export interface DetectedConnection {
|
|
14
16
|
service: string;
|
|
17
|
+
/** The service's working directory — provenance for project classification. */
|
|
18
|
+
cwd: string;
|
|
15
19
|
key: string;
|
|
16
20
|
engine: DatabaseEngine;
|
|
17
21
|
url: string;
|
package/dist/core/db-peek.js
CHANGED
|
@@ -21,6 +21,7 @@ export class DbPeek {
|
|
|
21
21
|
engine: connection.engine,
|
|
22
22
|
url: maskConnectionUrl(connection.engine, connection.url),
|
|
23
23
|
writeUnlocked: connection.writeUnlocked ?? false,
|
|
24
|
+
projectPath: connection.projectPath,
|
|
24
25
|
}));
|
|
25
26
|
}
|
|
26
27
|
async listTables(name) {
|
|
@@ -72,6 +73,7 @@ export class DbPeek {
|
|
|
72
73
|
seen.add(dedupe);
|
|
73
74
|
found.push({
|
|
74
75
|
service: service.name,
|
|
76
|
+
cwd: service.cwd,
|
|
75
77
|
key,
|
|
76
78
|
engine,
|
|
77
79
|
url: value,
|
package/dist/core/db-peek.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-peek.js","sourceRoot":"","sources":["../../src/core/db-peek.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"db-peek.js","sourceRoot":"","sources":["../../src/core/db-peek.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,13 +43,13 @@ declare const composeServiceDetailSchema: z.ZodObject<{
|
|
|
43
43
|
environment: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
44
44
|
}, "strip", z.ZodTypeAny, {
|
|
45
45
|
name: string;
|
|
46
|
-
ports: string[];
|
|
47
46
|
environment: Record<string, string>;
|
|
47
|
+
ports: string[];
|
|
48
48
|
image?: string | undefined;
|
|
49
49
|
}, {
|
|
50
50
|
name: string;
|
|
51
|
-
ports: string[];
|
|
52
51
|
environment: Record<string, string>;
|
|
52
|
+
ports: string[];
|
|
53
53
|
image?: string | undefined;
|
|
54
54
|
}>;
|
|
55
55
|
export type ComposeServiceDetail = z.infer<typeof composeServiceDetailSchema>;
|
|
@@ -101,13 +101,13 @@ export declare const repoProfileSchema: z.ZodObject<{
|
|
|
101
101
|
environment: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
102
102
|
}, "strip", z.ZodTypeAny, {
|
|
103
103
|
name: string;
|
|
104
|
-
ports: string[];
|
|
105
104
|
environment: Record<string, string>;
|
|
105
|
+
ports: string[];
|
|
106
106
|
image?: string | undefined;
|
|
107
107
|
}, {
|
|
108
108
|
name: string;
|
|
109
|
-
ports: string[];
|
|
110
109
|
environment: Record<string, string>;
|
|
110
|
+
ports: string[];
|
|
111
111
|
image?: string | undefined;
|
|
112
112
|
}>, "many">>;
|
|
113
113
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -116,8 +116,8 @@ export declare const repoProfileSchema: z.ZodObject<{
|
|
|
116
116
|
composeFile?: string | undefined;
|
|
117
117
|
services?: {
|
|
118
118
|
name: string;
|
|
119
|
-
ports: string[];
|
|
120
119
|
environment: Record<string, string>;
|
|
120
|
+
ports: string[];
|
|
121
121
|
image?: string | undefined;
|
|
122
122
|
}[] | undefined;
|
|
123
123
|
}, {
|
|
@@ -126,8 +126,8 @@ export declare const repoProfileSchema: z.ZodObject<{
|
|
|
126
126
|
composeFile?: string | undefined;
|
|
127
127
|
services?: {
|
|
128
128
|
name: string;
|
|
129
|
-
ports: string[];
|
|
130
129
|
environment: Record<string, string>;
|
|
130
|
+
ports: string[];
|
|
131
131
|
image?: string | undefined;
|
|
132
132
|
}[] | undefined;
|
|
133
133
|
}>>;
|
|
@@ -145,8 +145,8 @@ export declare const repoProfileSchema: z.ZodObject<{
|
|
|
145
145
|
composeFile?: string | undefined;
|
|
146
146
|
services?: {
|
|
147
147
|
name: string;
|
|
148
|
-
ports: string[];
|
|
149
148
|
environment: Record<string, string>;
|
|
149
|
+
ports: string[];
|
|
150
150
|
image?: string | undefined;
|
|
151
151
|
}[] | undefined;
|
|
152
152
|
} | undefined;
|
|
@@ -174,8 +174,8 @@ export declare const repoProfileSchema: z.ZodObject<{
|
|
|
174
174
|
composeFile?: string | undefined;
|
|
175
175
|
services?: {
|
|
176
176
|
name: string;
|
|
177
|
-
ports: string[];
|
|
178
177
|
environment: Record<string, string>;
|
|
178
|
+
ports: string[];
|
|
179
179
|
image?: string | undefined;
|
|
180
180
|
}[] | undefined;
|
|
181
181
|
} | undefined;
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { buildServiceAgentContext } from "./agent-context.js";
|
|
2
|
+
// Many runtimes (Go's log package, cargo, dotnet) write routine output to
|
|
3
|
+
// stderr, so only the text can tell an error apart from an info line.
|
|
4
|
+
const ERROR_LOG_PATTERN = /error|failed|exception|panic|fatal|traceback|exit status/i;
|
|
2
5
|
export function computeServiceHealth(input) {
|
|
3
6
|
const status = input.status;
|
|
7
|
+
const startedAt = status?.startedAt;
|
|
4
8
|
const lastErrorLog = [...input.logs]
|
|
5
9
|
.reverse()
|
|
6
|
-
.find((entry) =>
|
|
10
|
+
.find((entry) => ERROR_LOG_PATTERN.test(entry.text) &&
|
|
11
|
+
(!startedAt || entry.timestamp >= startedAt));
|
|
7
12
|
if (!status || status.state === "stopped") {
|
|
8
13
|
return baseHealth(input, "unknown", "Service is not running.", lastErrorLog);
|
|
9
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-health.js","sourceRoot":"","sources":["../../src/core/service-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAkB9D,MAAM,UAAU,oBAAoB,CAClC,KAAgC;IAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;SACjC,OAAO,EAAE;SACT,IAAI,CACH,CAAC,KAAK,EAAE,EAAE,CACR,
|
|
1
|
+
{"version":3,"file":"service-health.js","sourceRoot":"","sources":["../../src/core/service-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAkB9D,0EAA0E;AAC1E,sEAAsE;AACtE,MAAM,iBAAiB,GACrB,2DAA2D,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAClC,KAAgC;IAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAC;IACpC,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;SACjC,OAAO,EAAE;SACT,IAAI,CACH,CAAC,KAAK,EAAE,EAAE,CACR,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,CAC/C,CAAC;IAEJ,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,UAAU,CACf,KAAK,EACL,WAAW,EACX,4BAA4B,MAAM,CAAC,QAAQ,IAAI,SAAS,GAAG,EAC3D,YAAY,CACb,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QAC3D,OAAO,UAAU,CACf,KAAK,EACL,SAAS,EACT,sBAAsB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EACnE,YAAY,CACb,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,UAAU,CACf,KAAK,EACL,SAAS,EACT,qBAAqB,YAAY,CAAC,IAAI,EAAE,EACxC,YAAY,CACb,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CACf,KAAK,EACL,SAAS,EACT,+CAA+C,EAC/C,YAAY,CACb,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,KAAgC,EAChC,MAA+B,EAC/B,OAAe,EACf,YAAuB;IAEvB,MAAM,YAAY,GAAG,wBAAwB,CAAC;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,aAAa,EAAE,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;KAC/B,CAAC,CAAC;IACH,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;QAC3B,MAAM;QACN,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW;QACtC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,YAAY;QACZ,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -42,9 +42,11 @@ export declare class ServiceRegistry {
|
|
|
42
42
|
private write;
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* The shared registry
|
|
46
|
-
*
|
|
45
|
+
* The shared registry is machine-global: `~/.nomoreide/runtime.json`. Running
|
|
46
|
+
* processes and their ports are global resources, so sessions launched from
|
|
47
|
+
* different directories (multiple terminals, the desktop app, per-project MCP
|
|
48
|
+
* servers) must all see the same registry or they spawn duplicates.
|
|
47
49
|
*/
|
|
48
|
-
export declare function defaultRuntimeRegistryPath(
|
|
50
|
+
export declare function defaultRuntimeRegistryPath(): string;
|
|
49
51
|
/** `true` while the pid exists (including when owned by another user — EPERM). */
|
|
50
52
|
export declare function isPidAlive(pid: number): boolean;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
3
4
|
/**
|
|
4
5
|
* Shared, project-local view of running services, persisted at
|
|
5
6
|
* `.nomoreide/runtime.json`. Reads never mutate the file; mutations rewrite it
|
|
@@ -77,11 +78,13 @@ export class ServiceRegistry {
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
/**
|
|
80
|
-
* The shared registry
|
|
81
|
-
*
|
|
81
|
+
* The shared registry is machine-global: `~/.nomoreide/runtime.json`. Running
|
|
82
|
+
* processes and their ports are global resources, so sessions launched from
|
|
83
|
+
* different directories (multiple terminals, the desktop app, per-project MCP
|
|
84
|
+
* servers) must all see the same registry or they spawn duplicates.
|
|
82
85
|
*/
|
|
83
|
-
export function defaultRuntimeRegistryPath(
|
|
84
|
-
return
|
|
86
|
+
export function defaultRuntimeRegistryPath() {
|
|
87
|
+
return join(homedir(), ".nomoreide", "runtime.json");
|
|
85
88
|
}
|
|
86
89
|
/** `true` while the pid exists (including when owned by another user — EPERM). */
|
|
87
90
|
export function isPidAlive(pid) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../../src/core/service-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"service-registry.js","sourceRoot":"","sources":["../../src/core/service-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type PtyAdapter, type TerminalSessionLike, type TerminalSize, type TerminalSnapshot } from "./terminal-session.js";
|
|
2
|
+
import type { InteractiveAgentProvider } from "./agent-terminal.js";
|
|
2
3
|
/** A session's snapshot plus the id the manager tracks it under. */
|
|
3
4
|
export interface TerminalSessionInfo extends TerminalSnapshot {
|
|
4
5
|
id: string;
|
|
@@ -10,6 +11,8 @@ export interface TerminalSpawnOptions {
|
|
|
10
11
|
shell?: string;
|
|
11
12
|
args?: string[];
|
|
12
13
|
label?: string;
|
|
14
|
+
kind?: "shell" | "service" | "agent";
|
|
15
|
+
provider?: InteractiveAgentProvider;
|
|
13
16
|
}
|
|
14
17
|
/** The subset of the manager the web layer depends on (so tests can fake it). */
|
|
15
18
|
export interface TerminalSessionManagerLike {
|
|
@@ -110,7 +110,9 @@ export class TerminalSessionManager {
|
|
|
110
110
|
env: options.env ?? this.options.env,
|
|
111
111
|
shell: options.shell ?? this.options.shell,
|
|
112
112
|
args: options.args,
|
|
113
|
+
kind: options.kind,
|
|
113
114
|
label: options.label,
|
|
115
|
+
provider: options.provider,
|
|
114
116
|
});
|
|
115
117
|
// PTY output counts as activity, so a live tail keeps the session alive.
|
|
116
118
|
const outputSub = session.onOutput(() => this.touch(id));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-manager.js","sourceRoot":"","sources":["../../src/core/terminal-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,GAIhB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal-manager.js","sourceRoot":"","sources":["../../src/core/terminal-manager.ts"],"names":[],"mappings":"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"}
|