@sesamespace/hivemind 0.5.4 → 0.5.7

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/.github/workflows/memory-release.yml +89 -0
  2. package/config/default.toml +12 -0
  3. package/dist/{chunk-YHRGEWAZ.js → chunk-4U4GKI3X.js} +121 -34
  4. package/dist/chunk-4U4GKI3X.js.map +1 -0
  5. package/{packages/cli/src/commands/start.ts → dist/chunk-62S2NGMN.js} +39 -38
  6. package/dist/chunk-62S2NGMN.js.map +1 -0
  7. package/dist/{chunk-CGSXJVSS.js → chunk-7RTJSPMX.js} +2 -2
  8. package/dist/chunk-IJRAVHQC.js +327 -0
  9. package/dist/chunk-IJRAVHQC.js.map +1 -0
  10. package/dist/{chunk-MHDLSAJ3.js → chunk-JXLLCKMG.js} +102 -5
  11. package/dist/chunk-JXLLCKMG.js.map +1 -0
  12. package/dist/{chunk-SJI2KAIN.js → chunk-LJHJGDKY.js} +8 -2
  13. package/dist/chunk-LJHJGDKY.js.map +1 -0
  14. package/dist/{chunk-LNV373IF.js → chunk-LSOEUOTO.js} +2 -2
  15. package/dist/{chunk-S3RVZBPZ.js → chunk-PFN3BITA.js} +322 -2
  16. package/dist/chunk-PFN3BITA.js.map +1 -0
  17. package/dist/commands/fleet.js +3 -3
  18. package/dist/commands/init.js +1 -1
  19. package/dist/commands/service.js +1 -1
  20. package/dist/commands/start.js +3 -3
  21. package/dist/commands/upgrade.js +1 -1
  22. package/dist/commands/watchdog.js +10 -0
  23. package/dist/commands/watchdog.js.map +1 -0
  24. package/dist/index.js +6 -2
  25. package/dist/main.js +22 -12
  26. package/dist/main.js.map +1 -1
  27. package/dist/start.js +1 -1
  28. package/package.json +4 -3
  29. package/PLANNING.md +0 -383
  30. package/TASKS.md +0 -60
  31. package/dist/chunk-MHDLSAJ3.js.map +0 -1
  32. package/dist/chunk-PPQGQHXJ.js +0 -151
  33. package/dist/chunk-PPQGQHXJ.js.map +0 -1
  34. package/dist/chunk-S3RVZBPZ.js.map +0 -1
  35. package/dist/chunk-SJI2KAIN.js.map +0 -1
  36. package/dist/chunk-YHRGEWAZ.js.map +0 -1
  37. package/install.sh +0 -120
  38. package/npm-package.json +0 -26
  39. package/packages/cli/package.json +0 -23
  40. package/packages/cli/src/commands/fleet.ts +0 -206
  41. package/packages/cli/src/commands/init.ts +0 -252
  42. package/packages/cli/src/commands/service.ts +0 -159
  43. package/packages/cli/src/commands/upgrade.ts +0 -158
  44. package/packages/cli/src/main.ts +0 -64
  45. package/packages/cli/tsconfig.json +0 -8
  46. package/packages/memory/Cargo.lock +0 -6480
  47. package/packages/memory/Cargo.toml +0 -21
  48. package/packages/memory/src/context.rs +0 -179
  49. package/packages/memory/src/embeddings.rs +0 -51
  50. package/packages/memory/src/main.rs +0 -626
  51. package/packages/memory/src/promotion.rs +0 -637
  52. package/packages/memory/src/scoring.rs +0 -131
  53. package/packages/memory/src/store.rs +0 -460
  54. package/packages/memory/src/tasks.rs +0 -321
  55. package/packages/runtime/package.json +0 -24
  56. package/packages/runtime/src/__tests__/fleet-integration.test.ts +0 -235
  57. package/packages/runtime/src/__tests__/fleet.test.ts +0 -207
  58. package/packages/runtime/src/__tests__/integration.test.ts +0 -434
  59. package/packages/runtime/src/agent.ts +0 -255
  60. package/packages/runtime/src/config.ts +0 -130
  61. package/packages/runtime/src/context.ts +0 -192
  62. package/packages/runtime/src/fleet/fleet-manager.ts +0 -399
  63. package/packages/runtime/src/fleet/memory-sync.ts +0 -362
  64. package/packages/runtime/src/fleet/primary-client.ts +0 -285
  65. package/packages/runtime/src/fleet/worker-protocol.ts +0 -158
  66. package/packages/runtime/src/fleet/worker-server.ts +0 -246
  67. package/packages/runtime/src/index.ts +0 -57
  68. package/packages/runtime/src/llm-client.ts +0 -65
  69. package/packages/runtime/src/memory-client.ts +0 -309
  70. package/packages/runtime/src/pipeline.ts +0 -187
  71. package/packages/runtime/src/prompt.ts +0 -173
  72. package/packages/runtime/src/sesame.ts +0 -226
  73. package/packages/runtime/src/start.ts +0 -20
  74. package/packages/runtime/src/task-engine.ts +0 -113
  75. package/packages/runtime/src/worker.ts +0 -339
  76. package/packages/runtime/tsconfig.json +0 -8
  77. package/pnpm-workspace.yaml +0 -2
  78. package/run-aidan.sh +0 -23
  79. package/scripts/bootstrap.sh +0 -196
  80. package/scripts/build-npm.sh +0 -92
  81. package/scripts/com.hivemind.agent.plist +0 -44
  82. package/scripts/com.hivemind.memory.plist +0 -31
  83. package/tsconfig.json +0 -22
  84. package/tsup.config.ts +0 -27
  85. /package/dist/{chunk-CGSXJVSS.js.map → chunk-7RTJSPMX.js.map} +0 -0
  86. /package/dist/{chunk-LNV373IF.js.map → chunk-LSOEUOTO.js.map} +0 -0
package/dist/main.js CHANGED
@@ -1,21 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runInitCommand
4
- } from "./chunk-MHDLSAJ3.js";
4
+ } from "./chunk-JXLLCKMG.js";
5
5
  import {
6
6
  runStartCommand
7
- } from "./chunk-LNV373IF.js";
7
+ } from "./chunk-LSOEUOTO.js";
8
8
  import {
9
9
  runFleetCommand
10
- } from "./chunk-CGSXJVSS.js";
10
+ } from "./chunk-7RTJSPMX.js";
11
11
  import {
12
12
  runServiceCommand
13
- } from "./chunk-PPQGQHXJ.js";
13
+ } from "./chunk-IJRAVHQC.js";
14
14
  import {
15
15
  runUpgradeCommand
16
- } from "./chunk-SJI2KAIN.js";
17
- import "./chunk-S3RVZBPZ.js";
18
- import "./chunk-YHRGEWAZ.js";
16
+ } from "./chunk-LJHJGDKY.js";
17
+ import {
18
+ runWatchdogCommand
19
+ } from "./chunk-62S2NGMN.js";
20
+ import "./chunk-PFN3BITA.js";
21
+ import "./chunk-4U4GKI3X.js";
19
22
  import "./chunk-GPI4RU7N.js";
20
23
 
21
24
  // packages/cli/src/main.ts
@@ -51,17 +54,24 @@ switch (command) {
51
54
  process.exit(1);
52
55
  });
53
56
  break;
57
+ case "watchdog":
58
+ runWatchdogCommand(args).catch((err) => {
59
+ console.error(err instanceof Error ? err.message : String(err));
60
+ process.exit(1);
61
+ });
62
+ break;
54
63
  default:
55
64
  console.log(`hivemind cli v0.3.0
56
65
 
57
66
  Usage: hivemind <command> [args]
58
67
 
59
68
  Commands:
60
- init Initialize agent from Sesame API key
61
- start Start the Hivemind agent
62
- upgrade Upgrade the Hivemind runtime
63
- service Manage launchd services (install/uninstall/status/logs)
64
- fleet Manage the worker fleet
69
+ init Initialize agent from Sesame API key
70
+ start Start the Hivemind agent
71
+ watchdog Start the watchdog daemon
72
+ upgrade Upgrade the Hivemind runtime
73
+ service Manage launchd services (install/uninstall/stop/start/status/logs)
74
+ fleet Manage the worker fleet
65
75
  `);
66
76
  if (command) {
67
77
  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\";\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 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 upgrade Upgrade the Hivemind runtime\n service Manage launchd services (install/uninstall/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":";;;;;;;;;;;;;;;;;;;;;AAQA,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;AACE,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAUf;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/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":[]}
package/dist/start.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  loadConfig,
4
4
  startPipeline,
5
5
  startWorker
6
- } from "./chunk-YHRGEWAZ.js";
6
+ } from "./chunk-4U4GKI3X.js";
7
7
  import "./chunk-GPI4RU7N.js";
8
8
 
9
9
  // packages/runtime/src/start.ts
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@sesamespace/hivemind",
3
- "version": "0.5.4",
3
+ "version": "0.5.7",
4
4
  "description": "Cognitive architecture for AI agents with multi-layered memory",
5
5
  "scripts": {
6
- "build": "pnpm -r build",
6
+ "build": "tsup",
7
7
  "typecheck": "pnpm -r typecheck",
8
8
  "lint": "pnpm -r lint",
9
- "test": "pnpm -r test"
9
+ "test": "pnpm -r test",
10
+ "prepublishOnly": "tsup"
10
11
  },
11
12
  "engines": {
12
13
  "node": ">=20.0.0",
package/PLANNING.md DELETED
@@ -1,383 +0,0 @@
1
- # Hivemind — Cognitive Architecture for AI Agents
2
-
3
- ## Vision
4
-
5
- Hivemind is an opinionated, high-performance agent runtime with a multi-layered memory architecture inspired by CPU cache hierarchies — not the flat-file, dump-everything-in-context approach of current agent frameworks. It enables agents that genuinely remember, learn, and work on multiple projects in parallel without context contamination.
6
-
7
- **Core thesis:** The bottleneck in AI agents isn't the model — it's memory management. Current systems either burn their entire context window on static files or lose everything between sessions. Hivemind solves this with continuous, incremental memory management across isolated project contexts.
8
-
9
- **Success criteria:** A Hivemind agent joins our Sesame channel. We have a conversation on Monday, come back Wednesday, and it recalls the context naturally — no hand-curated MEMORY.md, no post-it notes. It works on LinkZero and Untube simultaneously without cross-pollination. It runs across multiple Mac minis with true parallelism.
10
-
11
- ---
12
-
13
- ## Architecture
14
-
15
- ### Memory Layers
16
-
17
- | Layer | Name | What | Storage | Management |
18
- |-------|------|------|---------|------------|
19
- | L1 | Working Memory | Current conversation + active task state | In-memory (runtime) | Deterministic eviction by relevance score |
20
- | L2 | Episodic Memory | Recent interactions, decisions, outcomes | LanceDB (vector) | Write-through on every interaction, continuous decay |
21
- | L3 | Semantic Memory | Distilled knowledge, patterns, project understanding | LanceDB (vector + structured) | Threshold-based promotion from L2, pull-based LLM synthesis |
22
- | L4 | External Memory | Git, filesystem, APIs, databases | Native tools | Accessed on demand; index of *what exists where* lives in L2/L3 |
23
-
24
- ### Key Principle: No Batch Consolidation
25
-
26
- Memory management is **continuous and incremental**, like garbage collection in a runtime:
27
-
28
- - **Write-through:** Every interaction embedded + indexed into L2 immediately (local embedding model, no LLM)
29
- - **Decay/scoring:** Lightweight process continuously updates relevance scores (recency × access frequency × connection density) — pure math
30
- - **Promotion:** L2 episodes auto-promote to L3 when they cross access/connection thresholds — no LLM needed
31
- - **Eviction:** When L1 context fills, lowest-relevance items drop first — deterministic, predictable
32
- - **LLM synthesis on demand only:** Agent requests consolidated summaries when needed (pull, not push)
33
-
34
- No step functions. No discontinuities. No compaction surprises.
35
-
36
- ### Context Isolation (Multi-Project)
37
-
38
- ```
39
- ┌─ Hivemind Agent ──────────────────────────────┐
40
- │ │
41
- │ ┌─────────────────────────────────────────┐ │
42
- │ │ Context Manager │ │
43
- │ │ - Routes messages to correct context │ │
44
- │ │ - Spawns/suspends/resumes contexts │ │
45
- │ │ - Manages cross-context queries │ │
46
- │ └──┬──────────┬──────────┬───────────┬────┘ │
47
- │ │ │ │ │ │
48
- │ ┌──▼───┐ ┌──▼───┐ ┌──▼───┐ ┌────▼────┐ │
49
- │ │ CTX: │ │ CTX: │ │ CTX: │ │ CTX: │ │
50
- │ │Proj A│ │Proj B│ │Proj C│ │ Global │ │
51
- │ │ │ │ │ │ │ │ │ │
52
- │ │ L1 │ │ L1 │ │ L1 │ │Identity │ │
53
- │ │ L2 │ │ L2 │ │ L2 │ │Prefs │ │
54
- │ │ L3 │ │ L3 │ │ L3 │ │Skills │ │
55
- │ │Tasks │ │Tasks │ │Tasks │ │Relations│ │
56
- │ └──────┘ └──────┘ └──────┘ └─────────┘ │
57
- │ │
58
- │ ┌─────────────────────────────────────────┐ │
59
- │ │ Shared Infrastructure │ │
60
- │ │ Memory Daemon (Rust) · LanceDB │ │
61
- │ │ Ollama (embeddings) · Sesame · Router │ │
62
- │ └─────────────────────────────────────────┘ │
63
- └───────────────────────────────────────────────┘
64
- ```
65
-
66
- Each context has:
67
- - Own L1/L2/L3 memory partitions (LanceDB namespaces)
68
- - Own relevance scoring and decay curves
69
- - Own task queue and working state
70
- - Own model preferences (via ClawRouter)
71
-
72
- Global context holds:
73
- - Agent identity and personality
74
- - Communication preferences
75
- - Cross-cutting skills and tool knowledge
76
- - Relationship maps (who is Ryan, what does he care about)
77
-
78
- **Cross-context communication:**
79
- - Default: **full isolation** — no cross-pollination
80
- - Explicit sharing: "Share X with context Y"
81
- - Cross-context search: query all contexts, results labeled by source
82
- - Auto-promotion to Global: knowledge referenced across 3+ contexts
83
-
84
- ### Multi-Machine Distribution
85
-
86
- ```
87
- Mac Mini 1 (Primary):
88
- └─ Context Manager (coordinator)
89
- └─ Global Context
90
- └─ Active conversation handling
91
- └─ Memory Daemon + LanceDB (primary)
92
-
93
- Mac Mini 2:
94
- └─ Hivemind Worker
95
- └─ CTX: Project A (autonomous background work)
96
- └─ Local Memory Daemon + LanceDB partition
97
- └─ Local Ollama (embeddings)
98
-
99
- Mac Mini 3:
100
- └─ Hivemind Worker
101
- └─ CTX: Project B (autonomous background work)
102
- └─ Local Memory Daemon + LanceDB partition
103
- └─ Local Ollama (embeddings)
104
- ```
105
-
106
- Contexts can be **active** (attached to conversation) or **background** (autonomous task execution). Multiple contexts run truly in parallel across machines.
107
-
108
- ---
109
-
110
- ## Tech Stack
111
-
112
- | Component | Technology | Rationale |
113
- |-----------|-----------|-----------|
114
- | Agent Runtime | TypeScript | Fast iteration, Sesame SDK is TS, ClawRouter client TS, rich AI ecosystem |
115
- | Memory Daemon | Rust | Performance-critical hot path, reliability, native LanceDB bindings |
116
- | Vector Storage | LanceDB (embedded) | No server process, Rust-native, fast, partitioning support |
117
- | Embeddings | Ollama (local) | Apple Silicon optimized, zero-latency, `nomic-embed-text` or `mxbai-embed-large` |
118
- | Communications | Sesame SDK | Native agent participant, not bolted on |
119
- | Model Provider | ClawRouter | Drop-in OpenAI-compatible API, model routing/optimization |
120
- | Task/Queue | In-process (TS) | No external dependencies for MVP; upgrade to Redis/NATS if needed |
121
- | Config | TOML or YAML | Human-readable, easy to hand-edit |
122
-
123
- ### Dependencies (External Services)
124
-
125
- - **Sesame** (sesame.space) — agent registration, messaging, channels
126
- - **ClawRouter** (clawrouter.app) — model API provider
127
- - **Ollama** — local embedding model server (runs on each Mac mini)
128
-
129
- ---
130
-
131
- ## Project Structure
132
-
133
- ```
134
- hivemind/
135
- ├── packages/
136
- │ ├── runtime/ # TypeScript agent runtime
137
- │ │ ├── src/
138
- │ │ │ ├── agent.ts # Core agent loop
139
- │ │ │ ├── context.ts # Context manager
140
- │ │ │ ├── memory-client.ts # Client for memory daemon
141
- │ │ │ ├── task-engine.ts # Task planning + execution
142
- │ │ │ ├── sesame.ts # Sesame integration
143
- │ │ │ ├── router.ts # ClawRouter client
144
- │ │ │ └── tools/ # Built-in tool implementations
145
- │ │ ├── package.json
146
- │ │ └── tsconfig.json
147
- │ │
148
- │ ├── memory/ # Rust memory daemon
149
- │ │ ├── src/
150
- │ │ │ ├── main.rs # Daemon entry, HTTP/gRPC server
151
- │ │ │ ├── store.rs # LanceDB operations
152
- │ │ │ ├── embeddings.rs # Ollama embedding client
153
- │ │ │ ├── scoring.rs # Relevance decay + scoring
154
- │ │ │ ├── context.rs # Context/namespace management
155
- │ │ │ └── promotion.rs # L2→L3 threshold logic
156
- │ │ ├── Cargo.toml
157
- │ │ └── proto/ # gRPC definitions (if used)
158
- │ │
159
- │ └── cli/ # CLI for management
160
- │ ├── src/
161
- │ │ ├── main.ts
162
- │ │ ├── commands/
163
- │ │ │ ├── start.ts # Start agent
164
- │ │ │ ├── status.ts # Check status
165
- │ │ │ ├── context.ts # Manage contexts
166
- │ │ │ └── memory.ts # Query/inspect memory
167
- │ └── package.json
168
-
169
- ├── config/
170
- │ ├── default.toml # Default configuration
171
- │ └── example.toml # Example with comments
172
-
173
- ├── PLANNING.md # This file
174
- ├── TASKS.md # Task tracker (auto-maintained)
175
- ├── ARCHITECTURE.md # Deep-dive technical docs
176
- └── README.md # Project overview + quickstart
177
- ```
178
-
179
- ---
180
-
181
- ## Phases & Tasks
182
-
183
- ### Phase 1 — Single Context, Prove the Memory Works
184
-
185
- **Goal:** One Hivemind agent on Sesame with working episodic memory. Conversation Monday → recall Wednesday.
186
-
187
- **Decision boundaries:** Bailey can make all implementation decisions. Ping Ryan only for: external service setup (Sesame agent registration, ClawRouter config), UX decisions about how the agent presents itself, or architectural changes that deviate from this plan.
188
-
189
- #### Tasks
190
-
191
- - [ ] **1.1 — Project scaffolding**
192
- - Initialize monorepo (pnpm workspaces)
193
- - Set up TypeScript config for runtime + cli packages
194
- - Set up Rust project for memory daemon
195
- - CI basics (lint, type-check, test)
196
- - *Est: 1 session*
197
-
198
- - [ ] **1.2 — Memory daemon MVP**
199
- - Rust HTTP server (axum or actix-web)
200
- - LanceDB integration: create table, insert, query
201
- - Ollama embedding client (HTTP to local Ollama)
202
- - Core API endpoints:
203
- - `POST /episodes` — store an episode (auto-embeds)
204
- - `GET /search` — semantic search over episodes
205
- - `GET /context/{name}` — get all episodes for a context
206
- - `POST /contexts` — create a new context namespace
207
- - Basic relevance scoring (recency-weighted)
208
- - *Est: 2-3 sessions*
209
-
210
- - [ ] **1.3 — Agent runtime MVP**
211
- - Core agent loop: receive message → query memory → build prompt → call model → respond → store episode
212
- - Memory client (talks to daemon API)
213
- - ClawRouter integration (OpenAI-compatible client, pointed at ClawRouter)
214
- - Prompt construction: Global context + relevant L2 episodes + current message
215
- - Basic personality/identity from config (not flat files)
216
- - *Est: 2 sessions*
217
-
218
- - [ ] **1.4 — Sesame integration**
219
- - Connect as Sesame agent (WebSocket)
220
- - Receive messages, route to agent loop
221
- - Send responses back to channel
222
- - Handle DMs and group channels
223
- - *Est: 1-2 sessions*
224
-
225
- - [ ] **1.5 — Write-through memory pipeline**
226
- - Every conversation turn → episode stored in L2 automatically
227
- - Embed + index happens synchronously (local Ollama = fast enough)
228
- - Episode includes: timestamp, context name, role, content, embedding
229
- - On next message: top-K relevant episodes pulled into L1 prompt
230
- - *Est: 1 session*
231
-
232
- - [ ] **1.6 — Integration test: "Remember me"**
233
- - Deploy on Mac mini
234
- - Start Ollama with embedding model
235
- - Start memory daemon
236
- - Start agent runtime, connect to Sesame
237
- - Have a conversation, wait 24h, verify recall
238
- - *Est: 1 session + waiting*
239
-
240
- **Phase 1 deliverable:** A Hivemind agent in our Sesame channel that remembers conversations across sessions without any manual memory management.
241
-
242
- ---
243
-
244
- ### Phase 2 — Multi-Context with Isolation
245
-
246
- **Goal:** Multiple project contexts with full memory isolation. Work on two projects without contamination.
247
-
248
- #### Tasks
249
-
250
- - [ ] **2.1 — Context Manager**
251
- - Context creation/deletion/listing
252
- - Message routing: infer context from message content or explicit switching ("switch to LinkZero")
253
- - Context metadata: name, description, created date, last active
254
- - Global context (always loaded alongside active project context)
255
- - *Est: 2 sessions*
256
-
257
- - [ ] **2.2 — Partitioned memory**
258
- - LanceDB namespace per context (separate tables)
259
- - Episode storage tagged with context ID
260
- - Search scoped to active context + global
261
- - Relevance scoring per-context (independent decay curves)
262
- - *Est: 1-2 sessions*
263
-
264
- - [ ] **2.3 — L2→L3 promotion engine**
265
- - Track access frequency per episode
266
- - Track connection density (episodes referenced together)
267
- - Threshold-based promotion: episode → semantic knowledge
268
- - L3 entries are higher-level (patterns, decisions, architecture choices)
269
- - No LLM involved — just metadata promotion + re-indexing
270
- - *Est: 2 sessions*
271
-
272
- - [ ] **2.4 — Cross-context features**
273
- - Cross-context search: query all contexts, results labeled by source
274
- - Explicit sharing: "share this with [context]"
275
- - Auto-promotion to Global: knowledge referenced in 3+ contexts
276
- - *Est: 1-2 sessions*
277
-
278
- - [ ] **2.5 — Task engine (per-context)**
279
- - Per-context task queue (TASKS stored in context memory)
280
- - Task states: planned → active → complete → archived
281
- - Task dependencies
282
- - Agent can autonomously pick next task from queue
283
- - *Est: 2 sessions*
284
-
285
- - [ ] **2.6 — Integration test: "Two projects, no bleed"**
286
- - Create two project contexts
287
- - Work on both interleaved
288
- - Verify: searching in context A returns nothing from context B
289
- - Verify: explicit cross-context search works when requested
290
- - *Est: 1 session*
291
-
292
- **Phase 2 deliverable:** Hivemind handles multiple projects with isolated memory. Context switching is instant and clean.
293
-
294
- ---
295
-
296
- ### Phase 3 — Multi-Machine Fleet
297
-
298
- **Goal:** Contexts distributed across Mac minis. True parallel autonomous work.
299
-
300
- #### Tasks
301
-
302
- - [ ] **3.1 — Worker protocol**
303
- - Define Primary ↔ Worker communication protocol
304
- - Worker registration and health checks
305
- - Context assignment: Primary tells Worker "you own context X"
306
- - Worker reports status back to Primary
307
- - *Est: 2 sessions*
308
-
309
- - [ ] **3.2 — Distributed context execution**
310
- - Worker runs its own memory daemon + Ollama + agent runtime
311
- - Context state is local to the worker (no shared DB needed for MVP)
312
- - Worker executes tasks autonomously from its context's task queue
313
- - *Est: 2-3 sessions*
314
-
315
- - [ ] **3.3 — Fleet Manager (Primary)**
316
- - CLI/API to provision new workers
317
- - Assign/migrate contexts between machines
318
- - Aggregate status view: "what is each machine working on?"
319
- - Sesame routing: messages for context X → forwarded to worker owning X
320
- - *Est: 2 sessions*
321
-
322
- - [ ] **3.4 — Cross-machine memory sync**
323
- - Worker periodically syncs key L3 knowledge back to Primary
324
- - Primary can push Global context updates to workers
325
- - Conflict resolution: last-write-wins for L3, append-only for L2
326
- - *Est: 2 sessions*
327
-
328
- - [ ] **3.5 — Integration test: "The fleet"**
329
- - 3 Mac minis running
330
- - Each with a different project context
331
- - All 3 making progress simultaneously
332
- - Query any project's status via Sesame on Primary
333
- - *Est: 1-2 sessions (plus hardware setup with Ryan)*
334
-
335
- **Phase 3 deliverable:** A fleet of Hivemind agents working autonomously across multiple machines, coordinated through a primary node, all accessible via Sesame.
336
-
337
- ---
338
-
339
- ## Decision Boundaries
340
-
341
- ### Bailey decides autonomously:
342
- - Implementation details (function signatures, data structures, error handling)
343
- - Library/crate choices within the agreed stack
344
- - File organization within the agreed project structure
345
- - Test strategy and coverage
346
- - Git workflow (branching, commits, PRs)
347
- - Bug fixes and refactoring
348
- - Task ordering within a phase
349
-
350
- ### Ping Ryan for:
351
- - External service setup (new Sesame agents, ClawRouter config changes)
352
- - Architectural changes that deviate from this plan
353
- - Adding new external dependencies or services not in the stack
354
- - UX decisions (how the agent presents itself, conversation style)
355
- - Scope changes (adding/removing features from a phase)
356
- - Any spend (new services, API costs beyond existing accounts)
357
- - Phase completion review before moving to next phase
358
-
359
- ---
360
-
361
- ## Open Questions (Resolve During Build)
362
-
363
- 1. **Embedding model choice:** `nomic-embed-text` vs `mxbai-embed-large` — need to benchmark on Apple Silicon for latency/quality tradeoff
364
- 2. **Memory daemon API:** REST (simpler) vs gRPC (faster, typed) — start REST, upgrade if latency matters
365
- 3. **Episode granularity:** Per-message? Per-turn (user+assistant)? Per-conversation? Start per-turn, can adjust.
366
- 4. **Context inference:** How smart does the Context Manager need to be about guessing which project a message relates to? Start with explicit switching, add inference later.
367
- 5. **Sesame agent identity:** One Hivemind agent on Sesame, or one per context? Start with one, route internally.
368
-
369
- ---
370
-
371
- ## References
372
-
373
- - [LanceDB docs](https://lancedb.github.io/lancedb/)
374
- - [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md)
375
- - [Sesame docs](https://sesame.space/docs)
376
- - [ClawRouter](https://clawrouter.app)
377
- - [Axum (Rust web framework)](https://github.com/tokio-rs/axum)
378
-
379
- ---
380
-
381
- *Created: 2025-07-18*
382
- *Last updated: 2025-07-18*
383
- *Status: Planning complete — ready for Phase 1 execution*
package/TASKS.md DELETED
@@ -1,60 +0,0 @@
1
- # Hivemind — Task Tracker
2
-
3
- *Auto-maintained by Bailey. Updated after each coding session.*
4
-
5
- ## Current Phase: 4 — Deployment & Distribution
6
-
7
- | # | Task | Status | Notes |
8
- |---|------|--------|-------|
9
- | 4.1 | Sesame integration fixes | ✅ done | sendMessage API, sender handles, group chat awareness |
10
- | 4.2 | Team Charter system | ✅ done | config/TEAM-CHARTER.md, __SKIP__ for group etiquette |
11
- | 4.3 | CLI commands | ✅ done | init, start, service, fleet |
12
- | 4.4 | Config layering | ✅ done | default.toml + local.toml + .env + env vars |
13
- | 4.5 | npm publish | ✅ done | @sesamespace/hivemind@0.1.0 (public) |
14
- | 4.6 | launchd services | ✅ done | hivemind service install/uninstall/status/logs |
15
- | 4.7 | Sesame bootstrap endpoint | ✅ done | GET /api/v1/hivemind/install (pushed, needs deploy) |
16
- | 4.8 | hivemind.team DNS | ⏳ pending | Ryan to configure, points to Sesame API |
17
- | 4.9 | Fresh machine test | ⏳ pending | Full bootstrap on new Mac mini |
18
- | 4.10 | Vault provisioning | ⏳ pending | Needs vault creation in Sesame |
19
- | 4.11 | hivemind update command | ⏳ queued | npm update + vault re-check |
20
- | 4.12 | hivemind-help channel | ⏳ queued | Create on Sesame, add to default channels |
21
-
22
- ## Phase 3 — Multi-Machine Fleet ✅ COMPLETE
23
-
24
- | # | Task | Status | Notes |
25
- |---|------|--------|-------|
26
- | 3.1 | Worker protocol | ✅ done | Shared types, PrimaryClient, WorkerServer, 20 tests |
27
- | 3.2 | Distributed context execution | ✅ done | Worker mode, config, task loop |
28
- | 3.3 | Fleet Manager | ✅ done | CLI/API for provisioning, context migration, subnet discovery |
29
- | 3.4 | Cross-machine memory sync | ✅ done | L3 last-write-wins, L2 append-only, sync push/pull |
30
- | 3.5 | Integration test | ✅ done | 21 tests: multi-worker registration, context distribution, sync, dashboard |
31
-
32
- ## Phase 2 — Multi-Context ✅ COMPLETE
33
-
34
- | # | Task | Status | Notes |
35
- |---|------|--------|-------|
36
- | 2.1 | Context Manager | ✅ done | Message routing, context-aware agent loop |
37
- | 2.2 | Partitioned memory | ✅ done | Per-context LanceDB namespaces, independent decay |
38
- | 2.3 | L2→L3 promotion engine | ✅ done | Access frequency + connection density, threshold promotion |
39
- | 2.4 | Cross-context features | ✅ done | Cross-context search, sharing, auto-promotion to Global |
40
- | 2.5 | Task engine (per-context) | ✅ done | Per-context task queues, chat commands, dependencies |
41
- | 2.6 | Integration tests | ✅ done | 8/8 tests passing |
42
-
43
- ## Phase 1 — Single Context ✅ COMPLETE
44
-
45
- | # | Task | Status | Notes |
46
- |---|------|--------|-------|
47
- | 1.1 | Project scaffolding | ✅ done | pnpm monorepo, TS + Rust, config |
48
- | 1.2 | Memory daemon MVP | ✅ done | Rust/axum, LanceDB, Ollama embeddings |
49
- | 1.3 | Agent runtime MVP | ✅ done | Core agent loop, memory client, LLM client |
50
- | 1.4 | Sesame integration | ✅ done | WebSocket + REST, reconnection |
51
- | 1.5 | Write-through pipeline | ✅ done | Auto-embed every turn, top-K retrieval |
52
-
53
- ---
54
-
55
- ## Test Suite: 49 tests passing
56
- - 20 worker protocol
57
- - 8 memory integration
58
- - 21 fleet integration
59
-
60
- *Last updated: 2026-02-23*
@@ -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 } from \"fs\";\nimport { createInterface } from \"readline\";\nimport { fileURLToPath } from \"url\";\nimport { SesameClient } from \"@sesamespace/sdk\";\nimport { homedir } 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 ENV_FILE = resolve(HIVEMIND_DIR, \".env\");\nconst LOCAL_TOML = resolve(CONFIG_DIR, \"local.toml\");\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 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 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.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 if (config.llmApiKey) console.log(\" ✓ LLM API key loaded from vault\");\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 4: Prompt for anything missing ---\n if (!config.llmApiKey) {\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 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${config.llmModel ? `[llm]\\nmodel = \"${config.llmModel}\"` : \"# [llm] using defaults\"}\n${config.llmBaseUrl ? `# base_url = \"${config.llmBaseUrl}\"` : \"\"}\n\n[sesame]\napi_key = \"${sesameApiKey}\"\n`;\n\n writeFileSync(LOCAL_TOML, localToml);\n console.log(` ✓ ${LOCAL_TOML}`);\n\n // Write .env\n const envContent = `# Hivemind Agent — ${config.agentName}\n# Generated by hivemind init — ${new Date().toISOString()}\nSESAME_API_KEY=${sesameApiKey}\nLLM_API_KEY=${config.llmApiKey || \"\"}\nAGENT_NAME=${config.agentName}\n`;\n\n writeFileSync(ENV_FILE, envContent, { mode: 0o600 });\n console.log(` ✓ ${ENV_FILE} (chmod 600)`);\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\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. Prompts for any missing configuration\n 4. Writes config/local.toml and .env\n\nOptions:\n -h, --help Show this help\n`);\n}\n"],"mappings":"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","names":["resolve"]}