nomoreide 0.1.93 → 0.1.95

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 CHANGED
@@ -522,7 +522,7 @@ NoMoreIDE is designed to be **safe for AI agents to call without guard rails**:
522
522
  - Database writes require explicit unlock, preview, and commit
523
523
  - GitHub create/comment/merge tools require a configured token and explicit user intent
524
524
  - Config is scoped to `~/.config/nomoreide/config.json`
525
- - Logs are written only to `.nomoreide/logs/`
525
+ - Logs are written only to `~/.nomoreide/logs/`
526
526
 
527
527
  ---
528
528
 
@@ -12,9 +12,10 @@ export interface AgentSession {
12
12
  toolCount: number;
13
13
  }
14
14
  /**
15
- * Sessions are persisted to `.nomoreide/agent-sessions.json` (not kept only
16
- * in memory) because the MCP server and the web UI may run in different
17
- * processes — the UI must be able to list change-sets it didn't record.
15
+ * By default, sessions are persisted to `~/.nomoreide/agent-sessions.json`
16
+ * (not kept only in memory) because the MCP server and the web UI may run in
17
+ * different processes — the UI must be able to list change-sets it didn't
18
+ * record.
18
19
  */
19
20
  export declare class AgentSessionStore {
20
21
  private readonly filePath;
@@ -3,9 +3,10 @@ import { dirname } from "node:path";
3
3
  import { SnapshotManager } from "./snapshot-manager.js";
4
4
  const MAX_SESSIONS = 50;
5
5
  /**
6
- * Sessions are persisted to `.nomoreide/agent-sessions.json` (not kept only
7
- * in memory) because the MCP server and the web UI may run in different
8
- * processes — the UI must be able to list change-sets it didn't record.
6
+ * By default, sessions are persisted to `~/.nomoreide/agent-sessions.json`
7
+ * (not kept only in memory) because the MCP server and the web UI may run in
8
+ * different processes — the UI must be able to list change-sets it didn't
9
+ * record.
9
10
  */
10
11
  export class AgentSessionStore {
11
12
  filePath;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-sessions.js","sourceRoot":"","sources":["../../src/core/agent-sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-sessions.js","sourceRoot":"","sources":["../../src/core/agent-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type CpuInfo } from "node:os";
2
+ export interface CpuTimes {
3
+ idle: number;
4
+ total: number;
5
+ }
6
+ export interface DiskUsage {
7
+ path: string;
8
+ totalBytes: number;
9
+ usedBytes: number;
10
+ availableBytes: number;
11
+ usedPercent: number;
12
+ }
13
+ export interface HostMetricSample {
14
+ t: number;
15
+ cpuPercent: number | null;
16
+ memoryUsedBytes: number;
17
+ memoryTotalBytes: number;
18
+ memoryUsedPercent: number;
19
+ loadAverage: [number, number, number] | null;
20
+ uptimeSeconds: number;
21
+ logicalCpuCount: number;
22
+ disk: DiskUsage | null;
23
+ }
24
+ export interface HostMetricsReader {
25
+ cpuInfo(): CpuInfo[];
26
+ diskUsage(path: string): Promise<DiskUsage>;
27
+ freeMemoryBytes(): number;
28
+ loadAverage(): [number, number, number] | null;
29
+ totalMemoryBytes(): number;
30
+ uptimeSeconds(): number;
31
+ }
32
+ export declare class HostMetricsCollector {
33
+ private readonly path;
34
+ private readonly reader;
35
+ private previousCpu?;
36
+ constructor(path: string, reader?: HostMetricsReader);
37
+ sample(now?: number): Promise<HostMetricSample>;
38
+ }
39
+ export declare function summarizeCpuTimes(cpuInfo: CpuInfo[]): CpuTimes;
40
+ export declare function calculateCpuPercent(previous: CpuTimes | undefined, current: CpuTimes): number | null;
41
+ export declare function readDiskUsage(path: string): Promise<DiskUsage>;
@@ -0,0 +1,93 @@
1
+ import { statfs } from "node:fs/promises";
2
+ import { cpus, freemem, loadavg, platform, totalmem, uptime, } from "node:os";
3
+ export class HostMetricsCollector {
4
+ path;
5
+ reader;
6
+ previousCpu;
7
+ constructor(path, reader = defaultHostMetricsReader) {
8
+ this.path = path;
9
+ this.reader = reader;
10
+ }
11
+ async sample(now = Date.now()) {
12
+ const cpuInfo = this.reader.cpuInfo();
13
+ const currentCpu = summarizeCpuTimes(cpuInfo);
14
+ const cpuPercent = calculateCpuPercent(this.previousCpu, currentCpu);
15
+ this.previousCpu = currentCpu;
16
+ const memoryTotalBytes = Math.max(0, this.reader.totalMemoryBytes());
17
+ const memoryFreeBytes = clamp(this.reader.freeMemoryBytes(), 0, memoryTotalBytes);
18
+ const memoryUsedBytes = Math.max(0, memoryTotalBytes - memoryFreeBytes);
19
+ const disk = await this.reader.diskUsage(this.path).catch(() => null);
20
+ return {
21
+ t: now,
22
+ cpuPercent,
23
+ memoryUsedBytes,
24
+ memoryTotalBytes,
25
+ memoryUsedPercent: percent(memoryUsedBytes, memoryTotalBytes),
26
+ loadAverage: this.reader.loadAverage(),
27
+ uptimeSeconds: Math.max(0, this.reader.uptimeSeconds()),
28
+ logicalCpuCount: cpuInfo.length,
29
+ disk,
30
+ };
31
+ }
32
+ }
33
+ export function summarizeCpuTimes(cpuInfo) {
34
+ return cpuInfo.reduce((summary, cpu) => {
35
+ const total = cpu.times.user +
36
+ cpu.times.nice +
37
+ cpu.times.sys +
38
+ cpu.times.idle +
39
+ cpu.times.irq;
40
+ return {
41
+ idle: summary.idle + cpu.times.idle,
42
+ total: summary.total + total,
43
+ };
44
+ }, { idle: 0, total: 0 });
45
+ }
46
+ export function calculateCpuPercent(previous, current) {
47
+ if (!previous)
48
+ return null;
49
+ const totalDelta = current.total - previous.total;
50
+ const idleDelta = current.idle - previous.idle;
51
+ if (totalDelta <= 0)
52
+ return null;
53
+ return roundOne(clamp((1 - idleDelta / totalDelta) * 100, 0, 100));
54
+ }
55
+ export async function readDiskUsage(path) {
56
+ const stats = await statfs(path);
57
+ const blockSize = Number(stats.bsize);
58
+ const totalBytes = blockSize * Number(stats.blocks);
59
+ const availableBytes = blockSize * Number(stats.bavail);
60
+ const usedBytes = Math.max(0, totalBytes - blockSize * Number(stats.bfree));
61
+ return {
62
+ path,
63
+ totalBytes,
64
+ usedBytes,
65
+ availableBytes,
66
+ usedPercent: percent(usedBytes, totalBytes),
67
+ };
68
+ }
69
+ const defaultHostMetricsReader = {
70
+ cpuInfo: cpus,
71
+ diskUsage: readDiskUsage,
72
+ freeMemoryBytes: freemem,
73
+ loadAverage: () => {
74
+ if (platform() === "win32")
75
+ return null;
76
+ const [one, five, fifteen] = loadavg();
77
+ return [one ?? 0, five ?? 0, fifteen ?? 0];
78
+ },
79
+ totalMemoryBytes: totalmem,
80
+ uptimeSeconds: uptime,
81
+ };
82
+ function percent(value, total) {
83
+ if (total <= 0)
84
+ return 0;
85
+ return roundOne(clamp((value / total) * 100, 0, 100));
86
+ }
87
+ function clamp(value, minimum, maximum) {
88
+ return Math.min(maximum, Math.max(minimum, value));
89
+ }
90
+ function roundOne(value) {
91
+ return Math.round(value * 10) / 10;
92
+ }
93
+ //# sourceMappingURL=host-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-metrics.js","sourceRoot":"","sources":["../../src/core/host-metrics.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { ProcessManager } from "./process-manager.js";
2
+ import { HostMetricsCollector, type HostMetricSample } from "./host-metrics.js";
3
+ import { type ProcessTreeSummary } from "./process-tree.js";
2
4
  export interface MetricSample {
3
5
  t: number;
4
6
  cpu: number;
@@ -10,12 +12,32 @@ export interface MetricsSeries {
10
12
  sampleIntervalMs: number;
11
13
  samples: MetricSample[];
12
14
  }
15
+ export interface ServiceActivityMetric {
16
+ service: string;
17
+ startedAt?: string;
18
+ sampledAt: number;
19
+ cpuPercent: number;
20
+ rssMb: number;
21
+ processCount: number;
22
+ }
23
+ export interface ActivityMetrics {
24
+ sampleIntervalMs: number;
25
+ host: {
26
+ current: HostMetricSample | null;
27
+ samples: HostMetricSample[];
28
+ };
29
+ services: Record<string, ServiceActivityMetric>;
30
+ }
13
31
  export interface MetricsStoreOptions {
14
32
  manager: ProcessManager;
15
33
  /** Seconds between samples. */
16
34
  intervalMs?: number;
17
35
  /** Max samples kept per service (ring buffer). */
18
36
  capacity?: number;
37
+ cwd?: string;
38
+ hostCollector?: Pick<HostMetricsCollector, "sample">;
39
+ processTreeReader?: (rootPid: number) => Promise<ProcessTreeSummary>;
40
+ now?: () => number;
19
41
  }
20
42
  /**
21
43
  * In-memory CPU/RSS time series for managed services. Polls process trees on a
@@ -26,12 +48,17 @@ export declare class MetricsStore {
26
48
  private readonly manager;
27
49
  private readonly intervalMs;
28
50
  private readonly capacity;
51
+ private readonly hostCollector;
52
+ private readonly processTreeReader;
53
+ private readonly now;
29
54
  private readonly buffers;
55
+ private readonly hostSamples;
30
56
  private timer?;
31
57
  private sampling;
32
58
  constructor(options: MetricsStoreOptions);
33
59
  start(): void;
34
60
  stop(): void;
35
61
  read(service: string): MetricsSeries;
36
- private sampleOnce;
62
+ readActivity(): ActivityMetrics;
63
+ sampleOnce(): Promise<void>;
37
64
  }
@@ -1,4 +1,5 @@
1
- import { readProcessTree } from "./process-tree.js";
1
+ import { HostMetricsCollector, } from "./host-metrics.js";
2
+ import { readProcessTree, } from "./process-tree.js";
2
3
  /**
3
4
  * In-memory CPU/RSS time series for managed services. Polls process trees on a
4
5
  * fixed cadence; PIDs that disappear are kept in the buffer so the chart can
@@ -8,13 +9,21 @@ export class MetricsStore {
8
9
  manager;
9
10
  intervalMs;
10
11
  capacity;
12
+ hostCollector;
13
+ processTreeReader;
14
+ now;
11
15
  buffers = new Map();
16
+ hostSamples = [];
12
17
  timer;
13
18
  sampling = false;
14
19
  constructor(options) {
15
20
  this.manager = options.manager;
16
21
  this.intervalMs = options.intervalMs ?? 3000;
17
22
  this.capacity = options.capacity ?? 600;
23
+ this.hostCollector =
24
+ options.hostCollector ?? new HostMetricsCollector(options.cwd ?? process.cwd());
25
+ this.processTreeReader = options.processTreeReader ?? readProcessTree;
26
+ this.now = options.now ?? Date.now;
18
27
  }
19
28
  start() {
20
29
  if (this.timer)
@@ -22,6 +31,7 @@ export class MetricsStore {
22
31
  this.timer = setInterval(() => void this.sampleOnce(), this.intervalMs);
23
32
  if (typeof this.timer.unref === "function")
24
33
  this.timer.unref();
34
+ void this.sampleOnce();
25
35
  }
26
36
  stop() {
27
37
  if (this.timer) {
@@ -38,13 +48,43 @@ export class MetricsStore {
38
48
  samples: buffer ? [...buffer.samples] : [],
39
49
  };
40
50
  }
51
+ readActivity() {
52
+ const statuses = this.manager.status().services;
53
+ const services = {};
54
+ const currentHostSample = this.hostSamples.at(-1);
55
+ for (const [name, buffer] of this.buffers) {
56
+ const status = statuses[name];
57
+ if (status?.state !== "running" ||
58
+ !buffer.latest ||
59
+ buffer.startedAt !== status.startedAt) {
60
+ continue;
61
+ }
62
+ services[name] = {
63
+ service: name,
64
+ startedAt: buffer.startedAt,
65
+ sampledAt: buffer.latest.sampledAt,
66
+ cpuPercent: buffer.latest.tree.cpuPercent,
67
+ rssMb: buffer.latest.tree.rssMb,
68
+ processCount: buffer.latest.tree.processCount,
69
+ };
70
+ }
71
+ return {
72
+ sampleIntervalMs: this.intervalMs,
73
+ host: {
74
+ current: currentHostSample ? cloneHostSample(currentHostSample) : null,
75
+ samples: this.hostSamples.map(cloneHostSample),
76
+ },
77
+ services,
78
+ };
79
+ }
41
80
  async sampleOnce() {
42
81
  if (this.sampling)
43
82
  return;
44
83
  this.sampling = true;
45
84
  try {
46
85
  const { services } = this.manager.status();
47
- const now = Date.now();
86
+ const now = this.now();
87
+ const hostSample = this.hostCollector.sample(now).catch(() => undefined);
48
88
  await Promise.all(Object.values(services).map(async (status) => {
49
89
  if (status.state !== "running" || !status.pid)
50
90
  return;
@@ -55,8 +95,9 @@ export class MetricsStore {
55
95
  this.buffers.set(status.name, buffer);
56
96
  }
57
97
  try {
58
- const tree = await readProcessTree(status.pid);
98
+ const tree = await this.processTreeReader(status.pid);
59
99
  buffer.samples.push({ t: now, cpu: tree.cpuPercent, rss: tree.rssMb });
100
+ buffer.latest = { sampledAt: now, tree };
60
101
  if (buffer.samples.length > this.capacity) {
61
102
  buffer.samples.splice(0, buffer.samples.length - this.capacity);
62
103
  }
@@ -65,10 +106,24 @@ export class MetricsStore {
65
106
  // ps may briefly fail right after spawn / during exit — skip this tick.
66
107
  }
67
108
  }));
109
+ const nextHostSample = await hostSample;
110
+ if (nextHostSample) {
111
+ this.hostSamples.push(nextHostSample);
112
+ if (this.hostSamples.length > this.capacity) {
113
+ this.hostSamples.splice(0, this.hostSamples.length - this.capacity);
114
+ }
115
+ }
68
116
  }
69
117
  finally {
70
118
  this.sampling = false;
71
119
  }
72
120
  }
73
121
  }
122
+ function cloneHostSample(sample) {
123
+ return {
124
+ ...sample,
125
+ loadAverage: sample.loadAverage ? [...sample.loadAverage] : null,
126
+ disk: sample.disk ? { ...sample.disk } : null,
127
+ };
128
+ }
74
129
  //# sourceMappingURL=metrics-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-store.js","sourceRoot":"","sources":["../../src/core/metrics-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics-store.js","sourceRoot":"","sources":["../../src/core/metrics-store.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ interface StartNoMoreIdeMcpServerOptions {
27
27
  env?: NodeJS.ProcessEnv;
28
28
  createServer?: () => Pick<NoMoreIdeMcpServer, "server" | "daemon">;
29
29
  }
30
+ export declare function defaultMcpLogDir(): string;
30
31
  /**
31
32
  * The MCP process is a thin client: service operations go to the shared
32
33
  * daemon over HTTP; config, git, db, and agent tooling stay local because
@@ -1,4 +1,5 @@
1
- import { dirname, resolve } from "node:path";
1
+ import { homedir } from "node:os";
2
+ import { dirname, join, resolve } from "node:path";
2
3
  import { FastMCP } from "fastmcp";
3
4
  import { AgentSessionStore, createAgentSessionTracker, } from "../core/agent-sessions.js";
4
5
  import { ConfigStore, defaultGlobalConfigPath } from "../core/config-store.js";
@@ -16,6 +17,9 @@ export const NOMOREIDE_MCP_INSTRUCTIONS = [
16
17
  "For failures, inspect nomoreide_service_health, nomoreide_read_logs, nomoreide_timeline, and nomoreide_service_context before restarting, then verify health and logs afterward.",
17
18
  "If the project is not registered, explain that and use the NoMoreIDE onboarding or registration flow before managing it.",
18
19
  ].join(" ");
20
+ export function defaultMcpLogDir() {
21
+ return join(homedir(), ".nomoreide", "logs");
22
+ }
19
23
  /**
20
24
  * The MCP process is a thin client: service operations go to the shared
21
25
  * daemon over HTTP; config, git, db, and agent tooling stay local because
@@ -23,7 +27,7 @@ export const NOMOREIDE_MCP_INSTRUCTIONS = [
23
27
  */
24
28
  export function createNoMoreIdeMcpServer(options = {}) {
25
29
  const configPath = options.configPath ?? defaultGlobalConfigPath();
26
- const logDir = options.logDir ?? resolve(process.cwd(), ".nomoreide/logs");
30
+ const logDir = options.logDir ?? defaultMcpLogDir();
27
31
  const configStore = new ConfigStore(configPath);
28
32
  const logStore = new LogStore({
29
33
  baseDir: logDir,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}