@sesamespace/hivemind 0.8.13 → 0.11.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/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  PrimaryMemorySync,
5
5
  Watchdog,
6
6
  WorkerMemorySync
7
- } from "./chunk-4Y7A25UG.js";
7
+ } from "./chunk-K6KL2VD6.js";
8
8
  import {
9
9
  Agent,
10
10
  AutoDebugger,
@@ -34,7 +34,7 @@ import {
34
34
  setLogLevel,
35
35
  startPipeline,
36
36
  startWorker
37
- } from "./chunk-ZM7RK5YV.js";
37
+ } from "./chunk-OB6OXLPC.js";
38
38
  import "./chunk-DGUM43GV.js";
39
39
  export {
40
40
  Agent,
package/dist/main.js CHANGED
@@ -1,26 +1,387 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runInitCommand
4
- } from "./chunk-NSTTILSN.js";
4
+ } from "./chunk-4YXOQGQC.js";
5
5
  import {
6
6
  runStartCommand
7
- } from "./chunk-PFZO67E2.js";
7
+ } from "./chunk-ZA4NWNS6.js";
8
8
  import {
9
9
  runFleetCommand
10
- } from "./chunk-HTLHMXAL.js";
10
+ } from "./chunk-4C6B2AMB.js";
11
11
  import {
12
12
  runServiceCommand
13
13
  } from "./chunk-IJRAVHQC.js";
14
14
  import {
15
15
  runUpgradeCommand
16
- } from "./chunk-LJHJGDKY.js";
16
+ } from "./chunk-ICSJNKI6.js";
17
17
  import {
18
18
  runWatchdogCommand
19
- } from "./chunk-MLY4VFOO.js";
20
- import "./chunk-4Y7A25UG.js";
21
- import "./chunk-ZM7RK5YV.js";
19
+ } from "./chunk-LYL5GG2F.js";
20
+ import "./chunk-K6KL2VD6.js";
21
+ import "./chunk-OB6OXLPC.js";
22
22
  import "./chunk-DGUM43GV.js";
23
23
 
24
+ // packages/cli/src/commands/session.ts
25
+ import { resolve } from "path";
26
+ import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
27
+ import { execSync } from "child_process";
28
+ import { homedir } from "os";
29
+ var MEMORY_URL = process.env.HIVEMIND_MEMORY_URL || "http://localhost:3434";
30
+ var CONTEXT = process.env.HIVEMIND_CONTEXT || "coding-sessions";
31
+ async function storeRecord(content, metadata) {
32
+ try {
33
+ const resp = await fetch(`${MEMORY_URL}/store`, {
34
+ method: "POST",
35
+ headers: { "Content-Type": "application/json" },
36
+ body: JSON.stringify({ context: CONTEXT, content, metadata })
37
+ });
38
+ return resp.ok;
39
+ } catch {
40
+ return false;
41
+ }
42
+ }
43
+ async function runSessionCommand(args2) {
44
+ const subcommand = args2[0];
45
+ switch (subcommand) {
46
+ case "ingest":
47
+ await runIngest(args2.slice(1));
48
+ break;
49
+ case "hot-start":
50
+ await runHotStart(args2.slice(1));
51
+ break;
52
+ case "setup-claude":
53
+ await runSetupClaude(args2.slice(1));
54
+ break;
55
+ default:
56
+ console.log(`hivemind session \u2014 Claude Code session memory tools
57
+
58
+ Usage: hivemind session <command>
59
+
60
+ Commands:
61
+ ingest [dir] Ingest .session-log.json from a project into hivemind memory
62
+ hot-start [dir] Generate project context guide from codebase + hivemind memory
63
+ setup-claude Install global CLAUDE.md for session logging
64
+ `);
65
+ if (subcommand) {
66
+ console.error(`Unknown subcommand: ${subcommand}`);
67
+ process.exit(1);
68
+ }
69
+ }
70
+ }
71
+ async function runIngest(args2) {
72
+ const projectDir = resolve(args2[0] || ".");
73
+ const sessionLogPath = resolve(projectDir, ".session-log.json");
74
+ if (!existsSync(sessionLogPath)) {
75
+ console.log("No .session-log.json found \u2014 nothing to ingest.");
76
+ return;
77
+ }
78
+ console.log(`Ingesting session from ${projectDir}...`);
79
+ const data = JSON.parse(readFileSync(sessionLogPath, "utf-8"));
80
+ const timestamp = data.timestamp || (/* @__PURE__ */ new Date()).toISOString();
81
+ const sessionId = `session-${Date.now()}`;
82
+ let projectName = "unknown";
83
+ let gitBranch = "unknown";
84
+ let gitHash = "unknown";
85
+ let gitDiffStat = "";
86
+ try {
87
+ projectName = execSync("basename $(git rev-parse --show-toplevel)", {
88
+ cwd: projectDir,
89
+ encoding: "utf-8"
90
+ }).trim();
91
+ } catch {
92
+ projectName = resolve(projectDir).split("/").pop() || "unknown";
93
+ }
94
+ try {
95
+ gitBranch = execSync("git rev-parse --abbrev-ref HEAD", {
96
+ cwd: projectDir,
97
+ encoding: "utf-8"
98
+ }).trim();
99
+ } catch {
100
+ }
101
+ try {
102
+ gitHash = execSync("git rev-parse --short HEAD", {
103
+ cwd: projectDir,
104
+ encoding: "utf-8"
105
+ }).trim();
106
+ } catch {
107
+ }
108
+ try {
109
+ gitDiffStat = execSync("git diff --stat HEAD~1", {
110
+ cwd: projectDir,
111
+ encoding: "utf-8"
112
+ }).trim();
113
+ } catch {
114
+ }
115
+ const baseMeta = {
116
+ type: "coding_session",
117
+ project: projectName,
118
+ session_id: sessionId,
119
+ branch: gitBranch,
120
+ commit: gitHash,
121
+ timestamp
122
+ };
123
+ let stored = 0;
124
+ if (data.summary) {
125
+ await storeRecord(
126
+ `[${projectName}] ${data.summary}`,
127
+ { ...baseMeta, record_type: "session_summary" }
128
+ );
129
+ stored++;
130
+ console.log(" \u2713 Summary stored");
131
+ }
132
+ if (data.decisions?.length) {
133
+ for (const d of data.decisions) {
134
+ let content = `[${projectName}] Decision: ${d.topic} \u2014 Chose ${d.choice} because ${d.rationale}`;
135
+ if (d.alternatives_considered?.length) {
136
+ content += ` (alternatives: ${d.alternatives_considered.join(", ")})`;
137
+ }
138
+ await storeRecord(content, { ...baseMeta, record_type: "decision", topic: d.topic });
139
+ stored++;
140
+ }
141
+ console.log(` \u2713 ${data.decisions.length} decision(s) stored`);
142
+ }
143
+ if (data.patterns?.length) {
144
+ for (const p of data.patterns) {
145
+ await storeRecord(
146
+ `[${projectName}] Pattern: ${p.pattern}`,
147
+ { ...baseMeta, record_type: "pattern", scope: p.scope || "project-wide" }
148
+ );
149
+ stored++;
150
+ }
151
+ console.log(` \u2713 ${data.patterns.length} pattern(s) stored`);
152
+ }
153
+ if (data.gotchas?.length) {
154
+ for (const g of data.gotchas) {
155
+ let content = `[${projectName}] Gotcha: ${g.issue} \u2192 Fix: ${g.resolution}`;
156
+ if (g.prevention) content += `. Prevention: ${g.prevention}`;
157
+ await storeRecord(content, { ...baseMeta, record_type: "gotcha" });
158
+ stored++;
159
+ }
160
+ console.log(` \u2713 ${data.gotchas.length} gotcha(s) stored`);
161
+ }
162
+ if (data.files_changed?.length) {
163
+ const lines = data.files_changed.map(
164
+ (f) => `- ${f.path} (${f.action}): ${f.purpose}`
165
+ );
166
+ await storeRecord(
167
+ `[${projectName}] Files changed:
168
+ ${lines.join("\n")}`,
169
+ { ...baseMeta, record_type: "file_context" }
170
+ );
171
+ stored++;
172
+ console.log(` \u2713 File context stored (${data.files_changed.length} files)`);
173
+ }
174
+ if (gitDiffStat) {
175
+ await storeRecord(
176
+ `[${projectName}] Git diff:
177
+ ${gitDiffStat}`,
178
+ { ...baseMeta, record_type: "git_diff" }
179
+ );
180
+ stored++;
181
+ console.log(" \u2713 Git diff stored");
182
+ }
183
+ unlinkSync(sessionLogPath);
184
+ console.log(`Done. ${stored} records ingested as ${sessionId}`);
185
+ }
186
+ async function runHotStart(args2) {
187
+ const projectDir = resolve(args2.find((a) => !a.startsWith("-")) || ".");
188
+ const writeMode = args2.includes("--write");
189
+ let projectRoot;
190
+ try {
191
+ projectRoot = execSync("git rev-parse --show-toplevel", {
192
+ cwd: projectDir,
193
+ encoding: "utf-8"
194
+ }).trim();
195
+ } catch {
196
+ projectRoot = resolve(projectDir);
197
+ }
198
+ const projectName = projectRoot.split("/").pop() || "unknown";
199
+ const has = (f) => existsSync(resolve(projectRoot, f));
200
+ const lines = [];
201
+ lines.push(`# Project: ${projectName}`, "");
202
+ lines.push("## Tech Stack");
203
+ const langMap = [
204
+ ["package.json", "TypeScript/JavaScript"],
205
+ ["Cargo.toml", "Rust"],
206
+ ["go.mod", "Go"],
207
+ ["requirements.txt", "Python"],
208
+ ["pyproject.toml", "Python"],
209
+ ["Gemfile", "Ruby"]
210
+ ];
211
+ const langs = [...new Set(langMap.filter(([f]) => has(f)).map(([, l]) => l))];
212
+ if (langs.length) lines.push(`- Languages: ${langs.join(", ")}`);
213
+ for (const [f, pm] of [["pnpm-lock.yaml", "pnpm"], ["yarn.lock", "yarn"], ["package-lock.json", "npm"], ["Cargo.lock", "cargo"]]) {
214
+ if (has(f)) {
215
+ lines.push(`- Package manager: ${pm}`);
216
+ break;
217
+ }
218
+ }
219
+ if (has("package.json")) {
220
+ try {
221
+ const pkg = JSON.parse(readFileSync(resolve(projectRoot, "package.json"), "utf-8"));
222
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
223
+ for (const fw of ["react", "next", "express", "fastify", "vite", "vitest", "jest", "prisma", "drizzle"]) {
224
+ if (fw in allDeps) lines.push(`- Framework: ${fw}`);
225
+ }
226
+ } catch {
227
+ }
228
+ }
229
+ lines.push("");
230
+ lines.push("## Structure", "```");
231
+ try {
232
+ const tree = execSync(
233
+ 'find . -maxdepth 2 -type d ! -path "*/node_modules*" ! -path "*/.git*" ! -path "*/target*" ! -path "*/.next*" ! -path "*/dist*" ! -path "*/__pycache__*" | sort | head -30 | sed "s|^\\./||"',
234
+ { cwd: projectRoot, encoding: "utf-8" }
235
+ ).trim();
236
+ lines.push(tree);
237
+ } catch {
238
+ }
239
+ lines.push("```", "");
240
+ lines.push("## Key Files");
241
+ for (const f of ["README.md", "CONTRIBUTING.md", "ARCHITECTURE.md", "CLAUDE.md", ".claude/settings.json"]) {
242
+ if (has(f)) lines.push(`- \`${f}\` exists`);
243
+ }
244
+ for (const f of ["src/index.ts", "src/main.ts", "src/app.ts", "index.ts", "main.ts", "src/lib.rs", "src/main.rs", "main.go"]) {
245
+ if (has(f)) lines.push(`- Entry point: \`${f}\``);
246
+ }
247
+ lines.push("");
248
+ if (has("package.json")) {
249
+ try {
250
+ const pkg = JSON.parse(readFileSync(resolve(projectRoot, "package.json"), "utf-8"));
251
+ if (pkg.scripts && Object.keys(pkg.scripts).length) {
252
+ lines.push("## Scripts (from package.json)");
253
+ for (const [k, v] of Object.entries(pkg.scripts).slice(0, 15)) {
254
+ lines.push(`- \`${k}\`: ${v}`);
255
+ }
256
+ lines.push("");
257
+ }
258
+ } catch {
259
+ }
260
+ }
261
+ lines.push("## Recent Git Activity", "```");
262
+ try {
263
+ lines.push(execSync("git log --oneline -10", { cwd: projectRoot, encoding: "utf-8" }).trim());
264
+ } catch {
265
+ lines.push("no git history");
266
+ }
267
+ lines.push("```", "");
268
+ try {
269
+ const healthRes = await fetch(`${MEMORY_URL}/health`);
270
+ if (healthRes.ok) {
271
+ lines.push("## Relevant Memories (from hivemind)", "");
272
+ for (const [label, query] of [
273
+ ["Past Decisions", `${projectName} decision`],
274
+ ["Known Gotchas", `${projectName} gotcha bug issue`],
275
+ ["Project Patterns", `${projectName} pattern convention`]
276
+ ]) {
277
+ try {
278
+ const res = await fetch(`${MEMORY_URL}/search?q=${encodeURIComponent(query)}&context=coding-sessions&limit=5`);
279
+ if (res.ok) {
280
+ const data = await res.json();
281
+ const results = (data.results || []).map((r) => r.content).filter(Boolean);
282
+ if (results.length) {
283
+ lines.push(`### ${label}`);
284
+ for (const r of results) lines.push(`- ${r}`);
285
+ lines.push("");
286
+ }
287
+ }
288
+ } catch {
289
+ }
290
+ }
291
+ }
292
+ } catch {
293
+ }
294
+ const output = lines.join("\n");
295
+ if (writeMode) {
296
+ const claudeMd = resolve(projectRoot, "CLAUDE.md");
297
+ const header = `<!-- Auto-generated by hivemind hot-start ${(/* @__PURE__ */ new Date()).toISOString()} -->`;
298
+ if (existsSync(claudeMd)) {
299
+ const existing = readFileSync(claudeMd, "utf-8");
300
+ writeFileSync(claudeMd, existing + "\n---\n" + header + "\n" + output);
301
+ console.log(`Updated ${claudeMd} with hot-start context`);
302
+ } else {
303
+ writeFileSync(claudeMd, header + "\n" + output);
304
+ console.log(`Created ${claudeMd} with hot-start context`);
305
+ }
306
+ } else {
307
+ console.log(output);
308
+ }
309
+ }
310
+ async function runSetupClaude(_args) {
311
+ const claudeDir = resolve(homedir(), ".claude");
312
+ const claudeMd = resolve(claudeDir, "CLAUDE.md");
313
+ const content = `# Claude Code \u2014 Global Instructions
314
+
315
+ ## Session Logging
316
+
317
+ Before completing any session, write a \`.session-log.json\` file in the project root with the following structure:
318
+
319
+ \`\`\`json
320
+ {
321
+ "timestamp": "<ISO-8601>",
322
+ "summary": "One paragraph describing what was done and why",
323
+ "decisions": [
324
+ {
325
+ "topic": "Short label (e.g. 'auth strategy')",
326
+ "choice": "What was chosen",
327
+ "rationale": "Why this over alternatives",
328
+ "alternatives_considered": ["alt1", "alt2"]
329
+ }
330
+ ],
331
+ "patterns": [
332
+ {
333
+ "pattern": "Description of a coding pattern or convention used/discovered",
334
+ "scope": "project-wide | file-specific | language-general"
335
+ }
336
+ ],
337
+ "gotchas": [
338
+ {
339
+ "issue": "What went wrong or was tricky",
340
+ "resolution": "How it was fixed or worked around",
341
+ "prevention": "How to avoid it next time"
342
+ }
343
+ ],
344
+ "files_changed": [
345
+ {
346
+ "path": "relative/path/to/file",
347
+ "action": "created | modified | deleted",
348
+ "purpose": "Why this file was changed"
349
+ }
350
+ ]
351
+ }
352
+ \`\`\`
353
+
354
+ Rules:
355
+ - Always create this file, even for small changes
356
+ - Omit empty arrays (e.g. if no gotchas, leave out the key)
357
+ - Be specific in decisions and gotchas \u2014 these help future sessions
358
+ - The file is gitignored and consumed by tooling, not humans
359
+ - If the session was exploratory with no changes, still log the summary and any insights
360
+ `;
361
+ if (existsSync(claudeMd)) {
362
+ const existing = readFileSync(claudeMd, "utf-8");
363
+ if (existing.includes("Session Logging")) {
364
+ console.log("CLAUDE.md already contains session logging instructions.");
365
+ return;
366
+ }
367
+ writeFileSync(claudeMd, existing + "\n" + content);
368
+ console.log(`\u2713 Appended session logging instructions to ${claudeMd}`);
369
+ } else {
370
+ writeFileSync(claudeMd, content);
371
+ console.log(`\u2713 Created ${claudeMd} with session logging instructions`);
372
+ }
373
+ const globalGitignore = resolve(homedir(), ".gitignore_global");
374
+ try {
375
+ const existing = existsSync(globalGitignore) ? readFileSync(globalGitignore, "utf-8") : "";
376
+ if (!existing.includes(".session-log.json")) {
377
+ writeFileSync(globalGitignore, existing + "\n.session-log.json\n");
378
+ execSync(`git config --global core.excludesfile "${globalGitignore}"`, { stdio: "ignore" });
379
+ console.log("\u2713 Added .session-log.json to global gitignore");
380
+ }
381
+ } catch {
382
+ }
383
+ }
384
+
24
385
  // packages/cli/src/main.ts
25
386
  var [command, ...args] = process.argv.slice(2);
26
387
  switch (command) {
@@ -60,6 +421,12 @@ switch (command) {
60
421
  process.exit(1);
61
422
  });
62
423
  break;
424
+ case "session":
425
+ runSessionCommand(args).catch((err) => {
426
+ console.error(err instanceof Error ? err.message : String(err));
427
+ process.exit(1);
428
+ });
429
+ break;
63
430
  default:
64
431
  console.log(`hivemind cli v0.3.0
65
432
 
@@ -72,6 +439,7 @@ Commands:
72
439
  upgrade Upgrade the Hivemind runtime
73
440
  service Manage launchd services (install/uninstall/stop/start/status/logs)
74
441
  fleet Manage the worker fleet
442
+ session Claude Code session memory (ingest/hot-start/setup-claude)
75
443
  `);
76
444
  if (command) {
77
445
  console.error(`Unknown command: ${command}`);
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../packages/cli/src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { runFleetCommand } from \"./commands/fleet.js\";\nimport { runStartCommand } from \"./commands/start.js\";\nimport { runInitCommand } from \"./commands/init.js\";\nimport { runServiceCommand } from \"./commands/service.js\";\nimport { runUpgradeCommand } from \"./commands/upgrade.js\";\nimport { runWatchdogCommand } from \"./commands/watchdog.js\";\n\nconst [command, ...args] = process.argv.slice(2);\n\nswitch (command) {\n case \"init\":\n runInitCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"start\":\n runStartCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"service\":\n runServiceCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"fleet\":\n runFleetCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"upgrade\":\n runUpgradeCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"watchdog\":\n runWatchdogCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n default:\n console.log(`hivemind cli v0.3.0\n\nUsage: hivemind <command> [args]\n\nCommands:\n init Initialize agent from Sesame API key\n start Start the Hivemind agent\n watchdog Start the watchdog daemon\n upgrade Upgrade the Hivemind runtime\n service Manage launchd services (install/uninstall/stop/start/status/logs)\n fleet Manage the worker fleet\n`);\n if (command) {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n break;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AASA,IAAM,CAAC,SAAS,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC;AAE/C,QAAQ,SAAS;AAAA,EACf,KAAK;AACH,mBAAe,IAAI,EAAE,MAAM,CAAC,QAAQ;AAClC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EAEF,KAAK;AACH,oBAAgB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACnC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EAEF,KAAK;AACH,sBAAkB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACrC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EAEF,KAAK;AACH,oBAAgB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACnC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EAEF,KAAK;AACH,sBAAkB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACrC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EAEF,KAAK;AACH,uBAAmB,IAAI,EAAE,MAAM,CAAC,QAAQ;AACtC,cAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AACD;AAAA,EAEF;AACE,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAWf;AACG,QAAI,SAAS;AACX,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AACJ;","names":[]}
1
+ {"version":3,"sources":["../packages/cli/src/commands/session.ts","../packages/cli/src/main.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { existsSync, readFileSync, unlinkSync, writeFileSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { homedir } from \"os\";\n\nconst MEMORY_URL = process.env.HIVEMIND_MEMORY_URL || \"http://localhost:3434\";\nconst CONTEXT = process.env.HIVEMIND_CONTEXT || \"coding-sessions\";\n\ninterface SessionLog {\n timestamp?: string;\n summary?: string;\n decisions?: Array<{\n topic: string;\n choice: string;\n rationale: string;\n alternatives_considered?: string[];\n }>;\n patterns?: Array<{\n pattern: string;\n scope?: string;\n }>;\n gotchas?: Array<{\n issue: string;\n resolution: string;\n prevention?: string;\n }>;\n files_changed?: Array<{\n path: string;\n action: string;\n purpose: string;\n }>;\n}\n\nasync function storeRecord(content: string, metadata: Record<string, any>): Promise<boolean> {\n try {\n const resp = await fetch(`${MEMORY_URL}/store`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ context: CONTEXT, content, metadata }),\n });\n return resp.ok;\n } catch {\n return false;\n }\n}\n\nexport async function runSessionCommand(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n switch (subcommand) {\n case \"ingest\":\n await runIngest(args.slice(1));\n break;\n case \"hot-start\":\n await runHotStart(args.slice(1));\n break;\n case \"setup-claude\":\n await runSetupClaude(args.slice(1));\n break;\n default:\n console.log(`hivemind session — Claude Code session memory tools\n\nUsage: hivemind session <command>\n\nCommands:\n ingest [dir] Ingest .session-log.json from a project into hivemind memory\n hot-start [dir] Generate project context guide from codebase + hivemind memory\n setup-claude Install global CLAUDE.md for session logging\n`);\n if (subcommand) {\n console.error(`Unknown subcommand: ${subcommand}`);\n process.exit(1);\n }\n }\n}\n\nasync function runIngest(args: string[]): Promise<void> {\n const projectDir = resolve(args[0] || \".\");\n const sessionLogPath = resolve(projectDir, \".session-log.json\");\n\n if (!existsSync(sessionLogPath)) {\n console.log(\"No .session-log.json found — nothing to ingest.\");\n return;\n }\n\n console.log(`Ingesting session from ${projectDir}...`);\n\n const data: SessionLog = JSON.parse(readFileSync(sessionLogPath, \"utf-8\"));\n const timestamp = data.timestamp || new Date().toISOString();\n const sessionId = `session-${Date.now()}`;\n\n // Get project name and git context\n let projectName = \"unknown\";\n let gitBranch = \"unknown\";\n let gitHash = \"unknown\";\n let gitDiffStat = \"\";\n\n try {\n projectName = execSync(\"basename $(git rev-parse --show-toplevel)\", {\n cwd: projectDir, encoding: \"utf-8\",\n }).trim();\n } catch { projectName = resolve(projectDir).split(\"/\").pop() || \"unknown\"; }\n\n try {\n gitBranch = execSync(\"git rev-parse --abbrev-ref HEAD\", {\n cwd: projectDir, encoding: \"utf-8\",\n }).trim();\n } catch {}\n\n try {\n gitHash = execSync(\"git rev-parse --short HEAD\", {\n cwd: projectDir, encoding: \"utf-8\",\n }).trim();\n } catch {}\n\n try {\n gitDiffStat = execSync(\"git diff --stat HEAD~1\", {\n cwd: projectDir, encoding: \"utf-8\",\n }).trim();\n } catch {}\n\n const baseMeta = {\n type: \"coding_session\",\n project: projectName,\n session_id: sessionId,\n branch: gitBranch,\n commit: gitHash,\n timestamp,\n };\n\n let stored = 0;\n\n // 1. Summary\n if (data.summary) {\n await storeRecord(\n `[${projectName}] ${data.summary}`,\n { ...baseMeta, record_type: \"session_summary\" },\n );\n stored++;\n console.log(\" ✓ Summary stored\");\n }\n\n // 2. Decisions\n if (data.decisions?.length) {\n for (const d of data.decisions) {\n let content = `[${projectName}] Decision: ${d.topic} — Chose ${d.choice} because ${d.rationale}`;\n if (d.alternatives_considered?.length) {\n content += ` (alternatives: ${d.alternatives_considered.join(\", \")})`;\n }\n await storeRecord(content, { ...baseMeta, record_type: \"decision\", topic: d.topic });\n stored++;\n }\n console.log(` ✓ ${data.decisions.length} decision(s) stored`);\n }\n\n // 3. Patterns\n if (data.patterns?.length) {\n for (const p of data.patterns) {\n await storeRecord(\n `[${projectName}] Pattern: ${p.pattern}`,\n { ...baseMeta, record_type: \"pattern\", scope: p.scope || \"project-wide\" },\n );\n stored++;\n }\n console.log(` ✓ ${data.patterns.length} pattern(s) stored`);\n }\n\n // 4. Gotchas\n if (data.gotchas?.length) {\n for (const g of data.gotchas) {\n let content = `[${projectName}] Gotcha: ${g.issue} → Fix: ${g.resolution}`;\n if (g.prevention) content += `. Prevention: ${g.prevention}`;\n await storeRecord(content, { ...baseMeta, record_type: \"gotcha\" });\n stored++;\n }\n console.log(` ✓ ${data.gotchas.length} gotcha(s) stored`);\n }\n\n // 5. File context\n if (data.files_changed?.length) {\n const lines = data.files_changed.map(\n (f) => `- ${f.path} (${f.action}): ${f.purpose}`,\n );\n await storeRecord(\n `[${projectName}] Files changed:\\n${lines.join(\"\\n\")}`,\n { ...baseMeta, record_type: \"file_context\" },\n );\n stored++;\n console.log(` ✓ File context stored (${data.files_changed.length} files)`);\n }\n\n // 6. Git diff\n if (gitDiffStat) {\n await storeRecord(\n `[${projectName}] Git diff:\\n${gitDiffStat}`,\n { ...baseMeta, record_type: \"git_diff\" },\n );\n stored++;\n console.log(\" ✓ Git diff stored\");\n }\n\n // Clean up\n unlinkSync(sessionLogPath);\n console.log(`Done. ${stored} records ingested as ${sessionId}`);\n}\n\nasync function runHotStart(args: string[]): Promise<void> {\n const projectDir = resolve(args.find(a => !a.startsWith(\"-\")) || \".\");\n const writeMode = args.includes(\"--write\");\n\n let projectRoot: string;\n try {\n projectRoot = execSync(\"git rev-parse --show-toplevel\", {\n cwd: projectDir, encoding: \"utf-8\",\n }).trim();\n } catch {\n projectRoot = resolve(projectDir);\n }\n const projectName = projectRoot.split(\"/\").pop() || \"unknown\";\n const has = (f: string) => existsSync(resolve(projectRoot, f));\n const lines: string[] = [];\n\n lines.push(`# Project: ${projectName}`, \"\");\n\n // Tech stack\n lines.push(\"## Tech Stack\");\n const langMap: [string, string][] = [\n [\"package.json\", \"TypeScript/JavaScript\"], [\"Cargo.toml\", \"Rust\"],\n [\"go.mod\", \"Go\"], [\"requirements.txt\", \"Python\"],\n [\"pyproject.toml\", \"Python\"], [\"Gemfile\", \"Ruby\"],\n ];\n const langs = [...new Set(langMap.filter(([f]) => has(f)).map(([, l]) => l))];\n if (langs.length) lines.push(`- Languages: ${langs.join(\", \")}`);\n\n for (const [f, pm] of [[\"pnpm-lock.yaml\", \"pnpm\"], [\"yarn.lock\", \"yarn\"], [\"package-lock.json\", \"npm\"], [\"Cargo.lock\", \"cargo\"]] as const) {\n if (has(f)) { lines.push(`- Package manager: ${pm}`); break; }\n }\n\n // Frameworks from package.json\n if (has(\"package.json\")) {\n try {\n const pkg = JSON.parse(readFileSync(resolve(projectRoot, \"package.json\"), \"utf-8\"));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const fw of [\"react\", \"next\", \"express\", \"fastify\", \"vite\", \"vitest\", \"jest\", \"prisma\", \"drizzle\"]) {\n if (fw in allDeps) lines.push(`- Framework: ${fw}`);\n }\n } catch {}\n }\n lines.push(\"\");\n\n // Structure\n lines.push(\"## Structure\", \"```\");\n try {\n const tree = execSync(\n 'find . -maxdepth 2 -type d ' +\n '! -path \"*/node_modules*\" ! -path \"*/.git*\" ! -path \"*/target*\" ' +\n '! -path \"*/.next*\" ! -path \"*/dist*\" ! -path \"*/__pycache__*\" ' +\n '| sort | head -30 | sed \"s|^\\\\./||\"',\n { cwd: projectRoot, encoding: \"utf-8\" },\n ).trim();\n lines.push(tree);\n } catch {}\n lines.push(\"```\", \"\");\n\n // Key files\n lines.push(\"## Key Files\");\n for (const f of [\"README.md\", \"CONTRIBUTING.md\", \"ARCHITECTURE.md\", \"CLAUDE.md\", \".claude/settings.json\"]) {\n if (has(f)) lines.push(`- \\`${f}\\` exists`);\n }\n for (const f of [\"src/index.ts\", \"src/main.ts\", \"src/app.ts\", \"index.ts\", \"main.ts\", \"src/lib.rs\", \"src/main.rs\", \"main.go\"]) {\n if (has(f)) lines.push(`- Entry point: \\`${f}\\``);\n }\n lines.push(\"\");\n\n // Scripts from package.json\n if (has(\"package.json\")) {\n try {\n const pkg = JSON.parse(readFileSync(resolve(projectRoot, \"package.json\"), \"utf-8\"));\n if (pkg.scripts && Object.keys(pkg.scripts).length) {\n lines.push(\"## Scripts (from package.json)\");\n for (const [k, v] of Object.entries(pkg.scripts).slice(0, 15)) {\n lines.push(`- \\`${k}\\`: ${v}`);\n }\n lines.push(\"\");\n }\n } catch {}\n }\n\n // Git context\n lines.push(\"## Recent Git Activity\", \"```\");\n try {\n lines.push(execSync(\"git log --oneline -10\", { cwd: projectRoot, encoding: \"utf-8\" }).trim());\n } catch {\n lines.push(\"no git history\");\n }\n lines.push(\"```\", \"\");\n\n // Hivemind memory\n try {\n const healthRes = await fetch(`${MEMORY_URL}/health`);\n if (healthRes.ok) {\n lines.push(\"## Relevant Memories (from hivemind)\", \"\");\n\n for (const [label, query] of [\n [\"Past Decisions\", `${projectName} decision`],\n [\"Known Gotchas\", `${projectName} gotcha bug issue`],\n [\"Project Patterns\", `${projectName} pattern convention`],\n ] as const) {\n try {\n const res = await fetch(`${MEMORY_URL}/search?q=${encodeURIComponent(query)}&context=coding-sessions&limit=5`);\n if (res.ok) {\n const data = await res.json() as any;\n const results = (data.results || []).map((r: any) => r.content).filter(Boolean);\n if (results.length) {\n lines.push(`### ${label}`);\n for (const r of results) lines.push(`- ${r}`);\n lines.push(\"\");\n }\n }\n } catch {}\n }\n }\n } catch {}\n\n // Output\n const output = lines.join(\"\\n\");\n\n if (writeMode) {\n const claudeMd = resolve(projectRoot, \"CLAUDE.md\");\n const header = `<!-- Auto-generated by hivemind hot-start ${new Date().toISOString()} -->`;\n if (existsSync(claudeMd)) {\n const existing = readFileSync(claudeMd, \"utf-8\");\n writeFileSync(claudeMd, existing + \"\\n---\\n\" + header + \"\\n\" + output);\n console.log(`Updated ${claudeMd} with hot-start context`);\n } else {\n writeFileSync(claudeMd, header + \"\\n\" + output);\n console.log(`Created ${claudeMd} with hot-start context`);\n }\n } else {\n console.log(output);\n }\n}\n\nasync function runSetupClaude(_args: string[]): Promise<void> {\n const claudeDir = resolve(homedir(), \".claude\");\n const claudeMd = resolve(claudeDir, \"CLAUDE.md\");\n\n const content = `# Claude Code — Global Instructions\n\n## Session Logging\n\nBefore completing any session, write a \\`.session-log.json\\` file in the project root with the following structure:\n\n\\`\\`\\`json\n{\n \"timestamp\": \"<ISO-8601>\",\n \"summary\": \"One paragraph describing what was done and why\",\n \"decisions\": [\n {\n \"topic\": \"Short label (e.g. 'auth strategy')\",\n \"choice\": \"What was chosen\",\n \"rationale\": \"Why this over alternatives\",\n \"alternatives_considered\": [\"alt1\", \"alt2\"]\n }\n ],\n \"patterns\": [\n {\n \"pattern\": \"Description of a coding pattern or convention used/discovered\",\n \"scope\": \"project-wide | file-specific | language-general\"\n }\n ],\n \"gotchas\": [\n {\n \"issue\": \"What went wrong or was tricky\",\n \"resolution\": \"How it was fixed or worked around\",\n \"prevention\": \"How to avoid it next time\"\n }\n ],\n \"files_changed\": [\n {\n \"path\": \"relative/path/to/file\",\n \"action\": \"created | modified | deleted\",\n \"purpose\": \"Why this file was changed\"\n }\n ]\n}\n\\`\\`\\`\n\nRules:\n- Always create this file, even for small changes\n- Omit empty arrays (e.g. if no gotchas, leave out the key)\n- Be specific in decisions and gotchas — these help future sessions\n- The file is gitignored and consumed by tooling, not humans\n- If the session was exploratory with no changes, still log the summary and any insights\n`;\n\n if (existsSync(claudeMd)) {\n const existing = readFileSync(claudeMd, \"utf-8\");\n if (existing.includes(\"Session Logging\")) {\n console.log(\"CLAUDE.md already contains session logging instructions.\");\n return;\n }\n // Append\n writeFileSync(claudeMd, existing + \"\\n\" + content);\n console.log(`✓ Appended session logging instructions to ${claudeMd}`);\n } else {\n writeFileSync(claudeMd, content);\n console.log(`✓ Created ${claudeMd} with session logging instructions`);\n }\n\n // Also add .session-log.json to global gitignore\n const globalGitignore = resolve(homedir(), \".gitignore_global\");\n try {\n const existing = existsSync(globalGitignore) ? readFileSync(globalGitignore, \"utf-8\") : \"\";\n if (!existing.includes(\".session-log.json\")) {\n writeFileSync(globalGitignore, existing + \"\\n.session-log.json\\n\");\n execSync(`git config --global core.excludesfile \"${globalGitignore}\"`, { stdio: \"ignore\" });\n console.log(\"✓ Added .session-log.json to global gitignore\");\n }\n } catch {}\n}\n","#!/usr/bin/env node\n\nimport { runFleetCommand } from \"./commands/fleet.js\";\nimport { runStartCommand } from \"./commands/start.js\";\nimport { runInitCommand } from \"./commands/init.js\";\nimport { runServiceCommand } from \"./commands/service.js\";\nimport { runUpgradeCommand } from \"./commands/upgrade.js\";\nimport { runWatchdogCommand } from \"./commands/watchdog.js\";\nimport { runSessionCommand } from \"./commands/session.js\";\n\nconst [command, ...args] = process.argv.slice(2);\n\nswitch (command) {\n case \"init\":\n runInitCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"start\":\n runStartCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"service\":\n runServiceCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"fleet\":\n runFleetCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"upgrade\":\n runUpgradeCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"watchdog\":\n runWatchdogCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n case \"session\":\n runSessionCommand(args).catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n });\n break;\n\n default:\n console.log(`hivemind cli v0.3.0\n\nUsage: hivemind <command> [args]\n\nCommands:\n init Initialize agent from Sesame API key\n start Start the Hivemind agent\n watchdog Start the watchdog daemon\n upgrade Upgrade the Hivemind runtime\n service Manage launchd services (install/uninstall/stop/start/status/logs)\n fleet Manage the worker fleet\n session Claude Code session memory (ingest/hot-start/setup-claude)\n`);\n if (command) {\n console.error(`Unknown command: ${command}`);\n process.exit(1);\n }\n break;\n}\n"],"mappings":"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","names":["args"]}
package/dist/start.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  loadConfig,
4
4
  startPipeline,
5
5
  startWorker
6
- } from "./chunk-ZM7RK5YV.js";
6
+ } from "./chunk-OB6OXLPC.js";
7
7
  import "./chunk-DGUM43GV.js";
8
8
 
9
9
  // packages/runtime/src/start.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sesamespace/hivemind",
3
- "version": "0.8.13",
3
+ "version": "0.11.0",
4
4
  "description": "Cognitive architecture for AI agents with multi-layered memory",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../packages/cli/src/commands/upgrade.ts"],"sourcesContent":["import { execSync } from \"child_process\";\nimport { resolve } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, unlinkSync } from \"fs\";\n\nconst PACKAGE_NAME = \"@sesamespace/hivemind\";\nconst STOP_FLAG_FILE = \"/tmp/hivemind-agent.stopped\";\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 // Write stop flag so the watchdog doesn't race us during restart\n writeFileSync(STOP_FLAG_FILE, String(Date.now()));\n\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 // Remove stop flag so watchdog resumes monitoring\n try { unlinkSync(STOP_FLAG_FILE); } catch {}\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":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../packages/cli/src/commands/init.ts"],"sourcesContent":["import { resolve, dirname } from \"path\";\nimport { existsSync, writeFileSync, mkdirSync, readFileSync, copyFileSync, realpathSync, chmodSync } from \"fs\";\nimport { createInterface } from \"readline\";\nimport { fileURLToPath } from \"url\";\nimport { execSync } from \"child_process\";\nimport { SesameClient } from \"@sesamespace/sdk\";\nimport { getClaudeCodeOAuthToken } from \"@hivemind/runtime\";\nimport { homedir, arch, platform } from \"os\";\n\nconst HIVEMIND_DIR = resolve(process.env.HIVEMIND_HOME || resolve(homedir(), \"hivemind\"));\nconst CONFIG_DIR = resolve(HIVEMIND_DIR, \"config\");\nconst WORKSPACE_DIR = resolve(HIVEMIND_DIR, \"workspace\");\nconst BIN_DIR = resolve(HIVEMIND_DIR, \"bin\");\nconst DATA_DIR = resolve(HIVEMIND_DIR, \"data\");\nconst ENV_FILE = resolve(HIVEMIND_DIR, \".env\");\nconst LOCAL_TOML = resolve(CONFIG_DIR, \"local.toml\");\nconst MEMORY_BIN = resolve(BIN_DIR, \"hivemind-memory\");\n\nconst RELEASES_BASE_URL = \"https://sesame-hivemind-releases.s3.amazonaws.com\";\nconst EMBEDDING_MODEL = \"nomic-embed-text\";\n\nconst VAULT_CONFIG_NAME = \"hivemind-config\";\n\ninterface ProvisioningConfig {\n agentName: string;\n agentHandle: string;\n agentId: string;\n personality?: string;\n llmApiKey?: string;\n llmBaseUrl?: string;\n llmModel?: string;\n llmProvider?: 'openai' | 'anthropic';\n fleetRole?: string;\n channels: Array<{ id: string; name: string | null; kind: string }>;\n}\n\nasync function prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport async function runInitCommand(args: string[]): Promise<void> {\n const nonInteractive = args.includes(\"--yes\") || args.includes(\"-y\") || args.includes(\"--non-interactive\");\n const filteredArgs = args.filter((a) => ![\"--yes\", \"-y\", \"--non-interactive\", \"--help\", \"-h\"].includes(a));\n let sesameApiKey = filteredArgs[0];\n\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n printHelp();\n return;\n }\n\n console.log(`\n ╦ ╦╦╦ ╦╔═╗╔╦╗╦╔╗╔╔╦╗\n ╠═╣║╚╗╔╝║╣ ║║║║║║║ ║║\n ╩ ╩╩ ╚╝ ╚═╝╩ ╩╩╝╚╝═╩╝\n Agent Initialization\n`);\n\n // --- Step 1: Get Sesame API key ---\n // Check existing config if no key provided\n if (!sesameApiKey) {\n // Try .env file\n if (existsSync(ENV_FILE)) {\n try {\n const envContent = readFileSync(ENV_FILE, \"utf-8\");\n const match = envContent.match(/^SESAME_API_KEY=(.+)$/m);\n if (match && match[1].trim()) {\n sesameApiKey = match[1].trim();\n console.log(\" ✓ Found existing API key in .env\");\n }\n } catch {}\n }\n // Try local.toml\n if (!sesameApiKey && existsSync(LOCAL_TOML)) {\n try {\n const tomlContent = readFileSync(LOCAL_TOML, \"utf-8\");\n const match = tomlContent.match(/api_key\\s*=\\s*\"([^\"]+)\"/);\n if (match && match[1].trim()) {\n sesameApiKey = match[1].trim();\n console.log(\" ✓ Found existing API key in local.toml\");\n }\n } catch {}\n }\n // Try environment variable\n if (!sesameApiKey && process.env.SESAME_API_KEY) {\n sesameApiKey = process.env.SESAME_API_KEY;\n console.log(\" ✓ Using API key from SESAME_API_KEY env var\");\n }\n }\n if (!sesameApiKey) {\n sesameApiKey = await prompt(\" Sesame API key: \");\n }\n if (!sesameApiKey) {\n console.error(\"Error: Sesame API key is required\");\n process.exit(1);\n }\n\n // --- Step 2: Connect to Sesame and fetch manifest ---\n console.log(\"\\n→ Connecting to Sesame...\");\n const sdk = new SesameClient({\n apiUrl: \"https://api.sesame.space\",\n wsUrl: \"wss://ws.sesame.space\",\n apiKey: sesameApiKey,\n });\n\n let config: ProvisioningConfig;\n try {\n const manifest = await sdk.getManifest();\n console.log(` ✓ Authenticated as ${manifest.agent.handle} (${manifest.agent.id})`);\n console.log(` ✓ Workspace: ${manifest.workspace.name}`);\n console.log(` ✓ Channels: ${manifest.channels.length}`);\n for (const ch of manifest.channels) {\n console.log(` - ${ch.name || ch.id} (${ch.kind})`);\n }\n\n config = {\n agentName: manifest.agent.handle,\n agentHandle: manifest.agent.handle,\n agentId: manifest.agent.id,\n channels: manifest.channels.map((ch) => ({\n id: ch.id,\n name: ch.name,\n kind: ch.kind,\n })),\n };\n\n // --- Step 3: Check vault for config ---\n console.log(\"\\n→ Checking vault for provisioning config...\");\n try {\n const vaultResp = await sdk.listVaultItems() as any;\n const items = vaultResp.items || vaultResp.data || [];\n const configItem = items.find((i: any) => i.name === VAULT_CONFIG_NAME);\n\n if (configItem) {\n console.log(` ✓ Found ${VAULT_CONFIG_NAME} vault item`);\n const revealResp = await sdk.revealItem(configItem.id) as any;\n const fields = revealResp.data?.fields || revealResp.fields || revealResp.data || {};\n\n config.llmApiKey = fields.llm_api_key || fields.openrouter_api_key;\n config.llmBaseUrl = fields.llm_base_url;\n config.llmModel = fields.llm_model;\n config.personality = fields.agent_personality || fields.personality;\n config.fleetRole = fields.fleet_role;\n\n // Detect Anthropic API key from vault — sets provider + base_url automatically\n if (!config.llmApiKey && fields.anthropic_api_key) {\n config.llmApiKey = fields.anthropic_api_key;\n config.llmProvider = 'anthropic';\n if (!config.llmBaseUrl) config.llmBaseUrl = 'https://api.anthropic.com';\n }\n\n if (config.llmApiKey) console.log(` ✓ LLM API key loaded from vault${config.llmProvider === 'anthropic' ? ' (Anthropic)' : ''}`);\n if (config.llmModel) console.log(` ✓ LLM model: ${config.llmModel}`);\n if (config.personality) console.log(` ✓ Personality: ${config.personality.slice(0, 60)}...`);\n if (config.fleetRole) console.log(` ✓ Fleet role: ${config.fleetRole}`);\n } else {\n console.log(\" ! No hivemind-config vault item found\");\n console.log(\" ! Will prompt for LLM API key instead\");\n }\n } catch (err) {\n console.log(` ! Could not read vault: ${(err as Error).message}`);\n }\n } catch (err) {\n console.error(`\\n ✗ Failed to connect to Sesame: ${(err as Error).message}`);\n console.error(\" Check your API key and try again.\");\n process.exit(1);\n } finally {\n sdk.disconnect();\n }\n\n // --- Step 3.5: Try Claude Code OAuth if no API key from vault ---\n if (!config.llmApiKey) {\n const oauthToken = getClaudeCodeOAuthToken();\n if (oauthToken) {\n // Don't store the token — it expires. Configure provider so it's read from keychain at runtime.\n config.llmProvider = 'anthropic';\n config.llmBaseUrl = 'https://api.anthropic.com';\n if (!config.llmModel) config.llmModel = 'claude-sonnet-4-20250514';\n console.log(' ✓ Claude Max subscription detected (via Claude Code OAuth)');\n console.log(' ✓ Configuring provider=anthropic — token read from keychain at runtime');\n }\n }\n\n // --- Step 4: Prompt for anything missing ---\n if (!config.llmApiKey && !config.llmProvider) {\n console.log(\" ! No LLM API key found in vault — set LLM_API_KEY in .env after init\");\n }\n\n // --- Step 5: Write config files ---\n console.log(\"\\n→ Writing configuration...\");\n\n mkdirSync(CONFIG_DIR, { recursive: true });\n mkdirSync(WORKSPACE_DIR, { recursive: true });\n\n // Copy default.toml from installed package if not present\n const defaultToml = resolve(CONFIG_DIR, \"default.toml\");\n if (!existsSync(defaultToml)) {\n // Resolve from the hivemind binary location\n // process.argv[1] may be a symlink, so resolve it first\n const realBin = realpathSync(process.argv[1]);\n // realBin is <pkg>/dist/main.js, so ../config/ gets us to <pkg>/config/\n const packageConfigDir = resolve(dirname(realBin), \"..\", \"config\");\n const packageDefault = resolve(packageConfigDir, \"default.toml\");\n if (existsSync(packageDefault)) {\n copyFileSync(packageDefault, defaultToml);\n console.log(` ✓ ${defaultToml}`);\n // Also copy team charter if available\n const packageCharter = resolve(packageConfigDir, \"TEAM-CHARTER.md\");\n const localCharter = resolve(CONFIG_DIR, \"TEAM-CHARTER.md\");\n if (existsSync(packageCharter) && !existsSync(localCharter)) {\n copyFileSync(packageCharter, localCharter);\n console.log(` ✓ ${localCharter}`);\n }\n } else {\n console.log(` ! default.toml not found in package — you may need to copy it manually`);\n }\n }\n\n // Write workspace identity files\n const soulPath = resolve(WORKSPACE_DIR, \"SOUL.md\");\n if (!existsSync(soulPath)) {\n const personality = config.personality || \"A helpful, capable agent.\";\n writeFileSync(soulPath, `# SOUL.md — Who You Are\n\n${personality}\n\n---\n\n_This file defines your personality and values. Edit it to evolve who you are._\n`);\n console.log(` ✓ ${soulPath}`);\n }\n\n const identityPath = resolve(WORKSPACE_DIR, \"IDENTITY.md\");\n if (!existsSync(identityPath)) {\n writeFileSync(identityPath, `# IDENTITY.md\n\n- **Name:** ${config.agentName}\n- **Handle:** ${config.agentHandle}\n- **Agent ID:** ${config.agentId}\n`);\n console.log(` ✓ ${identityPath}`);\n }\n\n // Write local.toml (overrides)\n const llmLines: string[] = [];\n if (config.llmModel || config.llmProvider || config.llmBaseUrl) {\n llmLines.push('[llm]');\n if (config.llmProvider) llmLines.push(`provider = \"${config.llmProvider}\"`);\n if (config.llmBaseUrl) llmLines.push(`base_url = \"${config.llmBaseUrl}\"`);\n if (config.llmModel) llmLines.push(`model = \"${config.llmModel}\"`);\n } else {\n llmLines.push('# [llm] using defaults');\n }\n\n const localToml = `# Generated by hivemind init — ${new Date().toISOString()}\n# Overrides config/default.toml with agent-specific settings\n\n[agent]\nname = \"${config.agentName}\"\n${config.personality ? `personality = \"${config.personality.replace(/\"/g, '\\\\\"')}\"` : \"# personality = (using default)\"}\nworkspace = \"workspace\"\n\n${llmLines.join('\\n')}\n\n[sesame]\napi_key = \"${sesameApiKey}\"\n`;\n\n writeFileSync(LOCAL_TOML, localToml);\n console.log(` ✓ ${LOCAL_TOML}`);\n\n // Write .env\n const envLines = [\n `# Hivemind Agent — ${config.agentName}`,\n `# Generated by hivemind init — ${new Date().toISOString()}`,\n `SESAME_API_KEY=${sesameApiKey}`,\n ];\n if (config.llmProvider === 'anthropic') {\n envLines.push(`ANTHROPIC_API_KEY=${config.llmApiKey || \"\"}`);\n } else {\n envLines.push(`LLM_API_KEY=${config.llmApiKey || \"\"}`);\n }\n envLines.push(`AGENT_NAME=${config.agentName}`, '');\n const envContent = envLines.join('\\n');\n\n writeFileSync(ENV_FILE, envContent, { mode: 0o600 });\n console.log(` ✓ ${ENV_FILE} (chmod 600)`);\n\n // --- Step 6: Install memory infrastructure ---\n console.log(\"\\n→ Setting up memory system...\");\n mkdirSync(BIN_DIR, { recursive: true });\n mkdirSync(DATA_DIR, { recursive: true });\n\n await installOllama();\n await pullEmbeddingModel();\n await downloadMemoryDaemon();\n\n // --- Done ---\n console.log(`\n ✓ Hivemind initialized for ${config.agentName}!\n\n To start the agent:\n hivemind start\n\n To install as a service:\n hivemind service install\n\n Agent ID: ${config.agentId}\n Channels: ${config.channels.map((c) => c.name || c.id).join(\", \")}\n Fleet role: ${config.fleetRole || \"standalone\"}\n`);\n}\n\n// --- Memory infrastructure helpers ---\n\nasync function installOllama(): Promise<void> {\n try {\n execSync(\"which ollama\", { stdio: \"ignore\" });\n const version = execSync(\"ollama --version\", { encoding: \"utf-8\" }).trim();\n console.log(` ✓ Ollama already installed (${version})`);\n return;\n } catch {}\n\n console.log(\" → Installing Ollama...\");\n try {\n // Try Homebrew first (macOS)\n execSync(\"which brew\", { stdio: \"ignore\" });\n execSync(\"brew install ollama\", { stdio: \"inherit\" });\n console.log(\" ✓ Ollama installed via Homebrew\");\n } catch {\n // Fall back to official installer\n try {\n execSync(\"curl -fsSL https://ollama.com/install.sh | sh\", { stdio: \"inherit\" });\n console.log(\" ✓ Ollama installed via installer script\");\n } catch (err) {\n console.error(` ✗ Failed to install Ollama: ${(err as Error).message}`);\n console.error(\" ! Install manually: https://ollama.com/download\");\n console.error(\" ! Memory system will not work without Ollama\");\n }\n }\n}\n\nasync function pullEmbeddingModel(): Promise<void> {\n console.log(` → Pulling embedding model (${EMBEDDING_MODEL})...`);\n try {\n // Ensure ollama is running\n try {\n execSync(\"curl -sf http://localhost:11434/api/tags > /dev/null\", { stdio: \"ignore\" });\n } catch {\n // Start ollama serve in background\n console.log(\" → Starting Ollama server...\");\n execSync(\"ollama serve &\", { stdio: \"ignore\", shell: \"/bin/sh\" });\n // Wait for it to be ready\n for (let i = 0; i < 15; i++) {\n try {\n execSync(\"curl -sf http://localhost:11434/api/tags > /dev/null\", { stdio: \"ignore\" });\n break;\n } catch {\n execSync(\"sleep 1\");\n }\n }\n }\n\n execSync(`ollama pull ${EMBEDDING_MODEL}`, { stdio: \"inherit\" });\n console.log(` ✓ ${EMBEDDING_MODEL} model ready`);\n } catch (err) {\n console.error(` ✗ Failed to pull model: ${(err as Error).message}`);\n console.error(` ! Run manually: ollama pull ${EMBEDDING_MODEL}`);\n }\n}\n\nasync function downloadMemoryDaemon(): Promise<void> {\n if (existsSync(MEMORY_BIN)) {\n console.log(` ✓ Memory daemon already installed at ${MEMORY_BIN}`);\n return;\n }\n\n const osArch = arch();\n const osPlatform = platform();\n\n if (osPlatform !== \"darwin\") {\n console.log(` ! Memory daemon pre-built binaries only available for macOS currently`);\n console.log(` ! Build from source: cd packages/memory && cargo build --release`);\n return;\n }\n\n const artifactName = osArch === \"arm64\"\n ? \"hivemind-memory-darwin-arm64\"\n : \"hivemind-memory-darwin-x64\";\n\n console.log(` → Downloading memory daemon (${artifactName})...`);\n try {\n // Get latest version from S3\n const latestJson = execSync(\n `curl -sf \"${RELEASES_BASE_URL}/latest.json\"`,\n { encoding: \"utf-8\" },\n );\n const { version } = JSON.parse(latestJson);\n const url = `${RELEASES_BASE_URL}/v${version}/${artifactName}`;\n\n execSync(\n `curl -fSL -o \"${MEMORY_BIN}\" \"${url}\"`,\n { stdio: \"inherit\" },\n );\n chmodSync(MEMORY_BIN, 0o755);\n console.log(` ✓ Memory daemon installed at ${MEMORY_BIN} (v${version})`);\n } catch (err) {\n console.error(` ✗ Failed to download memory daemon: ${(err as Error).message}`);\n console.error(\" ! Build from source: cd packages/memory && cargo build --release\");\n console.error(` ! Then copy to: ${MEMORY_BIN}`);\n }\n}\n\nfunction printHelp(): void {\n console.log(`hivemind init — Initialize a Hivemind agent from Sesame\n\nUsage: hivemind init [sesame-api-key]\n\nThe API key can also be passed as the first argument.\n\nWhat it does:\n 1. Connects to Sesame and fetches agent identity\n 2. Reads provisioning config from Sesame vault (if available)\n 3. Writes config/local.toml and .env\n 4. Installs Ollama + embedding model for memory\n 5. Downloads pre-built memory daemon binary\n\nOptions:\n -h, --help Show this help\n`);\n}\n"],"mappings":"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","names":["resolve","envContent"]}