nomoreide 0.1.99 → 0.1.100

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 (157) hide show
  1. package/README.md +26 -1
  2. package/dist/cli/git.js +5 -1
  3. package/dist/cli/git.js.map +1 -1
  4. package/dist/cli/profile.js +1 -1
  5. package/dist/cli/profile.js.map +1 -1
  6. package/dist/core/agent-profiles/index.d.ts +1 -1
  7. package/dist/core/agent-profiles/index.js +1 -1
  8. package/dist/core/agent-profiles/index.js.map +1 -1
  9. package/dist/core/agent-profiles/registry-client.d.ts +2 -1
  10. package/dist/core/agent-profiles/registry-client.js.map +1 -1
  11. package/dist/core/agent-profiles/registry-config.d.ts +16 -2
  12. package/dist/core/agent-profiles/registry-config.js +76 -22
  13. package/dist/core/agent-profiles/registry-config.js.map +1 -1
  14. package/dist/core/agent-profiles/registry-transfer.js +15 -1
  15. package/dist/core/agent-profiles/registry-transfer.js.map +1 -1
  16. package/dist/core/agent-profiles/store.d.ts +10 -0
  17. package/dist/core/agent-profiles/store.js +47 -1
  18. package/dist/core/agent-profiles/store.js.map +1 -1
  19. package/dist/core/agent-profiles/transfer.js +28 -5
  20. package/dist/core/agent-profiles/transfer.js.map +1 -1
  21. package/dist/core/agent-terminal.d.ts +3 -1
  22. package/dist/core/agent-terminal.js +24 -5
  23. package/dist/core/agent-terminal.js.map +1 -1
  24. package/dist/core/agent-transcripts.js +36 -3
  25. package/dist/core/agent-transcripts.js.map +1 -1
  26. package/dist/core/app-settings.d.ts +6 -0
  27. package/dist/core/app-settings.js +6 -0
  28. package/dist/core/app-settings.js.map +1 -1
  29. package/dist/core/config-store.d.ts +35 -1
  30. package/dist/core/config-store.js +173 -0
  31. package/dist/core/config-store.js.map +1 -1
  32. package/dist/core/db/data-masking.d.ts +3 -0
  33. package/dist/core/db/data-masking.js +14 -0
  34. package/dist/core/db/data-masking.js.map +1 -0
  35. package/dist/core/db/driver.d.ts +29 -1
  36. package/dist/core/db/driver.js +94 -0
  37. package/dist/core/db/driver.js.map +1 -1
  38. package/dist/core/db/export.d.ts +17 -0
  39. package/dist/core/db/export.js +67 -0
  40. package/dist/core/db/export.js.map +1 -0
  41. package/dist/core/db/mysql-driver.d.ts +3 -2
  42. package/dist/core/db/mysql-driver.js +53 -3
  43. package/dist/core/db/mysql-driver.js.map +1 -1
  44. package/dist/core/db/postgres-driver.d.ts +3 -2
  45. package/dist/core/db/postgres-driver.js +41 -3
  46. package/dist/core/db/postgres-driver.js.map +1 -1
  47. package/dist/core/db/sqlite-driver.d.ts +3 -2
  48. package/dist/core/db/sqlite-driver.js +38 -4
  49. package/dist/core/db/sqlite-driver.js.map +1 -1
  50. package/dist/core/db-peek.d.ts +9 -2
  51. package/dist/core/db-peek.js +20 -10
  52. package/dist/core/db-peek.js.map +1 -1
  53. package/dist/core/git-actions.d.ts +19 -0
  54. package/dist/core/git-actions.js +36 -4
  55. package/dist/core/git-actions.js.map +1 -1
  56. package/dist/core/git-identity.d.ts +78 -0
  57. package/dist/core/git-identity.js +178 -0
  58. package/dist/core/git-identity.js.map +1 -0
  59. package/dist/core/git-manager.d.ts +9 -1
  60. package/dist/core/git-manager.js +10 -3
  61. package/dist/core/git-manager.js.map +1 -1
  62. package/dist/core/github-context.js +1 -29
  63. package/dist/core/github-context.js.map +1 -1
  64. package/dist/core/github-manager.d.ts +6 -0
  65. package/dist/core/github-manager.js.map +1 -1
  66. package/dist/core/process-manager.js +10 -3
  67. package/dist/core/process-manager.js.map +1 -1
  68. package/dist/core/project-overview.d.ts +52 -0
  69. package/dist/core/project-overview.js +122 -0
  70. package/dist/core/project-overview.js.map +1 -0
  71. package/dist/core/repo-match.d.ts +12 -0
  72. package/dist/core/repo-match.js +40 -0
  73. package/dist/core/repo-match.js.map +1 -0
  74. package/dist/core/repo-onboard.d.ts +4 -4
  75. package/dist/core/service-detect.d.ts +19 -0
  76. package/dist/core/service-detect.js +141 -0
  77. package/dist/core/service-detect.js.map +1 -0
  78. package/dist/core/ssh-servers.d.ts +52 -0
  79. package/dist/core/ssh-servers.js +194 -0
  80. package/dist/core/ssh-servers.js.map +1 -0
  81. package/dist/core/terminal-session.d.ts +8 -0
  82. package/dist/core/terminal-session.js +20 -0
  83. package/dist/core/terminal-session.js.map +1 -1
  84. package/dist/core/types.d.ts +62 -0
  85. package/dist/core/vercel-actions.d.ts +71 -0
  86. package/dist/core/vercel-actions.js +109 -0
  87. package/dist/core/vercel-actions.js.map +1 -0
  88. package/dist/core/vercel-auth.d.ts +58 -0
  89. package/dist/core/vercel-auth.js +130 -0
  90. package/dist/core/vercel-auth.js.map +1 -0
  91. package/dist/core/vercel-context.d.ts +25 -0
  92. package/dist/core/vercel-context.js +143 -0
  93. package/dist/core/vercel-context.js.map +1 -0
  94. package/dist/core/vercel-manager.d.ts +253 -0
  95. package/dist/core/vercel-manager.js +391 -0
  96. package/dist/core/vercel-manager.js.map +1 -0
  97. package/dist/core/vercel-oauth.d.ts +75 -0
  98. package/dist/core/vercel-oauth.js +223 -0
  99. package/dist/core/vercel-oauth.js.map +1 -0
  100. package/dist/index.js +0 -0
  101. package/dist/mcp/tools/agent-registry.d.ts +2 -2
  102. package/dist/mcp/tools/agent-registry.js +3 -3
  103. package/dist/mcp/tools/agent-registry.js.map +1 -1
  104. package/dist/mcp/tools/docs.d.ts +1 -1
  105. package/dist/mcp/tools/docs.js +20 -8
  106. package/dist/mcp/tools/docs.js.map +1 -1
  107. package/dist/mcp/tools/git.js +20 -2
  108. package/dist/mcp/tools/git.js.map +1 -1
  109. package/dist/mcp/tools/index.d.ts +1 -1
  110. package/dist/mcp/tools/index.js +3 -0
  111. package/dist/mcp/tools/index.js.map +1 -1
  112. package/dist/mcp/tools/vercel.d.ts +12 -0
  113. package/dist/mcp/tools/vercel.js +103 -0
  114. package/dist/mcp/tools/vercel.js.map +1 -0
  115. package/dist/mcp/tools.d.ts +19 -0
  116. package/dist/mcp/tools.js +354 -0
  117. package/dist/mcp/tools.js.map +1 -0
  118. package/dist/web/client/assets/code-editor-DFOGG6ys.js +30 -0
  119. package/dist/web/client/assets/index-BG_E_64s.css +1 -0
  120. package/dist/web/client/assets/index-BhDAhmA1.js +1 -0
  121. package/dist/web/client/assets/index-CYgm7PZW.js +346 -0
  122. package/dist/web/client/assets/{system-process-table-DbxLdSLC.js → system-process-table-B9uNpXW9.js} +1 -1
  123. package/dist/web/client/index.html +2 -2
  124. package/dist/web/routes/agent-chat-routes.js +29 -0
  125. package/dist/web/routes/agent-chat-routes.js.map +1 -1
  126. package/dist/web/routes/agent-profile-routes.js +14 -2
  127. package/dist/web/routes/agent-profile-routes.js.map +1 -1
  128. package/dist/web/routes/database-routes.js +108 -1
  129. package/dist/web/routes/database-routes.js.map +1 -1
  130. package/dist/web/routes/git-routes.js +37 -7
  131. package/dist/web/routes/git-routes.js.map +1 -1
  132. package/dist/web/routes/index.js +6 -0
  133. package/dist/web/routes/index.js.map +1 -1
  134. package/dist/web/routes/overview-routes.d.ts +2 -0
  135. package/dist/web/routes/overview-routes.js +36 -0
  136. package/dist/web/routes/overview-routes.js.map +1 -0
  137. package/dist/web/routes/shell-routes.d.ts +8 -0
  138. package/dist/web/routes/shell-routes.js +10 -2
  139. package/dist/web/routes/shell-routes.js.map +1 -1
  140. package/dist/web/routes/ssh-server-routes.d.ts +3 -0
  141. package/dist/web/routes/ssh-server-routes.js +101 -0
  142. package/dist/web/routes/ssh-server-routes.js.map +1 -0
  143. package/dist/web/routes/terminal-routes.js +18 -4
  144. package/dist/web/routes/terminal-routes.js.map +1 -1
  145. package/dist/web/routes/vercel-routes.d.ts +2 -0
  146. package/dist/web/routes/vercel-routes.js +476 -0
  147. package/dist/web/routes/vercel-routes.js.map +1 -0
  148. package/dist/web/server.d.ts +8 -0
  149. package/dist/web/server.js +25 -7
  150. package/dist/web/server.js.map +1 -1
  151. package/dist/web/ui-lifecycle.d.ts +30 -0
  152. package/dist/web/ui-lifecycle.js +129 -0
  153. package/dist/web/ui-lifecycle.js.map +1 -0
  154. package/package.json +4 -1
  155. package/dist/web/client/assets/code-editor-DUgkd8Vo.js +0 -28
  156. package/dist/web/client/assets/index-BTwlXmPn.css +0 -1
  157. package/dist/web/client/assets/index-CRM7WNxX.js +0 -308
@@ -217,9 +217,9 @@ export declare const proposedServiceSchema: z.ZodObject<{
217
217
  }, "strip", z.ZodTypeAny, {
218
218
  kind: "local" | "docker-compose";
219
219
  name: string;
220
+ reason: string;
220
221
  cwd: string;
221
222
  confidence: "high" | "medium" | "low";
222
- reason: string;
223
223
  port?: number | undefined;
224
224
  command?: string | undefined;
225
225
  description?: string | undefined;
@@ -230,9 +230,9 @@ export declare const proposedServiceSchema: z.ZodObject<{
230
230
  }, {
231
231
  kind: "local" | "docker-compose";
232
232
  name: string;
233
+ reason: string;
233
234
  cwd: string;
234
235
  confidence: "high" | "medium" | "low";
235
- reason: string;
236
236
  port?: number | undefined;
237
237
  command?: string | undefined;
238
238
  description?: string | undefined;
@@ -257,17 +257,17 @@ export declare const proposedDatabaseSchema: z.ZodObject<{
257
257
  reason: z.ZodString;
258
258
  }, "strip", z.ZodTypeAny, {
259
259
  name: string;
260
+ reason: string;
260
261
  engine: "postgres" | "mysql";
261
262
  url: string;
262
263
  confidence: "high" | "medium" | "low";
263
- reason: string;
264
264
  composeService?: string | undefined;
265
265
  }, {
266
266
  name: string;
267
+ reason: string;
267
268
  engine: "postgres" | "mysql";
268
269
  url: string;
269
270
  confidence: "high" | "medium" | "low";
270
- reason: string;
271
271
  composeService?: string | undefined;
272
272
  }>;
273
273
  export type ProposedDatabase = z.infer<typeof proposedDatabaseSchema>;
@@ -0,0 +1,19 @@
1
+ export type DetectedKind = "local" | "docker-compose" | "ssh";
2
+ /**
3
+ * A best-guess service definition derived from a folder's contents, used to
4
+ * pre-fill the guided "add service" wizard. Everything is a suggestion the user
5
+ * can override — detection never registers anything on its own.
6
+ */
7
+ export interface ServiceSuggestion {
8
+ kind: DetectedKind;
9
+ name: string;
10
+ command?: string;
11
+ composeFile?: string;
12
+ composeService?: string;
13
+ port?: number;
14
+ description?: string;
15
+ /** Human-readable reason ("Found package.json — pnpm dev script"). */
16
+ detected: string;
17
+ }
18
+ /** Inspect a local folder and propose a runnable service definition. */
19
+ export declare function detectServiceSetup(cwd: string): Promise<ServiceSuggestion>;
@@ -0,0 +1,141 @@
1
+ import { access, readFile } from "node:fs/promises";
2
+ import { basename, join, resolve } from "node:path";
3
+ const PORT_IN_SCRIPT = /(?:--port[=\s]+|-p\s+|PORT=)(\d{2,5})\b/;
4
+ /** Inspect a local folder and propose a runnable service definition. */
5
+ export async function detectServiceSetup(cwd) {
6
+ const root = resolve(cwd);
7
+ const name = sanitizeName(basename(root)) || "service";
8
+ const pkg = await readJson(join(root, "package.json"));
9
+ if (pkg) {
10
+ const manager = await detectPackageManager(root);
11
+ const scripts = (pkg.scripts ?? {});
12
+ const script = ["dev", "start", "serve"].find((key) => typeof scripts[key] === "string");
13
+ const command = script
14
+ ? manager === "npm"
15
+ ? `npm run ${script}`
16
+ : `${manager} ${script}`
17
+ : undefined;
18
+ const port = script ? portFrom(scripts[script]) : undefined;
19
+ return {
20
+ kind: "local",
21
+ name,
22
+ command,
23
+ port: port ?? (await portFromEnv(root)),
24
+ description: typeof pkg.description === "string" ? pkg.description : undefined,
25
+ detected: script
26
+ ? `package.json — ${manager} "${script}" script`
27
+ : `package.json — no dev/start script found, pick a command`,
28
+ };
29
+ }
30
+ const compose = await firstExisting(root, [
31
+ "docker-compose.yml",
32
+ "docker-compose.yaml",
33
+ "compose.yml",
34
+ "compose.yaml",
35
+ ]);
36
+ if (compose) {
37
+ const service = await firstComposeService(join(root, compose));
38
+ return {
39
+ kind: "docker-compose",
40
+ name,
41
+ composeFile: compose,
42
+ composeService: service,
43
+ detected: `${compose}${service ? ` — first service "${service}"` : ""}`,
44
+ };
45
+ }
46
+ const langGuess = await detectLanguageCommand(root);
47
+ if (langGuess) {
48
+ return { kind: "local", name, command: langGuess.command, detected: langGuess.detected };
49
+ }
50
+ return { kind: "local", name, detected: "No known project files — enter a command manually" };
51
+ }
52
+ async function detectPackageManager(root) {
53
+ if (await exists(join(root, "pnpm-lock.yaml")))
54
+ return "pnpm";
55
+ if (await exists(join(root, "yarn.lock")))
56
+ return "yarn";
57
+ if (await exists(join(root, "bun.lockb")))
58
+ return "bun";
59
+ return "npm";
60
+ }
61
+ async function detectLanguageCommand(root) {
62
+ if (await exists(join(root, "go.mod"))) {
63
+ return { command: "go run .", detected: "go.mod — Go module" };
64
+ }
65
+ if (await exists(join(root, "Cargo.toml"))) {
66
+ return { command: "cargo run", detected: "Cargo.toml — Rust crate" };
67
+ }
68
+ if (await exists(join(root, "manage.py"))) {
69
+ return { command: "python manage.py runserver", detected: "manage.py — Django project" };
70
+ }
71
+ if ((await exists(join(root, "pyproject.toml"))) || (await exists(join(root, "requirements.txt")))) {
72
+ return { command: "python main.py", detected: "Python project — adjust the entry point" };
73
+ }
74
+ return undefined;
75
+ }
76
+ function portFrom(script) {
77
+ if (!script)
78
+ return undefined;
79
+ const match = script.match(PORT_IN_SCRIPT);
80
+ const port = match ? Number(match[1]) : NaN;
81
+ return Number.isInteger(port) && port > 0 && port <= 65535 ? port : undefined;
82
+ }
83
+ async function portFromEnv(root) {
84
+ const text = await readText(join(root, ".env"));
85
+ if (!text)
86
+ return undefined;
87
+ const line = text.split("\n").find((entry) => /^\s*PORT\s*=/.test(entry));
88
+ return portFrom(line);
89
+ }
90
+ /** Pull the first key under a compose file's top-level `services:` block. */
91
+ async function firstComposeService(path) {
92
+ const text = await readText(path);
93
+ if (!text)
94
+ return undefined;
95
+ const lines = text.split("\n");
96
+ const start = lines.findIndex((line) => /^services:\s*$/.test(line));
97
+ if (start === -1)
98
+ return undefined;
99
+ for (const line of lines.slice(start + 1)) {
100
+ if (/^\S/.test(line))
101
+ break; // dedented back to another top-level key
102
+ const match = line.match(/^\s{1,4}([A-Za-z0-9._-]+):\s*$/);
103
+ if (match)
104
+ return match[1];
105
+ }
106
+ return undefined;
107
+ }
108
+ async function firstExisting(root, names) {
109
+ for (const name of names) {
110
+ if (await exists(join(root, name)))
111
+ return name;
112
+ }
113
+ return undefined;
114
+ }
115
+ function sanitizeName(raw) {
116
+ return raw.replace(/[^A-Za-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
117
+ }
118
+ async function exists(path) {
119
+ return access(path).then(() => true, () => false);
120
+ }
121
+ async function readText(path) {
122
+ try {
123
+ return await readFile(path, "utf8");
124
+ }
125
+ catch {
126
+ return undefined;
127
+ }
128
+ }
129
+ async function readJson(path) {
130
+ const text = await readText(path);
131
+ if (!text)
132
+ return undefined;
133
+ try {
134
+ const parsed = JSON.parse(text);
135
+ return parsed && typeof parsed === "object" ? parsed : undefined;
136
+ }
137
+ catch {
138
+ return undefined;
139
+ }
140
+ }
141
+ //# sourceMappingURL=service-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-detect.js","sourceRoot":"","sources":["../../src/core/service-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { SshServerDefinition } from "./types.js";
2
+ export interface SshServerSummary extends SshServerDefinition {
3
+ discovered: boolean;
4
+ saved: boolean;
5
+ }
6
+ export interface SshServerProbe {
7
+ host: string;
8
+ reachable: boolean;
9
+ latencyMs: number;
10
+ hostname?: string;
11
+ platform?: string;
12
+ error?: string;
13
+ }
14
+ export interface RemoteProcessMetric {
15
+ pid: number;
16
+ ppid: number;
17
+ user: string;
18
+ cpuPercent: number;
19
+ rssMb: number;
20
+ command: string;
21
+ }
22
+ export interface RemoteHostMetricSample {
23
+ t: number;
24
+ cpuPercent: number;
25
+ memoryUsedBytes: number;
26
+ memoryTotalBytes: number;
27
+ memoryUsedPercent: number;
28
+ loadAverage: [number, number, number];
29
+ uptimeSeconds: number;
30
+ logicalCpuCount: number;
31
+ disk: {
32
+ path: string;
33
+ totalBytes: number;
34
+ usedBytes: number;
35
+ availableBytes: number;
36
+ usedPercent: number;
37
+ } | null;
38
+ }
39
+ export interface RemoteHostMetrics {
40
+ host: string;
41
+ hostname: string;
42
+ platform: string;
43
+ current: RemoteHostMetricSample;
44
+ processes: RemoteProcessMetric[];
45
+ }
46
+ /** Explicit, concrete aliases from ~/.ssh/config. Wildcard patterns are omitted. */
47
+ export declare function parseSshConfigHosts(contents: string): string[];
48
+ export declare function discoverSshHosts(configPath?: string): Promise<string[]>;
49
+ export declare function mergeSshServers(saved: SshServerDefinition[], discoveredHosts: string[]): SshServerSummary[];
50
+ export declare function probeSshServer(host: string): Promise<SshServerProbe>;
51
+ export declare function readRemoteHostMetrics(host: string): Promise<RemoteHostMetrics>;
52
+ export declare function parseRemoteMetrics(host: string, output: string, sampledAt: number): RemoteHostMetrics;
@@ -0,0 +1,194 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ const execFileAsync = promisify(execFile);
7
+ const SSH_TIMEOUT_MS = 7_000;
8
+ const SSH_OPTIONS = [
9
+ "-o",
10
+ "BatchMode=yes",
11
+ "-o",
12
+ "ConnectTimeout=5",
13
+ ];
14
+ /** Explicit, concrete aliases from ~/.ssh/config. Wildcard patterns are omitted. */
15
+ export function parseSshConfigHosts(contents) {
16
+ const hosts = new Set();
17
+ for (const rawLine of contents.split(/\r?\n/)) {
18
+ const line = rawLine.trim();
19
+ const match = /^Host\s+(.+)$/i.exec(line);
20
+ if (!match)
21
+ continue;
22
+ for (const candidate of (match[1] ?? "").split(/\s+/)) {
23
+ if (!candidate || /[*?!]/.test(candidate) || candidate.startsWith("-"))
24
+ continue;
25
+ hosts.add(candidate);
26
+ }
27
+ }
28
+ return [...hosts].sort((a, b) => a.localeCompare(b));
29
+ }
30
+ export async function discoverSshHosts(configPath = join(homedir(), ".ssh", "config")) {
31
+ const contents = await readFile(configPath, "utf8").catch(() => "");
32
+ return parseSshConfigHosts(contents);
33
+ }
34
+ export function mergeSshServers(saved, discoveredHosts) {
35
+ const savedByHost = new Map(saved.map((server) => [server.host, server]));
36
+ const hosts = new Set([...discoveredHosts, ...savedByHost.keys()]);
37
+ return [...hosts]
38
+ .sort((a, b) => a.localeCompare(b))
39
+ .map((host) => ({
40
+ host,
41
+ ...savedByHost.get(host),
42
+ discovered: discoveredHosts.includes(host),
43
+ saved: savedByHost.has(host),
44
+ }));
45
+ }
46
+ export async function probeSshServer(host) {
47
+ assertSafeSshHost(host);
48
+ const startedAt = Date.now();
49
+ try {
50
+ const { stdout } = await execFileAsync("ssh", [...SSH_OPTIONS, host, "printf 'NMI\\t'; hostname; uname -s"], { timeout: SSH_TIMEOUT_MS, maxBuffer: 64 * 1024 });
51
+ const lines = stdout.trim().split(/\r?\n/);
52
+ const first = lines[0]?.split("\t") ?? [];
53
+ if (first[0] !== "NMI")
54
+ throw new Error("Remote probe returned an unexpected response.");
55
+ return {
56
+ host,
57
+ reachable: true,
58
+ latencyMs: Date.now() - startedAt,
59
+ hostname: first[1]?.trim() || undefined,
60
+ platform: lines[1]?.trim() || undefined,
61
+ };
62
+ }
63
+ catch (error) {
64
+ return {
65
+ host,
66
+ reachable: false,
67
+ latencyMs: Date.now() - startedAt,
68
+ error: conciseSshError(error),
69
+ };
70
+ }
71
+ }
72
+ export async function readRemoteHostMetrics(host) {
73
+ assertSafeSshHost(host);
74
+ const { stdout } = await execFileAsync("ssh", [...SSH_OPTIONS, host, REMOTE_METRICS_COMMAND], { timeout: SSH_TIMEOUT_MS, maxBuffer: 2 * 1024 * 1024 });
75
+ return parseRemoteMetrics(host, stdout, Date.now());
76
+ }
77
+ export function parseRemoteMetrics(host, output, sampledAt) {
78
+ const lines = output.split(/\r?\n/);
79
+ const values = new Map();
80
+ const processes = [];
81
+ let readingProcesses = false;
82
+ for (const line of lines) {
83
+ if (line === "NMI_PROCESSES") {
84
+ readingProcesses = true;
85
+ continue;
86
+ }
87
+ if (readingProcesses) {
88
+ const match = /^\s*(\d+)\s+(\d+)\s+(\S+)\s+([\d.]+)\s+(\d+)\s+(.*)$/.exec(line);
89
+ if (!match)
90
+ continue;
91
+ processes.push({
92
+ pid: Number(match[1]),
93
+ ppid: Number(match[2]),
94
+ user: match[3] ?? "",
95
+ cpuPercent: Number(match[4]),
96
+ rssMb: Number(match[5]) / 1024,
97
+ command: match[6] ?? "",
98
+ });
99
+ continue;
100
+ }
101
+ const [key, ...rest] = line.split("\t");
102
+ if (key?.startsWith("NMI_"))
103
+ values.set(key, rest);
104
+ }
105
+ const meta = required(values, "NMI_META", 2);
106
+ const cpu = numberAt(values, "NMI_CPU", 0);
107
+ const memory = required(values, "NMI_MEMORY", 2).map(Number);
108
+ const load = required(values, "NMI_LOAD", 3).map(Number);
109
+ const uptimeSeconds = numberAt(values, "NMI_UPTIME", 0);
110
+ const logicalCpuCount = numberAt(values, "NMI_CPUS", 0);
111
+ const diskValues = values.get("NMI_DISK")?.map(Number);
112
+ const memoryTotalBytes = memory[0] * 1024;
113
+ const memoryAvailableBytes = memory[1] * 1024;
114
+ const memoryUsedBytes = Math.max(0, memoryTotalBytes - memoryAvailableBytes);
115
+ const disk = diskValues && diskValues.length >= 3
116
+ ? {
117
+ path: "/",
118
+ totalBytes: diskValues[0] * 1024,
119
+ usedBytes: diskValues[1] * 1024,
120
+ availableBytes: diskValues[2] * 1024,
121
+ usedPercent: percent(diskValues[1], diskValues[0]),
122
+ }
123
+ : null;
124
+ return {
125
+ host,
126
+ hostname: meta[0] ?? host,
127
+ platform: meta[1] ?? "Linux",
128
+ current: {
129
+ t: sampledAt,
130
+ cpuPercent: cpu,
131
+ memoryUsedBytes,
132
+ memoryTotalBytes,
133
+ memoryUsedPercent: percent(memoryUsedBytes, memoryTotalBytes),
134
+ loadAverage: load,
135
+ uptimeSeconds,
136
+ logicalCpuCount,
137
+ disk,
138
+ },
139
+ processes,
140
+ };
141
+ }
142
+ function assertSafeSshHost(host) {
143
+ if (!/^[A-Za-z0-9][A-Za-z0-9._:@-]*$/.test(host)) {
144
+ throw new Error("SSH host must be a host name or ~/.ssh/config alias.");
145
+ }
146
+ }
147
+ function conciseSshError(error) {
148
+ if (!(error instanceof Error))
149
+ return String(error);
150
+ const stderr = "stderr" in error ? String(error.stderr).trim() : "";
151
+ return (stderr || error.message).split(/\r?\n/).at(-1) ?? error.message;
152
+ }
153
+ function required(values, key, length) {
154
+ const value = values.get(key);
155
+ if (!value || value.length < length) {
156
+ throw new Error(`Remote metrics response is missing ${key}.`);
157
+ }
158
+ return value;
159
+ }
160
+ function numberAt(values, key, index) {
161
+ const value = Number(required(values, key, index + 1)[index]);
162
+ if (!Number.isFinite(value))
163
+ throw new Error(`Remote metrics response has invalid ${key}.`);
164
+ return value;
165
+ }
166
+ function percent(value, total) {
167
+ if (total <= 0)
168
+ return 0;
169
+ return Math.round(Math.min(100, Math.max(0, (value / total) * 100)) * 10) / 10;
170
+ }
171
+ // Linux-first, read-only probe. Output is deliberately tab/line based so the
172
+ // remote host needs only POSIX sh, awk, ps, and procfs — not Node or Python.
173
+ const REMOTE_METRICS_COMMAND = String.raw `LC_ALL=C sh -c '
174
+ read_cpu() { awk '\''/^cpu / { idle=$5+$6; total=0; for(i=2;i<=NF;i++) total+=$i; print idle, total; exit }'\'' /proc/stat; }
175
+ set -- $(read_cpu); idle1=$1; total1=$2
176
+ sleep 0.2
177
+ set -- $(read_cpu); idle2=$1; total2=$2
178
+ cpu=$(awk -v i1="$idle1" -v t1="$total1" -v i2="$idle2" -v t2="$total2" '\''BEGIN { d=t2-t1; if (d<=0) print "0.0"; else printf "%.1f", (1-(i2-i1)/d)*100 }'\'')
179
+ mem_total=$(awk '\''/^MemTotal:/ {print $2}'\'' /proc/meminfo)
180
+ mem_available=$(awk '\''/^MemAvailable:/ {print $2}'\'' /proc/meminfo)
181
+ set -- $(cat /proc/loadavg); load1=$1; load5=$2; load15=$3
182
+ set -- $(cat /proc/uptime); uptime=$1
183
+ set -- $(df -Pk / | tail -n 1); disk_total=$2; disk_used=$3; disk_available=$4
184
+ printf "NMI_META\t%s\t%s\n" "$(hostname)" "$(uname -s)"
185
+ printf "NMI_CPU\t%s\n" "$cpu"
186
+ printf "NMI_MEMORY\t%s\t%s\n" "$mem_total" "$mem_available"
187
+ printf "NMI_LOAD\t%s\t%s\t%s\n" "$load1" "$load5" "$load15"
188
+ printf "NMI_UPTIME\t%s\n" "$uptime"
189
+ printf "NMI_CPUS\t%s\n" "$(getconf _NPROCESSORS_ONLN 2>/dev/null || grep -c ^processor /proc/cpuinfo)"
190
+ printf "NMI_DISK\t%s\t%s\t%s\n" "$disk_total" "$disk_used" "$disk_available"
191
+ printf "NMI_PROCESSES\n"
192
+ ps -eo pid=,ppid=,user=,pcpu=,rss=,args= --sort=-pcpu | head -n 101
193
+ '`;
194
+ //# sourceMappingURL=ssh-servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-servers.js","sourceRoot":"","sources":["../../src/core/ssh-servers.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import type { InteractiveAgentProvider } from "./agent-terminal.js";
2
+ export declare const NODE_PTY_SPAWN_FAILURE = "posix_spawnp failed";
3
+ export declare function isNodePtySpawnHelperFailure(error: unknown): boolean;
4
+ /**
5
+ * Restore the executable bit on node-pty's fixed, platform-specific helper.
6
+ * The path is resolved from NoMoreIDE's own dependency; callers cannot choose
7
+ * a filesystem target through the terminal transport.
8
+ */
9
+ export declare function repairNodePtySpawnHelper(): string;
2
10
  export type TerminalState = "idle" | "running" | "exited" | "error";
3
11
  export interface TerminalSize {
4
12
  cols: number;
@@ -1,5 +1,25 @@
1
+ import { chmodSync } from "node:fs";
1
2
  import { createRequire } from "node:module";
3
+ import { dirname, join } from "node:path";
2
4
  const require = createRequire(import.meta.url);
5
+ export const NODE_PTY_SPAWN_FAILURE = "posix_spawnp failed";
6
+ export function isNodePtySpawnHelperFailure(error) {
7
+ return (typeof error === "string" && error.includes(NODE_PTY_SPAWN_FAILURE));
8
+ }
9
+ /**
10
+ * Restore the executable bit on node-pty's fixed, platform-specific helper.
11
+ * The path is resolved from NoMoreIDE's own dependency; callers cannot choose
12
+ * a filesystem target through the terminal transport.
13
+ */
14
+ export function repairNodePtySpawnHelper() {
15
+ if (process.platform !== "darwin") {
16
+ throw new Error("Automatic terminal repair is only available on macOS.");
17
+ }
18
+ const packagePath = require.resolve("node-pty/package.json");
19
+ const helperPath = join(dirname(packagePath), "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper");
20
+ chmodSync(helperPath, 0o755);
21
+ return helperPath;
22
+ }
3
23
  /**
4
24
  * Every xterm-backed PTY should advertise its real capabilities even when
5
25
  * NoMoreIDE itself was launched by a parent process that suppresses colour.
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-session.js","sourceRoot":"","sources":["../../src/core/terminal-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terminal-session.js","sourceRoot":"","sources":["../../src/core/terminal-session.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,19 @@ import type { PortBindingStatus } from "./port-utils.js";
3
3
  import type { Workflow } from "./workflows.js";
4
4
  import type { WorkflowTrigger } from "./workflow-triggers.js";
5
5
  export type ServiceKind = "local" | "docker-compose" | "ssh";
6
+ /**
7
+ * A reusable remote machine reached through the user's OpenSSH configuration.
8
+ * NoMoreIDE stores only presentation metadata; credentials remain owned by
9
+ * ~/.ssh/config and ssh-agent.
10
+ */
11
+ export interface SshServerDefinition {
12
+ /** Host alias passed to `ssh`, normally an explicit Host in ~/.ssh/config. */
13
+ host: string;
14
+ /** Optional human-friendly label; falls back to `host`. */
15
+ name?: string;
16
+ /** Free-form environment label such as Development, UAT, or Production. */
17
+ environment?: string;
18
+ }
6
19
  export interface ServiceDefinition {
7
20
  name: string;
8
21
  kind?: ServiceKind;
@@ -40,6 +53,11 @@ export interface GitRepositoryDefinition {
40
53
  activeWorktreePath?: string;
41
54
  /** GitHub identity used for API operations in this logical repository. */
42
55
  githubCredential?: GitHubCredentialSelection;
56
+ /**
57
+ * Vercel project this repository deploys, when the user pinned one. Absent
58
+ * means "infer it" — from `.vercel/project.json`, else the git remote.
59
+ */
60
+ vercelProjectId?: string;
43
61
  }
44
62
  export type GitHubCredentialSelection = {
45
63
  source: "gh";
@@ -134,6 +152,39 @@ export interface GitHubToken {
134
152
  login?: string;
135
153
  avatarUrl?: string;
136
154
  }
155
+ /**
156
+ * Commit author/committer for a GitHub account. Cached so the commit path can
157
+ * stamp an identity without an API round trip per commit.
158
+ */
159
+ export interface GitHubIdentity {
160
+ host: string;
161
+ login: string;
162
+ name: string;
163
+ email: string;
164
+ }
165
+ /**
166
+ * How the Vercel integration authenticates. `cli` holds no secret — the token
167
+ * is re-read from the Vercel CLI's own auth file each time, so `vercel logout`
168
+ * revokes NoMoreIDE's access too. `stored` carries a pasted token. `oauth` is
169
+ * the browser sign-in, whose access token expires hourly and is renewed from
170
+ * `refreshToken` (see `vercel-oauth.ts`).
171
+ */
172
+ export interface VercelConnection {
173
+ source: "cli" | "stored" | "oauth";
174
+ /** The pasted token (`stored`) or the current access token (`oauth`). Masked out of every API response. */
175
+ token?: string;
176
+ /** `oauth` only: renews `token`, and is itself rotated on every use. Masked like `token`. */
177
+ refreshToken?: string;
178
+ /** `oauth` only: epoch ms at which `token` expires. */
179
+ expiresAt?: number;
180
+ /** `oauth` only: the registered client the tokens belong to, needed to refresh them. */
181
+ clientId?: string;
182
+ /** Team scope. Absent means the personal account. */
183
+ teamId?: string;
184
+ teamSlug?: string;
185
+ /** Cached account identity, captured at connect time. */
186
+ username?: string;
187
+ }
137
188
  export interface ProjectPreferences {
138
189
  logs: {
139
190
  showTimestamps: boolean;
@@ -157,7 +208,12 @@ export interface NoMoreIdeConfig {
157
208
  gitBoardRepositories?: string[];
158
209
  databases: DatabaseConnection[];
159
210
  logSources: LogSourceDefinition[];
211
+ sshServers: SshServerDefinition[];
160
212
  githubTokens: GitHubToken[];
213
+ /** Resolved commit identities, keyed by host + login. */
214
+ githubIdentities: GitHubIdentity[];
215
+ /** How the Vercel integration authenticates; absent = not connected. */
216
+ vercel?: VercelConnection;
161
217
  /** User-saved git/GitHub workflows (forks/edits of the built-in templates). */
162
218
  workflows: Workflow[];
163
219
  /** Event→workflow bindings that auto-fire workflows (IDEAS #16). */
@@ -167,6 +223,12 @@ export interface NoMoreIdeConfig {
167
223
  * back to startup-agent detection.
168
224
  */
169
225
  chatProvider?: "claude" | "codex";
226
+ /**
227
+ * Model each agent CLI is pinned to. A missing entry means "let the CLI
228
+ * pick" — there is no model name that safely stands in for a provider's own
229
+ * default, so the absence is the signal.
230
+ */
231
+ chatModels?: Partial<Record<"claude" | "codex", string>>;
170
232
  preferences?: ProjectPreferences;
171
233
  }
172
234
  export type ServiceState = "stopped" | "starting" | "running" | "exited";