@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
package/dist/start.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { startPipeline } from "./pipeline.js";
|
|
4
|
+
import { startWorker } from "./worker.js";
|
|
5
|
+
const configPath = process.argv[2] || "config/default.toml";
|
|
6
|
+
const config = loadConfig(configPath);
|
|
7
|
+
// If worker mode is enabled, start as a fleet worker
|
|
8
|
+
if (config.worker?.enabled) {
|
|
9
|
+
startWorker(config).catch((err) => {
|
|
10
|
+
console.error("[hivemind] Worker fatal:", err);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
startPipeline(configPath).catch((err) => {
|
|
16
|
+
console.error("[hivemind] Fatal:", err);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC;AAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;AAEtC,qDAAqD;AACrD,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC3B,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAChC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,aAAa,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { MemoryClient, TaskRecord } from "./memory-client.js";
|
|
2
|
+
export type TaskStatus = "planned" | "active" | "complete" | "archived";
|
|
3
|
+
export interface TaskEngineOptions {
|
|
4
|
+
contextName: string;
|
|
5
|
+
memory: MemoryClient;
|
|
6
|
+
}
|
|
7
|
+
export declare class TaskEngine {
|
|
8
|
+
private contextName;
|
|
9
|
+
private memory;
|
|
10
|
+
constructor(options: TaskEngineOptions);
|
|
11
|
+
addTask(title: string, description: string, blockedBy?: string[]): Promise<TaskRecord>;
|
|
12
|
+
listTasks(status?: TaskStatus): Promise<TaskRecord[]>;
|
|
13
|
+
startTask(taskId: string): Promise<TaskRecord | null>;
|
|
14
|
+
completeTask(taskId: string): Promise<TaskRecord | null>;
|
|
15
|
+
archiveTask(taskId: string): Promise<TaskRecord | null>;
|
|
16
|
+
getNextTask(): Promise<TaskRecord | null>;
|
|
17
|
+
pickAndStartNextTask(): Promise<TaskRecord | null>;
|
|
18
|
+
setContext(contextName: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Parse a task command from a chat message.
|
|
21
|
+
* Returns the action and parsed parameters, or null if not a task command.
|
|
22
|
+
*/
|
|
23
|
+
static parseTaskCommand(message: string): TaskCommand | null;
|
|
24
|
+
}
|
|
25
|
+
export interface TaskCommand {
|
|
26
|
+
action: "add" | "list" | "complete" | "start" | "next" | "archive";
|
|
27
|
+
title?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
taskId?: string;
|
|
30
|
+
statusFilter?: TaskStatus;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=task-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-engine.d.ts","sourceRoot":"","sources":["../src/task-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAa,MAAM,oBAAoB,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAe;gBAEjB,OAAO,EAAE,iBAAiB;IAKhC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAU1F,SAAS,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIrD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIrD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIxD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIvD,WAAW,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIzC,oBAAoB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQxD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIrC;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;CAwC7D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export class TaskEngine {
|
|
2
|
+
contextName;
|
|
3
|
+
memory;
|
|
4
|
+
constructor(options) {
|
|
5
|
+
this.contextName = options.contextName;
|
|
6
|
+
this.memory = options.memory;
|
|
7
|
+
}
|
|
8
|
+
async addTask(title, description, blockedBy = []) {
|
|
9
|
+
return this.memory.createTask({
|
|
10
|
+
context_name: this.contextName,
|
|
11
|
+
title,
|
|
12
|
+
description,
|
|
13
|
+
status: "planned",
|
|
14
|
+
blocked_by: blockedBy,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async listTasks(status) {
|
|
18
|
+
return this.memory.listTasks(this.contextName, status);
|
|
19
|
+
}
|
|
20
|
+
async startTask(taskId) {
|
|
21
|
+
return this.memory.updateTask(taskId, { status: "active" });
|
|
22
|
+
}
|
|
23
|
+
async completeTask(taskId) {
|
|
24
|
+
return this.memory.updateTask(taskId, { status: "complete" });
|
|
25
|
+
}
|
|
26
|
+
async archiveTask(taskId) {
|
|
27
|
+
return this.memory.updateTask(taskId, { status: "archived" });
|
|
28
|
+
}
|
|
29
|
+
async getNextTask() {
|
|
30
|
+
return this.memory.getNextTask(this.contextName);
|
|
31
|
+
}
|
|
32
|
+
async pickAndStartNextTask() {
|
|
33
|
+
const next = await this.getNextTask();
|
|
34
|
+
if (next) {
|
|
35
|
+
return this.startTask(next.id);
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
setContext(contextName) {
|
|
40
|
+
this.contextName = contextName;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse a task command from a chat message.
|
|
44
|
+
* Returns the action and parsed parameters, or null if not a task command.
|
|
45
|
+
*/
|
|
46
|
+
static parseTaskCommand(message) {
|
|
47
|
+
const lower = message.trim().toLowerCase();
|
|
48
|
+
// "add task: <title>"
|
|
49
|
+
const addMatch = message.match(/^(?:add|create)\s+task[:\s]+(.+)/i);
|
|
50
|
+
if (addMatch) {
|
|
51
|
+
return { action: "add", title: addMatch[1].trim() };
|
|
52
|
+
}
|
|
53
|
+
// "list tasks"
|
|
54
|
+
if (/^list\s+tasks/i.test(lower)) {
|
|
55
|
+
const statusMatch = lower.match(/list\s+tasks\s+(\w+)/);
|
|
56
|
+
return { action: "list", statusFilter: statusMatch?.[1] };
|
|
57
|
+
}
|
|
58
|
+
// "complete task <id>"
|
|
59
|
+
const completeMatch = message.match(/^complete\s+task\s+(\S+)/i);
|
|
60
|
+
if (completeMatch) {
|
|
61
|
+
return { action: "complete", taskId: completeMatch[1] };
|
|
62
|
+
}
|
|
63
|
+
// "start task <id>"
|
|
64
|
+
const startMatch = message.match(/^start\s+task\s+(\S+)/i);
|
|
65
|
+
if (startMatch) {
|
|
66
|
+
return { action: "start", taskId: startMatch[1] };
|
|
67
|
+
}
|
|
68
|
+
// "next task"
|
|
69
|
+
if (/^next\s+task/i.test(lower)) {
|
|
70
|
+
return { action: "next" };
|
|
71
|
+
}
|
|
72
|
+
// "archive task <id>"
|
|
73
|
+
const archiveMatch = message.match(/^archive\s+task\s+(\S+)/i);
|
|
74
|
+
if (archiveMatch) {
|
|
75
|
+
return { action: "archive", taskId: archiveMatch[1] };
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=task-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-engine.js","sourceRoot":"","sources":["../src/task-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker mode entry point — distributed context execution.
|
|
3
|
+
*
|
|
4
|
+
* A worker runs autonomously on a separate machine:
|
|
5
|
+
* 1. Starts its HTTP server (for Primary to manage it)
|
|
6
|
+
* 2. Registers with the Primary node
|
|
7
|
+
* 3. Connects to the local memory daemon
|
|
8
|
+
* 4. Picks up tasks from assigned context queues
|
|
9
|
+
* 5. Executes tasks using the agent loop (query memory, call LLM, store episodes)
|
|
10
|
+
* 6. Reports status back to Primary via HTTP
|
|
11
|
+
*/
|
|
12
|
+
import type { HivemindConfig, WorkerModeConfig } from "./config.js";
|
|
13
|
+
import type { WorkerRegistrationResponse } from "./fleet/worker-protocol.js";
|
|
14
|
+
import { WorkerServer } from "./fleet/worker-server.js";
|
|
15
|
+
import { Agent } from "./agent.js";
|
|
16
|
+
import { MemoryClient } from "./memory-client.js";
|
|
17
|
+
export interface WorkerRuntimeOptions {
|
|
18
|
+
config: HivemindConfig;
|
|
19
|
+
workerConfig: WorkerModeConfig;
|
|
20
|
+
}
|
|
21
|
+
export declare class WorkerRuntime {
|
|
22
|
+
private config;
|
|
23
|
+
private workerConfig;
|
|
24
|
+
private server;
|
|
25
|
+
private memory;
|
|
26
|
+
private agent;
|
|
27
|
+
private taskPollTimer;
|
|
28
|
+
private statusReportTimer;
|
|
29
|
+
private registeredWorkerId;
|
|
30
|
+
private running;
|
|
31
|
+
private executing;
|
|
32
|
+
constructor(opts: WorkerRuntimeOptions);
|
|
33
|
+
/**
|
|
34
|
+
* Start the worker: HTTP server, register with Primary, begin task loop.
|
|
35
|
+
*/
|
|
36
|
+
start(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Stop the worker gracefully.
|
|
39
|
+
*/
|
|
40
|
+
stop(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Register this worker with the Primary node.
|
|
43
|
+
*/
|
|
44
|
+
registerWithPrimary(): Promise<WorkerRegistrationResponse | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Start the task execution polling loop.
|
|
47
|
+
* Iterates assigned contexts and picks up tasks from each queue.
|
|
48
|
+
*/
|
|
49
|
+
startTaskLoop(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Find and execute the next available task across all assigned contexts.
|
|
52
|
+
*/
|
|
53
|
+
executeNextTask(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Periodically report status back to Primary.
|
|
56
|
+
*/
|
|
57
|
+
startStatusReporting(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Send a status report to the Primary.
|
|
60
|
+
*/
|
|
61
|
+
reportStatus(activity: "idle" | "working" | "error", currentContext: string | null, currentTask: string | null, error?: string): Promise<void>;
|
|
62
|
+
getServer(): WorkerServer;
|
|
63
|
+
getAgent(): Agent;
|
|
64
|
+
getMemoryClient(): MemoryClient;
|
|
65
|
+
isRunning(): boolean;
|
|
66
|
+
isExecuting(): boolean;
|
|
67
|
+
getRegisteredWorkerId(): string | null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Start a worker from a config file path (convenience entry point).
|
|
71
|
+
*/
|
|
72
|
+
export declare function startWorker(config: HivemindConfig): Promise<WorkerRuntime>;
|
|
73
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAA6B,0BAA0B,EAAsB,MAAM,4BAA4B,CAAC;AAE5H,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAmB;IACvC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,kBAAkB,CAAuB;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,oBAAoB;IAgBtC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAuCvE;;;OAGG;IACH,aAAa,IAAI,IAAI;IASrB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAmEtC;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAe5B;;OAEG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,EACtC,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAwBhB,SAAS,IAAI,YAAY;IAIzB,QAAQ,IAAI,KAAK;IAIjB,eAAe,IAAI,YAAY;IAI/B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,OAAO;IAItB,qBAAqB,IAAI,MAAM,GAAG,IAAI;CAGvC;AAcD;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAYhF"}
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker mode entry point — distributed context execution.
|
|
3
|
+
*
|
|
4
|
+
* A worker runs autonomously on a separate machine:
|
|
5
|
+
* 1. Starts its HTTP server (for Primary to manage it)
|
|
6
|
+
* 2. Registers with the Primary node
|
|
7
|
+
* 3. Connects to the local memory daemon
|
|
8
|
+
* 4. Picks up tasks from assigned context queues
|
|
9
|
+
* 5. Executes tasks using the agent loop (query memory, call LLM, store episodes)
|
|
10
|
+
* 6. Reports status back to Primary via HTTP
|
|
11
|
+
*/
|
|
12
|
+
import { PRIMARY_ROUTES } from "./fleet/worker-protocol.js";
|
|
13
|
+
import { WorkerServer } from "./fleet/worker-server.js";
|
|
14
|
+
import { Agent } from "./agent.js";
|
|
15
|
+
import { MemoryClient } from "./memory-client.js";
|
|
16
|
+
import { TaskEngine } from "./task-engine.js";
|
|
17
|
+
export class WorkerRuntime {
|
|
18
|
+
config;
|
|
19
|
+
workerConfig;
|
|
20
|
+
server;
|
|
21
|
+
memory;
|
|
22
|
+
agent;
|
|
23
|
+
taskPollTimer = null;
|
|
24
|
+
statusReportTimer = null;
|
|
25
|
+
registeredWorkerId = null;
|
|
26
|
+
running = false;
|
|
27
|
+
executing = false;
|
|
28
|
+
constructor(opts) {
|
|
29
|
+
this.config = opts.config;
|
|
30
|
+
this.workerConfig = opts.workerConfig;
|
|
31
|
+
this.server = new WorkerServer({
|
|
32
|
+
workerId: this.workerConfig.worker_id,
|
|
33
|
+
port: this.workerConfig.worker_port,
|
|
34
|
+
maxContexts: this.workerConfig.max_contexts,
|
|
35
|
+
memoryDaemonUrl: this.config.memory.daemon_url,
|
|
36
|
+
ollamaUrl: this.config.ollama.base_url,
|
|
37
|
+
});
|
|
38
|
+
this.memory = new MemoryClient(this.config.memory);
|
|
39
|
+
this.agent = new Agent(this.config);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start the worker: HTTP server, register with Primary, begin task loop.
|
|
43
|
+
*/
|
|
44
|
+
async start() {
|
|
45
|
+
this.running = true;
|
|
46
|
+
// 1. Start the worker HTTP server
|
|
47
|
+
this.server.onContextAssigned((contextName, description) => {
|
|
48
|
+
console.log(`[worker] Context assigned: "${contextName}" — ${description || "(no description)"}`);
|
|
49
|
+
// Create the context in the local memory daemon
|
|
50
|
+
this.memory.createContext(contextName, description).catch((err) => {
|
|
51
|
+
console.warn(`[worker] Failed to create context "${contextName}" in daemon:`, err.message);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
await this.server.start();
|
|
55
|
+
console.log(`[worker] HTTP server listening on port ${this.workerConfig.worker_port}`);
|
|
56
|
+
// 2. Verify local memory daemon is reachable
|
|
57
|
+
const memoryOk = await this.memory.healthCheck();
|
|
58
|
+
if (memoryOk) {
|
|
59
|
+
console.log("[worker] Local memory daemon connected");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.warn("[worker] Memory daemon unreachable at", this.config.memory.daemon_url);
|
|
63
|
+
console.warn("[worker] Continuing — episodes will not be stored until daemon is available");
|
|
64
|
+
}
|
|
65
|
+
// 3. Register with Primary
|
|
66
|
+
await this.registerWithPrimary();
|
|
67
|
+
// 4. Start the task execution loop
|
|
68
|
+
this.startTaskLoop();
|
|
69
|
+
// 5. Start periodic status reporting
|
|
70
|
+
this.startStatusReporting();
|
|
71
|
+
console.log("[worker] Ready — waiting for context assignments");
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Stop the worker gracefully.
|
|
75
|
+
*/
|
|
76
|
+
async stop() {
|
|
77
|
+
this.running = false;
|
|
78
|
+
if (this.taskPollTimer) {
|
|
79
|
+
clearInterval(this.taskPollTimer);
|
|
80
|
+
this.taskPollTimer = null;
|
|
81
|
+
}
|
|
82
|
+
if (this.statusReportTimer) {
|
|
83
|
+
clearInterval(this.statusReportTimer);
|
|
84
|
+
this.statusReportTimer = null;
|
|
85
|
+
}
|
|
86
|
+
await this.server.stop();
|
|
87
|
+
console.log("[worker] Stopped");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Register this worker with the Primary node.
|
|
91
|
+
*/
|
|
92
|
+
async registerWithPrimary() {
|
|
93
|
+
const workerUrl = `http://localhost:${this.workerConfig.worker_port}`;
|
|
94
|
+
const registration = {
|
|
95
|
+
url: workerUrl,
|
|
96
|
+
capabilities: {
|
|
97
|
+
max_contexts: this.workerConfig.max_contexts,
|
|
98
|
+
has_ollama: true,
|
|
99
|
+
has_memory_daemon: true,
|
|
100
|
+
available_models: [this.config.memory.embedding_model],
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
try {
|
|
104
|
+
const resp = await fetch(`${this.workerConfig.primary_url}${PRIMARY_ROUTES.register}`, {
|
|
105
|
+
method: "POST",
|
|
106
|
+
headers: { "Content-Type": "application/json" },
|
|
107
|
+
body: JSON.stringify(registration),
|
|
108
|
+
});
|
|
109
|
+
if (!resp.ok) {
|
|
110
|
+
console.error(`[worker] Registration failed: ${resp.status} ${await resp.text()}`);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const result = (await resp.json());
|
|
114
|
+
this.registeredWorkerId = result.worker_id;
|
|
115
|
+
console.log(`[worker] Registered with Primary as ${result.worker_id}`);
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error("[worker] Could not reach Primary at", this.workerConfig.primary_url);
|
|
120
|
+
console.error("[worker] Will continue in standalone mode — retry registration manually");
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Start the task execution polling loop.
|
|
126
|
+
* Iterates assigned contexts and picks up tasks from each queue.
|
|
127
|
+
*/
|
|
128
|
+
startTaskLoop() {
|
|
129
|
+
this.taskPollTimer = setInterval(() => {
|
|
130
|
+
if (!this.running || this.executing)
|
|
131
|
+
return;
|
|
132
|
+
this.executeNextTask().catch((err) => {
|
|
133
|
+
console.error("[worker] Task execution error:", err.message);
|
|
134
|
+
});
|
|
135
|
+
}, this.workerConfig.task_poll_interval_ms);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Find and execute the next available task across all assigned contexts.
|
|
139
|
+
*/
|
|
140
|
+
async executeNextTask() {
|
|
141
|
+
const contexts = this.server.getAssignedContexts();
|
|
142
|
+
if (contexts.length === 0)
|
|
143
|
+
return;
|
|
144
|
+
for (const contextName of contexts) {
|
|
145
|
+
const engine = new TaskEngine({ contextName, memory: this.memory });
|
|
146
|
+
const task = await engine.getNextTask();
|
|
147
|
+
if (task) {
|
|
148
|
+
this.executing = true;
|
|
149
|
+
try {
|
|
150
|
+
// Update worker status
|
|
151
|
+
this.server.setActiveContext(contextName);
|
|
152
|
+
this.server.setCurrentTask(task.id);
|
|
153
|
+
console.log(`[worker] Executing task [${task.id.slice(0, 8)}] "${task.title}" in context "${contextName}"`);
|
|
154
|
+
// Mark task as active
|
|
155
|
+
await engine.startTask(task.id);
|
|
156
|
+
// Switch agent to the correct context
|
|
157
|
+
this.agent.setContext(contextName);
|
|
158
|
+
// Ensure context exists in memory daemon
|
|
159
|
+
try {
|
|
160
|
+
await this.memory.createContext(contextName);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Context may already exist
|
|
164
|
+
}
|
|
165
|
+
// Execute the task via the agent loop:
|
|
166
|
+
// - Agent queries memory for relevant episodes
|
|
167
|
+
// - Builds prompt with context + memories
|
|
168
|
+
// - Calls LLM for a response
|
|
169
|
+
// - Stores episodes (write-through to L2)
|
|
170
|
+
// - Triggers promotion if needed
|
|
171
|
+
const taskPrompt = buildTaskPrompt(task.title, task.description);
|
|
172
|
+
const response = await this.agent.processMessage(taskPrompt);
|
|
173
|
+
console.log(`[worker] Task [${task.id.slice(0, 8)}] completed. Response: ${response.content.slice(0, 100)}...`);
|
|
174
|
+
// Mark task as complete
|
|
175
|
+
await engine.completeTask(task.id);
|
|
176
|
+
// Report status to Primary
|
|
177
|
+
await this.reportStatus("working", contextName, task.id);
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
console.error(`[worker] Task [${task.id.slice(0, 8)}] failed:`, err.message);
|
|
181
|
+
await this.reportStatus("error", contextName, task.id, err.message);
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
this.executing = false;
|
|
185
|
+
this.server.setCurrentTask(null);
|
|
186
|
+
}
|
|
187
|
+
// Execute one task per poll cycle to stay responsive
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// No tasks found in any context — go idle
|
|
192
|
+
if (this.server.getAssignedContexts().length > 0) {
|
|
193
|
+
this.server.setActiveContext(null);
|
|
194
|
+
this.server.setCurrentTask(null);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Periodically report status back to Primary.
|
|
199
|
+
*/
|
|
200
|
+
startStatusReporting() {
|
|
201
|
+
this.statusReportTimer = setInterval(() => {
|
|
202
|
+
if (!this.running || !this.registeredWorkerId)
|
|
203
|
+
return;
|
|
204
|
+
const contexts = this.server.getAssignedContexts();
|
|
205
|
+
if (contexts.length === 0)
|
|
206
|
+
return;
|
|
207
|
+
this.reportStatus(this.executing ? "working" : "idle", this.executing ? contexts[0] : null, null).catch(() => { });
|
|
208
|
+
}, this.workerConfig.status_report_interval_ms);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Send a status report to the Primary.
|
|
212
|
+
*/
|
|
213
|
+
async reportStatus(activity, currentContext, currentTask, error) {
|
|
214
|
+
if (!this.registeredWorkerId)
|
|
215
|
+
return;
|
|
216
|
+
const report = {
|
|
217
|
+
activity,
|
|
218
|
+
current_context: currentContext,
|
|
219
|
+
current_task: currentTask,
|
|
220
|
+
error,
|
|
221
|
+
};
|
|
222
|
+
try {
|
|
223
|
+
const statusUrl = `${this.workerConfig.primary_url}${PRIMARY_ROUTES.status(this.registeredWorkerId)}`;
|
|
224
|
+
await fetch(statusUrl, {
|
|
225
|
+
method: "POST",
|
|
226
|
+
headers: { "Content-Type": "application/json" },
|
|
227
|
+
body: JSON.stringify(report),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Primary unreachable — non-fatal, will retry next interval
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// --- Accessors for testing ---
|
|
235
|
+
getServer() {
|
|
236
|
+
return this.server;
|
|
237
|
+
}
|
|
238
|
+
getAgent() {
|
|
239
|
+
return this.agent;
|
|
240
|
+
}
|
|
241
|
+
getMemoryClient() {
|
|
242
|
+
return this.memory;
|
|
243
|
+
}
|
|
244
|
+
isRunning() {
|
|
245
|
+
return this.running;
|
|
246
|
+
}
|
|
247
|
+
isExecuting() {
|
|
248
|
+
return this.executing;
|
|
249
|
+
}
|
|
250
|
+
getRegisteredWorkerId() {
|
|
251
|
+
return this.registeredWorkerId;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Build a prompt for executing a task via the agent.
|
|
256
|
+
*/
|
|
257
|
+
function buildTaskPrompt(title, description) {
|
|
258
|
+
let prompt = `[TASK] ${title}`;
|
|
259
|
+
if (description) {
|
|
260
|
+
prompt += `\n\n${description}`;
|
|
261
|
+
}
|
|
262
|
+
prompt += "\n\nPlease work on this task. Use your memory and knowledge to provide a thorough response.";
|
|
263
|
+
return prompt;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Start a worker from a config file path (convenience entry point).
|
|
267
|
+
*/
|
|
268
|
+
export async function startWorker(config) {
|
|
269
|
+
if (!config.worker || !config.worker.enabled) {
|
|
270
|
+
throw new Error("Worker mode is not enabled in config. Set [worker] enabled = true.");
|
|
271
|
+
}
|
|
272
|
+
const runtime = new WorkerRuntime({
|
|
273
|
+
config,
|
|
274
|
+
workerConfig: config.worker,
|
|
275
|
+
});
|
|
276
|
+
await runtime.start();
|
|
277
|
+
return runtime;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|