@imisbahk/hive 0.1.6 → 0.1.8
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/AUTHORS.md +5 -0
- package/README.md +18 -5
- package/dist/agent/agent.js +7 -3
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/hive-ctx.d.ts.map +1 -1
- package/dist/agent/hive-ctx.js +1 -2
- package/dist/agent/hive-ctx.js.map +1 -1
- package/dist/agent/passive-memory.d.ts +13 -0
- package/dist/agent/passive-memory.d.ts.map +1 -0
- package/dist/agent/passive-memory.js +195 -0
- package/dist/agent/passive-memory.js.map +1 -0
- package/dist/agent/prompt-auto-update.d.ts +3 -0
- package/dist/agent/prompt-auto-update.d.ts.map +1 -0
- package/dist/agent/prompt-auto-update.js +78 -0
- package/dist/agent/prompt-auto-update.js.map +1 -0
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +51 -51
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/daemon-service.d.ts +17 -0
- package/dist/cli/commands/daemon-service.d.ts.map +1 -0
- package/dist/cli/commands/daemon-service.js +281 -0
- package/dist/cli/commands/daemon-service.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +13 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +482 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +151 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +21 -1
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/nuke.d.ts.map +1 -1
- package/dist/cli/commands/nuke.js +189 -3
- package/dist/cli/commands/nuke.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +115 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/update.d.ts +4 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +96 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/helpers/version.d.ts +5 -0
- package/dist/cli/helpers/version.d.ts.map +1 -0
- package/dist/cli/helpers/version.js +58 -0
- package/dist/cli/helpers/version.js.map +1 -0
- package/dist/cli/index.js +6 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/index.d.ts +13 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +412 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/watcher.d.ts +12 -0
- package/dist/daemon/watcher.d.ts.map +1 -0
- package/dist/daemon/watcher.js +256 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/storage/db.d.ts +3 -0
- package/dist/storage/db.d.ts.map +1 -1
- package/dist/storage/db.js +32 -5
- package/dist/storage/db.js.map +1 -1
- package/dist/storage/schema.d.ts +2 -1
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +9 -1
- package/dist/storage/schema.js.map +1 -1
- package/package.json +11 -3
- package/prompts/Behaviour.md +23 -0
- package/prompts/Browser.md +13 -0
- package/prompts/Code.md +12 -0
- package/prompts/Debugging.md +15 -0
- package/prompts/Execution.md +13 -0
- package/prompts/Memory.md +11 -0
- package/prompts/Planning.md +13 -0
- package/prompts/Product.md +14 -0
- package/prompts/Review.md +15 -0
- package/prompts/Safety.md +12 -0
- package/prompts/Search.md +14 -0
- package/prompts/System.md +6 -0
- package/prompts/Tools.md +14 -0
- package/prompts/Writing.md +13 -0
- package/.gitattributes +0 -7
- package/.rocket/README.md +0 -31
- package/.rocket/config.json +0 -18
- package/Aborted +0 -0
- package/bun.lock +0 -554
- package/master +0 -0
- /package/{LICENSE.md → LICENSE} +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fetch from "node-fetch";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
const REGISTRY_LATEST_URL = "https://registry.npmjs.org/@imisbahk/hive/latest";
|
|
4
|
+
export async function fetchLatestVersion(timeoutMs = 3000) {
|
|
5
|
+
try {
|
|
6
|
+
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), timeoutMs));
|
|
7
|
+
const latest = (await Promise.race([
|
|
8
|
+
fetch(REGISTRY_LATEST_URL).then((response) => response.json()),
|
|
9
|
+
timeout,
|
|
10
|
+
]));
|
|
11
|
+
if (!latest?.version || typeof latest.version !== "string") {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return latest.version;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function getLocalVersion() {
|
|
21
|
+
try {
|
|
22
|
+
const raw = readFileSync(new URL("../../../package.json", import.meta.url), "utf8");
|
|
23
|
+
const parsed = JSON.parse(raw);
|
|
24
|
+
if (parsed.version) {
|
|
25
|
+
return parsed.version;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// ignore
|
|
30
|
+
}
|
|
31
|
+
return "0.0.0";
|
|
32
|
+
}
|
|
33
|
+
export function isVersionNewer(remote, local) {
|
|
34
|
+
const r = toNumbers(remote);
|
|
35
|
+
const l = toNumbers(local);
|
|
36
|
+
const length = Math.max(r.length, l.length);
|
|
37
|
+
for (let index = 0; index < length; index += 1) {
|
|
38
|
+
const rv = r[index] ?? 0;
|
|
39
|
+
const lv = l[index] ?? 0;
|
|
40
|
+
if (rv > lv)
|
|
41
|
+
return true;
|
|
42
|
+
if (rv < lv)
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
export function isMinorJump(remote, local) {
|
|
48
|
+
const [rMajor, rMinor] = toNumbers(remote);
|
|
49
|
+
const [lMajor, lMinor] = toNumbers(local);
|
|
50
|
+
if (rMajor > lMajor) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return rMajor === lMajor && rMinor >= (lMinor + 1);
|
|
54
|
+
}
|
|
55
|
+
function toNumbers(value) {
|
|
56
|
+
return value.split(".").map((part) => Number.parseInt(part, 10));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/cli/helpers/version.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -3,24 +3,29 @@ import "dotenv/config";
|
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { registerChatCommand, runChatCommand } from "./commands/chat.js";
|
|
5
5
|
import { registerConfigCommand } from "./commands/config.js";
|
|
6
|
+
import { registerDaemonCommand } from "./commands/daemon.js";
|
|
6
7
|
import { registerDoctorCommand } from "./commands/doctor.js";
|
|
7
8
|
import { registerInitCommand } from "./commands/init.js";
|
|
8
9
|
import { registerMemoryCommand } from "./commands/memory.js";
|
|
9
10
|
import { registerNukeCommand } from "./commands/nuke.js";
|
|
10
11
|
import { registerStatusCommand } from "./commands/status.js";
|
|
12
|
+
import { registerUpdateCommand } from "./commands/update.js";
|
|
13
|
+
import { getLocalVersion } from "./helpers/version.js";
|
|
11
14
|
import { renderError, renderHiveHeader } from "./ui.js";
|
|
12
15
|
const program = new Command();
|
|
13
16
|
program
|
|
14
17
|
.name("hive")
|
|
15
18
|
.description("Your agent. Always running. Always learning. Always working.")
|
|
16
|
-
.version(
|
|
19
|
+
.version(getLocalVersion());
|
|
17
20
|
registerInitCommand(program);
|
|
18
21
|
registerChatCommand(program);
|
|
19
22
|
registerConfigCommand(program);
|
|
23
|
+
registerDaemonCommand(program);
|
|
20
24
|
registerDoctorCommand(program);
|
|
21
25
|
registerStatusCommand(program);
|
|
22
26
|
registerNukeCommand(program);
|
|
23
27
|
registerMemoryCommand(program);
|
|
28
|
+
registerUpdateCommand(program);
|
|
24
29
|
const argv = process.argv.slice(2);
|
|
25
30
|
void main();
|
|
26
31
|
async function main() {
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,8DAA8D,CAAC;KAC3E,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hive Daemon - Always-on background process for The Hive
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - TCP server on port 2718 for IPC
|
|
7
|
+
* - Auto-restart on crash via watcher
|
|
8
|
+
* - Heartbeat mechanism for health monitoring
|
|
9
|
+
* - Graceful shutdown protocol
|
|
10
|
+
* - Cross-platform service registration
|
|
11
|
+
*/
|
|
12
|
+
import "dotenv/config";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,eAAe,CAAC"}
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hive Daemon - Always-on background process for The Hive
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - TCP server on port 2718 for IPC
|
|
7
|
+
* - Auto-restart on crash via watcher
|
|
8
|
+
* - Heartbeat mechanism for health monitoring
|
|
9
|
+
* - Graceful shutdown protocol
|
|
10
|
+
* - Cross-platform service registration
|
|
11
|
+
*/
|
|
12
|
+
import "dotenv/config";
|
|
13
|
+
import * as fs from "node:fs";
|
|
14
|
+
import * as path from "node:path";
|
|
15
|
+
import { createServer } from "node:net";
|
|
16
|
+
import { exec } from "node:child_process";
|
|
17
|
+
import { promisify } from "node:util";
|
|
18
|
+
import { getHiveHomeDir, getPrimaryAgent, openHiveDatabase, closeHiveDatabase } from "../storage/db.js";
|
|
19
|
+
import { initializeHiveCtxSession } from "../agent/hive-ctx.js";
|
|
20
|
+
import { createProvider } from "../providers/index.js";
|
|
21
|
+
const execAsync = promisify(exec);
|
|
22
|
+
const PORT = 2718;
|
|
23
|
+
const HEARTBEAT_INTERVAL_MS = 30000; // 30 seconds
|
|
24
|
+
const WATCHER_CHECK_INTERVAL_MS = 60000; // 60 seconds
|
|
25
|
+
const STALE_THRESHOLD_MS = 90000; // 90 seconds
|
|
26
|
+
const LOG_MAX_SIZE = 10 * 1024 * 1024; // 10MB
|
|
27
|
+
const LOG_MAX_FILES = 3;
|
|
28
|
+
const HIVE_HOME = getHiveHomeDir();
|
|
29
|
+
const DAEMON_PID_FILE = path.join(HIVE_HOME, "daemon.pid");
|
|
30
|
+
const DAEMON_PORT_FILE = path.join(HIVE_HOME, "daemon.port");
|
|
31
|
+
const DAEMON_LOCK_FILE = path.join(HIVE_HOME, "daemon.lock");
|
|
32
|
+
const DAEMON_LOG_FILE = path.join(HIVE_HOME, "daemon.log");
|
|
33
|
+
const DAEMON_STOP_SENTINEL = path.join(HIVE_HOME, "daemon.stop");
|
|
34
|
+
const DAEMON_CTX_PATH = path.join(HIVE_HOME, "ctx");
|
|
35
|
+
// Log rotation state
|
|
36
|
+
let currentLogSize = 0;
|
|
37
|
+
let logBuffer = "";
|
|
38
|
+
// Daemon state
|
|
39
|
+
let startTime;
|
|
40
|
+
let db = null;
|
|
41
|
+
let provider = null;
|
|
42
|
+
let agent = null;
|
|
43
|
+
let ctxSession = null;
|
|
44
|
+
let tcpServer = null;
|
|
45
|
+
let heartbeatInterval = null;
|
|
46
|
+
/**
|
|
47
|
+
* Log to file with rotation
|
|
48
|
+
*/
|
|
49
|
+
function logToDaemonFile(message) {
|
|
50
|
+
const timestamp = new Date().toISOString();
|
|
51
|
+
const logLine = `[${timestamp}] ${message}\n`;
|
|
52
|
+
// Check if rotation is needed
|
|
53
|
+
try {
|
|
54
|
+
const stats = fs.statSync(DAEMON_LOG_FILE);
|
|
55
|
+
if (stats.size >= LOG_MAX_SIZE) {
|
|
56
|
+
rotateLogs();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// File doesn't exist yet
|
|
61
|
+
}
|
|
62
|
+
fs.appendFileSync(DAEMON_LOG_FILE, logLine);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Rotate log files
|
|
66
|
+
*/
|
|
67
|
+
function rotateLogs() {
|
|
68
|
+
for (let i = LOG_MAX_FILES - 1; i >= 1; i--) {
|
|
69
|
+
const src = `${DAEMON_LOG_FILE}.${i}`;
|
|
70
|
+
const dest = `${DAEMON_LOG_FILE}.${i + 1}`;
|
|
71
|
+
try {
|
|
72
|
+
if (fs.existsSync(src)) {
|
|
73
|
+
fs.renameSync(src, dest);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Ignore rotation errors
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Move current log to .1
|
|
81
|
+
try {
|
|
82
|
+
if (fs.existsSync(DAEMON_LOG_FILE)) {
|
|
83
|
+
fs.renameSync(DAEMON_LOG_FILE, `${DAEMON_LOG_FILE}.1`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Ignore rotation errors
|
|
88
|
+
}
|
|
89
|
+
// Create new empty log file
|
|
90
|
+
fs.writeFileSync(DAEMON_LOG_FILE, "");
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Write PID file
|
|
94
|
+
*/
|
|
95
|
+
function writePidFile() {
|
|
96
|
+
fs.writeFileSync(DAEMON_PID_FILE, String(process.pid));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Write port file
|
|
100
|
+
*/
|
|
101
|
+
function writePortFile(port) {
|
|
102
|
+
fs.writeFileSync(DAEMON_PORT_FILE, String(port));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove PID file
|
|
106
|
+
*/
|
|
107
|
+
function removePidFile() {
|
|
108
|
+
try {
|
|
109
|
+
fs.unlinkSync(DAEMON_PID_FILE);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Ignore
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Update heartbeat lock file
|
|
117
|
+
*/
|
|
118
|
+
function updateHeartbeat() {
|
|
119
|
+
fs.writeFileSync(DAEMON_LOCK_FILE, String(Date.now()));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Initialize the daemon
|
|
123
|
+
*/
|
|
124
|
+
async function initializeDaemon() {
|
|
125
|
+
logToDaemonFile("Initializing Hive daemon...");
|
|
126
|
+
// Create hive home directory if needed
|
|
127
|
+
if (!fs.existsSync(HIVE_HOME)) {
|
|
128
|
+
fs.mkdirSync(HIVE_HOME, { recursive: true });
|
|
129
|
+
}
|
|
130
|
+
// Create ctx directory
|
|
131
|
+
if (!fs.existsSync(DAEMON_CTX_PATH)) {
|
|
132
|
+
fs.mkdirSync(DAEMON_CTX_PATH, { recursive: true });
|
|
133
|
+
}
|
|
134
|
+
// Open database
|
|
135
|
+
logToDaemonFile("Opening database...");
|
|
136
|
+
db = openHiveDatabase();
|
|
137
|
+
// Load agent profile
|
|
138
|
+
logToDaemonFile("Loading agent profile...");
|
|
139
|
+
agent = getPrimaryAgent(db);
|
|
140
|
+
if (!agent) {
|
|
141
|
+
logToDaemonFile("Warning: No agent profile found. Daemon will start but agent features unavailable.");
|
|
142
|
+
}
|
|
143
|
+
// Initialize provider
|
|
144
|
+
if (agent) {
|
|
145
|
+
try {
|
|
146
|
+
logToDaemonFile(`Initializing provider: ${agent.provider}...`);
|
|
147
|
+
provider = await createProvider(agent.provider);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logToDaemonFile(`Warning: Failed to initialize provider: ${error}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Initialize hive-ctx
|
|
154
|
+
if (agent) {
|
|
155
|
+
try {
|
|
156
|
+
logToDaemonFile("Initializing hive-ctx...");
|
|
157
|
+
const result = await initializeHiveCtxSession({
|
|
158
|
+
storagePath: DAEMON_CTX_PATH,
|
|
159
|
+
profile: agent,
|
|
160
|
+
model: agent.model,
|
|
161
|
+
});
|
|
162
|
+
ctxSession = result.session;
|
|
163
|
+
if (result.warning) {
|
|
164
|
+
logToDaemonFile(result.warning);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
logToDaemonFile(`Warning: Failed to initialize hive-ctx: ${error}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Write PID file
|
|
172
|
+
writePidFile();
|
|
173
|
+
logToDaemonFile(`PID file written: ${process.pid}`);
|
|
174
|
+
// Update heartbeat
|
|
175
|
+
updateHeartbeat();
|
|
176
|
+
logToDaemonFile("Heartbeat started");
|
|
177
|
+
// Start heartbeat interval
|
|
178
|
+
heartbeatInterval = setInterval(() => {
|
|
179
|
+
// Check for stop sentinel
|
|
180
|
+
if (fs.existsSync(DAEMON_STOP_SENTINEL)) {
|
|
181
|
+
logToDaemonFile("Stop sentinel detected. Shutting down...");
|
|
182
|
+
cleanupAndExit(0);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
updateHeartbeat();
|
|
186
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
187
|
+
logToDaemonFile("Daemon initialization complete");
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Handle TCP connection
|
|
191
|
+
*/
|
|
192
|
+
function handleConnection(socket) {
|
|
193
|
+
let buffer = "";
|
|
194
|
+
socket.on("data", (data) => {
|
|
195
|
+
buffer += data.toString();
|
|
196
|
+
// Process complete lines
|
|
197
|
+
while (buffer.includes("\n")) {
|
|
198
|
+
const lineEnd = buffer.indexOf("\n");
|
|
199
|
+
const line = buffer.slice(0, lineEnd).trim();
|
|
200
|
+
buffer = buffer.slice(lineEnd + 1);
|
|
201
|
+
if (line.length === 0)
|
|
202
|
+
continue;
|
|
203
|
+
handleCommand(line, socket);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
socket.on("error", (error) => {
|
|
207
|
+
logToDaemonFile(`TCP connection error: ${error.message}`);
|
|
208
|
+
});
|
|
209
|
+
socket.on("close", () => {
|
|
210
|
+
logToDaemonFile("TCP connection closed");
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Handle IPC command
|
|
215
|
+
*/
|
|
216
|
+
function handleCommand(command, socket) {
|
|
217
|
+
try {
|
|
218
|
+
const parsed = JSON.parse(command);
|
|
219
|
+
if (!parsed || typeof parsed !== "object") {
|
|
220
|
+
sendResponse(socket, { error: "Invalid JSON object" });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
switch (parsed.type) {
|
|
224
|
+
case "status":
|
|
225
|
+
handleStatus(socket);
|
|
226
|
+
break;
|
|
227
|
+
case "ping":
|
|
228
|
+
handlePing(socket);
|
|
229
|
+
break;
|
|
230
|
+
case "stop":
|
|
231
|
+
handleStop(socket);
|
|
232
|
+
break;
|
|
233
|
+
case "task":
|
|
234
|
+
handleTask(parsed, socket);
|
|
235
|
+
break;
|
|
236
|
+
default:
|
|
237
|
+
sendResponse(socket, { error: `Unknown command type: ${parsed.type}` });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
sendResponse(socket, { error: "Invalid JSON" });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Handle status command
|
|
246
|
+
*/
|
|
247
|
+
function handleStatus(socket) {
|
|
248
|
+
const now = Date.now();
|
|
249
|
+
const uptime = Math.floor((now - startTime) / 1000);
|
|
250
|
+
const uptimeHours = Math.floor(uptime / 3600);
|
|
251
|
+
const uptimeMinutes = Math.floor((uptime % 3600) / 60);
|
|
252
|
+
let memoryStats = { episodes: 0, conversations: 0 };
|
|
253
|
+
if (db) {
|
|
254
|
+
try {
|
|
255
|
+
const episodeCount = db.prepare("SELECT COUNT(*) as count FROM episodes").get();
|
|
256
|
+
const conversationCount = db.prepare("SELECT COUNT(*) as count FROM conversations").get();
|
|
257
|
+
memoryStats = {
|
|
258
|
+
episodes: episodeCount.count,
|
|
259
|
+
conversations: conversationCount.count,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// Ignore database errors
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const response = {
|
|
267
|
+
pid: process.pid,
|
|
268
|
+
uptime: `${uptimeHours}h ${uptimeMinutes}m`,
|
|
269
|
+
uptimeSeconds: uptime,
|
|
270
|
+
agent: agent?.agent_name ?? "not set",
|
|
271
|
+
provider: agent?.provider ?? "none",
|
|
272
|
+
model: agent?.model ?? "none",
|
|
273
|
+
memoryStats,
|
|
274
|
+
ctxEnabled: !!ctxSession,
|
|
275
|
+
timestamp: now,
|
|
276
|
+
};
|
|
277
|
+
sendResponse(socket, response);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Handle ping command
|
|
281
|
+
*/
|
|
282
|
+
function handlePing(socket) {
|
|
283
|
+
sendResponse(socket, {
|
|
284
|
+
pong: true,
|
|
285
|
+
timestamp: Date.now(),
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Handle stop command
|
|
290
|
+
*/
|
|
291
|
+
function handleStop(socket) {
|
|
292
|
+
sendResponse(socket, { acknowledged: true });
|
|
293
|
+
// Remove sentinel and exit cleanly
|
|
294
|
+
try {
|
|
295
|
+
fs.unlinkSync(DAEMON_STOP_SENTINEL);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Ignore
|
|
299
|
+
}
|
|
300
|
+
setTimeout(() => {
|
|
301
|
+
cleanupAndExit(0);
|
|
302
|
+
}, 100);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Handle task command (stub for v0.2)
|
|
306
|
+
*/
|
|
307
|
+
function handleTask(parsed, socket) {
|
|
308
|
+
sendResponse(socket, {
|
|
309
|
+
accepted: true,
|
|
310
|
+
taskId: `task_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Send response to socket
|
|
315
|
+
*/
|
|
316
|
+
function sendResponse(socket, data) {
|
|
317
|
+
try {
|
|
318
|
+
const response = JSON.stringify(data) + "\n";
|
|
319
|
+
socket.write(response);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// Ignore write errors
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Start TCP server
|
|
327
|
+
*/
|
|
328
|
+
async function startTcpServer() {
|
|
329
|
+
return new Promise((resolve, reject) => {
|
|
330
|
+
tcpServer = createServer(handleConnection);
|
|
331
|
+
tcpServer.on("error", (error) => {
|
|
332
|
+
logToDaemonFile(`TCP server error: ${error.message}`);
|
|
333
|
+
reject(error);
|
|
334
|
+
});
|
|
335
|
+
// Try to bind to port 2718, increment if needed
|
|
336
|
+
let currentPort = PORT;
|
|
337
|
+
const bindNextPort = () => {
|
|
338
|
+
tcpServer.listen(currentPort, "127.0.0.1", () => {
|
|
339
|
+
writePortFile(currentPort);
|
|
340
|
+
logToDaemonFile(`TCP server listening on 127.0.0.1:${currentPort}`);
|
|
341
|
+
resolve();
|
|
342
|
+
});
|
|
343
|
+
};
|
|
344
|
+
tcpServer.on("listening", () => {
|
|
345
|
+
// Port is already written in the callback above
|
|
346
|
+
});
|
|
347
|
+
tcpServer.on("error", (error) => {
|
|
348
|
+
if (error.code === "EADDRINUSE") {
|
|
349
|
+
logToDaemonFile(`Port ${currentPort} in use, trying ${currentPort + 1}...`);
|
|
350
|
+
currentPort += 1;
|
|
351
|
+
tcpServer.close();
|
|
352
|
+
bindNextPort();
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
reject(error);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
bindNextPort();
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Cleanup and exit
|
|
363
|
+
*/
|
|
364
|
+
async function cleanupAndExit(code) {
|
|
365
|
+
logToDaemonFile(`Cleaning up and exiting with code ${code}`);
|
|
366
|
+
// Clear heartbeat interval
|
|
367
|
+
if (heartbeatInterval) {
|
|
368
|
+
clearInterval(heartbeatInterval);
|
|
369
|
+
heartbeatInterval = null;
|
|
370
|
+
}
|
|
371
|
+
// Close TCP server
|
|
372
|
+
if (tcpServer) {
|
|
373
|
+
tcpServer.close(() => {
|
|
374
|
+
logToDaemonFile("TCP server closed");
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
// Remove PID file
|
|
378
|
+
removePidFile();
|
|
379
|
+
// Close database
|
|
380
|
+
if (db) {
|
|
381
|
+
closeHiveDatabase(db);
|
|
382
|
+
db = null;
|
|
383
|
+
}
|
|
384
|
+
process.exit(code);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Main entry point
|
|
388
|
+
*/
|
|
389
|
+
async function main() {
|
|
390
|
+
// Start time for uptime calculation
|
|
391
|
+
startTime = Date.now();
|
|
392
|
+
// Initialize daemon
|
|
393
|
+
await initializeDaemon();
|
|
394
|
+
// Start TCP server
|
|
395
|
+
await startTcpServer();
|
|
396
|
+
logToDaemonFile("Daemon is running. Press Ctrl+C to stop.");
|
|
397
|
+
// Handle signals
|
|
398
|
+
process.on("SIGTERM", () => {
|
|
399
|
+
logToDaemonFile("Received SIGTERM");
|
|
400
|
+
cleanupAndExit(0);
|
|
401
|
+
});
|
|
402
|
+
process.on("SIGINT", () => {
|
|
403
|
+
logToDaemonFile("Received SIGINT");
|
|
404
|
+
cleanupAndExit(0);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
// Start the daemon
|
|
408
|
+
main().catch((error) => {
|
|
409
|
+
logToDaemonFile(`Fatal error: ${error.message}`);
|
|
410
|
+
process.exit(1);
|
|
411
|
+
});
|
|
412
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Hive Watcher - Auto-restarts daemon on crash
|
|
4
|
+
*
|
|
5
|
+
* Behavior:
|
|
6
|
+
* - Checks daemon heartbeat file every 60 seconds
|
|
7
|
+
* - If lock file is stale (> 90 seconds), respawn daemon
|
|
8
|
+
* - Respects daemon.stop sentinel file
|
|
9
|
+
* - Registered as system service, not daemon directly
|
|
10
|
+
*/
|
|
11
|
+
import "dotenv/config";
|
|
12
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/daemon/watcher.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,eAAe,CAAC"}
|