homaruscc 0.2.0 → 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 (53) hide show
  1. package/README.md +30 -9
  2. package/dashboard/dist/assets/index-CIzoeO8A.js +52 -0
  3. package/dashboard/dist/favicon.ico +0 -0
  4. package/dashboard/dist/favicon.png +0 -0
  5. package/dashboard/dist/index.html +15 -0
  6. package/dist/agent-registry.d.ts +9 -12
  7. package/dist/agent-registry.d.ts.map +1 -1
  8. package/dist/agent-registry.js +44 -113
  9. package/dist/agent-registry.js.map +1 -1
  10. package/dist/claude-code-registrar.d.ts +10 -0
  11. package/dist/claude-code-registrar.d.ts.map +1 -0
  12. package/dist/claude-code-registrar.js +71 -0
  13. package/dist/claude-code-registrar.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +28 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/compaction-manager.d.ts +24 -0
  19. package/dist/compaction-manager.d.ts.map +1 -1
  20. package/dist/compaction-manager.js +88 -7
  21. package/dist/compaction-manager.js.map +1 -1
  22. package/dist/dashboard-server.d.ts.map +1 -1
  23. package/dist/dashboard-server.js +348 -4
  24. package/dist/dashboard-server.js.map +1 -1
  25. package/dist/homaruscc.d.ts.map +1 -1
  26. package/dist/homaruscc.js +1 -2
  27. package/dist/homaruscc.js.map +1 -1
  28. package/dist/mcp-tools.d.ts.map +1 -1
  29. package/dist/mcp-tools.js +28 -0
  30. package/dist/mcp-tools.js.map +1 -1
  31. package/dist/memory-index.js +1 -1
  32. package/dist/memory-index.js.map +1 -1
  33. package/dist/scaffolder.d.ts +16 -0
  34. package/dist/scaffolder.d.ts.map +1 -0
  35. package/dist/scaffolder.js +154 -0
  36. package/dist/scaffolder.js.map +1 -0
  37. package/dist/session-checkpoint.d.ts +3 -0
  38. package/dist/session-checkpoint.d.ts.map +1 -1
  39. package/dist/session-checkpoint.js +24 -0
  40. package/dist/session-checkpoint.js.map +1 -1
  41. package/dist/telegram-adapter.d.ts +6 -0
  42. package/dist/telegram-adapter.d.ts.map +1 -1
  43. package/dist/telegram-adapter.js +151 -3
  44. package/dist/telegram-adapter.js.map +1 -1
  45. package/dist/transcript-logger.d.ts +10 -0
  46. package/dist/transcript-logger.d.ts.map +1 -1
  47. package/dist/transcript-logger.js +4 -0
  48. package/dist/transcript-logger.js.map +1 -1
  49. package/dist/wizard.d.ts +24 -0
  50. package/dist/wizard.d.ts.map +1 -0
  51. package/dist/wizard.js +146 -0
  52. package/dist/wizard.js.map +1 -0
  53. package/package.json +5 -1
Binary file
Binary file
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="icon" type="image/png" href="/favicon.png" />
7
+ <link rel="icon" type="image/x-icon" href="/favicon.ico" />
8
+ <link rel="apple-touch-icon" href="/favicon.png" />
9
+ <title>HomarUScc Dashboard</title>
10
+ <script type="module" crossorigin src="/assets/index-CIzoeO8A.js"></script>
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ </body>
15
+ </html>
@@ -1,11 +1,10 @@
1
1
  import type { Event, Logger } from "./types.js";
2
- export type AgentStatus = "running" | "completed" | "failed";
2
+ export type AgentStatus = "running" | "completed" | "failed" | "timeout";
3
3
  export interface AgentEntry {
4
4
  id: string;
5
5
  description: string;
6
6
  status: AgentStatus;
7
7
  startTime: number;
8
- outputFile?: string;
9
8
  result?: string;
10
9
  error?: string;
11
10
  }
@@ -14,11 +13,11 @@ export declare class AgentRegistry {
14
13
  private maxConcurrent;
15
14
  private emitFn;
16
15
  private logger;
17
- private pollIntervalMs;
18
- private pollTimer;
19
- constructor(logger: Logger, maxConcurrent?: number, pollIntervalMs?: number);
16
+ private timeoutMs;
17
+ private timeoutTimer;
18
+ constructor(logger: Logger, maxConcurrent?: number, timeoutMs?: number);
20
19
  setEmitter(fn: (event: Event) => void): void;
21
- register(id: string, description: string, outputFile?: string): boolean;
20
+ register(id: string, description: string): boolean;
22
21
  getAll(): AgentEntry[];
23
22
  get(id: string): AgentEntry | null;
24
23
  complete(id: string, result: string): void;
@@ -26,12 +25,10 @@ export declare class AgentRegistry {
26
25
  cleanup(id: string): void;
27
26
  getAvailableSlots(): number;
28
27
  getActiveCount(): number;
29
- startPolling(): void;
30
- stopPolling(): void;
31
- pollAgents(): void;
32
- private checkAgentFile;
33
- private readTail;
34
- private extractSummary;
28
+ private startTimeoutChecker;
29
+ private stopTimeoutChecker;
30
+ stop(): void;
31
+ private checkTimeouts;
35
32
  private resolve;
36
33
  private emit;
37
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../src/agent-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAWD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,SAAS,CAA+C;gBAEpD,MAAM,EAAE,MAAM,EAAE,aAAa,SAAI,EAAE,cAAc,SAAO;IAMpE,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI5C,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO;IAmBvE,MAAM,IAAI,UAAU,EAAE;IAItB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAKlC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAY1C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAYrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIzB,iBAAiB,IAAI,MAAM;IAI3B,cAAc,IAAI,MAAM;IASxB,YAAY,IAAI,IAAI;IAWpB,WAAW,IAAI,IAAI;IASnB,UAAU,IAAI,IAAI;IAiBlB,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,IAAI;CAcb"}
1
+ {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../src/agent-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAA+C;gBAEvD,MAAM,EAAE,MAAM,EAAE,aAAa,SAAI,EAAE,SAAS,SAAqB;IAM7E,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAI5C,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAwBlD,MAAM,IAAI,UAAU,EAAE;IAItB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAKlC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAY1C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAYrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQzB,iBAAiB,IAAI,MAAM;IAI3B,cAAc,IAAI,MAAM;IASxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,kBAAkB;IAO1B,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,IAAI;CAcb"}
@@ -1,30 +1,25 @@
1
- // CRC: crc-AgentRegistry.md | Seq: seq-agent-dispatch.md, seq-agent-poll.md
1
+ // CRC: crc-AgentRegistry.md | Seq: seq-agent-dispatch.md
2
2
  import { randomUUID } from "node:crypto";
3
- import { statSync, openSync, readSync, closeSync } from "node:fs";
4
- // R156: Completion markers found in Task agent JSONL output
5
- const COMPLETION_MARKERS = ['"stop_reason":"end_turn"', '"type":"result"'];
6
- // R156: Stable mtime threshold (ms) — file unchanged for this long is considered complete
7
- const STABLE_THRESHOLD_MS = 10_000;
8
- // R156: Number of bytes to read from file tail for marker detection
9
- const TAIL_BYTES = 512;
3
+ // Default timeout: 30 minutes
4
+ const DEFAULT_TIMEOUT_MS = 30 * 60 * 1000;
5
+ // How often to check for timed-out agents
6
+ const TIMEOUT_CHECK_INTERVAL_MS = 60_000;
10
7
  export class AgentRegistry {
11
8
  agents = new Map();
12
9
  maxConcurrent;
13
10
  emitFn = null;
14
11
  logger;
15
- // R155: Configurable poll interval
16
- pollIntervalMs;
17
- // R159: Global poll timer handle
18
- pollTimer = null;
19
- constructor(logger, maxConcurrent = 3, pollIntervalMs = 5000) {
12
+ timeoutMs;
13
+ timeoutTimer = null;
14
+ constructor(logger, maxConcurrent = 3, timeoutMs = DEFAULT_TIMEOUT_MS) {
20
15
  this.logger = logger;
21
16
  this.maxConcurrent = maxConcurrent;
22
- this.pollIntervalMs = pollIntervalMs;
17
+ this.timeoutMs = timeoutMs;
23
18
  }
24
19
  setEmitter(fn) {
25
20
  this.emitFn = fn;
26
21
  }
27
- register(id, description, outputFile) {
22
+ register(id, description) {
28
23
  const active = this.getActiveCount();
29
24
  if (active >= this.maxConcurrent) {
30
25
  this.logger.warn("Agent registry at capacity", { active, max: this.maxConcurrent });
@@ -35,9 +30,12 @@ export class AgentRegistry {
35
30
  description,
36
31
  status: "running",
37
32
  startTime: Date.now(),
38
- outputFile,
39
33
  });
40
34
  this.logger.info("Agent registered", { id, description });
35
+ // Start timeout checker if not already running
36
+ if (!this.timeoutTimer) {
37
+ this.startTimeoutChecker();
38
+ }
41
39
  return true;
42
40
  }
43
41
  getAll() {
@@ -46,7 +44,7 @@ export class AgentRegistry {
46
44
  get(id) {
47
45
  return this.agents.get(id) ?? null;
48
46
  }
49
- // R157, R162: Complete only if still running (prevents duplicate events)
47
+ // Called via POST /api/agents/:id/complete callback from the agent itself
50
48
  complete(id, result) {
51
49
  const agent = this.resolve(id);
52
50
  if (!agent)
@@ -62,14 +60,19 @@ export class AgentRegistry {
62
60
  const agent = this.resolve(id);
63
61
  if (!agent)
64
62
  return;
63
+ if (agent.status !== "running")
64
+ return;
65
65
  agent.status = "failed";
66
66
  agent.error = error;
67
67
  this.emit("agent_failed", id, agent.description, { error });
68
68
  this.logger.warn("Agent failed", { id, error });
69
69
  }
70
- // R160: Cleanup removes agent and any associated polling state
71
70
  cleanup(id) {
72
71
  this.agents.delete(id);
72
+ // Stop timeout checker if no agents remain
73
+ if (this.getActiveCount() === 0) {
74
+ this.stopTimeoutChecker();
75
+ }
73
76
  }
74
77
  getAvailableSlots() {
75
78
  return Math.max(0, this.maxConcurrent - this.getActiveCount());
@@ -82,110 +85,38 @@ export class AgentRegistry {
82
85
  }
83
86
  return count;
84
87
  }
85
- // R159: Start global polling interval
86
- startPolling() {
87
- if (this.pollTimer)
88
+ // Periodic check for agents that have exceeded the timeout
89
+ startTimeoutChecker() {
90
+ if (this.timeoutTimer)
88
91
  return;
89
- this.pollTimer = setInterval(() => this.pollAgents(), this.pollIntervalMs);
90
- // Unref so the timer does not keep the process alive during shutdown
91
- if (this.pollTimer && typeof this.pollTimer === "object" && "unref" in this.pollTimer) {
92
- this.pollTimer.unref();
93
- }
94
- this.logger.info("Agent completion polling started", { intervalMs: this.pollIntervalMs });
95
- }
96
- // R159: Stop global polling interval
97
- stopPolling() {
98
- if (this.pollTimer) {
99
- clearInterval(this.pollTimer);
100
- this.pollTimer = null;
101
- this.logger.info("Agent completion polling stopped");
92
+ this.timeoutTimer = setInterval(() => this.checkTimeouts(), TIMEOUT_CHECK_INTERVAL_MS);
93
+ if (this.timeoutTimer && typeof this.timeoutTimer === "object" && "unref" in this.timeoutTimer) {
94
+ this.timeoutTimer.unref();
102
95
  }
103
96
  }
104
- // R154, R158: Poll all running agents with outputFiles for completion
105
- pollAgents() {
106
- for (const agent of this.agents.values()) {
107
- // R158: Only poll running agents with an outputFile
108
- if (agent.status !== "running" || !agent.outputFile)
109
- continue;
110
- try {
111
- this.checkAgentFile(agent);
112
- }
113
- catch (err) {
114
- // R161: Log and skip on errors
115
- this.logger.debug("Poll check error for agent", {
116
- id: agent.id,
117
- error: String(err),
118
- });
119
- }
97
+ stopTimeoutChecker() {
98
+ if (this.timeoutTimer) {
99
+ clearInterval(this.timeoutTimer);
100
+ this.timeoutTimer = null;
120
101
  }
121
102
  }
122
- checkAgentFile(agent) {
123
- // R161: statSync may throw ENOENT if file does not exist yet
124
- let stat;
125
- try {
126
- stat = statSync(agent.outputFile);
127
- }
128
- catch {
129
- return; // File does not exist yet — skip
130
- }
131
- // Skip empty files
132
- if (stat.size === 0)
133
- return;
134
- // R156: Read the tail of the file
135
- const tail = this.readTail(agent.outputFile, stat.size);
136
- if (!tail)
137
- return;
138
- // R156: Check for completion markers in the tail
139
- const hasMarker = COMPLETION_MARKERS.some((m) => tail.includes(m));
140
- if (hasMarker) {
141
- this.logger.info("Detected completion marker in agent output", { id: agent.id });
142
- this.complete(agent.id, this.extractSummary(tail));
143
- return;
144
- }
145
- // R156: Check for stable mtime (no writes in STABLE_THRESHOLD_MS)
146
- const age = Date.now() - stat.mtimeMs;
147
- if (age >= STABLE_THRESHOLD_MS) {
148
- this.logger.info("Detected stable output file for agent", {
149
- id: agent.id,
150
- stableForMs: Math.round(age),
151
- });
152
- this.complete(agent.id, this.extractSummary(tail));
153
- }
103
+ stop() {
104
+ this.stopTimeoutChecker();
154
105
  }
155
- // Read the last `count` bytes of a file as a UTF-8 string
156
- readTail(filePath, fileSize) {
157
- const readSize = Math.min(TAIL_BYTES, fileSize);
158
- const offset = fileSize - readSize;
159
- const buf = Buffer.alloc(readSize);
160
- let fd = null;
161
- try {
162
- fd = openSync(filePath, "r");
163
- readSync(fd, buf, 0, readSize, offset);
164
- return buf.toString("utf-8");
165
- }
166
- catch {
167
- return null;
168
- }
169
- finally {
170
- if (fd !== null) {
171
- try {
172
- closeSync(fd);
173
- }
174
- catch { /* ignore */ }
106
+ checkTimeouts() {
107
+ const now = Date.now();
108
+ for (const agent of this.agents.values()) {
109
+ if (agent.status !== "running")
110
+ continue;
111
+ const elapsed = now - agent.startTime;
112
+ if (elapsed >= this.timeoutMs) {
113
+ agent.status = "timeout";
114
+ agent.error = `Agent timed out after ${Math.round(elapsed / 60_000)}m`;
115
+ this.emit("agent_timeout", agent.id, agent.description, { error: agent.error });
116
+ this.logger.warn("Agent timed out", { id: agent.id, elapsedMs: elapsed });
175
117
  }
176
118
  }
177
119
  }
178
- // Extract a brief summary from the file tail for the completion result
179
- extractSummary(tail) {
180
- // Try to find the last JSON line that looks like a result
181
- const lines = tail.split("\n").filter((l) => l.trim().length > 0);
182
- const lastLine = lines[lines.length - 1] ?? "";
183
- // Truncate to a reasonable length for the event payload
184
- if (lastLine.length > 200) {
185
- return lastLine.slice(0, 200) + "...";
186
- }
187
- return lastLine || "(output file completed)";
188
- }
189
120
  resolve(id) {
190
121
  const agent = this.agents.get(id);
191
122
  if (!agent) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../src/agent-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../src/agent-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Interface as ReadlineInterface } from "node:readline";
2
+ export declare class ClaudeCodeRegistrar {
3
+ private settingsLocations;
4
+ constructor();
5
+ detectSettingsFile(): string | null;
6
+ promptRegister(rl: ReadlineInterface): Promise<void>;
7
+ register(settingsPath: string): void;
8
+ private buildMcpEntry;
9
+ }
10
+ //# sourceMappingURL=claude-code-registrar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-registrar.d.ts","sourceRoot":"","sources":["../src/claude-code-registrar.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpE,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,iBAAiB,CAAW;;IAWpC,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAQ7B,cAAc,CAAC,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B1D,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAqBpC,OAAO,CAAC,aAAa;CAMtB"}
@@ -0,0 +1,71 @@
1
+ // CRC: crc-ClaudeCodeRegistrar.md | Seq: seq-first-run.md
2
+ // Detects Claude Code settings and registers HomarUScc as an MCP server.
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
4
+ import { resolve, dirname } from "node:path";
5
+ export class ClaudeCodeRegistrar {
6
+ settingsLocations;
7
+ constructor() {
8
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? "~";
9
+ this.settingsLocations = [
10
+ resolve(home, ".claude.json"),
11
+ resolve(home, ".claude", "settings.json"),
12
+ ];
13
+ }
14
+ // CRC: crc-ClaudeCodeRegistrar.md
15
+ detectSettingsFile() {
16
+ for (const path of this.settingsLocations) {
17
+ if (existsSync(path))
18
+ return path;
19
+ }
20
+ return null;
21
+ }
22
+ // CRC: crc-ClaudeCodeRegistrar.md
23
+ async promptRegister(rl) {
24
+ const settingsPath = this.detectSettingsFile();
25
+ if (!settingsPath) {
26
+ console.log("\n Claude Code settings not found. You can manually add HomarUScc later.");
27
+ console.log(" See: https://github.com/kcdjmaxx/homaruscc#claude-code-setup");
28
+ return;
29
+ }
30
+ console.log(`\n Found Claude Code settings at: ${settingsPath}`);
31
+ const answer = await new Promise((resolve) => {
32
+ rl.question(" Register HomarUScc as an MCP server? [Y/n]: ", resolve);
33
+ });
34
+ if (answer.trim().toLowerCase() === "n") {
35
+ console.log(" Skipped. You can add it manually later.");
36
+ return;
37
+ }
38
+ try {
39
+ this.register(settingsPath);
40
+ console.log(" HomarUScc registered in Claude Code settings.");
41
+ }
42
+ catch (err) {
43
+ console.log(` Could not update settings: ${String(err)}`);
44
+ console.log(" You can add it manually later.");
45
+ }
46
+ }
47
+ // CRC: crc-ClaudeCodeRegistrar.md
48
+ register(settingsPath) {
49
+ let settings = {};
50
+ if (existsSync(settingsPath)) {
51
+ const raw = readFileSync(settingsPath, "utf-8");
52
+ settings = JSON.parse(raw);
53
+ }
54
+ if (!settings.mcpServers || typeof settings.mcpServers !== "object") {
55
+ settings.mcpServers = {};
56
+ }
57
+ const mcpServers = settings.mcpServers;
58
+ mcpServers.homaruscc = this.buildMcpEntry();
59
+ // Ensure parent directory exists (for ~/.claude/settings.json case)
60
+ mkdirSync(dirname(settingsPath), { recursive: true });
61
+ writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
62
+ }
63
+ // CRC: crc-ClaudeCodeRegistrar.md
64
+ buildMcpEntry() {
65
+ return {
66
+ command: "npx",
67
+ args: ["homaruscc"],
68
+ };
69
+ }
70
+ }
71
+ //# sourceMappingURL=claude-code-registrar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-registrar.js","sourceRoot":"","sources":["../src/claude-code-registrar.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ // CRC: crc-Cli.md | Seq: seq-first-run.md, seq-normal-start.md
3
+ // CLI entry point — detects config and delegates to wizard or proxy.
4
+ import { existsSync } from "node:fs";
5
+ import { resolve } from "node:path";
6
+ // Seq: seq-first-run.md
7
+ function resolveConfigPath() {
8
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? "~";
9
+ return resolve(home, ".homaruscc", "config.json");
10
+ }
11
+ async function main() {
12
+ const configPath = resolveConfigPath();
13
+ if (existsSync(configPath)) {
14
+ // Seq: seq-normal-start.md
15
+ await import("./mcp-proxy.js");
16
+ }
17
+ else {
18
+ // Seq: seq-first-run.md
19
+ const { Wizard } = await import("./wizard.js");
20
+ const wizard = new Wizard();
21
+ await wizard.run();
22
+ }
23
+ }
24
+ main().catch((err) => {
25
+ process.stderr.write(`[FATAL] [cli] ${String(err)}\n`);
26
+ process.exit(1);
27
+ });
28
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,+DAA+D;AAC/D,qEAAqE;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAwB;AACxB,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC;IAChE,OAAO,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IAEvC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,2BAA2B;QAC3B,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,wBAAwB;QACxB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,11 +1,19 @@
1
1
  import type { Logger } from "./types.js";
2
2
  import type { HomarUScc } from "./homaruscc.js";
3
+ interface CompactionRecord {
4
+ timestamp: number;
5
+ loopRestarted: boolean;
6
+ }
3
7
  export declare class CompactionManager {
4
8
  private flushedThisCycle;
5
9
  private lastFlushTimestamp;
6
10
  private compactedSinceLastWake;
7
11
  private logger;
8
12
  private loop;
13
+ private compactionCount;
14
+ private compactionHistory;
15
+ private pendingCompaction;
16
+ private eventLoopActive;
9
17
  constructor(loop: HomarUScc, logger: Logger);
10
18
  handlePreCompact(): string;
11
19
  handlePostCompact(): string;
@@ -15,9 +23,25 @@ export declare class CompactionManager {
15
23
  * another compaction happens.
16
24
  */
17
25
  consumeCompactionFlag(): boolean;
26
+ /**
27
+ * Called when /api/wait is invoked (even without compaction flag).
28
+ * If there's a pending compaction that hasn't been consumed yet,
29
+ * this means the loop restarted via normal wake, not post-compaction wake.
30
+ */
31
+ markLoopActive(): void;
32
+ /** Called on first /api/wait — marks event loop as active for this backend lifetime */
33
+ setEventLoopActive(): void;
34
+ isEventLoopActive(): boolean;
18
35
  getFlushState(): {
19
36
  flushedThisCycle: boolean;
20
37
  lastFlushTimestamp: number;
21
38
  };
39
+ getCompactionStats(): {
40
+ count: number;
41
+ history: CompactionRecord[];
42
+ pending: CompactionRecord | null;
43
+ loopFailures: number;
44
+ };
22
45
  }
46
+ export {};
23
47
  //# sourceMappingURL=compaction-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compaction-manager.d.ts","sourceRoot":"","sources":["../src/compaction-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAY;gBAEZ,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;IAK3C,gBAAgB,IAAI,MAAM;IAsD1B,iBAAiB,IAAI,MAAM;IAuE3B;;;;OAIG;IACH,qBAAqB,IAAI,OAAO;IAQhC,aAAa,IAAI;QAAE,gBAAgB,EAAE,OAAO,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE;CAM3E"}
1
+ {"version":3,"file":"compaction-manager.d.ts","sourceRoot":"","sources":["../src/compaction-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAY;IAGxB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,iBAAiB,CAA0B;IACnD,OAAO,CAAC,iBAAiB,CAAiC;IAG1D,OAAO,CAAC,eAAe,CAAS;gBAEpB,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM;IAK3C,gBAAgB,IAAI,MAAM;IAiG1B,iBAAiB,IAAI,MAAM;IA+E3B;;;;OAIG;IACH,qBAAqB,IAAI,OAAO;IAehC;;;;OAIG;IACH,cAAc,IAAI,IAAI;IAOtB,uFAAuF;IACvF,kBAAkB,IAAI,IAAI;IAO1B,iBAAiB,IAAI,OAAO;IAI5B,aAAa,IAAI;QAAE,gBAAgB,EAAE,OAAO,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE;IAO1E,kBAAkB,IAAI;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;QAC5B,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;QACjC,YAAY,EAAE,MAAM,CAAC;KACtB;CAWF"}