@sesamespace/hivemind 0.4.0 → 0.4.2

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.
@@ -0,0 +1,132 @@
1
+ // packages/cli/src/commands/service.ts
2
+ import { resolve } from "path";
3
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
4
+ import { execSync } from "child_process";
5
+ import { homedir } from "os";
6
+ import { fileURLToPath } from "url";
7
+ import { dirname } from "path";
8
+ var LAUNCH_AGENTS_DIR = resolve(homedir(), "Library/LaunchAgents");
9
+ var AGENT_LABEL = "com.hivemind.agent";
10
+ var MEMORY_LABEL = "com.hivemind.memory";
11
+ async function runServiceCommand(args) {
12
+ const subcommand = args[0];
13
+ switch (subcommand) {
14
+ case "install":
15
+ await installServices(args.slice(1));
16
+ break;
17
+ case "uninstall":
18
+ await uninstallServices();
19
+ break;
20
+ case "status":
21
+ showStatus();
22
+ break;
23
+ case "logs":
24
+ showLogs(args[1]);
25
+ break;
26
+ default:
27
+ printHelp();
28
+ if (subcommand) {
29
+ console.error(`Unknown subcommand: ${subcommand}`);
30
+ process.exit(1);
31
+ }
32
+ break;
33
+ }
34
+ }
35
+ async function installServices(_args) {
36
+ const hivemindHome = process.env.HIVEMIND_HOME || process.cwd();
37
+ console.log(`
38
+ \u2192 Installing launchd services for ${hivemindHome}
39
+ `);
40
+ mkdirSync(LAUNCH_AGENTS_DIR, { recursive: true });
41
+ const scriptDirs = [
42
+ resolve(hivemindHome, "scripts"),
43
+ resolve(dirname(dirname(dirname(fileURLToPath(import.meta.url)))), "scripts")
44
+ ];
45
+ for (const label of [MEMORY_LABEL, AGENT_LABEL]) {
46
+ const plistFile = `${label}.plist`;
47
+ let templatePath = "";
48
+ for (const dir of scriptDirs) {
49
+ const p = resolve(dir, plistFile);
50
+ if (existsSync(p)) {
51
+ templatePath = p;
52
+ break;
53
+ }
54
+ }
55
+ if (!templatePath) {
56
+ console.error(` \u2717 Template not found: ${plistFile}`);
57
+ continue;
58
+ }
59
+ let content = readFileSync(templatePath, "utf-8");
60
+ content = content.replace(/__HIVEMIND_HOME__/g, hivemindHome);
61
+ const destPath = resolve(LAUNCH_AGENTS_DIR, plistFile);
62
+ writeFileSync(destPath, content);
63
+ try {
64
+ execSync(`launchctl unload ${destPath} 2>/dev/null`);
65
+ } catch {
66
+ }
67
+ execSync(`launchctl load ${destPath}`);
68
+ console.log(` \u2713 ${label} installed and started`);
69
+ }
70
+ console.log("\n Services will auto-start on boot.\n");
71
+ }
72
+ async function uninstallServices() {
73
+ console.log("\n\u2192 Uninstalling launchd services\n");
74
+ for (const label of [AGENT_LABEL, MEMORY_LABEL]) {
75
+ const plistPath = resolve(LAUNCH_AGENTS_DIR, `${label}.plist`);
76
+ if (existsSync(plistPath)) {
77
+ try {
78
+ execSync(`launchctl unload ${plistPath} 2>/dev/null`);
79
+ } catch {
80
+ }
81
+ const { unlinkSync } = await import("fs");
82
+ unlinkSync(plistPath);
83
+ console.log(` \u2713 ${label} uninstalled`);
84
+ } else {
85
+ console.log(` - ${label} not installed`);
86
+ }
87
+ }
88
+ console.log("");
89
+ }
90
+ function showStatus() {
91
+ console.log("\n\u2192 Service status\n");
92
+ for (const label of [MEMORY_LABEL, AGENT_LABEL]) {
93
+ try {
94
+ const out = execSync(`launchctl list ${label} 2>/dev/null`, { encoding: "utf-8" });
95
+ const pidMatch = out.match(/"PID"\s*=\s*(\d+)/);
96
+ const pid = pidMatch ? pidMatch[1] : "unknown";
97
+ console.log(` \u2713 ${label}: running (PID ${pid})`);
98
+ } catch {
99
+ console.log(` - ${label}: not running`);
100
+ }
101
+ }
102
+ console.log("");
103
+ }
104
+ function showLogs(which) {
105
+ const logFile = which === "memory" ? "/tmp/hivemind-memory.log" : "/tmp/hivemind-agent.log";
106
+ try {
107
+ execSync(`tail -30 ${logFile}`, { stdio: "inherit" });
108
+ } catch {
109
+ console.error(`No log file at ${logFile}`);
110
+ }
111
+ }
112
+ function printHelp() {
113
+ console.log(`hivemind service \u2014 Manage launchd services
114
+
115
+ Usage: hivemind service <subcommand>
116
+
117
+ Subcommands:
118
+ install Install and start launchd services (survives reboots)
119
+ uninstall Stop and remove launchd services
120
+ status Show service status
121
+ logs [agent|memory] Show recent logs
122
+
123
+ Services:
124
+ com.hivemind.memory \u2014 Memory daemon (Rust, port 3434)
125
+ com.hivemind.agent \u2014 Agent runtime (Node.js, Sesame)
126
+ `);
127
+ }
128
+
129
+ export {
130
+ runServiceCommand
131
+ };
132
+ //# sourceMappingURL=chunk-MBS5A6BZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/commands/service.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { homedir } from \"os\";\n\nconst LAUNCH_AGENTS_DIR = resolve(homedir(), \"Library/LaunchAgents\");\nconst AGENT_LABEL = \"com.hivemind.agent\";\nconst MEMORY_LABEL = \"com.hivemind.memory\";\n\nexport async function runServiceCommand(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n switch (subcommand) {\n case \"install\":\n await installServices(args.slice(1));\n break;\n case \"uninstall\":\n await uninstallServices();\n break;\n case \"status\":\n showStatus();\n break;\n case \"logs\":\n showLogs(args[1]);\n break;\n default:\n printHelp();\n if (subcommand) {\n console.error(`Unknown subcommand: ${subcommand}`);\n process.exit(1);\n }\n break;\n }\n}\n\nasync function installServices(_args: string[]): Promise<void> {\n const hivemindHome = process.env.HIVEMIND_HOME || process.cwd();\n\n console.log(`\\n→ Installing launchd services for ${hivemindHome}\\n`);\n\n mkdirSync(LAUNCH_AGENTS_DIR, { recursive: true });\n\n // Find plist templates\n const scriptDirs = [\n resolve(hivemindHome, \"scripts\"),\n resolve(dirname(dirname(dirname(fileURLToPath(import.meta.url)))), \"scripts\"),\n ];\n\n for (const label of [MEMORY_LABEL, AGENT_LABEL]) {\n const plistFile = `${label}.plist`;\n let templatePath = \"\";\n\n for (const dir of scriptDirs) {\n const p = resolve(dir, plistFile);\n if (existsSync(p)) { templatePath = p; break; }\n }\n\n if (!templatePath) {\n console.error(` ✗ Template not found: ${plistFile}`);\n continue;\n }\n\n let content = readFileSync(templatePath, \"utf-8\");\n content = content.replace(/__HIVEMIND_HOME__/g, hivemindHome);\n\n const destPath = resolve(LAUNCH_AGENTS_DIR, plistFile);\n writeFileSync(destPath, content);\n\n // Unload if already loaded, then load\n try { execSync(`launchctl unload ${destPath} 2>/dev/null`); } catch {}\n execSync(`launchctl load ${destPath}`);\n\n console.log(` ✓ ${label} installed and started`);\n }\n\n console.log(\"\\n Services will auto-start on boot.\\n\");\n}\n\nasync function uninstallServices(): Promise<void> {\n console.log(\"\\n→ Uninstalling launchd services\\n\");\n\n for (const label of [AGENT_LABEL, MEMORY_LABEL]) {\n const plistPath = resolve(LAUNCH_AGENTS_DIR, `${label}.plist`);\n if (existsSync(plistPath)) {\n try { execSync(`launchctl unload ${plistPath} 2>/dev/null`); } catch {}\n const { unlinkSync } = await import(\"fs\");\n unlinkSync(plistPath);\n console.log(` ✓ ${label} uninstalled`);\n } else {\n console.log(` - ${label} not installed`);\n }\n }\n console.log(\"\");\n}\n\nfunction showStatus(): void {\n console.log(\"\\n→ Service status\\n\");\n for (const label of [MEMORY_LABEL, AGENT_LABEL]) {\n try {\n const out = execSync(`launchctl list ${label} 2>/dev/null`, { encoding: \"utf-8\" });\n const pidMatch = out.match(/\"PID\"\\s*=\\s*(\\d+)/);\n const pid = pidMatch ? pidMatch[1] : \"unknown\";\n console.log(` ✓ ${label}: running (PID ${pid})`);\n } catch {\n console.log(` - ${label}: not running`);\n }\n }\n console.log(\"\");\n}\n\nfunction showLogs(which?: string): void {\n const logFile = which === \"memory\"\n ? \"/tmp/hivemind-memory.log\"\n : \"/tmp/hivemind-agent.log\";\n try {\n execSync(`tail -30 ${logFile}`, { stdio: \"inherit\" });\n } catch {\n console.error(`No log file at ${logFile}`);\n }\n}\n\nfunction printHelp(): void {\n console.log(`hivemind service — Manage launchd services\n\nUsage: hivemind service <subcommand>\n\nSubcommands:\n install Install and start launchd services (survives reboots)\n uninstall Stop and remove launchd services\n status Show service status\n logs [agent|memory] Show recent logs\n\nServices:\n com.hivemind.memory — Memory daemon (Rust, port 3434)\n com.hivemind.agent — Agent runtime (Node.js, Sesame)\n`);\n}\n\n// Helpers for ESM\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\n"],"mappings":"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","names":[]}
@@ -0,0 +1,44 @@
1
+ import {
2
+ startPipeline
3
+ } from "./chunk-LRK64BAK.js";
4
+
5
+ // packages/cli/src/commands/start.ts
6
+ import { resolve } from "path";
7
+ import { existsSync } from "fs";
8
+ var DEFAULT_CONFIG = "config/default.toml";
9
+ async function runStartCommand(args) {
10
+ let configPath = DEFAULT_CONFIG;
11
+ for (let i = 0; i < args.length; i++) {
12
+ if ((args[i] === "--config" || args[i] === "-c") && args[i + 1]) {
13
+ configPath = args[++i];
14
+ } else if (args[i] === "--help" || args[i] === "-h") {
15
+ printHelp();
16
+ return;
17
+ } else {
18
+ console.error(`Unknown argument: ${args[i]}`);
19
+ printHelp();
20
+ process.exit(1);
21
+ }
22
+ }
23
+ const resolved = resolve(configPath);
24
+ if (!existsSync(resolved)) {
25
+ console.error(`Config not found: ${resolved}`);
26
+ process.exit(1);
27
+ }
28
+ await startPipeline(resolved);
29
+ }
30
+ function printHelp() {
31
+ console.log(`hivemind start \u2014 Start the Hivemind agent
32
+
33
+ Usage: hivemind start [options]
34
+
35
+ Options:
36
+ -c, --config <path> Config file (default: config/default.toml)
37
+ -h, --help Show this help
38
+ `);
39
+ }
40
+
41
+ export {
42
+ runStartCommand
43
+ };
44
+ //# sourceMappingURL=chunk-OQ272HKA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/commands/start.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport { startPipeline } from \"@hivemind/runtime\";\n\nconst DEFAULT_CONFIG = \"config/default.toml\";\n\nexport async function runStartCommand(args: string[]): Promise<void> {\n let configPath = DEFAULT_CONFIG;\n\n // Parse args\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === \"--config\" || args[i] === \"-c\") && args[i + 1]) {\n configPath = args[++i];\n } else if (args[i] === \"--help\" || args[i] === \"-h\") {\n printHelp();\n return;\n } else {\n console.error(`Unknown argument: ${args[i]}`);\n printHelp();\n process.exit(1);\n }\n }\n\n const resolved = resolve(configPath);\n if (!existsSync(resolved)) {\n console.error(`Config not found: ${resolved}`);\n process.exit(1);\n }\n\n await startPipeline(resolved);\n}\n\nfunction printHelp(): void {\n console.log(`hivemind start — Start the Hivemind agent\n\nUsage: hivemind start [options]\n\nOptions:\n -c, --config <path> Config file (default: config/default.toml)\n -h, --help Show this help\n`);\n}\n"],"mappings":";;;;;AAAA,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAG3B,IAAM,iBAAiB;AAEvB,eAAsB,gBAAgB,MAA+B;AACnE,MAAI,aAAa;AAGjB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,SAAK,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM,SAAS,KAAK,IAAI,CAAC,GAAG;AAC/D,mBAAa,KAAK,EAAE,CAAC;AAAA,IACvB,WAAW,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM;AACnD,gBAAU;AACV;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,qBAAqB,KAAK,CAAC,CAAC,EAAE;AAC5C,gBAAU;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,UAAU;AACnC,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,QAAQ;AAC9B;AAEA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOb;AACD;","names":[]}
@@ -0,0 +1,186 @@
1
+ import {
2
+ FleetManager
3
+ } from "./chunk-YEOAEJ62.js";
4
+
5
+ // packages/cli/src/commands/fleet.ts
6
+ function formatUptime(seconds) {
7
+ if (seconds == null) return "\u2014";
8
+ if (seconds < 60) return `${seconds}s`;
9
+ if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;
10
+ const h = Math.floor(seconds / 3600);
11
+ const m = Math.floor(seconds % 3600 / 60);
12
+ return `${h}h ${m}m`;
13
+ }
14
+ function formatHealth(status) {
15
+ switch (status) {
16
+ case "healthy":
17
+ return "OK";
18
+ case "degraded":
19
+ return "DEGRADED";
20
+ case "unreachable":
21
+ return "DOWN";
22
+ default:
23
+ return status.toUpperCase();
24
+ }
25
+ }
26
+ function printDashboard(dashboard) {
27
+ console.log("\n=== Hivemind Fleet ===\n");
28
+ console.log(`Workers: ${dashboard.total_workers} (${dashboard.healthy} healthy, ${dashboard.degraded} degraded, ${dashboard.unreachable} unreachable)`);
29
+ console.log(`Contexts assigned: ${dashboard.total_contexts}`);
30
+ if (dashboard.unassigned_contexts.length > 0) {
31
+ console.log(`Unassigned contexts: ${dashboard.unassigned_contexts.join(", ")}`);
32
+ }
33
+ console.log("");
34
+ if (dashboard.workers.length === 0) {
35
+ console.log("No workers registered. Use 'fleet add-worker <url>' to add one.");
36
+ return;
37
+ }
38
+ const cols = { id: 12, url: 30, health: 8, activity: 10, contexts: 25, task: 20, uptime: 8 };
39
+ const header = [
40
+ "ID".padEnd(cols.id),
41
+ "URL".padEnd(cols.url),
42
+ "HEALTH".padEnd(cols.health),
43
+ "ACTIVITY".padEnd(cols.activity),
44
+ "CONTEXTS".padEnd(cols.contexts),
45
+ "TASK".padEnd(cols.task),
46
+ "UPTIME".padEnd(cols.uptime)
47
+ ].join(" ");
48
+ console.log(header);
49
+ console.log("-".repeat(header.length));
50
+ for (const w of dashboard.workers) {
51
+ const row = [
52
+ w.id.padEnd(cols.id),
53
+ w.url.slice(0, cols.url).padEnd(cols.url),
54
+ formatHealth(w.health).padEnd(cols.health),
55
+ w.activity.padEnd(cols.activity),
56
+ (w.contexts.join(", ") || "\u2014").slice(0, cols.contexts).padEnd(cols.contexts),
57
+ (w.current_task ?? "\u2014").slice(0, cols.task).padEnd(cols.task),
58
+ formatUptime(w.uptime_seconds).padEnd(cols.uptime)
59
+ ].join(" ");
60
+ console.log(row);
61
+ }
62
+ console.log(`
63
+ Generated: ${dashboard.generated_at}`);
64
+ }
65
+ async function runFleetCommand(args) {
66
+ const subcommand = args[0];
67
+ if (!subcommand) {
68
+ printUsage();
69
+ process.exit(1);
70
+ }
71
+ const fleet = new FleetManager();
72
+ switch (subcommand) {
73
+ case "status": {
74
+ const dashboard = await fleet.getDashboard();
75
+ printDashboard(dashboard);
76
+ break;
77
+ }
78
+ case "add-worker": {
79
+ const url = args[1];
80
+ if (!url) {
81
+ console.error("Usage: hivemind fleet add-worker <url>");
82
+ process.exit(1);
83
+ }
84
+ try {
85
+ const worker = await fleet.addWorker(url);
86
+ console.log(`Worker registered: ${worker.id}`);
87
+ console.log(` URL: ${worker.url}`);
88
+ console.log(` Max contexts: ${worker.capabilities.max_contexts}`);
89
+ console.log(` Ollama: ${worker.capabilities.has_ollama ? "yes" : "no"}`);
90
+ console.log(` Memory daemon: ${worker.capabilities.has_memory_daemon ? "yes" : "no"}`);
91
+ } catch (err) {
92
+ const msg = err instanceof Error ? err.message : String(err);
93
+ console.error(`Failed to add worker: ${msg}`);
94
+ process.exit(1);
95
+ }
96
+ break;
97
+ }
98
+ case "remove-worker": {
99
+ const workerId = args[1];
100
+ if (!workerId) {
101
+ console.error("Usage: hivemind fleet remove-worker <worker-id>");
102
+ process.exit(1);
103
+ }
104
+ const removed = await fleet.removeWorker(workerId);
105
+ if (removed) {
106
+ console.log(`Worker ${workerId} removed.`);
107
+ } else {
108
+ console.error(`Worker ${workerId} not found.`);
109
+ process.exit(1);
110
+ }
111
+ break;
112
+ }
113
+ case "assign": {
114
+ const workerId = args[1];
115
+ const context = args[2];
116
+ if (!workerId || !context) {
117
+ console.error("Usage: hivemind fleet assign <worker-id> <context>");
118
+ process.exit(1);
119
+ }
120
+ const result = await fleet.assignContext(workerId, context);
121
+ if (result.accepted) {
122
+ console.log(`Context '${context}' assigned to ${workerId}.`);
123
+ } else {
124
+ console.error(`Assignment rejected: ${result.reason}`);
125
+ process.exit(1);
126
+ }
127
+ break;
128
+ }
129
+ case "migrate": {
130
+ const context = args[1];
131
+ const toWorker = args[2];
132
+ if (!context || !toWorker) {
133
+ console.error("Usage: hivemind fleet migrate <context> <worker-id>");
134
+ process.exit(1);
135
+ }
136
+ const result = await fleet.migrateContext(context, toWorker);
137
+ if (result.success) {
138
+ console.log(`Context '${context}' migrated: ${result.from_worker} -> ${result.to_worker}`);
139
+ } else {
140
+ console.error(`Migration failed: ${result.reason}`);
141
+ process.exit(1);
142
+ }
143
+ break;
144
+ }
145
+ case "discover": {
146
+ const urls = args.slice(1);
147
+ if (urls.length === 0) {
148
+ console.error("Usage: hivemind fleet discover <url1> [url2] ...");
149
+ process.exit(1);
150
+ }
151
+ console.log(`Probing ${urls.length} URL(s)...`);
152
+ const found = await fleet.discoverWorkers(urls);
153
+ if (found.length === 0) {
154
+ console.log("No workers found.");
155
+ } else {
156
+ console.log(`Found ${found.length} worker(s):`);
157
+ for (const url of found) {
158
+ console.log(` ${url}`);
159
+ }
160
+ }
161
+ break;
162
+ }
163
+ default:
164
+ console.error(`Unknown fleet subcommand: ${subcommand}`);
165
+ printUsage();
166
+ process.exit(1);
167
+ }
168
+ }
169
+ function printUsage() {
170
+ console.log(`
171
+ Usage: hivemind fleet <command> [args]
172
+
173
+ Commands:
174
+ status Show fleet dashboard
175
+ add-worker <url> Register a worker by URL
176
+ remove-worker <worker-id> Remove a worker from the fleet
177
+ assign <worker-id> <context> Assign a context to a worker
178
+ migrate <context> <worker-id> Migrate a context to another worker
179
+ discover <url1> [url2] ... Probe URLs for workers
180
+ `.trim());
181
+ }
182
+
183
+ export {
184
+ runFleetCommand
185
+ };
186
+ //# sourceMappingURL=chunk-RXCV57H3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/commands/fleet.ts"],"sourcesContent":["/**\n * CLI commands for fleet management.\n *\n * Usage:\n * hivemind fleet status — Show fleet dashboard\n * hivemind fleet add-worker <url> — Register a worker by URL\n * hivemind fleet remove-worker <worker-id> — Remove a worker from the fleet\n * hivemind fleet assign <worker-id> <context> — Assign a context to a worker\n * hivemind fleet migrate <context> <worker-id> — Migrate a context to another worker\n * hivemind fleet discover <url1> [url2] ... — Probe URLs for workers\n */\n\nimport { FleetManager } from \"@hivemind/runtime\";\nimport type { FleetDashboard, WorkerSummary } from \"@hivemind/runtime\";\n\nfunction formatUptime(seconds: number | null): string {\n if (seconds == null) return \"—\";\n if (seconds < 60) return `${seconds}s`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n return `${h}h ${m}m`;\n}\n\nfunction formatHealth(status: string): string {\n switch (status) {\n case \"healthy\": return \"OK\";\n case \"degraded\": return \"DEGRADED\";\n case \"unreachable\": return \"DOWN\";\n default: return status.toUpperCase();\n }\n}\n\nfunction printDashboard(dashboard: FleetDashboard): void {\n console.log(\"\\n=== Hivemind Fleet ===\\n\");\n console.log(`Workers: ${dashboard.total_workers} (${dashboard.healthy} healthy, ${dashboard.degraded} degraded, ${dashboard.unreachable} unreachable)`);\n console.log(`Contexts assigned: ${dashboard.total_contexts}`);\n\n if (dashboard.unassigned_contexts.length > 0) {\n console.log(`Unassigned contexts: ${dashboard.unassigned_contexts.join(\", \")}`);\n }\n\n console.log(\"\");\n\n if (dashboard.workers.length === 0) {\n console.log(\"No workers registered. Use 'fleet add-worker <url>' to add one.\");\n return;\n }\n\n // Table header\n const cols = { id: 12, url: 30, health: 8, activity: 10, contexts: 25, task: 20, uptime: 8 };\n const header = [\n \"ID\".padEnd(cols.id),\n \"URL\".padEnd(cols.url),\n \"HEALTH\".padEnd(cols.health),\n \"ACTIVITY\".padEnd(cols.activity),\n \"CONTEXTS\".padEnd(cols.contexts),\n \"TASK\".padEnd(cols.task),\n \"UPTIME\".padEnd(cols.uptime),\n ].join(\" \");\n console.log(header);\n console.log(\"-\".repeat(header.length));\n\n for (const w of dashboard.workers) {\n const row = [\n w.id.padEnd(cols.id),\n w.url.slice(0, cols.url).padEnd(cols.url),\n formatHealth(w.health).padEnd(cols.health),\n w.activity.padEnd(cols.activity),\n (w.contexts.join(\", \") || \"—\").slice(0, cols.contexts).padEnd(cols.contexts),\n (w.current_task ?? \"—\").slice(0, cols.task).padEnd(cols.task),\n formatUptime(w.uptime_seconds).padEnd(cols.uptime),\n ].join(\" \");\n console.log(row);\n }\n\n console.log(`\\nGenerated: ${dashboard.generated_at}`);\n}\n\nexport async function runFleetCommand(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n if (!subcommand) {\n printUsage();\n process.exit(1);\n }\n\n const fleet = new FleetManager();\n\n switch (subcommand) {\n case \"status\": {\n const dashboard = await fleet.getDashboard();\n printDashboard(dashboard);\n break;\n }\n\n case \"add-worker\": {\n const url = args[1];\n if (!url) {\n console.error(\"Usage: hivemind fleet add-worker <url>\");\n process.exit(1);\n }\n try {\n const worker = await fleet.addWorker(url);\n console.log(`Worker registered: ${worker.id}`);\n console.log(` URL: ${worker.url}`);\n console.log(` Max contexts: ${worker.capabilities.max_contexts}`);\n console.log(` Ollama: ${worker.capabilities.has_ollama ? \"yes\" : \"no\"}`);\n console.log(` Memory daemon: ${worker.capabilities.has_memory_daemon ? \"yes\" : \"no\"}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`Failed to add worker: ${msg}`);\n process.exit(1);\n }\n break;\n }\n\n case \"remove-worker\": {\n const workerId = args[1];\n if (!workerId) {\n console.error(\"Usage: hivemind fleet remove-worker <worker-id>\");\n process.exit(1);\n }\n const removed = await fleet.removeWorker(workerId);\n if (removed) {\n console.log(`Worker ${workerId} removed.`);\n } else {\n console.error(`Worker ${workerId} not found.`);\n process.exit(1);\n }\n break;\n }\n\n case \"assign\": {\n const workerId = args[1];\n const context = args[2];\n if (!workerId || !context) {\n console.error(\"Usage: hivemind fleet assign <worker-id> <context>\");\n process.exit(1);\n }\n const result = await fleet.assignContext(workerId, context);\n if (result.accepted) {\n console.log(`Context '${context}' assigned to ${workerId}.`);\n } else {\n console.error(`Assignment rejected: ${result.reason}`);\n process.exit(1);\n }\n break;\n }\n\n case \"migrate\": {\n const context = args[1];\n const toWorker = args[2];\n if (!context || !toWorker) {\n console.error(\"Usage: hivemind fleet migrate <context> <worker-id>\");\n process.exit(1);\n }\n const result = await fleet.migrateContext(context, toWorker);\n if (result.success) {\n console.log(`Context '${context}' migrated: ${result.from_worker} -> ${result.to_worker}`);\n } else {\n console.error(`Migration failed: ${result.reason}`);\n process.exit(1);\n }\n break;\n }\n\n case \"discover\": {\n const urls = args.slice(1);\n if (urls.length === 0) {\n console.error(\"Usage: hivemind fleet discover <url1> [url2] ...\");\n process.exit(1);\n }\n console.log(`Probing ${urls.length} URL(s)...`);\n const found = await fleet.discoverWorkers(urls);\n if (found.length === 0) {\n console.log(\"No workers found.\");\n } else {\n console.log(`Found ${found.length} worker(s):`);\n for (const url of found) {\n console.log(` ${url}`);\n }\n }\n break;\n }\n\n default:\n console.error(`Unknown fleet subcommand: ${subcommand}`);\n printUsage();\n process.exit(1);\n }\n}\n\nfunction printUsage(): void {\n console.log(`\nUsage: hivemind fleet <command> [args]\n\nCommands:\n status Show fleet dashboard\n add-worker <url> Register a worker by URL\n remove-worker <worker-id> Remove a worker from the fleet\n assign <worker-id> <context> Assign a context to a worker\n migrate <context> <worker-id> Migrate a context to another worker\n discover <url1> [url2] ... Probe URLs for workers\n`.trim());\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,131 @@
1
+ // packages/cli/src/commands/upgrade.ts
2
+ import { execSync } from "child_process";
3
+ import { resolve } from "path";
4
+ import { existsSync, readFileSync } from "fs";
5
+ var PACKAGE_NAME = "@sesamespace/hivemind";
6
+ function getCurrentVersion() {
7
+ try {
8
+ const output = execSync(`npm ls -g ${PACKAGE_NAME} --json 2>/dev/null`, { encoding: "utf-8" });
9
+ const parsed = JSON.parse(output);
10
+ const deps = parsed.dependencies?.[PACKAGE_NAME];
11
+ if (deps?.version) return deps.version;
12
+ } catch {
13
+ }
14
+ const hivemindHome = process.env.HIVEMIND_HOME || resolve(process.env.HOME || "~", "hivemind");
15
+ const pkgPath = resolve(hivemindHome, "node_modules", PACKAGE_NAME, "package.json");
16
+ if (existsSync(pkgPath)) {
17
+ try {
18
+ return JSON.parse(readFileSync(pkgPath, "utf-8")).version;
19
+ } catch {
20
+ }
21
+ }
22
+ return "unknown";
23
+ }
24
+ function getLatestVersion(target) {
25
+ try {
26
+ const tag = target || "latest";
27
+ const output = execSync(`npm view ${PACKAGE_NAME}@${tag} version 2>/dev/null`, { encoding: "utf-8" });
28
+ return output.trim();
29
+ } catch {
30
+ throw new Error("Failed to check npm registry for latest version");
31
+ }
32
+ }
33
+ async function checkVersion(target) {
34
+ const current = getCurrentVersion();
35
+ const latest = target || getLatestVersion();
36
+ return {
37
+ current,
38
+ latest,
39
+ updateAvailable: current !== latest && current !== "unknown"
40
+ };
41
+ }
42
+ async function runUpgradeCommand(args) {
43
+ const checkOnly = args.includes("--check") || args.includes("-c");
44
+ const force = args.includes("--force") || args.includes("-f");
45
+ const dryRun = args.includes("--dry-run") || args.includes("-n");
46
+ const targetVersion = args.find((a) => !a.startsWith("-"));
47
+ if (args.includes("--help") || args.includes("-h")) {
48
+ printHelp();
49
+ return;
50
+ }
51
+ console.log(`
52
+ \u2566 \u2566\u2566\u2566 \u2566\u2554\u2550\u2557\u2554\u2566\u2557\u2566\u2554\u2557\u2554\u2554\u2566\u2557
53
+ \u2560\u2550\u2563\u2551\u255A\u2557\u2554\u255D\u2551\u2563 \u2551\u2551\u2551\u2551\u2551\u2551\u2551 \u2551\u2551
54
+ \u2569 \u2569\u2569 \u255A\u255D \u255A\u2550\u255D\u2569 \u2569\u2569\u255D\u255A\u255D\u2550\u2569\u255D
55
+ Agent Upgrade
56
+ `);
57
+ console.log("\u2192 Checking versions...");
58
+ const info = await checkVersion(targetVersion);
59
+ console.log(` Current: ${info.current}`);
60
+ console.log(` Latest: ${info.latest}`);
61
+ if (!info.updateAvailable && !force) {
62
+ console.log("\n \u2713 Already up to date!");
63
+ return;
64
+ }
65
+ if (info.updateAvailable) {
66
+ console.log(`
67
+ \u2B06 Update available: ${info.current} \u2192 ${info.latest}`);
68
+ }
69
+ if (checkOnly) {
70
+ return;
71
+ }
72
+ const target = targetVersion ? `${PACKAGE_NAME}@${targetVersion}` : `${PACKAGE_NAME}@latest`;
73
+ if (dryRun) {
74
+ console.log(`
75
+ \u2192 [dry-run] Would run: npm install -g ${target}`);
76
+ console.log("\u2192 [dry-run] Would restart the agent service");
77
+ return;
78
+ }
79
+ console.log(`
80
+ \u2192 Installing ${target}...`);
81
+ try {
82
+ execSync(`npm install -g ${target}`, { stdio: "inherit" });
83
+ console.log(" \u2713 Package updated");
84
+ } catch (err) {
85
+ console.error(` \u2717 npm install failed: ${err.message}`);
86
+ process.exit(1);
87
+ }
88
+ console.log("\n\u2192 Restarting agent...");
89
+ try {
90
+ const plistName = "com.hivemind.agent";
91
+ execSync(`launchctl list ${plistName} 2>/dev/null`, { encoding: "utf-8" });
92
+ execSync(`launchctl kickstart -k gui/$(id -u)/${plistName}`, { stdio: "inherit" });
93
+ console.log(" \u2713 Agent restarted via launchd");
94
+ } catch {
95
+ try {
96
+ execSync("pkill -f 'hivemind start'", { stdio: "inherit" });
97
+ console.log(" \u2713 Old process killed");
98
+ console.log(" ! Start the agent manually: hivemind start");
99
+ } catch {
100
+ console.log(" ! No running agent found \u2014 start manually: hivemind start");
101
+ }
102
+ }
103
+ const newVersion = getCurrentVersion();
104
+ console.log(`
105
+ \u2713 Upgrade complete: ${info.current} \u2192 ${newVersion}`);
106
+ }
107
+ function printHelp() {
108
+ console.log(`hivemind upgrade \u2014 Upgrade the Hivemind agent runtime
109
+
110
+ Usage: hivemind upgrade [version] [options]
111
+
112
+ Arguments:
113
+ version Target version (default: latest)
114
+
115
+ Options:
116
+ -c, --check Check for updates only (don't install)
117
+ -f, --force Force reinstall even if up to date
118
+ -n, --dry-run Show what would happen without doing it
119
+ -h, --help Show this help
120
+
121
+ Examples:
122
+ hivemind upgrade # Upgrade to latest
123
+ hivemind upgrade 0.3.0 # Upgrade to specific version
124
+ hivemind upgrade --check # Just check if update available
125
+ `);
126
+ }
127
+
128
+ export {
129
+ runUpgradeCommand
130
+ };
131
+ //# sourceMappingURL=chunk-SJI2KAIN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/commands/upgrade.ts"],"sourcesContent":["import { execSync } from \"child_process\";\nimport { resolve } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\n\nconst PACKAGE_NAME = \"@sesamespace/hivemind\";\n\ninterface VersionInfo {\n current: string;\n latest: string;\n updateAvailable: boolean;\n}\n\nfunction getCurrentVersion(): string {\n try {\n // Check the installed package version\n const output = execSync(`npm ls -g ${PACKAGE_NAME} --json 2>/dev/null`, { encoding: \"utf-8\" });\n const parsed = JSON.parse(output);\n const deps = parsed.dependencies?.[PACKAGE_NAME];\n if (deps?.version) return deps.version;\n } catch {\n // Fallback: read from the package.json in the hivemind dir\n }\n\n const hivemindHome = process.env.HIVEMIND_HOME || resolve(process.env.HOME || \"~\", \"hivemind\");\n const pkgPath = resolve(hivemindHome, \"node_modules\", PACKAGE_NAME, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n return JSON.parse(readFileSync(pkgPath, \"utf-8\")).version;\n } catch {\n // fall through\n }\n }\n\n return \"unknown\";\n}\n\nfunction getLatestVersion(target?: string): string {\n try {\n const tag = target || \"latest\";\n const output = execSync(`npm view ${PACKAGE_NAME}@${tag} version 2>/dev/null`, { encoding: \"utf-8\" });\n return output.trim();\n } catch {\n throw new Error(\"Failed to check npm registry for latest version\");\n }\n}\n\nasync function checkVersion(target?: string): Promise<VersionInfo> {\n const current = getCurrentVersion();\n const latest = target || getLatestVersion();\n return {\n current,\n latest,\n updateAvailable: current !== latest && current !== \"unknown\",\n };\n}\n\nexport async function runUpgradeCommand(args: string[]): Promise<void> {\n const checkOnly = args.includes(\"--check\") || args.includes(\"-c\");\n const force = args.includes(\"--force\") || args.includes(\"-f\");\n const dryRun = args.includes(\"--dry-run\") || args.includes(\"-n\");\n\n // Target version (optional positional arg)\n const targetVersion = args.find((a) => !a.startsWith(\"-\"));\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n console.log(`\n ╦ ╦╦╦ ╦╔═╗╔╦╗╦╔╗╔╔╦╗\n ╠═╣║╚╗╔╝║╣ ║║║║║║║ ║║\n ╩ ╩╩ ╚╝ ╚═╝╩ ╩╩╝╚╝═╩╝\n Agent Upgrade\n`);\n\n // --- Check versions ---\n console.log(\"→ Checking versions...\");\n const info = await checkVersion(targetVersion);\n console.log(` Current: ${info.current}`);\n console.log(` Latest: ${info.latest}`);\n\n if (!info.updateAvailable && !force) {\n console.log(\"\\n ✓ Already up to date!\");\n return;\n }\n\n if (info.updateAvailable) {\n console.log(`\\n ⬆ Update available: ${info.current} → ${info.latest}`);\n }\n\n if (checkOnly) {\n return;\n }\n\n // --- Perform upgrade ---\n const target = targetVersion ? `${PACKAGE_NAME}@${targetVersion}` : `${PACKAGE_NAME}@latest`;\n\n if (dryRun) {\n console.log(`\\n→ [dry-run] Would run: npm install -g ${target}`);\n console.log(\"→ [dry-run] Would restart the agent service\");\n return;\n }\n\n console.log(`\\n→ Installing ${target}...`);\n try {\n execSync(`npm install -g ${target}`, { stdio: \"inherit\" });\n console.log(\" ✓ Package updated\");\n } catch (err) {\n console.error(` ✗ npm install failed: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // --- Restart agent ---\n console.log(\"\\n→ Restarting agent...\");\n try {\n // Try launchctl first (macOS service)\n const plistName = \"com.hivemind.agent\";\n execSync(`launchctl list ${plistName} 2>/dev/null`, { encoding: \"utf-8\" });\n // Service exists — restart it\n execSync(`launchctl kickstart -k gui/$(id -u)/${plistName}`, { stdio: \"inherit\" });\n console.log(\" ✓ Agent restarted via launchd\");\n } catch {\n // No launchd service — try finding and restarting the process\n try {\n execSync(\"pkill -f 'hivemind start'\", { stdio: \"inherit\" });\n console.log(\" ✓ Old process killed\");\n console.log(\" ! Start the agent manually: hivemind start\");\n } catch {\n console.log(\" ! No running agent found — start manually: hivemind start\");\n }\n }\n\n // --- Verify ---\n const newVersion = getCurrentVersion();\n console.log(`\\n ✓ Upgrade complete: ${info.current} → ${newVersion}`);\n}\n\nfunction printHelp(): void {\n console.log(`hivemind upgrade — Upgrade the Hivemind agent runtime\n\nUsage: hivemind upgrade [version] [options]\n\nArguments:\n version Target version (default: latest)\n\nOptions:\n -c, --check Check for updates only (don't install)\n -f, --force Force reinstall even if up to date\n -n, --dry-run Show what would happen without doing it\n -h, --help Show this help\n\nExamples:\n hivemind upgrade # Upgrade to latest\n hivemind upgrade 0.3.0 # Upgrade to specific version\n hivemind upgrade --check # Just check if update available\n`);\n}\n"],"mappings":"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","names":[]}