@sesamespace/hivemind 0.5.3 → 0.5.5

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 (96) hide show
  1. package/.github/workflows/memory-release.yml +89 -0
  2. package/config/default.toml +12 -0
  3. package/data/lancedb/contexts.lance/_transactions/0-c4755ab9-b604-4d90-851f-0491f3cbcbce.txn +2 -0
  4. package/data/lancedb/contexts.lance/_versions/1.manifest +0 -0
  5. package/data/lancedb/episode_access.lance/_transactions/0-407a6366-0dca-490a-868b-ea63bee3b40c.txn +2 -0
  6. package/data/lancedb/episode_access.lance/_versions/1.manifest +0 -0
  7. package/data/lancedb/episode_cooccurrence.lance/_transactions/0-0e103c7f-29d7-4f09-8100-505c076f01ae.txn +1 -0
  8. package/data/lancedb/episode_cooccurrence.lance/_versions/1.manifest +0 -0
  9. package/data/lancedb/episodes.lance/_transactions/0-e678cbac-792b-4a9d-a457-17b0d4d23607.txn +1 -0
  10. package/data/lancedb/episodes.lance/_versions/1.manifest +0 -0
  11. package/data/lancedb/l3_knowledge.lance/_transactions/0-cdb3561f-3a59-4e15-bded-e93c5f9a50e3.txn +1 -0
  12. package/data/lancedb/l3_knowledge.lance/_versions/1.manifest +0 -0
  13. package/data/lancedb/tasks.lance/_transactions/0-d1cf10ec-1eb8-48b4-bbbe-34b3a1083664.txn +4 -0
  14. package/data/lancedb/tasks.lance/_versions/1.manifest +0 -0
  15. package/dist/{chunk-HGNVCCYG.js → chunk-2OIRJFI5.js} +14 -31
  16. package/dist/chunk-2OIRJFI5.js.map +1 -0
  17. package/dist/chunk-7D4SUZUM.js +38 -0
  18. package/dist/chunk-7D4SUZUM.js.map +1 -0
  19. package/dist/chunk-LRK64BAK.js +3601 -0
  20. package/dist/chunk-LRK64BAK.js.map +1 -0
  21. package/dist/chunk-MBS5A6BZ.js +132 -0
  22. package/dist/chunk-MBS5A6BZ.js.map +1 -0
  23. package/dist/{chunk-LNV373IF.js → chunk-OQ272HKA.js} +3 -28
  24. package/dist/chunk-OQ272HKA.js.map +1 -0
  25. package/dist/{chunk-CGSXJVSS.js → chunk-RXCV57H3.js} +2 -2
  26. package/dist/{chunk-S3RVZBPZ.js → chunk-YEOAEJ62.js} +2 -2
  27. package/dist/commands/fleet.js +4 -3
  28. package/dist/commands/init.js +2 -1
  29. package/dist/commands/service.js +2 -1
  30. package/dist/commands/start.js +4 -3
  31. package/dist/commands/upgrade.js +1 -0
  32. package/dist/index.js +3 -2
  33. package/dist/main.js +7 -6
  34. package/dist/main.js.map +1 -1
  35. package/dist/start.js +2 -1
  36. package/dist/start.js.map +1 -1
  37. package/package.json +1 -1
  38. package/PLANNING.md +0 -383
  39. package/TASKS.md +0 -60
  40. package/dist/chunk-HGNVCCYG.js.map +0 -1
  41. package/dist/chunk-LNV373IF.js.map +0 -1
  42. package/dist/chunk-PPQGQHXJ.js +0 -151
  43. package/dist/chunk-PPQGQHXJ.js.map +0 -1
  44. package/dist/chunk-YHRGEWAZ.js +0 -2326
  45. package/dist/chunk-YHRGEWAZ.js.map +0 -1
  46. package/install.sh +0 -120
  47. package/npm-package.json +0 -26
  48. package/packages/cli/package.json +0 -23
  49. package/packages/cli/src/commands/fleet.ts +0 -206
  50. package/packages/cli/src/commands/init.ts +0 -253
  51. package/packages/cli/src/commands/service.ts +0 -159
  52. package/packages/cli/src/commands/start.ts +0 -78
  53. package/packages/cli/src/commands/upgrade.ts +0 -158
  54. package/packages/cli/src/main.ts +0 -64
  55. package/packages/cli/tsconfig.json +0 -8
  56. package/packages/memory/Cargo.lock +0 -6480
  57. package/packages/memory/Cargo.toml +0 -21
  58. package/packages/memory/src/context.rs +0 -179
  59. package/packages/memory/src/embeddings.rs +0 -51
  60. package/packages/memory/src/main.rs +0 -626
  61. package/packages/memory/src/promotion.rs +0 -637
  62. package/packages/memory/src/scoring.rs +0 -131
  63. package/packages/memory/src/store.rs +0 -460
  64. package/packages/memory/src/tasks.rs +0 -321
  65. package/packages/runtime/package.json +0 -24
  66. package/packages/runtime/src/__tests__/fleet-integration.test.ts +0 -235
  67. package/packages/runtime/src/__tests__/fleet.test.ts +0 -207
  68. package/packages/runtime/src/__tests__/integration.test.ts +0 -434
  69. package/packages/runtime/src/agent.ts +0 -255
  70. package/packages/runtime/src/config.ts +0 -130
  71. package/packages/runtime/src/context.ts +0 -192
  72. package/packages/runtime/src/fleet/fleet-manager.ts +0 -399
  73. package/packages/runtime/src/fleet/memory-sync.ts +0 -362
  74. package/packages/runtime/src/fleet/primary-client.ts +0 -285
  75. package/packages/runtime/src/fleet/worker-protocol.ts +0 -158
  76. package/packages/runtime/src/fleet/worker-server.ts +0 -246
  77. package/packages/runtime/src/index.ts +0 -57
  78. package/packages/runtime/src/llm-client.ts +0 -65
  79. package/packages/runtime/src/memory-client.ts +0 -309
  80. package/packages/runtime/src/pipeline.ts +0 -187
  81. package/packages/runtime/src/prompt.ts +0 -173
  82. package/packages/runtime/src/sesame.ts +0 -226
  83. package/packages/runtime/src/start.ts +0 -20
  84. package/packages/runtime/src/task-engine.ts +0 -113
  85. package/packages/runtime/src/worker.ts +0 -339
  86. package/packages/runtime/tsconfig.json +0 -8
  87. package/pnpm-workspace.yaml +0 -2
  88. package/run-aidan.sh +0 -23
  89. package/scripts/bootstrap.sh +0 -196
  90. package/scripts/build-npm.sh +0 -92
  91. package/scripts/com.hivemind.agent.plist +0 -44
  92. package/scripts/com.hivemind.memory.plist +0 -31
  93. package/tsconfig.json +0 -22
  94. package/tsup.config.ts +0 -27
  95. /package/dist/{chunk-CGSXJVSS.js.map → chunk-RXCV57H3.js.map} +0 -0
  96. /package/dist/{chunk-S3RVZBPZ.js.map → chunk-YEOAEJ62.js.map} +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 } 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 { realpathSync } = await import(\"fs\");\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../packages/cli/src/commands/start.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { startPipeline } from \"@hivemind/runtime\";\n\nconst DEFAULT_CONFIG = \"config/default.toml\";\n\n/**\n * Load .env file from HIVEMIND_HOME, setting any missing env vars.\n * Simple KEY=VALUE parser — no dotenv dependency needed.\n */\nfunction loadEnvFile(dir: string): void {\n const envPath = resolve(dir, \".env\");\n if (!existsSync(envPath)) return;\n\n try {\n const content = readFileSync(envPath, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx < 1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n let value = trimmed.slice(eqIdx + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n // Don't overwrite existing env vars\n if (!(key in process.env)) {\n process.env[key] = value;\n }\n }\n } catch {\n // Silently ignore read errors\n }\n}\n\nexport async function runStartCommand(args: string[]): Promise<void> {\n // Load .env from HIVEMIND_HOME before anything else\n const hivemindHome = process.env.HIVEMIND_HOME || resolve(homedir(), \"hivemind\");\n loadEnvFile(hivemindHome);\n\n let configPath = DEFAULT_CONFIG;\n\n // Parse args\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === \"--config\" || args[i] === \"-c\") && args[i + 1]) {\n configPath = args[++i];\n } else if (args[i] === \"--help\" || args[i] === \"-h\") {\n printHelp();\n return;\n } else {\n console.error(`Unknown argument: ${args[i]}`);\n printHelp();\n process.exit(1);\n }\n }\n\n const resolved = resolve(configPath);\n if (!existsSync(resolved)) {\n console.error(`Config not found: ${resolved}`);\n process.exit(1);\n }\n\n await startPipeline(resolved);\n}\n\nfunction printHelp(): void {\n console.log(`hivemind start — Start the Hivemind agent\n\nUsage: hivemind start [options]\n\nOptions:\n -c, --config <path> Config file (default: config/default.toml)\n -h, --help Show this help\n`);\n}\n"],"mappings":";;;;;AAAA,SAAS,eAAe;AACxB,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AAGxB,IAAM,iBAAiB;AAMvB,SAAS,YAAY,KAAmB;AACtC,QAAM,UAAU,QAAQ,KAAK,MAAM;AACnC,MAAI,CAAC,WAAW,OAAO,EAAG;AAE1B,MAAI;AACF,UAAM,UAAU,aAAa,SAAS,OAAO;AAC7C,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,UAAI,QAAQ,EAAG;AACf,YAAM,MAAM,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK;AACzC,UAAI,QAAQ,QAAQ,MAAM,QAAQ,CAAC,EAAE,KAAK;AAE1C,UAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAAO,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AACpG,gBAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,MAC3B;AAEA,UAAI,EAAE,OAAO,QAAQ,MAAM;AACzB,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,gBAAgB,MAA+B;AAEnE,QAAM,eAAe,QAAQ,IAAI,iBAAiB,QAAQ,QAAQ,GAAG,UAAU;AAC/E,cAAY,YAAY;AAExB,MAAI,aAAa;AAGjB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,SAAK,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM,SAAS,KAAK,IAAI,CAAC,GAAG;AAC/D,mBAAa,KAAK,EAAE,CAAC;AAAA,IACvB,WAAW,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM;AACnD,gBAAU;AACV;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,qBAAqB,KAAK,CAAC,CAAC,EAAE;AAC5C,gBAAU;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,UAAU;AACnC,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,QAAQ;AAC9B;AAEA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOb;AACD;","names":[]}
@@ -1,151 +0,0 @@
1
- // packages/cli/src/commands/service.ts
2
- import { resolve } from "path";
3
- import { writeFileSync, existsSync, unlinkSync, mkdirSync } from "fs";
4
- import { execSync } from "child_process";
5
- import { homedir } from "os";
6
- var LAUNCH_AGENTS_DIR = resolve(homedir(), "Library/LaunchAgents");
7
- var AGENT_LABEL = "com.hivemind.agent";
8
- function getHivemindHome() {
9
- return process.env.HIVEMIND_HOME || resolve(homedir(), "hivemind");
10
- }
11
- function getHivemindBin() {
12
- try {
13
- const which = execSync("which hivemind", { encoding: "utf-8" }).trim();
14
- if (which) return which;
15
- } catch {
16
- }
17
- return process.argv[1] || "hivemind";
18
- }
19
- function generatePlist(hivemindHome, hivemindBin) {
20
- return `<?xml version="1.0" encoding="UTF-8"?>
21
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
22
- <plist version="1.0">
23
- <dict>
24
- <key>Label</key>
25
- <string>${AGENT_LABEL}</string>
26
- <key>ProgramArguments</key>
27
- <array>
28
- <string>${hivemindBin}</string>
29
- <string>start</string>
30
- </array>
31
- <key>WorkingDirectory</key>
32
- <string>${hivemindHome}</string>
33
- <key>EnvironmentVariables</key>
34
- <dict>
35
- <key>PATH</key>
36
- <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
37
- <key>HIVEMIND_HOME</key>
38
- <string>${hivemindHome}</string>
39
- </dict>
40
- <key>RunAtLoad</key>
41
- <true/>
42
- <key>KeepAlive</key>
43
- <true/>
44
- <key>StandardOutPath</key>
45
- <string>/tmp/hivemind-agent.log</string>
46
- <key>StandardErrorPath</key>
47
- <string>/tmp/hivemind-error.log</string>
48
- <key>ThrottleInterval</key>
49
- <integer>5</integer>
50
- </dict>
51
- </plist>`;
52
- }
53
- async function runServiceCommand(args) {
54
- const subcommand = args[0];
55
- switch (subcommand) {
56
- case "install":
57
- await installService();
58
- break;
59
- case "uninstall":
60
- await uninstallService();
61
- break;
62
- case "status":
63
- showStatus();
64
- break;
65
- case "logs":
66
- showLogs(args[1]);
67
- break;
68
- default:
69
- printHelp();
70
- if (subcommand) {
71
- console.error(`Unknown subcommand: ${subcommand}`);
72
- process.exit(1);
73
- }
74
- break;
75
- }
76
- }
77
- async function installService() {
78
- const hivemindHome = getHivemindHome();
79
- const hivemindBin = getHivemindBin();
80
- console.log(`
81
- \u2192 Installing launchd service for ${hivemindHome}
82
- `);
83
- console.log(` Binary: ${hivemindBin}`);
84
- mkdirSync(LAUNCH_AGENTS_DIR, { recursive: true });
85
- const plistContent = generatePlist(hivemindHome, hivemindBin);
86
- const destPath = resolve(LAUNCH_AGENTS_DIR, `${AGENT_LABEL}.plist`);
87
- try {
88
- execSync(`launchctl unload ${destPath} 2>/dev/null`);
89
- } catch {
90
- }
91
- writeFileSync(destPath, plistContent);
92
- execSync(`launchctl load ${destPath}`);
93
- console.log(` \u2713 ${AGENT_LABEL} installed and started`);
94
- console.log("\n Service will auto-start on boot.");
95
- console.log(" Logs: /tmp/hivemind-agent.log, /tmp/hivemind-error.log\n");
96
- }
97
- async function uninstallService() {
98
- console.log("\n\u2192 Uninstalling launchd service\n");
99
- const plistPath = resolve(LAUNCH_AGENTS_DIR, `${AGENT_LABEL}.plist`);
100
- if (existsSync(plistPath)) {
101
- try {
102
- execSync(`launchctl unload ${plistPath} 2>/dev/null`);
103
- } catch {
104
- }
105
- unlinkSync(plistPath);
106
- console.log(` \u2713 ${AGENT_LABEL} uninstalled`);
107
- } else {
108
- console.log(` - ${AGENT_LABEL} not installed`);
109
- }
110
- console.log("");
111
- }
112
- function showStatus() {
113
- console.log("\n\u2192 Service status\n");
114
- try {
115
- const out = execSync(`launchctl list ${AGENT_LABEL} 2>/dev/null`, { encoding: "utf-8" });
116
- const pidMatch = out.match(/"PID"\s*=\s*(\d+)/);
117
- const pid = pidMatch ? pidMatch[1] : "unknown";
118
- console.log(` \u2713 ${AGENT_LABEL}: running (PID ${pid})`);
119
- } catch {
120
- console.log(` - ${AGENT_LABEL}: not running`);
121
- }
122
- console.log("");
123
- }
124
- function showLogs(which) {
125
- const logFile = which === "error" ? "/tmp/hivemind-error.log" : "/tmp/hivemind-agent.log";
126
- try {
127
- execSync(`tail -30 ${logFile}`, { stdio: "inherit" });
128
- } catch {
129
- console.error(`No log file at ${logFile}`);
130
- }
131
- }
132
- function printHelp() {
133
- console.log(`hivemind service \u2014 Manage launchd service
134
-
135
- Usage: hivemind service <subcommand>
136
-
137
- Subcommands:
138
- install Install and start launchd service (survives reboots)
139
- uninstall Stop and remove launchd service
140
- status Show service status
141
- logs [agent|error] Show recent logs
142
-
143
- Service:
144
- com.hivemind.agent \u2014 Agent runtime (Node.js, Sesame)
145
- `);
146
- }
147
-
148
- export {
149
- runServiceCommand
150
- };
151
- //# sourceMappingURL=chunk-PPQGQHXJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../packages/cli/src/commands/service.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { writeFileSync, existsSync, unlinkSync, mkdirSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { homedir } from \"os\";\n\nconst LAUNCH_AGENTS_DIR = resolve(homedir(), \"Library/LaunchAgents\");\nconst AGENT_LABEL = \"com.hivemind.agent\";\n\nfunction getHivemindHome(): string {\n return process.env.HIVEMIND_HOME || resolve(homedir(), \"hivemind\");\n}\n\nfunction getHivemindBin(): string {\n // Try to find the hivemind binary\n try {\n const which = execSync(\"which hivemind\", { encoding: \"utf-8\" }).trim();\n if (which) return which;\n } catch {}\n // Fallback to process.argv[1] (the script being run)\n return process.argv[1] || \"hivemind\";\n}\n\nfunction generatePlist(hivemindHome: string, hivemindBin: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${AGENT_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${hivemindBin}</string>\n <string>start</string>\n </array>\n <key>WorkingDirectory</key>\n <string>${hivemindHome}</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>\n <key>HIVEMIND_HOME</key>\n <string>${hivemindHome}</string>\n </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>/tmp/hivemind-agent.log</string>\n <key>StandardErrorPath</key>\n <string>/tmp/hivemind-error.log</string>\n <key>ThrottleInterval</key>\n <integer>5</integer>\n</dict>\n</plist>`;\n}\n\nexport async function runServiceCommand(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n switch (subcommand) {\n case \"install\":\n await installService();\n break;\n case \"uninstall\":\n await uninstallService();\n break;\n case \"status\":\n showStatus();\n break;\n case \"logs\":\n showLogs(args[1]);\n break;\n default:\n printHelp();\n if (subcommand) {\n console.error(`Unknown subcommand: ${subcommand}`);\n process.exit(1);\n }\n break;\n }\n}\n\nasync function installService(): Promise<void> {\n const hivemindHome = getHivemindHome();\n const hivemindBin = getHivemindBin();\n\n console.log(`\\n→ Installing launchd service for ${hivemindHome}\\n`);\n console.log(` Binary: ${hivemindBin}`);\n\n mkdirSync(LAUNCH_AGENTS_DIR, { recursive: true });\n\n const plistContent = generatePlist(hivemindHome, hivemindBin);\n const destPath = resolve(LAUNCH_AGENTS_DIR, `${AGENT_LABEL}.plist`);\n\n // Unload if already loaded\n try { execSync(`launchctl unload ${destPath} 2>/dev/null`); } catch {}\n\n writeFileSync(destPath, plistContent);\n execSync(`launchctl load ${destPath}`);\n\n console.log(` ✓ ${AGENT_LABEL} installed and started`);\n console.log(\"\\n Service will auto-start on boot.\");\n console.log(\" Logs: /tmp/hivemind-agent.log, /tmp/hivemind-error.log\\n\");\n}\n\nasync function uninstallService(): Promise<void> {\n console.log(\"\\n→ Uninstalling launchd service\\n\");\n\n const plistPath = resolve(LAUNCH_AGENTS_DIR, `${AGENT_LABEL}.plist`);\n if (existsSync(plistPath)) {\n try { execSync(`launchctl unload ${plistPath} 2>/dev/null`); } catch {}\n unlinkSync(plistPath);\n console.log(` ✓ ${AGENT_LABEL} uninstalled`);\n } else {\n console.log(` - ${AGENT_LABEL} not installed`);\n }\n console.log(\"\");\n}\n\nfunction showStatus(): void {\n console.log(\"\\n→ Service status\\n\");\n try {\n const out = execSync(`launchctl list ${AGENT_LABEL} 2>/dev/null`, { encoding: \"utf-8\" });\n const pidMatch = out.match(/\"PID\"\\s*=\\s*(\\d+)/);\n const pid = pidMatch ? pidMatch[1] : \"unknown\";\n console.log(` ✓ ${AGENT_LABEL}: running (PID ${pid})`);\n } catch {\n console.log(` - ${AGENT_LABEL}: not running`);\n }\n console.log(\"\");\n}\n\nfunction showLogs(which?: string): void {\n const logFile = which === \"error\"\n ? \"/tmp/hivemind-error.log\"\n : \"/tmp/hivemind-agent.log\";\n try {\n execSync(`tail -30 ${logFile}`, { stdio: \"inherit\" });\n } catch {\n console.error(`No log file at ${logFile}`);\n }\n}\n\nfunction printHelp(): void {\n console.log(`hivemind service — Manage launchd service\n\nUsage: hivemind service <subcommand>\n\nSubcommands:\n install Install and start launchd service (survives reboots)\n uninstall Stop and remove launchd service\n status Show service status\n logs [agent|error] Show recent logs\n\nService:\n com.hivemind.agent — Agent runtime (Node.js, Sesame)\n`);\n}\n"],"mappings":"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","names":[]}