@sesamespace/hivemind 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/config/TEAM-CHARTER.md +87 -0
- package/config/default.toml +39 -0
- package/dist/__tests__/fleet-integration.test.d.ts +9 -0
- package/dist/__tests__/fleet-integration.test.d.ts.map +1 -0
- package/dist/__tests__/fleet-integration.test.js +201 -0
- package/dist/__tests__/fleet-integration.test.js.map +1 -0
- package/dist/__tests__/fleet.test.d.ts +7 -0
- package/dist/__tests__/fleet.test.d.ts.map +1 -0
- package/dist/__tests__/fleet.test.js +171 -0
- package/dist/__tests__/fleet.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +2 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +348 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/agent.d.ts +27 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +217 -0
- package/dist/agent.js.map +1 -0
- package/dist/commands/fleet.d.ts +13 -0
- package/dist/commands/fleet.d.ts.map +1 -0
- package/dist/commands/fleet.js +193 -0
- package/dist/commands/fleet.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +170 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +39 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +50 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +153 -0
- package/dist/context.js.map +1 -0
- package/dist/fleet/fleet-manager.d.ts +86 -0
- package/dist/fleet/fleet-manager.d.ts.map +1 -0
- package/dist/fleet/fleet-manager.js +298 -0
- package/dist/fleet/fleet-manager.js.map +1 -0
- package/dist/fleet/memory-sync.d.ts +91 -0
- package/dist/fleet/memory-sync.d.ts.map +1 -0
- package/dist/fleet/memory-sync.js +292 -0
- package/dist/fleet/memory-sync.js.map +1 -0
- package/dist/fleet/primary-client.d.ts +49 -0
- package/dist/fleet/primary-client.d.ts.map +1 -0
- package/dist/fleet/primary-client.js +222 -0
- package/dist/fleet/primary-client.js.map +1 -0
- package/dist/fleet/worker-protocol.d.ts +125 -0
- package/dist/fleet/worker-protocol.d.ts.map +1 -0
- package/dist/fleet/worker-protocol.js +27 -0
- package/dist/fleet/worker-protocol.js.map +1 -0
- package/dist/fleet/worker-server.d.ts +53 -0
- package/dist/fleet/worker-server.d.ts.map +1 -0
- package/dist/fleet/worker-server.js +191 -0
- package/dist/fleet/worker-server.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-client.d.ts +24 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +40 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +41 -0
- package/dist/main.js.map +1 -0
- package/dist/memory-client.d.ts +88 -0
- package/dist/memory-client.d.ts.map +1 -0
- package/dist/memory-client.js +185 -0
- package/dist/memory-client.js.map +1 -0
- package/dist/pipeline.d.ts +2 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +125 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/prompt.d.ts +6 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +75 -0
- package/dist/prompt.js.map +1 -0
- package/dist/sesame.d.ts +33 -0
- package/dist/sesame.d.ts.map +1 -0
- package/dist/sesame.js +67 -0
- package/dist/sesame.js.map +1 -0
- package/dist/start.d.ts +3 -0
- package/dist/start.d.ts.map +1 -0
- package/dist/start.js +20 -0
- package/dist/start.js.map +1 -0
- package/dist/task-engine.d.ts +32 -0
- package/dist/task-engine.d.ts.map +1 -0
- package/dist/task-engine.js +80 -0
- package/dist/task-engine.js.map +1 -0
- package/dist/worker.d.ts +73 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +279 -0
- package/dist/worker.js.map +1 -0
- package/install.sh +186 -0
- package/package.json +36 -0
- package/packages/memory/Cargo.lock +6480 -0
- package/packages/memory/Cargo.toml +21 -0
- package/packages/memory/src/src/context.rs +179 -0
- package/packages/memory/src/src/embeddings.rs +51 -0
- package/packages/memory/src/src/main.rs +626 -0
- package/packages/memory/src/src/promotion.rs +637 -0
- package/packages/memory/src/src/scoring.rs +131 -0
- package/packages/memory/src/src/store.rs +460 -0
- package/packages/memory/src/src/tasks.rs +321 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for Primary <-> Worker communication protocol.
|
|
3
|
+
*
|
|
4
|
+
* Communication is HTTP-based:
|
|
5
|
+
* - Primary calls Worker endpoints to assign contexts, check health
|
|
6
|
+
* - Worker calls Primary endpoints to register, report status
|
|
7
|
+
*/
|
|
8
|
+
export interface WorkerInfo {
|
|
9
|
+
id: string;
|
|
10
|
+
url: string;
|
|
11
|
+
capabilities: WorkerCapabilities;
|
|
12
|
+
assigned_contexts: string[];
|
|
13
|
+
registered_at: string;
|
|
14
|
+
last_heartbeat: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkerCapabilities {
|
|
17
|
+
max_contexts: number;
|
|
18
|
+
has_ollama: boolean;
|
|
19
|
+
has_memory_daemon: boolean;
|
|
20
|
+
available_models: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface WorkerRegistrationRequest {
|
|
23
|
+
url: string;
|
|
24
|
+
capabilities: WorkerCapabilities;
|
|
25
|
+
}
|
|
26
|
+
export interface WorkerRegistrationResponse {
|
|
27
|
+
worker_id: string;
|
|
28
|
+
registered_at: string;
|
|
29
|
+
}
|
|
30
|
+
export type WorkerHealthStatus = "healthy" | "degraded" | "unreachable";
|
|
31
|
+
export interface WorkerHealthResponse {
|
|
32
|
+
worker_id: string;
|
|
33
|
+
status: WorkerHealthStatus;
|
|
34
|
+
uptime_seconds: number;
|
|
35
|
+
assigned_contexts: string[];
|
|
36
|
+
active_context: string | null;
|
|
37
|
+
memory_daemon_ok: boolean;
|
|
38
|
+
ollama_ok: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface ContextAssignment {
|
|
41
|
+
context_name: string;
|
|
42
|
+
context_description: string;
|
|
43
|
+
assigned_at: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ContextAssignRequest {
|
|
46
|
+
context_name: string;
|
|
47
|
+
context_description: string;
|
|
48
|
+
}
|
|
49
|
+
export interface ContextAssignResponse {
|
|
50
|
+
context_name: string;
|
|
51
|
+
accepted: boolean;
|
|
52
|
+
reason?: string;
|
|
53
|
+
}
|
|
54
|
+
export type WorkerActivity = "idle" | "working" | "error";
|
|
55
|
+
export interface WorkerStatus {
|
|
56
|
+
worker_id: string;
|
|
57
|
+
activity: WorkerActivity;
|
|
58
|
+
current_context: string | null;
|
|
59
|
+
current_task: string | null;
|
|
60
|
+
error?: string;
|
|
61
|
+
reported_at: string;
|
|
62
|
+
}
|
|
63
|
+
export interface WorkerStatusReport {
|
|
64
|
+
activity: WorkerActivity;
|
|
65
|
+
current_context: string | null;
|
|
66
|
+
current_task: string | null;
|
|
67
|
+
error?: string;
|
|
68
|
+
}
|
|
69
|
+
/** L3 knowledge entries synced from Worker to Primary. */
|
|
70
|
+
export interface SyncPullRequest {
|
|
71
|
+
worker_id: string;
|
|
72
|
+
context_name: string;
|
|
73
|
+
entries: SyncL3Entry[];
|
|
74
|
+
}
|
|
75
|
+
/** An L3 entry with a last-modified timestamp for conflict resolution. */
|
|
76
|
+
export interface SyncL3Entry {
|
|
77
|
+
id: string;
|
|
78
|
+
source_episode_id: string;
|
|
79
|
+
context_name: string;
|
|
80
|
+
content: string;
|
|
81
|
+
promoted_at: string;
|
|
82
|
+
access_count: number;
|
|
83
|
+
connection_density: number;
|
|
84
|
+
updated_at: string;
|
|
85
|
+
}
|
|
86
|
+
export interface SyncPullResponse {
|
|
87
|
+
accepted: number;
|
|
88
|
+
rejected: number;
|
|
89
|
+
}
|
|
90
|
+
/** Global context updates pushed from Primary to Worker. */
|
|
91
|
+
export interface SyncPushRequest {
|
|
92
|
+
entries: SyncL3Entry[];
|
|
93
|
+
episodes: SyncL2Episode[];
|
|
94
|
+
}
|
|
95
|
+
/** L2 episodes synced as append-only (no conflict resolution needed). */
|
|
96
|
+
export interface SyncL2Episode {
|
|
97
|
+
id: string;
|
|
98
|
+
timestamp: string;
|
|
99
|
+
context_name: string;
|
|
100
|
+
role: string;
|
|
101
|
+
content: string;
|
|
102
|
+
}
|
|
103
|
+
export interface SyncPushResponse {
|
|
104
|
+
l3_accepted: number;
|
|
105
|
+
l2_appended: number;
|
|
106
|
+
}
|
|
107
|
+
export declare const WORKER_API_PREFIX = "/workers";
|
|
108
|
+
/** Primary-side routes (Worker calls these) */
|
|
109
|
+
export declare const PRIMARY_ROUTES: {
|
|
110
|
+
readonly register: "/workers/register";
|
|
111
|
+
readonly status: (workerId: string) => string;
|
|
112
|
+
readonly syncPull: "/workers/sync/pull";
|
|
113
|
+
};
|
|
114
|
+
/** Worker-side routes (Primary calls these) */
|
|
115
|
+
export declare const WORKER_ROUTES: {
|
|
116
|
+
readonly health: "/health";
|
|
117
|
+
readonly assign: "/assign";
|
|
118
|
+
readonly unassign: (contextName: string) => string;
|
|
119
|
+
readonly status: "/status";
|
|
120
|
+
readonly syncPush: "/sync/push";
|
|
121
|
+
};
|
|
122
|
+
export declare const DEFAULT_HEALTH_INTERVAL_MS = 30000;
|
|
123
|
+
export declare const HEALTH_TIMEOUT_MS = 5000;
|
|
124
|
+
export declare const DEFAULT_SYNC_INTERVAL_MS = 60000;
|
|
125
|
+
//# sourceMappingURL=worker-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-protocol.d.ts","sourceRoot":"","sources":["../../src/fleet/worker-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for Primary <-> Worker communication protocol.
|
|
3
|
+
*
|
|
4
|
+
* Communication is HTTP-based:
|
|
5
|
+
* - Primary calls Worker endpoints to assign contexts, check health
|
|
6
|
+
* - Worker calls Primary endpoints to register, report status
|
|
7
|
+
*/
|
|
8
|
+
// --- Protocol Constants ---
|
|
9
|
+
export const WORKER_API_PREFIX = "/workers";
|
|
10
|
+
/** Primary-side routes (Worker calls these) */
|
|
11
|
+
export const PRIMARY_ROUTES = {
|
|
12
|
+
register: `${WORKER_API_PREFIX}/register`,
|
|
13
|
+
status: (workerId) => `${WORKER_API_PREFIX}/${encodeURIComponent(workerId)}/status`,
|
|
14
|
+
syncPull: `${WORKER_API_PREFIX}/sync/pull`,
|
|
15
|
+
};
|
|
16
|
+
/** Worker-side routes (Primary calls these) */
|
|
17
|
+
export const WORKER_ROUTES = {
|
|
18
|
+
health: "/health",
|
|
19
|
+
assign: "/assign",
|
|
20
|
+
unassign: (contextName) => `/assign/${encodeURIComponent(contextName)}`,
|
|
21
|
+
status: "/status",
|
|
22
|
+
syncPush: "/sync/push",
|
|
23
|
+
};
|
|
24
|
+
export const DEFAULT_HEALTH_INTERVAL_MS = 30_000;
|
|
25
|
+
export const HEALTH_TIMEOUT_MS = 5_000;
|
|
26
|
+
export const DEFAULT_SYNC_INTERVAL_MS = 60_000;
|
|
27
|
+
//# sourceMappingURL=worker-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-protocol.js","sourceRoot":"","sources":["../../src/fleet/worker-protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiIH,6BAA6B;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE5C,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,QAAQ,EAAE,GAAG,iBAAiB,WAAW;IACzC,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,GAAG,iBAAiB,IAAI,kBAAkB,CAAC,QAAQ,CAAC,SAAS;IAC3F,QAAQ,EAAE,GAAG,iBAAiB,YAAY;CAClC,CAAC;AAEX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,CAAC,WAAmB,EAAE,EAAE,CAAC,WAAW,kBAAkB,CAAC,WAAW,CAAC,EAAE;IAC/E,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,YAAY;CACd,CAAC;AAEX,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-side HTTP server that exposes endpoints for the Primary to call.
|
|
3
|
+
*
|
|
4
|
+
* Uses Node's built-in http module — no external framework needed for these few routes.
|
|
5
|
+
*
|
|
6
|
+
* Endpoints:
|
|
7
|
+
* GET /health — Health check
|
|
8
|
+
* POST /assign — Accept a context assignment
|
|
9
|
+
* DELETE /assign/:contextName — Release a context
|
|
10
|
+
* GET /status — Current activity status
|
|
11
|
+
*/
|
|
12
|
+
import type { SyncPushRequest, SyncPushResponse } from "./worker-protocol.js";
|
|
13
|
+
export interface WorkerServerOptions {
|
|
14
|
+
workerId: string;
|
|
15
|
+
port: number;
|
|
16
|
+
maxContexts?: number;
|
|
17
|
+
memoryDaemonUrl?: string;
|
|
18
|
+
ollamaUrl?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class WorkerServer {
|
|
21
|
+
private server;
|
|
22
|
+
private workerId;
|
|
23
|
+
private port;
|
|
24
|
+
private startTime;
|
|
25
|
+
private assignedContexts;
|
|
26
|
+
private activeContext;
|
|
27
|
+
private currentTask;
|
|
28
|
+
private maxContexts;
|
|
29
|
+
private memoryDaemonUrl;
|
|
30
|
+
private ollamaUrl;
|
|
31
|
+
private onAssignCallback;
|
|
32
|
+
private onSyncPushCallback;
|
|
33
|
+
constructor(opts: WorkerServerOptions);
|
|
34
|
+
/** Start listening. */
|
|
35
|
+
start(): Promise<void>;
|
|
36
|
+
/** Stop the server. */
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
getPort(): number;
|
|
39
|
+
getAssignedContexts(): string[];
|
|
40
|
+
setActiveContext(name: string | null): void;
|
|
41
|
+
setCurrentTask(taskId: string | null): void;
|
|
42
|
+
/** Register a callback for when a new context is assigned. */
|
|
43
|
+
onContextAssigned(cb: (contextName: string, description: string) => void): void;
|
|
44
|
+
/** Register a handler for incoming sync push requests from Primary. */
|
|
45
|
+
onSyncPush(cb: (req: SyncPushRequest) => Promise<SyncPushResponse>): void;
|
|
46
|
+
private handleRequest;
|
|
47
|
+
private handleHealth;
|
|
48
|
+
private handleAssign;
|
|
49
|
+
private handleUnassign;
|
|
50
|
+
private handleStatus;
|
|
51
|
+
private handleSyncPush;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=worker-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-server.d.ts","sourceRoot":"","sources":["../../src/fleet/worker-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAMV,eAAe,EACf,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAA6C;IACrE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,gBAAgB,CAAqE;IAC7F,OAAO,CAAC,kBAAkB,CAAsE;gBAEpF,IAAI,EAAE,mBAAmB;IASrC,uBAAuB;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,uBAAuB;IACjB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,IAAI,MAAM;IAIjB,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI3C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAI3C,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI/E,uEAAuE;IACvE,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;YAM3D,aAAa;IAuC3B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,YAAY;YAUN,cAAc;CAU7B"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-side HTTP server that exposes endpoints for the Primary to call.
|
|
3
|
+
*
|
|
4
|
+
* Uses Node's built-in http module — no external framework needed for these few routes.
|
|
5
|
+
*
|
|
6
|
+
* Endpoints:
|
|
7
|
+
* GET /health — Health check
|
|
8
|
+
* POST /assign — Accept a context assignment
|
|
9
|
+
* DELETE /assign/:contextName — Release a context
|
|
10
|
+
* GET /status — Current activity status
|
|
11
|
+
*/
|
|
12
|
+
import { createServer } from "http";
|
|
13
|
+
export class WorkerServer {
|
|
14
|
+
server = null;
|
|
15
|
+
workerId;
|
|
16
|
+
port;
|
|
17
|
+
startTime;
|
|
18
|
+
assignedContexts = new Map();
|
|
19
|
+
activeContext = null;
|
|
20
|
+
currentTask = null;
|
|
21
|
+
maxContexts;
|
|
22
|
+
memoryDaemonUrl;
|
|
23
|
+
ollamaUrl;
|
|
24
|
+
onAssignCallback = null;
|
|
25
|
+
onSyncPushCallback = null;
|
|
26
|
+
constructor(opts) {
|
|
27
|
+
this.workerId = opts.workerId;
|
|
28
|
+
this.port = opts.port;
|
|
29
|
+
this.startTime = Date.now();
|
|
30
|
+
this.maxContexts = opts.maxContexts ?? 4;
|
|
31
|
+
this.memoryDaemonUrl = opts.memoryDaemonUrl ?? null;
|
|
32
|
+
this.ollamaUrl = opts.ollamaUrl ?? null;
|
|
33
|
+
}
|
|
34
|
+
/** Start listening. */
|
|
35
|
+
async start() {
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
this.server = createServer((req, res) => this.handleRequest(req, res));
|
|
38
|
+
this.server.on("error", reject);
|
|
39
|
+
this.server.listen(this.port, () => resolve());
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Stop the server. */
|
|
43
|
+
async stop() {
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
if (!this.server) {
|
|
46
|
+
resolve();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.server.close(() => resolve());
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
getPort() {
|
|
53
|
+
return this.port;
|
|
54
|
+
}
|
|
55
|
+
getAssignedContexts() {
|
|
56
|
+
return Array.from(this.assignedContexts.keys());
|
|
57
|
+
}
|
|
58
|
+
setActiveContext(name) {
|
|
59
|
+
this.activeContext = name;
|
|
60
|
+
}
|
|
61
|
+
setCurrentTask(taskId) {
|
|
62
|
+
this.currentTask = taskId;
|
|
63
|
+
}
|
|
64
|
+
/** Register a callback for when a new context is assigned. */
|
|
65
|
+
onContextAssigned(cb) {
|
|
66
|
+
this.onAssignCallback = cb;
|
|
67
|
+
}
|
|
68
|
+
/** Register a handler for incoming sync push requests from Primary. */
|
|
69
|
+
onSyncPush(cb) {
|
|
70
|
+
this.onSyncPushCallback = cb;
|
|
71
|
+
}
|
|
72
|
+
// --- Request Router ---
|
|
73
|
+
async handleRequest(req, res) {
|
|
74
|
+
const url = new URL(req.url ?? "/", `http://localhost:${this.port}`);
|
|
75
|
+
const path = url.pathname;
|
|
76
|
+
const method = req.method ?? "GET";
|
|
77
|
+
try {
|
|
78
|
+
if (method === "GET" && path === "/health") {
|
|
79
|
+
return this.handleHealth(res);
|
|
80
|
+
}
|
|
81
|
+
if (method === "POST" && path === "/assign") {
|
|
82
|
+
const body = await readBody(req);
|
|
83
|
+
return this.handleAssign(body, res);
|
|
84
|
+
}
|
|
85
|
+
// DELETE /assign/:contextName
|
|
86
|
+
if (method === "DELETE" && path.startsWith("/assign/")) {
|
|
87
|
+
const contextName = decodeURIComponent(path.slice("/assign/".length));
|
|
88
|
+
return this.handleUnassign(contextName, res);
|
|
89
|
+
}
|
|
90
|
+
if (method === "GET" && path === "/status") {
|
|
91
|
+
return this.handleStatus(res);
|
|
92
|
+
}
|
|
93
|
+
if (method === "POST" && path === "/sync/push") {
|
|
94
|
+
const body = await readBody(req);
|
|
95
|
+
return this.handleSyncPush(body, res);
|
|
96
|
+
}
|
|
97
|
+
sendJson(res, 404, { error: "Not found" });
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
101
|
+
sendJson(res, 500, { error: msg });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// --- Handlers ---
|
|
105
|
+
handleHealth(res) {
|
|
106
|
+
const uptimeMs = Date.now() - this.startTime;
|
|
107
|
+
const body = {
|
|
108
|
+
worker_id: this.workerId,
|
|
109
|
+
status: "healthy",
|
|
110
|
+
uptime_seconds: Math.floor(uptimeMs / 1000),
|
|
111
|
+
assigned_contexts: Array.from(this.assignedContexts.keys()),
|
|
112
|
+
active_context: this.activeContext,
|
|
113
|
+
memory_daemon_ok: this.memoryDaemonUrl !== null,
|
|
114
|
+
ollama_ok: this.ollamaUrl !== null,
|
|
115
|
+
};
|
|
116
|
+
sendJson(res, 200, body);
|
|
117
|
+
}
|
|
118
|
+
handleAssign(raw, res) {
|
|
119
|
+
const req = JSON.parse(raw);
|
|
120
|
+
if (this.assignedContexts.size >= this.maxContexts) {
|
|
121
|
+
const body = {
|
|
122
|
+
context_name: req.context_name,
|
|
123
|
+
accepted: false,
|
|
124
|
+
reason: "Worker at max context capacity",
|
|
125
|
+
};
|
|
126
|
+
sendJson(res, 200, body);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const assignment = {
|
|
130
|
+
context_name: req.context_name,
|
|
131
|
+
context_description: req.context_description,
|
|
132
|
+
assigned_at: new Date().toISOString(),
|
|
133
|
+
};
|
|
134
|
+
this.assignedContexts.set(req.context_name, assignment);
|
|
135
|
+
// Notify the worker runtime about the new context
|
|
136
|
+
if (this.onAssignCallback) {
|
|
137
|
+
this.onAssignCallback(req.context_name, req.context_description);
|
|
138
|
+
}
|
|
139
|
+
const body = {
|
|
140
|
+
context_name: req.context_name,
|
|
141
|
+
accepted: true,
|
|
142
|
+
};
|
|
143
|
+
sendJson(res, 200, body);
|
|
144
|
+
}
|
|
145
|
+
handleUnassign(contextName, res) {
|
|
146
|
+
const existed = this.assignedContexts.delete(contextName);
|
|
147
|
+
if (this.activeContext === contextName) {
|
|
148
|
+
this.activeContext = null;
|
|
149
|
+
this.currentTask = null;
|
|
150
|
+
}
|
|
151
|
+
sendJson(res, existed ? 200 : 404, {
|
|
152
|
+
context_name: contextName,
|
|
153
|
+
removed: existed,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
handleStatus(res) {
|
|
157
|
+
const report = {
|
|
158
|
+
activity: this.currentTask ? "working" : "idle",
|
|
159
|
+
current_context: this.activeContext,
|
|
160
|
+
current_task: this.currentTask,
|
|
161
|
+
};
|
|
162
|
+
sendJson(res, 200, report);
|
|
163
|
+
}
|
|
164
|
+
async handleSyncPush(raw, res) {
|
|
165
|
+
if (!this.onSyncPushCallback) {
|
|
166
|
+
sendJson(res, 501, { error: "Sync push handler not registered" });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const req = JSON.parse(raw);
|
|
170
|
+
const result = await this.onSyncPushCallback(req);
|
|
171
|
+
sendJson(res, 200, result);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// --- Helpers ---
|
|
175
|
+
function readBody(req) {
|
|
176
|
+
return new Promise((resolve, reject) => {
|
|
177
|
+
const chunks = [];
|
|
178
|
+
req.on("data", (chunk) => chunks.push(chunk));
|
|
179
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
180
|
+
req.on("error", reject);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
function sendJson(res, status, body) {
|
|
184
|
+
const payload = JSON.stringify(body);
|
|
185
|
+
res.writeHead(status, {
|
|
186
|
+
"Content-Type": "application/json",
|
|
187
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
188
|
+
});
|
|
189
|
+
res.end(payload);
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=worker-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-server.js","sourceRoot":"","sources":["../../src/fleet/worker-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { Agent } from "./agent.js";
|
|
2
|
+
export { MemoryClient } from "./memory-client.js";
|
|
3
|
+
export { LLMClient } from "./llm-client.js";
|
|
4
|
+
export { ContextManager } from "./context.js";
|
|
5
|
+
export { TaskEngine } from "./task-engine.js";
|
|
6
|
+
export { loadConfig } from "./config.js";
|
|
7
|
+
export { buildSystemPrompt, buildMessages } from "./prompt.js";
|
|
8
|
+
export { SesameClient } from "./sesame.js";
|
|
9
|
+
export { startPipeline } from "./pipeline.js";
|
|
10
|
+
export type { HivemindConfig, AgentConfig, LLMConfig, MemoryConfig, SesameConfig, WorkerModeConfig } from "./config.js";
|
|
11
|
+
export type { ChatMessage, ChatResponse } from "./llm-client.js";
|
|
12
|
+
export type { Episode, ScoredEpisode, EpisodeInput, ContextInfo, CrossContextResult, PromotionResult, L3Entry, TaskRecord, TaskInput, } from "./memory-client.js";
|
|
13
|
+
export type { AgentResponse } from "./agent.js";
|
|
14
|
+
export type { SesameMessage } from "./sesame.js";
|
|
15
|
+
export type { ContextMetadata, ContextSwitchResult } from "./context.js";
|
|
16
|
+
export type { TaskCommand, TaskStatus } from "./task-engine.js";
|
|
17
|
+
export { PrimaryClient } from "./fleet/primary-client.js";
|
|
18
|
+
export { WorkerServer } from "./fleet/worker-server.js";
|
|
19
|
+
export { WorkerRuntime, startWorker } from "./worker.js";
|
|
20
|
+
export { FleetManager } from "./fleet/fleet-manager.js";
|
|
21
|
+
export { WorkerMemorySync, PrimaryMemorySync } from "./fleet/memory-sync.js";
|
|
22
|
+
export type { FleetDashboard, WorkerSummary, MigrationResult } from "./fleet/fleet-manager.js";
|
|
23
|
+
export type { WorkerServerOptions } from "./fleet/worker-server.js";
|
|
24
|
+
export type { WorkerSyncOptions, PrimarySyncOptions } from "./fleet/memory-sync.js";
|
|
25
|
+
export type { WorkerInfo, WorkerCapabilities, WorkerRegistrationRequest, WorkerRegistrationResponse, WorkerHealthResponse, WorkerHealthStatus, WorkerStatus, WorkerStatusReport, WorkerActivity, ContextAssignment, ContextAssignRequest, ContextAssignResponse, SyncPullRequest, SyncPullResponse, SyncPushRequest, SyncPushResponse, SyncL3Entry, SyncL2Episode, } from "./fleet/worker-protocol.js";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxH,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EACV,OAAO,EACP,aAAa,EACb,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,UAAU,EACV,SAAS,GACV,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC/F,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACpF,YAAY,EACV,UAAU,EACV,kBAAkB,EAClB,yBAAyB,EACzB,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,aAAa,GACd,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { Agent } from "./agent.js";
|
|
2
|
+
export { MemoryClient } from "./memory-client.js";
|
|
3
|
+
export { LLMClient } from "./llm-client.js";
|
|
4
|
+
export { ContextManager } from "./context.js";
|
|
5
|
+
export { TaskEngine } from "./task-engine.js";
|
|
6
|
+
export { loadConfig } from "./config.js";
|
|
7
|
+
export { buildSystemPrompt, buildMessages } from "./prompt.js";
|
|
8
|
+
export { SesameClient } from "./sesame.js";
|
|
9
|
+
export { startPipeline } from "./pipeline.js";
|
|
10
|
+
// Fleet (Phase 3)
|
|
11
|
+
export { PrimaryClient } from "./fleet/primary-client.js";
|
|
12
|
+
export { WorkerServer } from "./fleet/worker-server.js";
|
|
13
|
+
export { WorkerRuntime, startWorker } from "./worker.js";
|
|
14
|
+
export { FleetManager } from "./fleet/fleet-manager.js";
|
|
15
|
+
export { WorkerMemorySync, PrimaryMemorySync } from "./fleet/memory-sync.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAoB9C,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LLMConfig } from "./config.js";
|
|
2
|
+
export interface ChatMessage {
|
|
3
|
+
role: "system" | "user" | "assistant";
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ChatResponse {
|
|
7
|
+
content: string;
|
|
8
|
+
model: string;
|
|
9
|
+
usage?: {
|
|
10
|
+
prompt_tokens: number;
|
|
11
|
+
completion_tokens: number;
|
|
12
|
+
total_tokens: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare class LLMClient {
|
|
16
|
+
private baseUrl;
|
|
17
|
+
private model;
|
|
18
|
+
private maxTokens;
|
|
19
|
+
private temperature;
|
|
20
|
+
private apiKey;
|
|
21
|
+
constructor(config: LLMConfig);
|
|
22
|
+
chat(messages: ChatMessage[]): Promise<ChatResponse>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=llm-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.d.ts","sourceRoot":"","sources":["../src/llm-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,SAAS;IAQvB,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;CAgC3D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export class LLMClient {
|
|
2
|
+
baseUrl;
|
|
3
|
+
model;
|
|
4
|
+
maxTokens;
|
|
5
|
+
temperature;
|
|
6
|
+
apiKey;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.baseUrl = config.base_url;
|
|
9
|
+
this.model = config.model;
|
|
10
|
+
this.maxTokens = config.max_tokens;
|
|
11
|
+
this.temperature = config.temperature;
|
|
12
|
+
this.apiKey = config.api_key ?? "";
|
|
13
|
+
}
|
|
14
|
+
async chat(messages) {
|
|
15
|
+
const resp = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
16
|
+
method: "POST",
|
|
17
|
+
headers: {
|
|
18
|
+
"Content-Type": "application/json",
|
|
19
|
+
...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
model: this.model,
|
|
23
|
+
messages,
|
|
24
|
+
max_tokens: this.maxTokens,
|
|
25
|
+
temperature: this.temperature,
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
if (!resp.ok) {
|
|
29
|
+
const body = await resp.text();
|
|
30
|
+
throw new Error(`LLM request failed: ${resp.status} ${body}`);
|
|
31
|
+
}
|
|
32
|
+
const data = (await resp.json());
|
|
33
|
+
return {
|
|
34
|
+
content: data.choices[0].message.content,
|
|
35
|
+
model: data.model,
|
|
36
|
+
usage: data.usage,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=llm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-client.js","sourceRoot":"","sources":["../src/llm-client.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,WAAW,CAAS;IACpB,MAAM,CAAS;IAEvB,YAAY,MAAiB;QAC3B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAuB;QAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ;gBACR,UAAU,EAAE,IAAI,CAAC,SAAS;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAI9B,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO;YACxC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runFleetCommand } from "./commands/fleet.js";
|
|
3
|
+
import { runStartCommand } from "./commands/start.js";
|
|
4
|
+
import { runInitCommand } from "./commands/init.js";
|
|
5
|
+
const [command, ...args] = process.argv.slice(2);
|
|
6
|
+
switch (command) {
|
|
7
|
+
case "init":
|
|
8
|
+
runInitCommand(args).catch((err) => {
|
|
9
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
});
|
|
12
|
+
break;
|
|
13
|
+
case "start":
|
|
14
|
+
runStartCommand(args).catch((err) => {
|
|
15
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
});
|
|
18
|
+
break;
|
|
19
|
+
case "fleet":
|
|
20
|
+
runFleetCommand(args).catch((err) => {
|
|
21
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
});
|
|
24
|
+
break;
|
|
25
|
+
default:
|
|
26
|
+
console.log(`hivemind cli v0.1.0
|
|
27
|
+
|
|
28
|
+
Usage: hivemind <command> [args]
|
|
29
|
+
|
|
30
|
+
Commands:
|
|
31
|
+
init Initialize agent from Sesame API key
|
|
32
|
+
start Start the Hivemind agent
|
|
33
|
+
fleet Manage the worker fleet
|
|
34
|
+
`);
|
|
35
|
+
if (command) {
|
|
36
|
+
console.error(`Unknown command: ${command}`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEjD,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,MAAM;QACT,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,OAAO;QACV,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER,KAAK,OAAO;QACV,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM;IAER;QACE,OAAO,CAAC,GAAG,CAAC;;;;;;;;CAQf,CAAC,CAAC;QACC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM;AACV,CAAC"}
|