@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.
Files changed (274) hide show
  1. package/README.md +270 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +188 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/commands/cleanup.d.ts +21 -0
  7. package/dist/commands/cleanup.d.ts.map +1 -0
  8. package/dist/commands/cleanup.js +380 -0
  9. package/dist/commands/cleanup.js.map +1 -0
  10. package/dist/commands/dispatch.d.ts +13 -0
  11. package/dist/commands/dispatch.d.ts.map +1 -0
  12. package/dist/commands/dispatch.js +85 -0
  13. package/dist/commands/dispatch.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +2 -0
  15. package/dist/commands/doctor.d.ts.map +1 -0
  16. package/dist/commands/doctor.js +155 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/generate.d.ts +3 -0
  19. package/dist/commands/generate.d.ts.map +1 -0
  20. package/dist/commands/generate.js +167 -0
  21. package/dist/commands/generate.js.map +1 -0
  22. package/dist/commands/init.d.ts +10 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +711 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/knowledge-sync.d.ts +69 -0
  27. package/dist/commands/knowledge-sync.d.ts.map +1 -0
  28. package/dist/commands/knowledge-sync.js +661 -0
  29. package/dist/commands/knowledge-sync.js.map +1 -0
  30. package/dist/commands/knowledge.d.ts +35 -0
  31. package/dist/commands/knowledge.d.ts.map +1 -0
  32. package/dist/commands/knowledge.js +254 -0
  33. package/dist/commands/knowledge.js.map +1 -0
  34. package/dist/commands/rollback.d.ts +13 -0
  35. package/dist/commands/rollback.d.ts.map +1 -0
  36. package/dist/commands/rollback.js +186 -0
  37. package/dist/commands/rollback.js.map +1 -0
  38. package/dist/commands/setup-config.d.ts +6 -0
  39. package/dist/commands/setup-config.d.ts.map +1 -0
  40. package/dist/commands/setup-config.js +663 -0
  41. package/dist/commands/setup-config.js.map +1 -0
  42. package/dist/commands/setup-project.d.ts +6 -0
  43. package/dist/commands/setup-project.d.ts.map +1 -0
  44. package/dist/commands/setup-project.js +361 -0
  45. package/dist/commands/setup-project.js.map +1 -0
  46. package/dist/commands/setup.d.ts +3 -0
  47. package/dist/commands/setup.d.ts.map +1 -0
  48. package/dist/commands/setup.js +293 -0
  49. package/dist/commands/setup.js.map +1 -0
  50. package/dist/commands/status.d.ts +51 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +182 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/commands/uninstall.d.ts +3 -0
  55. package/dist/commands/uninstall.d.ts.map +1 -0
  56. package/dist/commands/uninstall.js +173 -0
  57. package/dist/commands/uninstall.js.map +1 -0
  58. package/dist/commands/update.d.ts +10 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +435 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/commands/worktree.d.ts +30 -0
  63. package/dist/commands/worktree.d.ts.map +1 -0
  64. package/dist/commands/worktree.js +262 -0
  65. package/dist/commands/worktree.js.map +1 -0
  66. package/dist/generator/claude-cli.d.ts +24 -0
  67. package/dist/generator/claude-cli.d.ts.map +1 -0
  68. package/dist/generator/claude-cli.js +239 -0
  69. package/dist/generator/claude-cli.js.map +1 -0
  70. package/dist/generator/prompt-builder.d.ts +7 -0
  71. package/dist/generator/prompt-builder.d.ts.map +1 -0
  72. package/dist/generator/prompt-builder.js +144 -0
  73. package/dist/generator/prompt-builder.js.map +1 -0
  74. package/dist/index.d.ts +36 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +45 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/mcp/embeddings.d.ts +53 -0
  79. package/dist/mcp/embeddings.d.ts.map +1 -0
  80. package/dist/mcp/embeddings.js +68 -0
  81. package/dist/mcp/embeddings.js.map +1 -0
  82. package/dist/mcp/hybrid-search.d.ts +25 -0
  83. package/dist/mcp/hybrid-search.d.ts.map +1 -0
  84. package/dist/mcp/hybrid-search.js +72 -0
  85. package/dist/mcp/hybrid-search.js.map +1 -0
  86. package/dist/mcp/knowledge-server.d.ts +4 -0
  87. package/dist/mcp/knowledge-server.d.ts.map +1 -0
  88. package/dist/mcp/knowledge-server.js +294 -0
  89. package/dist/mcp/knowledge-server.js.map +1 -0
  90. package/dist/mcp/knowledge-utils.d.ts +65 -0
  91. package/dist/mcp/knowledge-utils.d.ts.map +1 -0
  92. package/dist/mcp/knowledge-utils.js +207 -0
  93. package/dist/mcp/knowledge-utils.js.map +1 -0
  94. package/dist/mcp/search-factory.d.ts +9 -0
  95. package/dist/mcp/search-factory.d.ts.map +1 -0
  96. package/dist/mcp/search-factory.js +23 -0
  97. package/dist/mcp/search-factory.js.map +1 -0
  98. package/dist/mcp/search-index.d.ts +45 -0
  99. package/dist/mcp/search-index.d.ts.map +1 -0
  100. package/dist/mcp/search-index.js +2 -0
  101. package/dist/mcp/search-index.js.map +1 -0
  102. package/dist/mcp/search-minisearch.d.ts +46 -0
  103. package/dist/mcp/search-minisearch.d.ts.map +1 -0
  104. package/dist/mcp/search-minisearch.js +99 -0
  105. package/dist/mcp/search-minisearch.js.map +1 -0
  106. package/dist/mcp/search-sqlite.d.ts +30 -0
  107. package/dist/mcp/search-sqlite.d.ts.map +1 -0
  108. package/dist/mcp/search-sqlite.js +188 -0
  109. package/dist/mcp/search-sqlite.js.map +1 -0
  110. package/dist/mcp/vector-store.d.ts +52 -0
  111. package/dist/mcp/vector-store.d.ts.map +1 -0
  112. package/dist/mcp/vector-store.js +183 -0
  113. package/dist/mcp/vector-store.js.map +1 -0
  114. package/dist/scaffold/copy-core-agents.d.ts +2 -0
  115. package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
  116. package/dist/scaffold/copy-core-agents.js +90 -0
  117. package/dist/scaffold/copy-core-agents.js.map +1 -0
  118. package/dist/scaffold/create-claude-settings.d.ts +40 -0
  119. package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
  120. package/dist/scaffold/create-claude-settings.js +422 -0
  121. package/dist/scaffold/create-claude-settings.js.map +1 -0
  122. package/dist/scaffold/create-config.d.ts +14 -0
  123. package/dist/scaffold/create-config.d.ts.map +1 -0
  124. package/dist/scaffold/create-config.js +199 -0
  125. package/dist/scaffold/create-config.js.map +1 -0
  126. package/dist/scaffold/create-project-description.d.ts +12 -0
  127. package/dist/scaffold/create-project-description.d.ts.map +1 -0
  128. package/dist/scaffold/create-project-description.js +104 -0
  129. package/dist/scaffold/create-project-description.js.map +1 -0
  130. package/dist/scaffold/create-structure.d.ts +2 -0
  131. package/dist/scaffold/create-structure.d.ts.map +1 -0
  132. package/dist/scaffold/create-structure.js +146 -0
  133. package/dist/scaffold/create-structure.js.map +1 -0
  134. package/dist/types/dependency-analysis.d.ts +11 -0
  135. package/dist/types/dependency-analysis.d.ts.map +1 -0
  136. package/dist/types/dependency-analysis.js +2 -0
  137. package/dist/types/dependency-analysis.js.map +1 -0
  138. package/dist/types/index.d.ts +526 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +3 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/types/task.d.ts +25 -0
  143. package/dist/types/task.d.ts.map +1 -0
  144. package/dist/types/task.js +3 -0
  145. package/dist/types/task.js.map +1 -0
  146. package/dist/utils/analyze-files.d.ts +7 -0
  147. package/dist/utils/analyze-files.d.ts.map +1 -0
  148. package/dist/utils/analyze-files.js +27 -0
  149. package/dist/utils/analyze-files.js.map +1 -0
  150. package/dist/utils/backup.d.ts +102 -0
  151. package/dist/utils/backup.d.ts.map +1 -0
  152. package/dist/utils/backup.js +352 -0
  153. package/dist/utils/backup.js.map +1 -0
  154. package/dist/utils/ci-provider.d.ts +23 -0
  155. package/dist/utils/ci-provider.d.ts.map +1 -0
  156. package/dist/utils/ci-provider.js +525 -0
  157. package/dist/utils/ci-provider.js.map +1 -0
  158. package/dist/utils/ci-status.d.ts +57 -0
  159. package/dist/utils/ci-status.d.ts.map +1 -0
  160. package/dist/utils/ci-status.js +349 -0
  161. package/dist/utils/ci-status.js.map +1 -0
  162. package/dist/utils/dependency-analysis.d.ts +34 -0
  163. package/dist/utils/dependency-analysis.d.ts.map +1 -0
  164. package/dist/utils/dependency-analysis.js +298 -0
  165. package/dist/utils/dependency-analysis.js.map +1 -0
  166. package/dist/utils/detect-git.d.ts +57 -0
  167. package/dist/utils/detect-git.d.ts.map +1 -0
  168. package/dist/utils/detect-git.js +439 -0
  169. package/dist/utils/detect-git.js.map +1 -0
  170. package/dist/utils/detect-mcp.d.ts +32 -0
  171. package/dist/utils/detect-mcp.d.ts.map +1 -0
  172. package/dist/utils/detect-mcp.js +178 -0
  173. package/dist/utils/detect-mcp.js.map +1 -0
  174. package/dist/utils/detect-project.d.ts +3 -0
  175. package/dist/utils/detect-project.d.ts.map +1 -0
  176. package/dist/utils/detect-project.js +155 -0
  177. package/dist/utils/detect-project.js.map +1 -0
  178. package/dist/utils/file-comparison.d.ts +89 -0
  179. package/dist/utils/file-comparison.d.ts.map +1 -0
  180. package/dist/utils/file-comparison.js +301 -0
  181. package/dist/utils/file-comparison.js.map +1 -0
  182. package/dist/utils/file-merger.d.ts +74 -0
  183. package/dist/utils/file-merger.d.ts.map +1 -0
  184. package/dist/utils/file-merger.js +350 -0
  185. package/dist/utils/file-merger.js.map +1 -0
  186. package/dist/utils/logger.d.ts +26 -0
  187. package/dist/utils/logger.d.ts.map +1 -0
  188. package/dist/utils/logger.js +72 -0
  189. package/dist/utils/logger.js.map +1 -0
  190. package/dist/utils/managed-process.d.ts +109 -0
  191. package/dist/utils/managed-process.d.ts.map +1 -0
  192. package/dist/utils/managed-process.js +481 -0
  193. package/dist/utils/managed-process.js.map +1 -0
  194. package/dist/utils/merge-claude-settings.d.ts +65 -0
  195. package/dist/utils/merge-claude-settings.d.ts.map +1 -0
  196. package/dist/utils/merge-claude-settings.js +133 -0
  197. package/dist/utils/merge-claude-settings.js.map +1 -0
  198. package/dist/utils/migration.d.ts +74 -0
  199. package/dist/utils/migration.d.ts.map +1 -0
  200. package/dist/utils/migration.js +345 -0
  201. package/dist/utils/migration.js.map +1 -0
  202. package/dist/utils/process-health.d.ts +51 -0
  203. package/dist/utils/process-health.d.ts.map +1 -0
  204. package/dist/utils/process-health.js +123 -0
  205. package/dist/utils/process-health.js.map +1 -0
  206. package/dist/utils/process-registry.d.ts +20 -0
  207. package/dist/utils/process-registry.d.ts.map +1 -0
  208. package/dist/utils/process-registry.js +151 -0
  209. package/dist/utils/process-registry.js.map +1 -0
  210. package/dist/utils/process-tree.d.ts +51 -0
  211. package/dist/utils/process-tree.d.ts.map +1 -0
  212. package/dist/utils/process-tree.js +499 -0
  213. package/dist/utils/process-tree.js.map +1 -0
  214. package/dist/utils/repair-mcp-config.d.ts +15 -0
  215. package/dist/utils/repair-mcp-config.d.ts.map +1 -0
  216. package/dist/utils/repair-mcp-config.js +129 -0
  217. package/dist/utils/repair-mcp-config.js.map +1 -0
  218. package/dist/utils/task-lifecycle.d.ts +60 -0
  219. package/dist/utils/task-lifecycle.d.ts.map +1 -0
  220. package/dist/utils/task-lifecycle.js +310 -0
  221. package/dist/utils/task-lifecycle.js.map +1 -0
  222. package/dist/utils/update-agent-mcp.d.ts +7 -0
  223. package/dist/utils/update-agent-mcp.d.ts.map +1 -0
  224. package/dist/utils/update-agent-mcp.js +115 -0
  225. package/dist/utils/update-agent-mcp.js.map +1 -0
  226. package/dist/utils/update-agent-templates.d.ts +6 -0
  227. package/dist/utils/update-agent-templates.d.ts.map +1 -0
  228. package/dist/utils/update-agent-templates.js +56 -0
  229. package/dist/utils/update-agent-templates.js.map +1 -0
  230. package/dist/utils/update-config-ci.d.ts +7 -0
  231. package/dist/utils/update-config-ci.d.ts.map +1 -0
  232. package/dist/utils/update-config-ci.js +72 -0
  233. package/dist/utils/update-config-ci.js.map +1 -0
  234. package/dist/utils/update-config-git.d.ts +18 -0
  235. package/dist/utils/update-config-git.d.ts.map +1 -0
  236. package/dist/utils/update-config-git.js +146 -0
  237. package/dist/utils/update-config-git.js.map +1 -0
  238. package/dist/utils/update-config-mcp.d.ts +7 -0
  239. package/dist/utils/update-config-mcp.d.ts.map +1 -0
  240. package/dist/utils/update-config-mcp.js +98 -0
  241. package/dist/utils/update-config-mcp.js.map +1 -0
  242. package/dist/utils/validate-config.d.ts +3 -0
  243. package/dist/utils/validate-config.d.ts.map +1 -0
  244. package/dist/utils/validate-config.js +109 -0
  245. package/dist/utils/validate-config.js.map +1 -0
  246. package/dist/utils/version-tracker.d.ts +130 -0
  247. package/dist/utils/version-tracker.d.ts.map +1 -0
  248. package/dist/utils/version-tracker.js +298 -0
  249. package/dist/utils/version-tracker.js.map +1 -0
  250. package/dist/utils/worktree.d.ts +68 -0
  251. package/dist/utils/worktree.d.ts.map +1 -0
  252. package/dist/utils/worktree.js +446 -0
  253. package/dist/utils/worktree.js.map +1 -0
  254. package/package.json +77 -0
  255. package/templates/ARCHAI_README.md +329 -0
  256. package/templates/CLAUDE.md +67 -0
  257. package/templates/PROMPTS.md +506 -0
  258. package/templates/core-agents/boss-agent.md +671 -0
  259. package/templates/core-agents/cleanup-agent.md +145 -0
  260. package/templates/core-agents/code-reviewer.md +175 -0
  261. package/templates/core-agents/critical-reviewer.md +117 -0
  262. package/templates/core-agents/deep-analyst.md +216 -0
  263. package/templates/core-agents/finalization-agent.md +252 -0
  264. package/templates/core-agents/git-coordinator.md +240 -0
  265. package/templates/core-agents/implementation-agent.md +151 -0
  266. package/templates/core-agents/maestro-agent.md +413 -0
  267. package/templates/core-agents/maestro-headless-agent.md +422 -0
  268. package/templates/core-agents/plan-validator.md +198 -0
  269. package/templates/core-agents/quick-fix.md +56 -0
  270. package/templates/core-agents/routing-templates.md +338 -0
  271. package/templates/core-agents/task-orchestrator.md +143 -0
  272. package/templates/core-agents/task-prep.md +202 -0
  273. package/templates/core-agents/tdd-designer.md +143 -0
  274. 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"}