@sesamespace/hivemind 0.1.0 → 0.2.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.
Files changed (122) hide show
  1. package/README.md +53 -23
  2. package/dist/chunk-2I2O6X5D.js +1408 -0
  3. package/dist/chunk-2I2O6X5D.js.map +1 -0
  4. package/dist/chunk-DVR2KBL7.js +186 -0
  5. package/dist/chunk-DVR2KBL7.js.map +1 -0
  6. package/dist/chunk-MBS5A6BZ.js +132 -0
  7. package/dist/chunk-MBS5A6BZ.js.map +1 -0
  8. package/dist/chunk-NVJ424TB.js +731 -0
  9. package/dist/chunk-NVJ424TB.js.map +1 -0
  10. package/dist/chunk-RNK5Q5GR.js +44 -0
  11. package/dist/chunk-RNK5Q5GR.js.map +1 -0
  12. package/dist/chunk-XNOWVLXD.js +160 -0
  13. package/dist/chunk-XNOWVLXD.js.map +1 -0
  14. package/dist/commands/fleet.js +8 -192
  15. package/dist/commands/fleet.js.map +1 -1
  16. package/dist/commands/init.js +6 -169
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/service.js +7 -0
  19. package/dist/commands/service.js.map +1 -0
  20. package/dist/commands/start.js +8 -38
  21. package/dist/commands/start.js.map +1 -1
  22. package/dist/index.js +40 -15
  23. package/dist/index.js.map +1 -1
  24. package/dist/main.js +49 -29
  25. package/dist/main.js.map +1 -1
  26. package/dist/start.js +18 -16
  27. package/dist/start.js.map +1 -1
  28. package/package.json +8 -16
  29. package/dist/__tests__/fleet-integration.test.d.ts +0 -9
  30. package/dist/__tests__/fleet-integration.test.d.ts.map +0 -1
  31. package/dist/__tests__/fleet-integration.test.js +0 -201
  32. package/dist/__tests__/fleet-integration.test.js.map +0 -1
  33. package/dist/__tests__/fleet.test.d.ts +0 -7
  34. package/dist/__tests__/fleet.test.d.ts.map +0 -1
  35. package/dist/__tests__/fleet.test.js +0 -171
  36. package/dist/__tests__/fleet.test.js.map +0 -1
  37. package/dist/__tests__/integration.test.d.ts +0 -2
  38. package/dist/__tests__/integration.test.d.ts.map +0 -1
  39. package/dist/__tests__/integration.test.js +0 -348
  40. package/dist/__tests__/integration.test.js.map +0 -1
  41. package/dist/agent.d.ts +0 -27
  42. package/dist/agent.d.ts.map +0 -1
  43. package/dist/agent.js +0 -217
  44. package/dist/agent.js.map +0 -1
  45. package/dist/commands/fleet.d.ts +0 -13
  46. package/dist/commands/fleet.d.ts.map +0 -1
  47. package/dist/commands/init.d.ts +0 -2
  48. package/dist/commands/init.d.ts.map +0 -1
  49. package/dist/commands/start.d.ts +0 -2
  50. package/dist/commands/start.d.ts.map +0 -1
  51. package/dist/config.d.ts +0 -44
  52. package/dist/config.d.ts.map +0 -1
  53. package/dist/config.js +0 -73
  54. package/dist/config.js.map +0 -1
  55. package/dist/context.d.ts +0 -50
  56. package/dist/context.d.ts.map +0 -1
  57. package/dist/context.js +0 -153
  58. package/dist/context.js.map +0 -1
  59. package/dist/fleet/fleet-manager.d.ts +0 -86
  60. package/dist/fleet/fleet-manager.d.ts.map +0 -1
  61. package/dist/fleet/fleet-manager.js +0 -298
  62. package/dist/fleet/fleet-manager.js.map +0 -1
  63. package/dist/fleet/memory-sync.d.ts +0 -91
  64. package/dist/fleet/memory-sync.d.ts.map +0 -1
  65. package/dist/fleet/memory-sync.js +0 -292
  66. package/dist/fleet/memory-sync.js.map +0 -1
  67. package/dist/fleet/primary-client.d.ts +0 -49
  68. package/dist/fleet/primary-client.d.ts.map +0 -1
  69. package/dist/fleet/primary-client.js +0 -222
  70. package/dist/fleet/primary-client.js.map +0 -1
  71. package/dist/fleet/worker-protocol.d.ts +0 -125
  72. package/dist/fleet/worker-protocol.d.ts.map +0 -1
  73. package/dist/fleet/worker-protocol.js +0 -27
  74. package/dist/fleet/worker-protocol.js.map +0 -1
  75. package/dist/fleet/worker-server.d.ts +0 -53
  76. package/dist/fleet/worker-server.d.ts.map +0 -1
  77. package/dist/fleet/worker-server.js +0 -191
  78. package/dist/fleet/worker-server.js.map +0 -1
  79. package/dist/index.d.ts +0 -26
  80. package/dist/index.d.ts.map +0 -1
  81. package/dist/llm-client.d.ts +0 -24
  82. package/dist/llm-client.d.ts.map +0 -1
  83. package/dist/llm-client.js +0 -40
  84. package/dist/llm-client.js.map +0 -1
  85. package/dist/main.d.ts +0 -3
  86. package/dist/main.d.ts.map +0 -1
  87. package/dist/memory-client.d.ts +0 -88
  88. package/dist/memory-client.d.ts.map +0 -1
  89. package/dist/memory-client.js +0 -185
  90. package/dist/memory-client.js.map +0 -1
  91. package/dist/pipeline.d.ts +0 -2
  92. package/dist/pipeline.d.ts.map +0 -1
  93. package/dist/pipeline.js +0 -125
  94. package/dist/pipeline.js.map +0 -1
  95. package/dist/prompt.d.ts +0 -6
  96. package/dist/prompt.d.ts.map +0 -1
  97. package/dist/prompt.js +0 -75
  98. package/dist/prompt.js.map +0 -1
  99. package/dist/sesame.d.ts +0 -33
  100. package/dist/sesame.d.ts.map +0 -1
  101. package/dist/sesame.js +0 -67
  102. package/dist/sesame.js.map +0 -1
  103. package/dist/start.d.ts +0 -3
  104. package/dist/start.d.ts.map +0 -1
  105. package/dist/task-engine.d.ts +0 -32
  106. package/dist/task-engine.d.ts.map +0 -1
  107. package/dist/task-engine.js +0 -80
  108. package/dist/task-engine.js.map +0 -1
  109. package/dist/worker.d.ts +0 -73
  110. package/dist/worker.d.ts.map +0 -1
  111. package/dist/worker.js +0 -279
  112. package/dist/worker.js.map +0 -1
  113. package/install.sh +0 -186
  114. package/packages/memory/Cargo.lock +0 -6480
  115. package/packages/memory/Cargo.toml +0 -21
  116. package/packages/memory/src/src/context.rs +0 -179
  117. package/packages/memory/src/src/embeddings.rs +0 -51
  118. package/packages/memory/src/src/main.rs +0 -626
  119. package/packages/memory/src/src/promotion.rs +0 -637
  120. package/packages/memory/src/src/scoring.rs +0 -131
  121. package/packages/memory/src/src/store.rs +0 -460
  122. package/packages/memory/src/src/tasks.rs +0 -321
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/runtime/src/fleet/primary-client.ts","../packages/runtime/src/fleet/fleet-manager.ts","../packages/runtime/src/fleet/memory-sync.ts"],"sourcesContent":["/**\n * Primary-side client for managing Workers.\n *\n * The Primary uses this to:\n * - Track registered workers\n * - Poll worker health\n * - Assign/unassign contexts to workers\n * - Collect status reports\n */\n\nimport type {\n WorkerInfo,\n WorkerRegistrationRequest,\n WorkerRegistrationResponse,\n WorkerHealthResponse,\n WorkerHealthStatus,\n WorkerStatus,\n WorkerStatusReport,\n ContextAssignRequest,\n ContextAssignResponse,\n SyncPushRequest,\n SyncPushResponse,\n SyncPullRequest,\n SyncPullResponse,\n} from \"./worker-protocol.js\";\n\nimport {\n PRIMARY_ROUTES,\n WORKER_ROUTES,\n DEFAULT_HEALTH_INTERVAL_MS,\n HEALTH_TIMEOUT_MS,\n} from \"./worker-protocol.js\";\n\nexport class PrimaryClient {\n private workers: Map<string, WorkerInfo> = new Map();\n private healthTimer: ReturnType<typeof setInterval> | null = null;\n private nextId = 1;\n private onSyncPullCallback: ((req: SyncPullRequest) => Promise<SyncPullResponse>) | null = null;\n\n /** All registered workers. */\n getWorkers(): WorkerInfo[] {\n return Array.from(this.workers.values());\n }\n\n /** Get a single worker by ID. */\n getWorker(workerId: string): WorkerInfo | undefined {\n return this.workers.get(workerId);\n }\n\n /** Find which worker owns a context, if any. */\n findWorkerForContext(contextName: string): WorkerInfo | undefined {\n for (const w of this.workers.values()) {\n if (w.assigned_contexts.includes(contextName)) return w;\n }\n return undefined;\n }\n\n // --- Registration (called when Worker POSTs to Primary) ---\n\n handleRegistration(req: WorkerRegistrationRequest): WorkerRegistrationResponse {\n const id = `worker-${this.nextId++}`;\n const now = new Date().toISOString();\n\n const info: WorkerInfo = {\n id,\n url: req.url,\n capabilities: req.capabilities,\n assigned_contexts: [],\n registered_at: now,\n last_heartbeat: now,\n };\n\n this.workers.set(id, info);\n return { worker_id: id, registered_at: now };\n }\n\n /** Remove a worker from the registry. */\n deregister(workerId: string): boolean {\n return this.workers.delete(workerId);\n }\n\n // --- Health Checking ---\n\n /** Poll a single worker's health endpoint. */\n async checkHealth(workerId: string): Promise<WorkerHealthResponse | null> {\n const worker = this.workers.get(workerId);\n if (!worker) return null;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n\n const resp = await fetch(`${worker.url}${WORKER_ROUTES.health}`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!resp.ok) {\n this.markUnreachable(workerId);\n return null;\n }\n\n const health = (await resp.json()) as WorkerHealthResponse;\n worker.last_heartbeat = new Date().toISOString();\n return health;\n } catch {\n this.markUnreachable(workerId);\n return null;\n }\n }\n\n /** Poll all workers and return their statuses. */\n async checkAllHealth(): Promise<Map<string, WorkerHealthStatus>> {\n const results = new Map<string, WorkerHealthStatus>();\n\n const checks = Array.from(this.workers.keys()).map(async (id) => {\n const health = await this.checkHealth(id);\n results.set(id, health?.status ?? \"unreachable\");\n });\n\n await Promise.all(checks);\n return results;\n }\n\n /** Start periodic health polling. */\n startHealthPolling(intervalMs = DEFAULT_HEALTH_INTERVAL_MS): void {\n this.stopHealthPolling();\n this.healthTimer = setInterval(() => {\n this.checkAllHealth().catch(() => {});\n }, intervalMs);\n }\n\n /** Stop periodic health polling. */\n stopHealthPolling(): void {\n if (this.healthTimer) {\n clearInterval(this.healthTimer);\n this.healthTimer = null;\n }\n }\n\n // --- Context Assignment ---\n\n /** Assign a context to a worker. */\n async assignContext(\n workerId: string,\n contextName: string,\n contextDescription = \"\",\n ): Promise<ContextAssignResponse> {\n const worker = this.workers.get(workerId);\n if (!worker) {\n return { context_name: contextName, accepted: false, reason: \"Worker not found\" };\n }\n\n if (worker.assigned_contexts.length >= worker.capabilities.max_contexts) {\n return { context_name: contextName, accepted: false, reason: \"Worker at capacity\" };\n }\n\n const body: ContextAssignRequest = {\n context_name: contextName,\n context_description: contextDescription,\n };\n\n try {\n const resp = await fetch(`${worker.url}${WORKER_ROUTES.assign}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const text = await resp.text();\n return { context_name: contextName, accepted: false, reason: `Worker rejected: ${text}` };\n }\n\n const result = (await resp.json()) as ContextAssignResponse;\n\n if (result.accepted) {\n worker.assigned_contexts.push(contextName);\n }\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { context_name: contextName, accepted: false, reason: `Request failed: ${msg}` };\n }\n }\n\n /** Unassign a context from a worker. */\n async unassignContext(workerId: string, contextName: string): Promise<boolean> {\n const worker = this.workers.get(workerId);\n if (!worker) return false;\n\n try {\n const resp = await fetch(`${worker.url}${WORKER_ROUTES.unassign(contextName)}`, {\n method: \"DELETE\",\n });\n\n if (resp.ok) {\n worker.assigned_contexts = worker.assigned_contexts.filter((c) => c !== contextName);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }\n\n // --- Status Collection ---\n\n /** Handle an incoming status report from a Worker. */\n handleStatusReport(workerId: string, report: WorkerStatusReport): WorkerStatus | null {\n const worker = this.workers.get(workerId);\n if (!worker) return null;\n\n worker.last_heartbeat = new Date().toISOString();\n\n return {\n worker_id: workerId,\n activity: report.activity,\n current_context: report.current_context,\n current_task: report.current_task,\n error: report.error,\n reported_at: new Date().toISOString(),\n };\n }\n\n // --- Memory Sync ---\n\n /** Register a handler for incoming sync pull requests from Workers. */\n onSyncPull(cb: (req: SyncPullRequest) => Promise<SyncPullResponse>): void {\n this.onSyncPullCallback = cb;\n }\n\n /** Handle an incoming sync pull (Worker sends L3 knowledge to Primary). */\n async handleSyncPull(req: SyncPullRequest): Promise<SyncPullResponse> {\n if (!this.onSyncPullCallback) {\n return { accepted: 0, rejected: req.entries.length };\n }\n return this.onSyncPullCallback(req);\n }\n\n /** Push Global context updates to a specific worker. */\n async pushSyncToWorker(workerId: string, payload: SyncPushRequest): Promise<SyncPushResponse | null> {\n const worker = this.workers.get(workerId);\n if (!worker) return null;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n\n const resp = await fetch(`${worker.url}${WORKER_ROUTES.syncPush}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!resp.ok) return null;\n return (await resp.json()) as SyncPushResponse;\n } catch {\n return null;\n }\n }\n\n /** Push Global context updates to all registered workers. */\n async pushSyncToAll(payload: SyncPushRequest): Promise<Map<string, SyncPushResponse | null>> {\n const results = new Map<string, SyncPushResponse | null>();\n\n const pushes = Array.from(this.workers.keys()).map(async (id) => {\n const result = await this.pushSyncToWorker(id, payload);\n results.set(id, result);\n });\n\n await Promise.all(pushes);\n return results;\n }\n\n // --- Internal ---\n\n private markUnreachable(workerId: string): void {\n // Worker stays registered but health is tracked via last_heartbeat staleness.\n // Fleet manager (Phase 3.3) will decide when to evict.\n }\n}\n","/**\n * Fleet Manager — high-level orchestration layer on top of PrimaryClient.\n *\n * Provides:\n * - Worker provisioning (register by URL)\n * - Context assignment and migration between workers\n * - Aggregate fleet status / dashboard data\n * - Worker discovery and removal\n */\n\nimport { PrimaryClient } from \"./primary-client.js\";\nimport {\n WORKER_ROUTES,\n HEALTH_TIMEOUT_MS,\n} from \"./worker-protocol.js\";\nimport type {\n WorkerInfo,\n WorkerHealthResponse,\n WorkerHealthStatus,\n WorkerCapabilities,\n ContextAssignResponse,\n WorkerStatus,\n WorkerActivity,\n} from \"./worker-protocol.js\";\n\n// --- Dashboard Types ---\n\nexport interface WorkerSummary {\n id: string;\n url: string;\n health: WorkerHealthStatus;\n contexts: string[];\n current_task: string | null;\n activity: WorkerActivity;\n uptime_seconds: number | null;\n capabilities: WorkerCapabilities;\n last_heartbeat: string;\n}\n\nexport interface FleetDashboard {\n total_workers: number;\n healthy: number;\n degraded: number;\n unreachable: number;\n total_contexts: number;\n workers: WorkerSummary[];\n unassigned_contexts: string[];\n generated_at: string;\n}\n\nexport interface MigrationResult {\n context_name: string;\n from_worker: string;\n to_worker: string;\n success: boolean;\n reason?: string;\n}\n\nexport class FleetManager {\n private primary: PrimaryClient;\n private latestHealth: Map<string, WorkerHealthResponse> = new Map();\n private latestStatus: Map<string, WorkerStatus> = new Map();\n private knownContexts: Set<string> = new Set();\n\n constructor(primary?: PrimaryClient) {\n this.primary = primary ?? new PrimaryClient();\n }\n\n getPrimary(): PrimaryClient {\n return this.primary;\n }\n\n // --- Worker Provisioning ---\n\n /**\n * Register a new worker by URL. Probes the worker's health endpoint\n * to discover capabilities, then registers it with the Primary.\n */\n async addWorker(url: string): Promise<WorkerInfo> {\n // Normalise trailing slash\n const baseUrl = url.replace(/\\/+$/, \"\");\n\n // Probe worker health to discover capabilities\n const capabilities = await this.probeWorker(baseUrl);\n\n const reg = this.primary.handleRegistration({ url: baseUrl, capabilities });\n\n const worker = this.primary.getWorker(reg.worker_id);\n if (!worker) {\n throw new Error(\"Worker registered but not found in registry\");\n }\n\n return worker;\n }\n\n /** Remove a worker from the fleet, unassigning its contexts first. */\n async removeWorker(workerId: string): Promise<boolean> {\n const worker = this.primary.getWorker(workerId);\n if (!worker) return false;\n\n // Unassign all contexts from this worker\n for (const ctx of [...worker.assigned_contexts]) {\n await this.primary.unassignContext(workerId, ctx);\n }\n\n return this.primary.deregister(workerId);\n }\n\n // --- Context Assignment ---\n\n /** Assign a context to a specific worker. */\n async assignContext(\n workerId: string,\n contextName: string,\n description = \"\",\n ): Promise<ContextAssignResponse> {\n const result = await this.primary.assignContext(workerId, contextName, description);\n if (result.accepted) {\n this.knownContexts.add(contextName);\n }\n return result;\n }\n\n /** Migrate a context from one worker to another. */\n async migrateContext(\n contextName: string,\n toWorkerId: string,\n ): Promise<MigrationResult> {\n const fromWorker = this.primary.findWorkerForContext(contextName);\n\n if (!fromWorker) {\n // Context isn't assigned anywhere — just assign to target\n const resp = await this.primary.assignContext(toWorkerId, contextName);\n return {\n context_name: contextName,\n from_worker: \"(none)\",\n to_worker: toWorkerId,\n success: resp.accepted,\n reason: resp.accepted ? undefined : resp.reason,\n };\n }\n\n if (fromWorker.id === toWorkerId) {\n return {\n context_name: contextName,\n from_worker: fromWorker.id,\n to_worker: toWorkerId,\n success: false,\n reason: \"Context already assigned to this worker\",\n };\n }\n\n // Assign to new worker first, then unassign from old\n const assignResult = await this.primary.assignContext(toWorkerId, contextName);\n if (!assignResult.accepted) {\n return {\n context_name: contextName,\n from_worker: fromWorker.id,\n to_worker: toWorkerId,\n success: false,\n reason: assignResult.reason ?? \"Target worker rejected assignment\",\n };\n }\n\n await this.primary.unassignContext(fromWorker.id, contextName);\n\n return {\n context_name: contextName,\n from_worker: fromWorker.id,\n to_worker: toWorkerId,\n success: true,\n };\n }\n\n // --- Status & Health ---\n\n /** Refresh health for all workers. */\n async refreshHealth(): Promise<void> {\n const workers = this.primary.getWorkers();\n\n const checks = workers.map(async (w) => {\n const health = await this.primary.checkHealth(w.id);\n if (health) {\n this.latestHealth.set(w.id, health);\n } else {\n // Mark unreachable but keep stale data\n this.latestHealth.set(w.id, {\n worker_id: w.id,\n status: \"unreachable\",\n uptime_seconds: 0,\n assigned_contexts: w.assigned_contexts,\n active_context: null,\n memory_daemon_ok: false,\n ollama_ok: false,\n });\n }\n });\n\n await Promise.all(checks);\n }\n\n /** Record a status report (called when worker POSTs status to Primary). */\n recordStatus(workerId: string, status: WorkerStatus): void {\n this.latestStatus.set(workerId, status);\n }\n\n /** Get the full fleet dashboard. */\n async getDashboard(): Promise<FleetDashboard> {\n await this.refreshHealth();\n\n const workers = this.primary.getWorkers();\n let healthy = 0;\n let degraded = 0;\n let unreachable = 0;\n let totalContexts = 0;\n\n const workerSummaries: WorkerSummary[] = workers.map((w) => {\n const health = this.latestHealth.get(w.id);\n const status = this.latestStatus.get(w.id);\n\n const healthStatus: WorkerHealthStatus = health?.status ?? \"unreachable\";\n if (healthStatus === \"healthy\") healthy++;\n else if (healthStatus === \"degraded\") degraded++;\n else unreachable++;\n\n totalContexts += w.assigned_contexts.length;\n\n return {\n id: w.id,\n url: w.url,\n health: healthStatus,\n contexts: w.assigned_contexts,\n current_task: status?.current_task ?? null,\n activity: status?.activity ?? \"idle\",\n uptime_seconds: health?.uptime_seconds ?? null,\n capabilities: w.capabilities,\n last_heartbeat: w.last_heartbeat,\n };\n });\n\n // Determine unassigned contexts\n const assignedContexts = new Set(workers.flatMap((w) => w.assigned_contexts));\n const unassigned = [...this.knownContexts].filter((c) => !assignedContexts.has(c));\n\n return {\n total_workers: workers.length,\n healthy,\n degraded,\n unreachable,\n total_contexts: totalContexts,\n workers: workerSummaries,\n unassigned_contexts: unassigned,\n generated_at: new Date().toISOString(),\n };\n }\n\n /** Get a quick status summary without refreshing health. */\n getStatusSnapshot(): FleetDashboard {\n const workers = this.primary.getWorkers();\n let healthy = 0;\n let degraded = 0;\n let unreachable = 0;\n let totalContexts = 0;\n\n const workerSummaries: WorkerSummary[] = workers.map((w) => {\n const health = this.latestHealth.get(w.id);\n const status = this.latestStatus.get(w.id);\n\n const healthStatus: WorkerHealthStatus = health?.status ?? \"unreachable\";\n if (healthStatus === \"healthy\") healthy++;\n else if (healthStatus === \"degraded\") degraded++;\n else unreachable++;\n\n totalContexts += w.assigned_contexts.length;\n\n return {\n id: w.id,\n url: w.url,\n health: healthStatus,\n contexts: w.assigned_contexts,\n current_task: status?.current_task ?? null,\n activity: status?.activity ?? \"idle\",\n uptime_seconds: health?.uptime_seconds ?? null,\n capabilities: w.capabilities,\n last_heartbeat: w.last_heartbeat,\n };\n });\n\n const assignedContexts = new Set(workers.flatMap((w) => w.assigned_contexts));\n const unassigned = [...this.knownContexts].filter((c) => !assignedContexts.has(c));\n\n return {\n total_workers: workers.length,\n healthy,\n degraded,\n unreachable,\n total_contexts: totalContexts,\n workers: workerSummaries,\n unassigned_contexts: unassigned,\n generated_at: new Date().toISOString(),\n };\n }\n\n // --- Worker Discovery ---\n\n /**\n * Scan a list of candidate URLs for workers. Returns the URLs\n * that responded to a health probe. Useful for auto-detecting\n * workers on a local network.\n */\n async discoverWorkers(candidateUrls: string[]): Promise<string[]> {\n const found: string[] = [];\n\n const probes = candidateUrls.map(async (url) => {\n const baseUrl = url.replace(/\\/+$/, \"\");\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n\n const resp = await fetch(`${baseUrl}${WORKER_ROUTES.health}`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (resp.ok) {\n found.push(baseUrl);\n }\n } catch {\n // Not reachable, skip\n }\n });\n\n await Promise.all(probes);\n return found;\n }\n\n /**\n * Scan a subnet-style range for workers. Generates URLs for\n * a base IP with ports and probes them.\n * Example: scanSubnet(\"192.168.1\", [10, 11, 12], 3100)\n */\n async scanSubnet(\n baseIp: string,\n hostIds: number[],\n port: number,\n ): Promise<string[]> {\n const urls = hostIds.map((id) => `http://${baseIp}.${id}:${port}`);\n return this.discoverWorkers(urls);\n }\n\n /** Track a context name so it appears in unassigned lists. */\n registerContext(contextName: string): void {\n this.knownContexts.add(contextName);\n }\n\n /** Start health polling (delegates to PrimaryClient). */\n startHealthPolling(intervalMs?: number): void {\n this.primary.startHealthPolling(intervalMs);\n }\n\n /** Stop health polling. */\n stopHealthPolling(): void {\n this.primary.stopHealthPolling();\n }\n\n // --- Internal ---\n\n private async probeWorker(baseUrl: string): Promise<WorkerCapabilities> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n\n const resp = await fetch(`${baseUrl}${WORKER_ROUTES.health}`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (resp.ok) {\n const health = (await resp.json()) as WorkerHealthResponse;\n return {\n max_contexts: health.assigned_contexts.length + 4, // assume capacity\n has_ollama: health.ollama_ok,\n has_memory_daemon: health.memory_daemon_ok,\n available_models: [],\n };\n }\n } catch {\n // Fall through to defaults\n }\n\n // Return default capabilities if probe fails\n return {\n max_contexts: 4,\n has_ollama: false,\n has_memory_daemon: false,\n available_models: [],\n };\n }\n}\n","/**\n * Cross-machine memory sync.\n *\n * Workers periodically push key L3 knowledge back to the Primary.\n * Primary can push Global context updates (L3 + L2 episodes) to workers.\n *\n * Conflict resolution:\n * - L3: last-write-wins (compared by updated_at timestamp)\n * - L2: append-only (episodes are never overwritten, only added)\n *\n * Sync protocol:\n * POST /sync/pull — Worker sends L3 knowledge to Primary\n * POST /sync/push — Primary sends Global context updates to Worker\n */\n\nimport type { MemoryClient, L3Entry, Episode } from \"../memory-client.js\";\nimport type { PrimaryClient } from \"./primary-client.js\";\nimport type { WorkerServer } from \"./worker-server.js\";\nimport type {\n SyncPullRequest,\n SyncPullResponse,\n SyncPushRequest,\n SyncPushResponse,\n SyncL3Entry,\n SyncL2Episode,\n} from \"./worker-protocol.js\";\nimport { DEFAULT_SYNC_INTERVAL_MS, HEALTH_TIMEOUT_MS, PRIMARY_ROUTES } from \"./worker-protocol.js\";\n\n// --- Helpers ---\n\nfunction l3ToSync(entry: L3Entry): SyncL3Entry {\n return {\n id: entry.id,\n source_episode_id: entry.source_episode_id,\n context_name: entry.context_name,\n content: entry.content,\n promoted_at: entry.promoted_at,\n access_count: entry.access_count,\n connection_density: entry.connection_density,\n updated_at: entry.promoted_at,\n };\n}\n\nfunction episodeToSync(ep: Episode): SyncL2Episode {\n return {\n id: ep.id,\n timestamp: ep.timestamp,\n context_name: ep.context_name,\n role: ep.role,\n content: ep.content,\n };\n}\n\n// --- MemorySync (Worker side) ---\n\nexport interface WorkerSyncOptions {\n workerId: string;\n primaryUrl: string;\n memory: MemoryClient;\n server: WorkerServer;\n syncIntervalMs?: number;\n}\n\n/**\n * Worker-side memory sync. Periodically sends L3 knowledge from assigned\n * contexts back to the Primary, and accepts Global context pushes.\n */\nexport class WorkerMemorySync {\n private workerId: string;\n private primaryUrl: string;\n private memory: MemoryClient;\n private syncTimer: ReturnType<typeof setInterval> | null = null;\n private syncIntervalMs: number;\n private knownL2Ids: Set<string> = new Set();\n private knownL3Ids: Map<string, string> = new Map(); // id -> updated_at\n\n constructor(opts: WorkerSyncOptions) {\n this.workerId = opts.workerId;\n this.primaryUrl = opts.primaryUrl;\n this.memory = opts.memory;\n this.syncIntervalMs = opts.syncIntervalMs ?? DEFAULT_SYNC_INTERVAL_MS;\n\n // Register handler for incoming Global context pushes from Primary\n opts.server.onSyncPush((req) => this.handlePush(req));\n }\n\n /** Start periodic sync (Worker -> Primary). */\n start(contextNames: () => string[]): void {\n this.stop();\n this.syncTimer = setInterval(() => {\n this.pullTowardsPrimary(contextNames()).catch((err) => {\n console.warn(\"[sync] Pull cycle failed:\", (err as Error).message);\n });\n }, this.syncIntervalMs);\n }\n\n /** Stop periodic sync. */\n stop(): void {\n if (this.syncTimer) {\n clearInterval(this.syncTimer);\n this.syncTimer = null;\n }\n }\n\n /**\n * Pull L3 knowledge from all assigned contexts and send to Primary.\n * Called periodically by the sync timer.\n */\n async pullTowardsPrimary(contextNames: string[]): Promise<void> {\n for (const contextName of contextNames) {\n try {\n const entries = await this.memory.getL3Knowledge(contextName);\n if (entries.length === 0) continue;\n\n const syncEntries = entries.map(l3ToSync);\n\n const req: SyncPullRequest = {\n worker_id: this.workerId,\n context_name: contextName,\n entries: syncEntries,\n };\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n\n const resp = await fetch(`${this.primaryUrl}${PRIMARY_ROUTES.syncPull}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(req),\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (resp.ok) {\n const result = (await resp.json()) as SyncPullResponse;\n if (result.accepted > 0) {\n console.log(`[sync] Pushed ${result.accepted} L3 entries from \"${contextName}\" to Primary`);\n }\n }\n } catch {\n // Primary unreachable — will retry next interval\n }\n }\n }\n\n /**\n * Handle an incoming push of Global context updates from the Primary.\n * L3: last-write-wins. L2: append-only.\n */\n async handlePush(req: SyncPushRequest): Promise<SyncPushResponse> {\n let l3Accepted = 0;\n let l2Appended = 0;\n\n // Process L3 entries with last-write-wins\n for (const entry of req.entries) {\n const existing = this.knownL3Ids.get(entry.id);\n if (existing && existing >= entry.updated_at) {\n // Local version is same or newer — skip\n continue;\n }\n\n // Store in local memory daemon (the memory daemon's L3 store handles upsert)\n try {\n // Store as an episode in the global context so the worker has access\n await this.memory.storeEpisode({\n context_name: entry.context_name,\n role: \"system\",\n content: entry.content,\n });\n this.knownL3Ids.set(entry.id, entry.updated_at);\n l3Accepted++;\n } catch {\n // Non-fatal — entry will be retried on next push\n }\n }\n\n // Process L2 episodes as append-only\n for (const episode of req.episodes) {\n if (this.knownL2Ids.has(episode.id)) {\n continue; // Already stored\n }\n\n try {\n await this.memory.storeEpisode({\n context_name: episode.context_name,\n role: episode.role,\n content: episode.content,\n });\n this.knownL2Ids.add(episode.id);\n l2Appended++;\n } catch {\n // Non-fatal\n }\n }\n\n if (l3Accepted > 0 || l2Appended > 0) {\n console.log(`[sync] Received push: ${l3Accepted} L3 accepted, ${l2Appended} L2 appended`);\n }\n\n return { l3_accepted: l3Accepted, l2_appended: l2Appended };\n }\n\n getSyncIntervalMs(): number {\n return this.syncIntervalMs;\n }\n}\n\n// --- PrimaryMemorySync ---\n\nexport interface PrimarySyncOptions {\n primary: PrimaryClient;\n memory: MemoryClient;\n syncIntervalMs?: number;\n}\n\n/**\n * Primary-side memory sync. Handles incoming L3 pulls from workers and\n * can push Global context updates out to all workers.\n */\nexport class PrimaryMemorySync {\n private primary: PrimaryClient;\n private memory: MemoryClient;\n private syncIntervalMs: number;\n private pushTimer: ReturnType<typeof setInterval> | null = null;\n private l3Store: Map<string, SyncL3Entry> = new Map(); // id -> latest entry\n private lastPushAt: string = new Date(0).toISOString();\n\n constructor(opts: PrimarySyncOptions) {\n this.primary = opts.primary;\n this.memory = opts.memory;\n this.syncIntervalMs = opts.syncIntervalMs ?? DEFAULT_SYNC_INTERVAL_MS;\n\n // Register handler for incoming L3 pulls from workers\n this.primary.onSyncPull((req) => this.handlePull(req));\n }\n\n /**\n * Handle an incoming pull — Worker sending L3 knowledge to Primary.\n * Uses last-write-wins for conflict resolution.\n */\n async handlePull(req: SyncPullRequest): Promise<SyncPullResponse> {\n let accepted = 0;\n let rejected = 0;\n\n for (const entry of req.entries) {\n const existing = this.l3Store.get(entry.id);\n\n if (existing && existing.updated_at >= entry.updated_at) {\n // Primary has same or newer version — reject\n rejected++;\n continue;\n }\n\n // Accept the entry — store locally\n this.l3Store.set(entry.id, entry);\n\n // Persist to Primary's memory daemon\n try {\n await this.memory.storeEpisode({\n context_name: entry.context_name,\n role: \"system\",\n content: entry.content,\n });\n } catch {\n // Non-fatal — the in-memory store is the source of truth for sync\n }\n\n accepted++;\n }\n\n if (accepted > 0) {\n console.log(\n `[sync] Accepted ${accepted} L3 entries from worker \"${req.worker_id}\" context \"${req.context_name}\"`,\n );\n }\n\n return { accepted, rejected };\n }\n\n /**\n * Push Global context updates to all workers.\n * Fetches current Global L3 knowledge and recent L2 episodes,\n * then pushes to every registered worker.\n */\n async pushGlobalToAll(): Promise<Map<string, SyncPushResponse | null>> {\n // Gather Global context L3 knowledge\n let l3Entries: SyncL3Entry[] = [];\n try {\n const knowledge = await this.memory.getL3Knowledge(\"global\");\n l3Entries = knowledge.map(l3ToSync);\n } catch {\n // Memory daemon may not have global context yet\n }\n\n // Gather recent Global L2 episodes (append-only)\n let l2Episodes: SyncL2Episode[] = [];\n try {\n const episodes = await this.memory.getContext(\"global\");\n // Only send episodes newer than last push\n l2Episodes = episodes\n .filter((ep) => ep.timestamp > this.lastPushAt)\n .map(episodeToSync);\n } catch {\n // Memory daemon may not have global context yet\n }\n\n if (l3Entries.length === 0 && l2Episodes.length === 0) {\n return new Map();\n }\n\n const payload: SyncPushRequest = {\n entries: l3Entries,\n episodes: l2Episodes,\n };\n\n this.lastPushAt = new Date().toISOString();\n\n const results = await this.primary.pushSyncToAll(payload);\n\n let totalL3 = 0;\n let totalL2 = 0;\n for (const resp of results.values()) {\n if (resp) {\n totalL3 += resp.l3_accepted;\n totalL2 += resp.l2_appended;\n }\n }\n\n if (totalL3 > 0 || totalL2 > 0) {\n console.log(`[sync] Pushed Global updates: ${totalL3} L3, ${totalL2} L2 across ${results.size} workers`);\n }\n\n return results;\n }\n\n /** Start periodic Global push to all workers. */\n startPushLoop(): void {\n this.stopPushLoop();\n this.pushTimer = setInterval(() => {\n this.pushGlobalToAll().catch((err) => {\n console.warn(\"[sync] Push cycle failed:\", (err as Error).message);\n });\n }, this.syncIntervalMs);\n }\n\n /** Stop periodic push. */\n stopPushLoop(): void {\n if (this.pushTimer) {\n clearInterval(this.pushTimer);\n this.pushTimer = null;\n }\n }\n\n /** Get all synced L3 entries the Primary has received. */\n getSyncedEntries(): SyncL3Entry[] {\n return Array.from(this.l3Store.values());\n }\n\n getSyncIntervalMs(): number {\n return this.syncIntervalMs;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,44 @@
1
+ import {
2
+ startPipeline
3
+ } from "./chunk-2I2O6X5D.js";
4
+
5
+ // packages/cli/src/commands/start.ts
6
+ import { resolve } from "path";
7
+ import { existsSync } from "fs";
8
+ var DEFAULT_CONFIG = "config/default.toml";
9
+ async function runStartCommand(args) {
10
+ let configPath = DEFAULT_CONFIG;
11
+ for (let i = 0; i < args.length; i++) {
12
+ if ((args[i] === "--config" || args[i] === "-c") && args[i + 1]) {
13
+ configPath = args[++i];
14
+ } else if (args[i] === "--help" || args[i] === "-h") {
15
+ printHelp();
16
+ return;
17
+ } else {
18
+ console.error(`Unknown argument: ${args[i]}`);
19
+ printHelp();
20
+ process.exit(1);
21
+ }
22
+ }
23
+ const resolved = resolve(configPath);
24
+ if (!existsSync(resolved)) {
25
+ console.error(`Config not found: ${resolved}`);
26
+ process.exit(1);
27
+ }
28
+ await startPipeline(resolved);
29
+ }
30
+ function printHelp() {
31
+ console.log(`hivemind start \u2014 Start the Hivemind agent
32
+
33
+ Usage: hivemind start [options]
34
+
35
+ Options:
36
+ -c, --config <path> Config file (default: config/default.toml)
37
+ -h, --help Show this help
38
+ `);
39
+ }
40
+
41
+ export {
42
+ runStartCommand
43
+ };
44
+ //# sourceMappingURL=chunk-RNK5Q5GR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/commands/start.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { existsSync } from \"fs\";\nimport { startPipeline } from \"@hivemind/runtime\";\n\nconst DEFAULT_CONFIG = \"config/default.toml\";\n\nexport async function runStartCommand(args: string[]): Promise<void> {\n let configPath = DEFAULT_CONFIG;\n\n // Parse args\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === \"--config\" || args[i] === \"-c\") && args[i + 1]) {\n configPath = args[++i];\n } else if (args[i] === \"--help\" || args[i] === \"-h\") {\n printHelp();\n return;\n } else {\n console.error(`Unknown argument: ${args[i]}`);\n printHelp();\n process.exit(1);\n }\n }\n\n const resolved = resolve(configPath);\n if (!existsSync(resolved)) {\n console.error(`Config not found: ${resolved}`);\n process.exit(1);\n }\n\n await startPipeline(resolved);\n}\n\nfunction printHelp(): void {\n console.log(`hivemind start — Start the Hivemind agent\n\nUsage: hivemind start [options]\n\nOptions:\n -c, --config <path> Config file (default: config/default.toml)\n -h, --help Show this help\n`);\n}\n"],"mappings":";;;;;AAAA,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAG3B,IAAM,iBAAiB;AAEvB,eAAsB,gBAAgB,MAA+B;AACnE,MAAI,aAAa;AAGjB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,SAAK,KAAK,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM,SAAS,KAAK,IAAI,CAAC,GAAG;AAC/D,mBAAa,KAAK,EAAE,CAAC;AAAA,IACvB,WAAW,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,MAAM;AACnD,gBAAU;AACV;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,qBAAqB,KAAK,CAAC,CAAC,EAAE;AAC5C,gBAAU;AACV,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,UAAU;AACnC,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,YAAQ,MAAM,qBAAqB,QAAQ,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,QAAQ;AAC9B;AAEA,SAAS,YAAkB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOb;AACD;","names":[]}
@@ -0,0 +1,160 @@
1
+ // packages/cli/src/commands/init.ts
2
+ import { resolve } from "path";
3
+ import { writeFileSync, mkdirSync } from "fs";
4
+ import { createInterface } from "readline";
5
+ import { SesameClient } from "@sesamespace/sdk";
6
+ var HIVEMIND_DIR = resolve(process.env.HIVEMIND_HOME || ".");
7
+ var CONFIG_DIR = resolve(HIVEMIND_DIR, "config");
8
+ var ENV_FILE = resolve(HIVEMIND_DIR, ".env");
9
+ var LOCAL_TOML = resolve(CONFIG_DIR, "local.toml");
10
+ var VAULT_CONFIG_NAME = "hivemind-config";
11
+ async function prompt(question) {
12
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
13
+ return new Promise((resolve2) => {
14
+ rl.question(question, (answer) => {
15
+ rl.close();
16
+ resolve2(answer.trim());
17
+ });
18
+ });
19
+ }
20
+ async function runInitCommand(args) {
21
+ let sesameApiKey = args[0];
22
+ if (args.includes("--help") || args.includes("-h")) {
23
+ printHelp();
24
+ return;
25
+ }
26
+ console.log(`
27
+ \u2566 \u2566\u2566\u2566 \u2566\u2554\u2550\u2557\u2554\u2566\u2557\u2566\u2554\u2557\u2554\u2554\u2566\u2557
28
+ \u2560\u2550\u2563\u2551\u255A\u2557\u2554\u255D\u2551\u2563 \u2551\u2551\u2551\u2551\u2551\u2551\u2551 \u2551\u2551
29
+ \u2569 \u2569\u2569 \u255A\u255D \u255A\u2550\u255D\u2569 \u2569\u2569\u255D\u255A\u255D\u2550\u2569\u255D
30
+ Agent Initialization
31
+ `);
32
+ if (!sesameApiKey) {
33
+ sesameApiKey = await prompt(" Sesame API key: ");
34
+ }
35
+ if (!sesameApiKey) {
36
+ console.error("Error: Sesame API key is required");
37
+ process.exit(1);
38
+ }
39
+ console.log("\n\u2192 Connecting to Sesame...");
40
+ const sdk = new SesameClient({
41
+ apiUrl: "https://api.sesame.space",
42
+ wsUrl: "wss://ws.sesame.space",
43
+ apiKey: sesameApiKey
44
+ });
45
+ let config;
46
+ try {
47
+ const manifest = await sdk.getManifest();
48
+ console.log(` \u2713 Authenticated as ${manifest.agent.handle} (${manifest.agent.id})`);
49
+ console.log(` \u2713 Workspace: ${manifest.workspace.name}`);
50
+ console.log(` \u2713 Channels: ${manifest.channels.length}`);
51
+ for (const ch of manifest.channels) {
52
+ console.log(` - ${ch.name || ch.id} (${ch.kind})`);
53
+ }
54
+ config = {
55
+ agentName: manifest.agent.handle,
56
+ agentHandle: manifest.agent.handle,
57
+ agentId: manifest.agent.id,
58
+ channels: manifest.channels.map((ch) => ({
59
+ id: ch.id,
60
+ name: ch.name,
61
+ kind: ch.kind
62
+ }))
63
+ };
64
+ console.log("\n\u2192 Checking vault for provisioning config...");
65
+ try {
66
+ const vaultResp = await sdk.listVaultItems();
67
+ const items = vaultResp.items || vaultResp.data || [];
68
+ const configItem = items.find((i) => i.name === VAULT_CONFIG_NAME);
69
+ if (configItem) {
70
+ console.log(` \u2713 Found ${VAULT_CONFIG_NAME} vault item`);
71
+ const revealResp = await sdk.revealItem(configItem.id);
72
+ const fields = revealResp.fields || revealResp.data || {};
73
+ config.llmApiKey = fields.llm_api_key || fields.openrouter_api_key;
74
+ config.llmBaseUrl = fields.llm_base_url;
75
+ config.llmModel = fields.llm_model;
76
+ config.personality = fields.agent_personality || fields.personality;
77
+ config.fleetRole = fields.fleet_role;
78
+ if (config.llmApiKey) console.log(" \u2713 LLM API key loaded from vault");
79
+ if (config.personality) console.log(` \u2713 Personality: ${config.personality.slice(0, 60)}...`);
80
+ if (config.fleetRole) console.log(` \u2713 Fleet role: ${config.fleetRole}`);
81
+ } else {
82
+ console.log(" ! No hivemind-config vault item found");
83
+ console.log(" ! Will prompt for LLM API key instead");
84
+ }
85
+ } catch (err) {
86
+ console.log(` ! Could not read vault: ${err.message}`);
87
+ }
88
+ } catch (err) {
89
+ console.error(`
90
+ \u2717 Failed to connect to Sesame: ${err.message}`);
91
+ console.error(" Check your API key and try again.");
92
+ process.exit(1);
93
+ } finally {
94
+ sdk.disconnect();
95
+ }
96
+ if (!config.llmApiKey) {
97
+ config.llmApiKey = await prompt("\n OpenRouter API key: ");
98
+ }
99
+ const nameOverride = await prompt(` Agent name [${config.agentName}]: `);
100
+ if (nameOverride) config.agentName = nameOverride;
101
+ console.log("\n\u2192 Writing configuration...");
102
+ mkdirSync(CONFIG_DIR, { recursive: true });
103
+ const localToml = `# Generated by hivemind init \u2014 ${(/* @__PURE__ */ new Date()).toISOString()}
104
+ # Overrides config/default.toml with agent-specific settings
105
+
106
+ [agent]
107
+ name = "${config.agentName}"
108
+ ${config.personality ? `personality = "${config.personality.replace(/"/g, '\\"')}"` : "# personality = (using default)"}
109
+ team_charter = "config/TEAM-CHARTER.md"
110
+
111
+ ${config.llmModel ? `[llm]
112
+ model = "${config.llmModel}"` : "# [llm] using defaults"}
113
+ ${config.llmBaseUrl ? `# base_url = "${config.llmBaseUrl}"` : ""}
114
+ `;
115
+ writeFileSync(LOCAL_TOML, localToml);
116
+ console.log(` \u2713 ${LOCAL_TOML}`);
117
+ const envContent = `# Hivemind Agent \u2014 ${config.agentName}
118
+ # Generated by hivemind init \u2014 ${(/* @__PURE__ */ new Date()).toISOString()}
119
+ SESAME_API_KEY=${sesameApiKey}
120
+ LLM_API_KEY=${config.llmApiKey || ""}
121
+ AGENT_NAME=${config.agentName}
122
+ `;
123
+ writeFileSync(ENV_FILE, envContent, { mode: 384 });
124
+ console.log(` \u2713 ${ENV_FILE} (chmod 600)`);
125
+ console.log(`
126
+ \u2713 Hivemind initialized for ${config.agentName}!
127
+
128
+ To start the agent:
129
+ ./start.sh
130
+
131
+ To start in background:
132
+ nohup ./start.sh > /tmp/hivemind.log 2>&1 &
133
+
134
+ Agent ID: ${config.agentId}
135
+ Channels: ${config.channels.map((c) => c.name || c.id).join(", ")}
136
+ Fleet role: ${config.fleetRole || "standalone"}
137
+ `);
138
+ }
139
+ function printHelp() {
140
+ console.log(`hivemind init \u2014 Initialize a Hivemind agent from Sesame
141
+
142
+ Usage: hivemind init [sesame-api-key]
143
+
144
+ The API key can also be passed as the first argument.
145
+
146
+ What it does:
147
+ 1. Connects to Sesame and fetches agent identity
148
+ 2. Reads provisioning config from Sesame vault (if available)
149
+ 3. Prompts for any missing configuration
150
+ 4. Writes config/local.toml and .env
151
+
152
+ Options:
153
+ -h, --help Show this help
154
+ `);
155
+ }
156
+
157
+ export {
158
+ runInitCommand
159
+ };
160
+ //# sourceMappingURL=chunk-XNOWVLXD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/cli/src/commands/init.ts"],"sourcesContent":["import { resolve, dirname } from \"path\";\nimport { existsSync, writeFileSync, mkdirSync, readFileSync } from \"fs\";\nimport { createInterface } from \"readline\";\nimport { SesameClient } from \"@sesamespace/sdk\";\n\nconst HIVEMIND_DIR = resolve(process.env.HIVEMIND_HOME || \".\");\nconst CONFIG_DIR = resolve(HIVEMIND_DIR, \"config\");\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 let sesameApiKey = args[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 config.llmApiKey = await prompt(\"\\n OpenRouter API key: \");\n }\n\n // Agent name override\n const nameOverride = await prompt(` Agent name [${config.agentName}]: `);\n if (nameOverride) config.agentName = nameOverride;\n\n // --- Step 5: Write config files ---\n console.log(\"\\n→ Writing configuration...\");\n\n mkdirSync(CONFIG_DIR, { recursive: true });\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)\"}\nteam_charter = \"config/TEAM-CHARTER.md\"\n\n${config.llmModel ? `[llm]\\nmodel = \"${config.llmModel}\"` : \"# [llm] using defaults\"}\n${config.llmBaseUrl ? `# base_url = \"${config.llmBaseUrl}\"` : \"\"}\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 ./start.sh\n\n To start in background:\n nohup ./start.sh > /tmp/hivemind.log 2>&1 &\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,193 +1,9 @@
1
- /**
2
- * CLI commands for fleet management.
3
- *
4
- * Usage:
5
- * hivemind fleet status — Show fleet dashboard
6
- * hivemind fleet add-worker <url> — Register a worker by URL
7
- * hivemind fleet remove-worker <worker-id> — Remove a worker from the fleet
8
- * hivemind fleet assign <worker-id> <context> — Assign a context to a worker
9
- * hivemind fleet migrate <context> <worker-id> — Migrate a context to another worker
10
- * hivemind fleet discover <url1> [url2] ... — Probe URLs for workers
11
- */
12
- import { FleetManager } from "@hivemind/runtime";
13
- function formatUptime(seconds) {
14
- if (seconds == null)
15
- return "—";
16
- if (seconds < 60)
17
- return `${seconds}s`;
18
- if (seconds < 3600)
19
- return `${Math.floor(seconds / 60)}m`;
20
- const h = Math.floor(seconds / 3600);
21
- const m = Math.floor((seconds % 3600) / 60);
22
- return `${h}h ${m}m`;
23
- }
24
- function formatHealth(status) {
25
- switch (status) {
26
- case "healthy": return "OK";
27
- case "degraded": return "DEGRADED";
28
- case "unreachable": return "DOWN";
29
- default: return status.toUpperCase();
30
- }
31
- }
32
- function printDashboard(dashboard) {
33
- console.log("\n=== Hivemind Fleet ===\n");
34
- console.log(`Workers: ${dashboard.total_workers} (${dashboard.healthy} healthy, ${dashboard.degraded} degraded, ${dashboard.unreachable} unreachable)`);
35
- console.log(`Contexts assigned: ${dashboard.total_contexts}`);
36
- if (dashboard.unassigned_contexts.length > 0) {
37
- console.log(`Unassigned contexts: ${dashboard.unassigned_contexts.join(", ")}`);
38
- }
39
- console.log("");
40
- if (dashboard.workers.length === 0) {
41
- console.log("No workers registered. Use 'fleet add-worker <url>' to add one.");
42
- return;
43
- }
44
- // Table header
45
- const cols = { id: 12, url: 30, health: 8, activity: 10, contexts: 25, task: 20, uptime: 8 };
46
- const header = [
47
- "ID".padEnd(cols.id),
48
- "URL".padEnd(cols.url),
49
- "HEALTH".padEnd(cols.health),
50
- "ACTIVITY".padEnd(cols.activity),
51
- "CONTEXTS".padEnd(cols.contexts),
52
- "TASK".padEnd(cols.task),
53
- "UPTIME".padEnd(cols.uptime),
54
- ].join(" ");
55
- console.log(header);
56
- console.log("-".repeat(header.length));
57
- for (const w of dashboard.workers) {
58
- const row = [
59
- w.id.padEnd(cols.id),
60
- w.url.slice(0, cols.url).padEnd(cols.url),
61
- formatHealth(w.health).padEnd(cols.health),
62
- w.activity.padEnd(cols.activity),
63
- (w.contexts.join(", ") || "—").slice(0, cols.contexts).padEnd(cols.contexts),
64
- (w.current_task ?? "—").slice(0, cols.task).padEnd(cols.task),
65
- formatUptime(w.uptime_seconds).padEnd(cols.uptime),
66
- ].join(" ");
67
- console.log(row);
68
- }
69
- console.log(`\nGenerated: ${dashboard.generated_at}`);
70
- }
71
- export async function runFleetCommand(args) {
72
- const subcommand = args[0];
73
- if (!subcommand) {
74
- printUsage();
75
- process.exit(1);
76
- }
77
- const fleet = new FleetManager();
78
- switch (subcommand) {
79
- case "status": {
80
- const dashboard = await fleet.getDashboard();
81
- printDashboard(dashboard);
82
- break;
83
- }
84
- case "add-worker": {
85
- const url = args[1];
86
- if (!url) {
87
- console.error("Usage: hivemind fleet add-worker <url>");
88
- process.exit(1);
89
- }
90
- try {
91
- const worker = await fleet.addWorker(url);
92
- console.log(`Worker registered: ${worker.id}`);
93
- console.log(` URL: ${worker.url}`);
94
- console.log(` Max contexts: ${worker.capabilities.max_contexts}`);
95
- console.log(` Ollama: ${worker.capabilities.has_ollama ? "yes" : "no"}`);
96
- console.log(` Memory daemon: ${worker.capabilities.has_memory_daemon ? "yes" : "no"}`);
97
- }
98
- catch (err) {
99
- const msg = err instanceof Error ? err.message : String(err);
100
- console.error(`Failed to add worker: ${msg}`);
101
- process.exit(1);
102
- }
103
- break;
104
- }
105
- case "remove-worker": {
106
- const workerId = args[1];
107
- if (!workerId) {
108
- console.error("Usage: hivemind fleet remove-worker <worker-id>");
109
- process.exit(1);
110
- }
111
- const removed = await fleet.removeWorker(workerId);
112
- if (removed) {
113
- console.log(`Worker ${workerId} removed.`);
114
- }
115
- else {
116
- console.error(`Worker ${workerId} not found.`);
117
- process.exit(1);
118
- }
119
- break;
120
- }
121
- case "assign": {
122
- const workerId = args[1];
123
- const context = args[2];
124
- if (!workerId || !context) {
125
- console.error("Usage: hivemind fleet assign <worker-id> <context>");
126
- process.exit(1);
127
- }
128
- const result = await fleet.assignContext(workerId, context);
129
- if (result.accepted) {
130
- console.log(`Context '${context}' assigned to ${workerId}.`);
131
- }
132
- else {
133
- console.error(`Assignment rejected: ${result.reason}`);
134
- process.exit(1);
135
- }
136
- break;
137
- }
138
- case "migrate": {
139
- const context = args[1];
140
- const toWorker = args[2];
141
- if (!context || !toWorker) {
142
- console.error("Usage: hivemind fleet migrate <context> <worker-id>");
143
- process.exit(1);
144
- }
145
- const result = await fleet.migrateContext(context, toWorker);
146
- if (result.success) {
147
- console.log(`Context '${context}' migrated: ${result.from_worker} -> ${result.to_worker}`);
148
- }
149
- else {
150
- console.error(`Migration failed: ${result.reason}`);
151
- process.exit(1);
152
- }
153
- break;
154
- }
155
- case "discover": {
156
- const urls = args.slice(1);
157
- if (urls.length === 0) {
158
- console.error("Usage: hivemind fleet discover <url1> [url2] ...");
159
- process.exit(1);
160
- }
161
- console.log(`Probing ${urls.length} URL(s)...`);
162
- const found = await fleet.discoverWorkers(urls);
163
- if (found.length === 0) {
164
- console.log("No workers found.");
165
- }
166
- else {
167
- console.log(`Found ${found.length} worker(s):`);
168
- for (const url of found) {
169
- console.log(` ${url}`);
170
- }
171
- }
172
- break;
173
- }
174
- default:
175
- console.error(`Unknown fleet subcommand: ${subcommand}`);
176
- printUsage();
177
- process.exit(1);
178
- }
179
- }
180
- function printUsage() {
181
- console.log(`
182
- Usage: hivemind fleet <command> [args]
183
-
184
- Commands:
185
- status Show fleet dashboard
186
- add-worker <url> Register a worker by URL
187
- remove-worker <worker-id> Remove a worker from the fleet
188
- assign <worker-id> <context> Assign a context to a worker
189
- migrate <context> <worker-id> Migrate a context to another worker
190
- discover <url1> [url2] ... Probe URLs for workers
191
- `.trim());
192
- }
1
+ import {
2
+ runFleetCommand
3
+ } from "../chunk-DVR2KBL7.js";
4
+ import "../chunk-NVJ424TB.js";
5
+ import "../chunk-2I2O6X5D.js";
6
+ export {
7
+ runFleetCommand
8
+ };
193
9
  //# sourceMappingURL=fleet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/commands/fleet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}