@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.
Files changed (86) hide show
  1. package/AUTHORS.md +5 -0
  2. package/README.md +18 -5
  3. package/dist/agent/agent.js +7 -3
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/hive-ctx.d.ts.map +1 -1
  6. package/dist/agent/hive-ctx.js +1 -2
  7. package/dist/agent/hive-ctx.js.map +1 -1
  8. package/dist/agent/passive-memory.d.ts +13 -0
  9. package/dist/agent/passive-memory.d.ts.map +1 -0
  10. package/dist/agent/passive-memory.js +195 -0
  11. package/dist/agent/passive-memory.js.map +1 -0
  12. package/dist/agent/prompt-auto-update.d.ts +3 -0
  13. package/dist/agent/prompt-auto-update.d.ts.map +1 -0
  14. package/dist/agent/prompt-auto-update.js +78 -0
  15. package/dist/agent/prompt-auto-update.js.map +1 -0
  16. package/dist/cli/commands/chat.d.ts.map +1 -1
  17. package/dist/cli/commands/chat.js +51 -51
  18. package/dist/cli/commands/chat.js.map +1 -1
  19. package/dist/cli/commands/daemon-service.d.ts +17 -0
  20. package/dist/cli/commands/daemon-service.d.ts.map +1 -0
  21. package/dist/cli/commands/daemon-service.js +281 -0
  22. package/dist/cli/commands/daemon-service.js.map +1 -0
  23. package/dist/cli/commands/daemon.d.ts +13 -0
  24. package/dist/cli/commands/daemon.d.ts.map +1 -0
  25. package/dist/cli/commands/daemon.js +482 -0
  26. package/dist/cli/commands/daemon.js.map +1 -0
  27. package/dist/cli/commands/init.d.ts.map +1 -1
  28. package/dist/cli/commands/init.js +151 -1
  29. package/dist/cli/commands/init.js.map +1 -1
  30. package/dist/cli/commands/memory.d.ts.map +1 -1
  31. package/dist/cli/commands/memory.js +21 -1
  32. package/dist/cli/commands/memory.js.map +1 -1
  33. package/dist/cli/commands/nuke.d.ts.map +1 -1
  34. package/dist/cli/commands/nuke.js +189 -3
  35. package/dist/cli/commands/nuke.js.map +1 -1
  36. package/dist/cli/commands/status.d.ts.map +1 -1
  37. package/dist/cli/commands/status.js +115 -0
  38. package/dist/cli/commands/status.js.map +1 -1
  39. package/dist/cli/commands/update.d.ts +4 -0
  40. package/dist/cli/commands/update.d.ts.map +1 -0
  41. package/dist/cli/commands/update.js +96 -0
  42. package/dist/cli/commands/update.js.map +1 -0
  43. package/dist/cli/helpers/version.d.ts +5 -0
  44. package/dist/cli/helpers/version.d.ts.map +1 -0
  45. package/dist/cli/helpers/version.js +58 -0
  46. package/dist/cli/helpers/version.js.map +1 -0
  47. package/dist/cli/index.js +6 -1
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/daemon/index.d.ts +13 -0
  50. package/dist/daemon/index.d.ts.map +1 -0
  51. package/dist/daemon/index.js +412 -0
  52. package/dist/daemon/index.js.map +1 -0
  53. package/dist/daemon/watcher.d.ts +12 -0
  54. package/dist/daemon/watcher.d.ts.map +1 -0
  55. package/dist/daemon/watcher.js +256 -0
  56. package/dist/daemon/watcher.js.map +1 -0
  57. package/dist/storage/db.d.ts +3 -0
  58. package/dist/storage/db.d.ts.map +1 -1
  59. package/dist/storage/db.js +32 -5
  60. package/dist/storage/db.js.map +1 -1
  61. package/dist/storage/schema.d.ts +2 -1
  62. package/dist/storage/schema.d.ts.map +1 -1
  63. package/dist/storage/schema.js +9 -1
  64. package/dist/storage/schema.js.map +1 -1
  65. package/package.json +11 -3
  66. package/prompts/Behaviour.md +23 -0
  67. package/prompts/Browser.md +13 -0
  68. package/prompts/Code.md +12 -0
  69. package/prompts/Debugging.md +15 -0
  70. package/prompts/Execution.md +13 -0
  71. package/prompts/Memory.md +11 -0
  72. package/prompts/Planning.md +13 -0
  73. package/prompts/Product.md +14 -0
  74. package/prompts/Review.md +15 -0
  75. package/prompts/Safety.md +12 -0
  76. package/prompts/Search.md +14 -0
  77. package/prompts/System.md +6 -0
  78. package/prompts/Tools.md +14 -0
  79. package/prompts/Writing.md +13 -0
  80. package/.gitattributes +0 -7
  81. package/.rocket/README.md +0 -31
  82. package/.rocket/config.json +0 -18
  83. package/Aborted +0 -0
  84. package/bun.lock +0 -554
  85. package/master +0 -0
  86. /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("0.1.4");
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() {
@@ -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,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,KAAK,IAAI,EAAE,CAAC;AAEZ,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,cAAc,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAc;IAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,WAAW,IAAI,MAAM,CAAC;AAC/B,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"}