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.
- package/README.md +30 -9
- package/dashboard/dist/assets/index-CIzoeO8A.js +52 -0
- package/dashboard/dist/favicon.ico +0 -0
- package/dashboard/dist/favicon.png +0 -0
- package/dashboard/dist/index.html +15 -0
- package/dist/agent-registry.d.ts +9 -12
- package/dist/agent-registry.d.ts.map +1 -1
- package/dist/agent-registry.js +44 -113
- package/dist/agent-registry.js.map +1 -1
- package/dist/claude-code-registrar.d.ts +10 -0
- package/dist/claude-code-registrar.d.ts.map +1 -0
- package/dist/claude-code-registrar.js +71 -0
- package/dist/claude-code-registrar.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -0
- package/dist/cli.js.map +1 -0
- package/dist/compaction-manager.d.ts +24 -0
- package/dist/compaction-manager.d.ts.map +1 -1
- package/dist/compaction-manager.js +88 -7
- package/dist/compaction-manager.js.map +1 -1
- package/dist/dashboard-server.d.ts.map +1 -1
- package/dist/dashboard-server.js +348 -4
- package/dist/dashboard-server.js.map +1 -1
- package/dist/homaruscc.d.ts.map +1 -1
- package/dist/homaruscc.js +1 -2
- package/dist/homaruscc.js.map +1 -1
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js +28 -0
- package/dist/mcp-tools.js.map +1 -1
- package/dist/memory-index.js +1 -1
- package/dist/memory-index.js.map +1 -1
- package/dist/scaffolder.d.ts +16 -0
- package/dist/scaffolder.d.ts.map +1 -0
- package/dist/scaffolder.js +154 -0
- package/dist/scaffolder.js.map +1 -0
- package/dist/session-checkpoint.d.ts +3 -0
- package/dist/session-checkpoint.d.ts.map +1 -1
- package/dist/session-checkpoint.js +24 -0
- package/dist/session-checkpoint.js.map +1 -1
- package/dist/telegram-adapter.d.ts +6 -0
- package/dist/telegram-adapter.d.ts.map +1 -1
- package/dist/telegram-adapter.js +151 -3
- package/dist/telegram-adapter.js.map +1 -1
- package/dist/transcript-logger.d.ts +10 -0
- package/dist/transcript-logger.d.ts.map +1 -1
- package/dist/transcript-logger.js +4 -0
- package/dist/transcript-logger.js.map +1 -1
- package/dist/wizard.d.ts +24 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +146 -0
- package/dist/wizard.js.map +1 -0
- 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>
|
package/dist/agent-registry.d.ts
CHANGED
|
@@ -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
|
|
18
|
-
private
|
|
19
|
-
constructor(logger: Logger, maxConcurrent?: 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
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
private
|
|
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":"
|
|
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"}
|
package/dist/agent-registry.js
CHANGED
|
@@ -1,30 +1,25 @@
|
|
|
1
|
-
// CRC: crc-AgentRegistry.md | Seq: seq-agent-dispatch.md
|
|
1
|
+
// CRC: crc-AgentRegistry.md | Seq: seq-agent-dispatch.md
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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.
|
|
17
|
+
this.timeoutMs = timeoutMs;
|
|
23
18
|
}
|
|
24
19
|
setEmitter(fn) {
|
|
25
20
|
this.emitFn = fn;
|
|
26
21
|
}
|
|
27
|
-
register(id, description
|
|
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
|
-
//
|
|
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
|
-
//
|
|
86
|
-
|
|
87
|
-
if (this.
|
|
88
|
+
// Periodic check for agents that have exceeded the timeout
|
|
89
|
+
startTimeoutChecker() {
|
|
90
|
+
if (this.timeoutTimer)
|
|
88
91
|
return;
|
|
89
|
-
this.
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
123
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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":"AAAA,
|
|
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 @@
|
|
|
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
|
package/dist/cli.js.map
ADDED
|
@@ -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;
|
|
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"}
|