@bhimudev/gnanai 0.4.0
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 +270 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +188 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/cleanup.d.ts +21 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +380 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/dispatch.d.ts +13 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +85 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +155 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +167 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +711 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge-sync.d.ts +69 -0
- package/dist/commands/knowledge-sync.d.ts.map +1 -0
- package/dist/commands/knowledge-sync.js +661 -0
- package/dist/commands/knowledge-sync.js.map +1 -0
- package/dist/commands/knowledge.d.ts +35 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +254 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +186 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/setup-config.d.ts +6 -0
- package/dist/commands/setup-config.d.ts.map +1 -0
- package/dist/commands/setup-config.js +663 -0
- package/dist/commands/setup-config.js.map +1 -0
- package/dist/commands/setup-project.d.ts +6 -0
- package/dist/commands/setup-project.d.ts.map +1 -0
- package/dist/commands/setup-project.js +361 -0
- package/dist/commands/setup-project.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +293 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +51 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +182 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +173 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +435 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/worktree.d.ts +30 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +262 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/generator/claude-cli.d.ts +24 -0
- package/dist/generator/claude-cli.d.ts.map +1 -0
- package/dist/generator/claude-cli.js +239 -0
- package/dist/generator/claude-cli.js.map +1 -0
- package/dist/generator/prompt-builder.d.ts +7 -0
- package/dist/generator/prompt-builder.d.ts.map +1 -0
- package/dist/generator/prompt-builder.js +144 -0
- package/dist/generator/prompt-builder.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/embeddings.d.ts +53 -0
- package/dist/mcp/embeddings.d.ts.map +1 -0
- package/dist/mcp/embeddings.js +68 -0
- package/dist/mcp/embeddings.js.map +1 -0
- package/dist/mcp/hybrid-search.d.ts +25 -0
- package/dist/mcp/hybrid-search.d.ts.map +1 -0
- package/dist/mcp/hybrid-search.js +72 -0
- package/dist/mcp/hybrid-search.js.map +1 -0
- package/dist/mcp/knowledge-server.d.ts +4 -0
- package/dist/mcp/knowledge-server.d.ts.map +1 -0
- package/dist/mcp/knowledge-server.js +294 -0
- package/dist/mcp/knowledge-server.js.map +1 -0
- package/dist/mcp/knowledge-utils.d.ts +65 -0
- package/dist/mcp/knowledge-utils.d.ts.map +1 -0
- package/dist/mcp/knowledge-utils.js +207 -0
- package/dist/mcp/knowledge-utils.js.map +1 -0
- package/dist/mcp/search-factory.d.ts +9 -0
- package/dist/mcp/search-factory.d.ts.map +1 -0
- package/dist/mcp/search-factory.js +23 -0
- package/dist/mcp/search-factory.js.map +1 -0
- package/dist/mcp/search-index.d.ts +45 -0
- package/dist/mcp/search-index.d.ts.map +1 -0
- package/dist/mcp/search-index.js +2 -0
- package/dist/mcp/search-index.js.map +1 -0
- package/dist/mcp/search-minisearch.d.ts +46 -0
- package/dist/mcp/search-minisearch.d.ts.map +1 -0
- package/dist/mcp/search-minisearch.js +99 -0
- package/dist/mcp/search-minisearch.js.map +1 -0
- package/dist/mcp/search-sqlite.d.ts +30 -0
- package/dist/mcp/search-sqlite.d.ts.map +1 -0
- package/dist/mcp/search-sqlite.js +188 -0
- package/dist/mcp/search-sqlite.js.map +1 -0
- package/dist/mcp/vector-store.d.ts +52 -0
- package/dist/mcp/vector-store.d.ts.map +1 -0
- package/dist/mcp/vector-store.js +183 -0
- package/dist/mcp/vector-store.js.map +1 -0
- package/dist/scaffold/copy-core-agents.d.ts +2 -0
- package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
- package/dist/scaffold/copy-core-agents.js +90 -0
- package/dist/scaffold/copy-core-agents.js.map +1 -0
- package/dist/scaffold/create-claude-settings.d.ts +40 -0
- package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
- package/dist/scaffold/create-claude-settings.js +422 -0
- package/dist/scaffold/create-claude-settings.js.map +1 -0
- package/dist/scaffold/create-config.d.ts +14 -0
- package/dist/scaffold/create-config.d.ts.map +1 -0
- package/dist/scaffold/create-config.js +199 -0
- package/dist/scaffold/create-config.js.map +1 -0
- package/dist/scaffold/create-project-description.d.ts +12 -0
- package/dist/scaffold/create-project-description.d.ts.map +1 -0
- package/dist/scaffold/create-project-description.js +104 -0
- package/dist/scaffold/create-project-description.js.map +1 -0
- package/dist/scaffold/create-structure.d.ts +2 -0
- package/dist/scaffold/create-structure.d.ts.map +1 -0
- package/dist/scaffold/create-structure.js +146 -0
- package/dist/scaffold/create-structure.js.map +1 -0
- package/dist/types/dependency-analysis.d.ts +11 -0
- package/dist/types/dependency-analysis.d.ts.map +1 -0
- package/dist/types/dependency-analysis.js +2 -0
- package/dist/types/dependency-analysis.js.map +1 -0
- package/dist/types/index.d.ts +526 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/task.d.ts +25 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +3 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/analyze-files.d.ts +7 -0
- package/dist/utils/analyze-files.d.ts.map +1 -0
- package/dist/utils/analyze-files.js +27 -0
- package/dist/utils/analyze-files.js.map +1 -0
- package/dist/utils/backup.d.ts +102 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +352 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/ci-provider.d.ts +23 -0
- package/dist/utils/ci-provider.d.ts.map +1 -0
- package/dist/utils/ci-provider.js +525 -0
- package/dist/utils/ci-provider.js.map +1 -0
- package/dist/utils/ci-status.d.ts +57 -0
- package/dist/utils/ci-status.d.ts.map +1 -0
- package/dist/utils/ci-status.js +349 -0
- package/dist/utils/ci-status.js.map +1 -0
- package/dist/utils/dependency-analysis.d.ts +34 -0
- package/dist/utils/dependency-analysis.d.ts.map +1 -0
- package/dist/utils/dependency-analysis.js +298 -0
- package/dist/utils/dependency-analysis.js.map +1 -0
- package/dist/utils/detect-git.d.ts +57 -0
- package/dist/utils/detect-git.d.ts.map +1 -0
- package/dist/utils/detect-git.js +439 -0
- package/dist/utils/detect-git.js.map +1 -0
- package/dist/utils/detect-mcp.d.ts +32 -0
- package/dist/utils/detect-mcp.d.ts.map +1 -0
- package/dist/utils/detect-mcp.js +178 -0
- package/dist/utils/detect-mcp.js.map +1 -0
- package/dist/utils/detect-project.d.ts +3 -0
- package/dist/utils/detect-project.d.ts.map +1 -0
- package/dist/utils/detect-project.js +155 -0
- package/dist/utils/detect-project.js.map +1 -0
- package/dist/utils/file-comparison.d.ts +89 -0
- package/dist/utils/file-comparison.d.ts.map +1 -0
- package/dist/utils/file-comparison.js +301 -0
- package/dist/utils/file-comparison.js.map +1 -0
- package/dist/utils/file-merger.d.ts +74 -0
- package/dist/utils/file-merger.d.ts.map +1 -0
- package/dist/utils/file-merger.js +350 -0
- package/dist/utils/file-merger.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/managed-process.d.ts +109 -0
- package/dist/utils/managed-process.d.ts.map +1 -0
- package/dist/utils/managed-process.js +481 -0
- package/dist/utils/managed-process.js.map +1 -0
- package/dist/utils/merge-claude-settings.d.ts +65 -0
- package/dist/utils/merge-claude-settings.d.ts.map +1 -0
- package/dist/utils/merge-claude-settings.js +133 -0
- package/dist/utils/merge-claude-settings.js.map +1 -0
- package/dist/utils/migration.d.ts +74 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +345 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/process-health.d.ts +51 -0
- package/dist/utils/process-health.d.ts.map +1 -0
- package/dist/utils/process-health.js +123 -0
- package/dist/utils/process-health.js.map +1 -0
- package/dist/utils/process-registry.d.ts +20 -0
- package/dist/utils/process-registry.d.ts.map +1 -0
- package/dist/utils/process-registry.js +151 -0
- package/dist/utils/process-registry.js.map +1 -0
- package/dist/utils/process-tree.d.ts +51 -0
- package/dist/utils/process-tree.d.ts.map +1 -0
- package/dist/utils/process-tree.js +499 -0
- package/dist/utils/process-tree.js.map +1 -0
- package/dist/utils/repair-mcp-config.d.ts +15 -0
- package/dist/utils/repair-mcp-config.d.ts.map +1 -0
- package/dist/utils/repair-mcp-config.js +129 -0
- package/dist/utils/repair-mcp-config.js.map +1 -0
- package/dist/utils/task-lifecycle.d.ts +60 -0
- package/dist/utils/task-lifecycle.d.ts.map +1 -0
- package/dist/utils/task-lifecycle.js +310 -0
- package/dist/utils/task-lifecycle.js.map +1 -0
- package/dist/utils/update-agent-mcp.d.ts +7 -0
- package/dist/utils/update-agent-mcp.d.ts.map +1 -0
- package/dist/utils/update-agent-mcp.js +115 -0
- package/dist/utils/update-agent-mcp.js.map +1 -0
- package/dist/utils/update-agent-templates.d.ts +6 -0
- package/dist/utils/update-agent-templates.d.ts.map +1 -0
- package/dist/utils/update-agent-templates.js +56 -0
- package/dist/utils/update-agent-templates.js.map +1 -0
- package/dist/utils/update-config-ci.d.ts +7 -0
- package/dist/utils/update-config-ci.d.ts.map +1 -0
- package/dist/utils/update-config-ci.js +72 -0
- package/dist/utils/update-config-ci.js.map +1 -0
- package/dist/utils/update-config-git.d.ts +18 -0
- package/dist/utils/update-config-git.d.ts.map +1 -0
- package/dist/utils/update-config-git.js +146 -0
- package/dist/utils/update-config-git.js.map +1 -0
- package/dist/utils/update-config-mcp.d.ts +7 -0
- package/dist/utils/update-config-mcp.d.ts.map +1 -0
- package/dist/utils/update-config-mcp.js +98 -0
- package/dist/utils/update-config-mcp.js.map +1 -0
- package/dist/utils/validate-config.d.ts +3 -0
- package/dist/utils/validate-config.d.ts.map +1 -0
- package/dist/utils/validate-config.js +109 -0
- package/dist/utils/validate-config.js.map +1 -0
- package/dist/utils/version-tracker.d.ts +130 -0
- package/dist/utils/version-tracker.d.ts.map +1 -0
- package/dist/utils/version-tracker.js +298 -0
- package/dist/utils/version-tracker.js.map +1 -0
- package/dist/utils/worktree.d.ts +68 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +446 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +77 -0
- package/templates/ARCHAI_README.md +329 -0
- package/templates/CLAUDE.md +67 -0
- package/templates/PROMPTS.md +506 -0
- package/templates/core-agents/boss-agent.md +671 -0
- package/templates/core-agents/cleanup-agent.md +145 -0
- package/templates/core-agents/code-reviewer.md +175 -0
- package/templates/core-agents/critical-reviewer.md +117 -0
- package/templates/core-agents/deep-analyst.md +216 -0
- package/templates/core-agents/finalization-agent.md +252 -0
- package/templates/core-agents/git-coordinator.md +240 -0
- package/templates/core-agents/implementation-agent.md +151 -0
- package/templates/core-agents/maestro-agent.md +413 -0
- package/templates/core-agents/maestro-headless-agent.md +422 -0
- package/templates/core-agents/plan-validator.md +198 -0
- package/templates/core-agents/quick-fix.md +56 -0
- package/templates/core-agents/routing-templates.md +338 -0
- package/templates/core-agents/task-orchestrator.md +143 -0
- package/templates/core-agents/task-prep.md +202 -0
- package/templates/core-agents/tdd-designer.md +143 -0
- package/templates/specialist-meta.md +275 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-demand health assessment for tracked processes.
|
|
3
|
+
*
|
|
4
|
+
* Pure classification logic (`classifyHealth`) plus I/O wrappers
|
|
5
|
+
* (`assessHealth`, `assessAll`) that resolve process data from
|
|
6
|
+
* in-process registry or cross-process state files.
|
|
7
|
+
*
|
|
8
|
+
* @module process-health
|
|
9
|
+
* @since Task-PROC-004
|
|
10
|
+
*/
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { ProcessRegistry } from './process-registry.js';
|
|
13
|
+
import { isAlive } from './process-tree.js';
|
|
14
|
+
const DEFAULT_STATE_DIR = path.join(process.cwd(), '.claude', 'state', 'proc');
|
|
15
|
+
/**
|
|
16
|
+
* Pure classification function — no I/O, no side effects.
|
|
17
|
+
* Exported for direct unit testing.
|
|
18
|
+
*
|
|
19
|
+
* Priority order: dead > zombie > stuck > idle > healthy.
|
|
20
|
+
*/
|
|
21
|
+
export function classifyHealth(data, alive, thresholds) {
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
const baseTime = data.lastEventTime ?? data.startTime;
|
|
24
|
+
const lastEventAge = Math.max(0, now - baseTime);
|
|
25
|
+
let status;
|
|
26
|
+
let details;
|
|
27
|
+
let recommendation;
|
|
28
|
+
if (!alive || data.state === 'exited') {
|
|
29
|
+
status = 'dead';
|
|
30
|
+
details = `Process not alive (pid: ${data.pid}, last state: ${data.state})`;
|
|
31
|
+
recommendation = 'Process has exited. Clean up state file if no longer needed.';
|
|
32
|
+
}
|
|
33
|
+
else if (data.state === 'result_received') {
|
|
34
|
+
status = 'zombie';
|
|
35
|
+
details = `Result received but process still alive (state: ${data.state}, pid: ${data.pid})`;
|
|
36
|
+
recommendation = 'Process should have exited after result. Kill recommended.';
|
|
37
|
+
}
|
|
38
|
+
else if (lastEventAge >= thresholds.stuckThresholdMs) {
|
|
39
|
+
status = 'stuck';
|
|
40
|
+
details = `No events for ${lastEventAge}ms (threshold: ${thresholds.stuckThresholdMs}ms)`;
|
|
41
|
+
recommendation = 'Process appears stuck. Consider killing and restarting.';
|
|
42
|
+
}
|
|
43
|
+
else if (lastEventAge >= thresholds.idleThresholdMs) {
|
|
44
|
+
status = 'idle';
|
|
45
|
+
details = `No events for ${lastEventAge}ms (threshold: ${thresholds.idleThresholdMs}ms)`;
|
|
46
|
+
recommendation = 'May be waiting for input or processing a large task';
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
status = 'healthy';
|
|
50
|
+
details = `Process alive, last event ${lastEventAge}ms ago (${data.eventCount} events)`;
|
|
51
|
+
recommendation = 'No action needed';
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
id: data.id,
|
|
55
|
+
pid: data.pid,
|
|
56
|
+
status,
|
|
57
|
+
state: data.state,
|
|
58
|
+
lastEventAge,
|
|
59
|
+
processAlive: alive,
|
|
60
|
+
details,
|
|
61
|
+
recommendation,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Assess the health of a single tracked process.
|
|
66
|
+
*
|
|
67
|
+
* Checks the in-process registry first (freshest data), then falls back
|
|
68
|
+
* to cross-process state files on disk.
|
|
69
|
+
*
|
|
70
|
+
* @returns ProcessHealthReport or null if process not found
|
|
71
|
+
*/
|
|
72
|
+
export function assessHealth(id, opts) {
|
|
73
|
+
const dir = opts?.stateDir ?? DEFAULT_STATE_DIR;
|
|
74
|
+
const thresholds = {
|
|
75
|
+
idleThresholdMs: opts?.idleThresholdMs ?? 60_000,
|
|
76
|
+
stuckThresholdMs: opts?.stuckThresholdMs ?? 300_000,
|
|
77
|
+
};
|
|
78
|
+
// In-process mode: check live registry first
|
|
79
|
+
const mp = ProcessRegistry.instance.get(id);
|
|
80
|
+
if (mp) {
|
|
81
|
+
const h = mp.health();
|
|
82
|
+
const startTime = Date.now() - h.uptime;
|
|
83
|
+
return classifyHealth({ id: mp.id, pid: h.pid, state: h.state, lastEventTime: h.lastEventTime, startTime, eventCount: h.eventCount }, h.alive, thresholds);
|
|
84
|
+
}
|
|
85
|
+
// Cross-process mode: read from disk
|
|
86
|
+
const stateData = ProcessRegistry.readOne(id, dir);
|
|
87
|
+
if (!stateData)
|
|
88
|
+
return null;
|
|
89
|
+
const processAlive = isAlive(stateData.pid);
|
|
90
|
+
return classifyHealth({ id: stateData.id, pid: stateData.pid, state: stateData.state, lastEventTime: stateData.lastEventTime, startTime: stateData.startTime, eventCount: stateData.eventCount }, processAlive, thresholds);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Assess the health of all tracked processes.
|
|
94
|
+
*
|
|
95
|
+
* Combines in-process registry entries with cross-process state files,
|
|
96
|
+
* deduplicating by ID (in-process wins).
|
|
97
|
+
*/
|
|
98
|
+
export function assessAll(opts) {
|
|
99
|
+
const dir = opts?.stateDir ?? DEFAULT_STATE_DIR;
|
|
100
|
+
const thresholds = {
|
|
101
|
+
idleThresholdMs: opts?.idleThresholdMs ?? 60_000,
|
|
102
|
+
stuckThresholdMs: opts?.stuckThresholdMs ?? 300_000,
|
|
103
|
+
};
|
|
104
|
+
const reports = [];
|
|
105
|
+
const inProcessIds = new Set();
|
|
106
|
+
// In-process: live ManagedProcesses
|
|
107
|
+
for (const mp of ProcessRegistry.instance.getAll()) {
|
|
108
|
+
inProcessIds.add(mp.id);
|
|
109
|
+
const h = mp.health();
|
|
110
|
+
const startTime = Date.now() - h.uptime;
|
|
111
|
+
reports.push(classifyHealth({ id: mp.id, pid: h.pid, state: h.state, lastEventTime: h.lastEventTime, startTime, eventCount: h.eventCount }, h.alive, thresholds));
|
|
112
|
+
}
|
|
113
|
+
// Cross-process: disk state, skip in-process (dedup)
|
|
114
|
+
const diskStates = ProcessRegistry.readAll(dir);
|
|
115
|
+
for (const data of diskStates) {
|
|
116
|
+
if (inProcessIds.has(data.id))
|
|
117
|
+
continue;
|
|
118
|
+
const processAlive = isAlive(data.pid);
|
|
119
|
+
reports.push(classifyHealth({ id: data.id, pid: data.pid, state: data.state, lastEventTime: data.lastEventTime, startTime: data.startTime, eventCount: data.eventCount }, processAlive, thresholds));
|
|
120
|
+
}
|
|
121
|
+
return reports;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=process-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-health.js","sourceRoot":"","sources":["../../src/utils/process-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ManagedProcess } from './managed-process.js';
|
|
2
|
+
import type { ProcessStateInfo, HealthReport, KillResult } from '../types/index.js';
|
|
3
|
+
export declare class ProcessRegistry {
|
|
4
|
+
private static _instance;
|
|
5
|
+
private _map;
|
|
6
|
+
private constructor();
|
|
7
|
+
static get instance(): ProcessRegistry;
|
|
8
|
+
register(mp: ManagedProcess): void;
|
|
9
|
+
unregister(id: string): void;
|
|
10
|
+
get(id: string): ManagedProcess | null;
|
|
11
|
+
getAll(): ManagedProcess[];
|
|
12
|
+
healthAll(stateDir?: string): HealthReport[];
|
|
13
|
+
killAll(): Promise<KillResult[]>;
|
|
14
|
+
reconcile(stateDir?: string): void;
|
|
15
|
+
static readAll(stateDir: string): ProcessStateInfo[];
|
|
16
|
+
static readOne(id: string, stateDir: string): ProcessStateInfo | null;
|
|
17
|
+
static pruneStale(stateDir: string): void;
|
|
18
|
+
_resetForTesting(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=process-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry.d.ts","sourceRoot":"","sources":["../../src/utils/process-registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAwC,MAAM,sBAAsB,CAAC;AAG5F,OAAO,KAAK,EAAoB,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAItG,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAgC;IACxD,OAAO,CAAC,IAAI,CAA0C;IAEtD,OAAO;IAOP,MAAM,KAAK,QAAQ,IAAI,eAAe,CAKrC;IAED,QAAQ,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI;IAOlC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAItC,MAAM,IAAI,cAAc,EAAE;IAI1B,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IA8BtC,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAatC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAuDlC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAIpD,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIrE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKzC,gBAAgB,IAAI,IAAI;CAKzB"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { ProcessStateManager, setRegistryHook } from './managed-process.js';
|
|
4
|
+
import { isAlive } from './process-tree.js';
|
|
5
|
+
import { logger } from './logger.js';
|
|
6
|
+
const DEFAULT_STATE_DIR = path.join(process.cwd(), '.claude', 'state', 'proc');
|
|
7
|
+
export class ProcessRegistry {
|
|
8
|
+
static _instance = null;
|
|
9
|
+
_map = new Map();
|
|
10
|
+
constructor() {
|
|
11
|
+
setRegistryHook({
|
|
12
|
+
register: (mp) => this.register(mp),
|
|
13
|
+
unregister: (id) => this.unregister(id),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
static get instance() {
|
|
17
|
+
if (!ProcessRegistry._instance) {
|
|
18
|
+
ProcessRegistry._instance = new ProcessRegistry();
|
|
19
|
+
}
|
|
20
|
+
return ProcessRegistry._instance;
|
|
21
|
+
}
|
|
22
|
+
register(mp) {
|
|
23
|
+
if (this._map.has(mp.id)) {
|
|
24
|
+
logger.warn(`ProcessRegistry: overwriting existing entry for id '${mp.id}'`);
|
|
25
|
+
}
|
|
26
|
+
this._map.set(mp.id, mp);
|
|
27
|
+
}
|
|
28
|
+
unregister(id) {
|
|
29
|
+
this._map.delete(id);
|
|
30
|
+
}
|
|
31
|
+
get(id) {
|
|
32
|
+
return this._map.get(id) ?? null;
|
|
33
|
+
}
|
|
34
|
+
getAll() {
|
|
35
|
+
return [...this._map.values()];
|
|
36
|
+
}
|
|
37
|
+
healthAll(stateDir) {
|
|
38
|
+
const dir = stateDir ?? DEFAULT_STATE_DIR;
|
|
39
|
+
const reports = [];
|
|
40
|
+
const inProcessIds = new Set();
|
|
41
|
+
// In-process: live health from registered ManagedProcesses
|
|
42
|
+
for (const [id, mp] of this._map) {
|
|
43
|
+
inProcessIds.add(id);
|
|
44
|
+
reports.push(mp.health());
|
|
45
|
+
}
|
|
46
|
+
// Cross-process: read disk state files, skip in-process
|
|
47
|
+
// TODO(PROC-perf): batch isAlive checks when N > 10
|
|
48
|
+
const diskStates = ProcessStateManager.readAll(dir);
|
|
49
|
+
for (const data of diskStates) {
|
|
50
|
+
if (inProcessIds.has(data.id))
|
|
51
|
+
continue; // dedup: in-process wins
|
|
52
|
+
reports.push({
|
|
53
|
+
pid: data.pid,
|
|
54
|
+
alive: isAlive(data.pid),
|
|
55
|
+
state: data.state,
|
|
56
|
+
lastEventTime: data.lastEventTime,
|
|
57
|
+
eventCount: data.eventCount,
|
|
58
|
+
uptime: Date.now() - data.startTime,
|
|
59
|
+
treeSize: data.treeSnapshot?.length || 1,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return reports;
|
|
63
|
+
}
|
|
64
|
+
async killAll() {
|
|
65
|
+
const entries = [...this._map.values()]; // snapshot — mp.kill() triggers unregister
|
|
66
|
+
const results = [];
|
|
67
|
+
for (const mp of entries) {
|
|
68
|
+
try {
|
|
69
|
+
results.push(await mp.kill());
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
results.push({ killed: [], survived: [], errors: [String(err)] });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
reconcile(stateDir) {
|
|
78
|
+
const dir = stateDir ?? DEFAULT_STATE_DIR;
|
|
79
|
+
let files;
|
|
80
|
+
try {
|
|
81
|
+
files = fs.readdirSync(dir).filter(f => f.endsWith('.json'));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return; // dir doesn't exist — nothing to reconcile
|
|
85
|
+
}
|
|
86
|
+
for (const file of files) {
|
|
87
|
+
const filePath = path.join(dir, file);
|
|
88
|
+
let data;
|
|
89
|
+
// Step 1: Parse JSON
|
|
90
|
+
try {
|
|
91
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
92
|
+
data = JSON.parse(raw);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Corrupted JSON — delete with warning
|
|
96
|
+
logger.warn(`ProcessRegistry: deleting corrupted state file: ${file}`);
|
|
97
|
+
try {
|
|
98
|
+
fs.unlinkSync(filePath);
|
|
99
|
+
}
|
|
100
|
+
catch { /* best-effort */ }
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Skip in-process entries (live MP is the authority)
|
|
104
|
+
if (this._map.has(data.id))
|
|
105
|
+
continue;
|
|
106
|
+
// Skip already-exited
|
|
107
|
+
if (data.state === 'exited')
|
|
108
|
+
continue;
|
|
109
|
+
// Step 2: Dead check (PID-only)
|
|
110
|
+
if (!isAlive(data.pid)) {
|
|
111
|
+
// Update state file to exited (atomic write)
|
|
112
|
+
data.state = 'exited';
|
|
113
|
+
data.error = 'detected dead by reconcile';
|
|
114
|
+
try {
|
|
115
|
+
const tmpPath = filePath + '.tmp';
|
|
116
|
+
fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2));
|
|
117
|
+
fs.renameSync(tmpPath, filePath);
|
|
118
|
+
}
|
|
119
|
+
catch { /* best-effort */ }
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// Step 3: PID reuse check (PID + name)
|
|
123
|
+
if (!isAlive(data.pid, data.processName)) {
|
|
124
|
+
// PID reused by different process — prune
|
|
125
|
+
try {
|
|
126
|
+
fs.unlinkSync(filePath);
|
|
127
|
+
}
|
|
128
|
+
catch { /* best-effort */ }
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
// Step 4: Alive and matches — skip
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Static state file readers — delegate to ProcessStateManager
|
|
135
|
+
static readAll(stateDir) {
|
|
136
|
+
return ProcessStateManager.readAll(stateDir);
|
|
137
|
+
}
|
|
138
|
+
static readOne(id, stateDir) {
|
|
139
|
+
return ProcessStateManager.readOne(id, stateDir);
|
|
140
|
+
}
|
|
141
|
+
static pruneStale(stateDir) {
|
|
142
|
+
ProcessStateManager.pruneStale(stateDir);
|
|
143
|
+
}
|
|
144
|
+
// Test isolation
|
|
145
|
+
_resetForTesting() {
|
|
146
|
+
this._map.clear();
|
|
147
|
+
setRegistryHook(null);
|
|
148
|
+
ProcessRegistry._instance = null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=process-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-registry.js","sourceRoot":"","sources":["../../src/utils/process-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface ProcessNode {
|
|
2
|
+
pid: number;
|
|
3
|
+
ppid: number;
|
|
4
|
+
name: string;
|
|
5
|
+
cmd: string;
|
|
6
|
+
}
|
|
7
|
+
export interface KillResult {
|
|
8
|
+
killed: number[];
|
|
9
|
+
survived: number[];
|
|
10
|
+
errors: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface KillOptions {
|
|
13
|
+
gracePeriodMs?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get all processes (platform-dispatched).
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAllProcesses(): ProcessNode[];
|
|
19
|
+
/**
|
|
20
|
+
* Enumerate the full process tree rooted at rootPid, including root.
|
|
21
|
+
* Each node includes a `depth` field (root = 0).
|
|
22
|
+
* Returns empty array if rootPid is not found in the process table.
|
|
23
|
+
*/
|
|
24
|
+
export declare function enumerateTree(rootPid: number): (ProcessNode & {
|
|
25
|
+
depth: number;
|
|
26
|
+
})[];
|
|
27
|
+
/**
|
|
28
|
+
* Enumerate descendants of rootPid (NOT including root itself).
|
|
29
|
+
* Returns flat array of ProcessNode[].
|
|
30
|
+
*/
|
|
31
|
+
export declare function enumerateChildren(rootPid: number): ProcessNode[];
|
|
32
|
+
/**
|
|
33
|
+
* Check if a process is alive. Optionally verify process name matches.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isAlive(pid: number, expectedName?: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Find processes whose working directory or command line relates to dirPath.
|
|
38
|
+
* Excludes own PID.
|
|
39
|
+
*/
|
|
40
|
+
export declare function findByCwd(dirPath: string): ProcessNode[];
|
|
41
|
+
/**
|
|
42
|
+
* Kill a process tree rooted at rootPid. Synchronous.
|
|
43
|
+
* Returns accounting of killed/survived/errors.
|
|
44
|
+
*/
|
|
45
|
+
export declare function killTree(rootPid: number, opts?: KillOptions): KillResult;
|
|
46
|
+
/**
|
|
47
|
+
* Kill a single process by PID. Returns true if process is now dead.
|
|
48
|
+
* Self-PID protected: will not kill own process.
|
|
49
|
+
*/
|
|
50
|
+
export declare function killSingle(pid: number): boolean;
|
|
51
|
+
//# sourceMappingURL=process-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.d.ts","sourceRoot":"","sources":["../../src/utils/process-tree.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA6HD;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAI/C;AAwBD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,GACd,CAAC,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CA2CrC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAKhE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAKnE;AA4CD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAKxD;AA2CD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,UAAU,CAKZ;AAqJD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA+B/C"}
|