@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.
Files changed (110) hide show
  1. package/README.md +86 -0
  2. package/config/TEAM-CHARTER.md +87 -0
  3. package/config/default.toml +39 -0
  4. package/dist/__tests__/fleet-integration.test.d.ts +9 -0
  5. package/dist/__tests__/fleet-integration.test.d.ts.map +1 -0
  6. package/dist/__tests__/fleet-integration.test.js +201 -0
  7. package/dist/__tests__/fleet-integration.test.js.map +1 -0
  8. package/dist/__tests__/fleet.test.d.ts +7 -0
  9. package/dist/__tests__/fleet.test.d.ts.map +1 -0
  10. package/dist/__tests__/fleet.test.js +171 -0
  11. package/dist/__tests__/fleet.test.js.map +1 -0
  12. package/dist/__tests__/integration.test.d.ts +2 -0
  13. package/dist/__tests__/integration.test.d.ts.map +1 -0
  14. package/dist/__tests__/integration.test.js +348 -0
  15. package/dist/__tests__/integration.test.js.map +1 -0
  16. package/dist/agent.d.ts +27 -0
  17. package/dist/agent.d.ts.map +1 -0
  18. package/dist/agent.js +217 -0
  19. package/dist/agent.js.map +1 -0
  20. package/dist/commands/fleet.d.ts +13 -0
  21. package/dist/commands/fleet.d.ts.map +1 -0
  22. package/dist/commands/fleet.js +193 -0
  23. package/dist/commands/fleet.js.map +1 -0
  24. package/dist/commands/init.d.ts +2 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +170 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/start.d.ts +2 -0
  29. package/dist/commands/start.d.ts.map +1 -0
  30. package/dist/commands/start.js +39 -0
  31. package/dist/commands/start.js.map +1 -0
  32. package/dist/config.d.ts +44 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +73 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/context.d.ts +50 -0
  37. package/dist/context.d.ts.map +1 -0
  38. package/dist/context.js +153 -0
  39. package/dist/context.js.map +1 -0
  40. package/dist/fleet/fleet-manager.d.ts +86 -0
  41. package/dist/fleet/fleet-manager.d.ts.map +1 -0
  42. package/dist/fleet/fleet-manager.js +298 -0
  43. package/dist/fleet/fleet-manager.js.map +1 -0
  44. package/dist/fleet/memory-sync.d.ts +91 -0
  45. package/dist/fleet/memory-sync.d.ts.map +1 -0
  46. package/dist/fleet/memory-sync.js +292 -0
  47. package/dist/fleet/memory-sync.js.map +1 -0
  48. package/dist/fleet/primary-client.d.ts +49 -0
  49. package/dist/fleet/primary-client.d.ts.map +1 -0
  50. package/dist/fleet/primary-client.js +222 -0
  51. package/dist/fleet/primary-client.js.map +1 -0
  52. package/dist/fleet/worker-protocol.d.ts +125 -0
  53. package/dist/fleet/worker-protocol.d.ts.map +1 -0
  54. package/dist/fleet/worker-protocol.js +27 -0
  55. package/dist/fleet/worker-protocol.js.map +1 -0
  56. package/dist/fleet/worker-server.d.ts +53 -0
  57. package/dist/fleet/worker-server.d.ts.map +1 -0
  58. package/dist/fleet/worker-server.js +191 -0
  59. package/dist/fleet/worker-server.js.map +1 -0
  60. package/dist/index.d.ts +26 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +16 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/llm-client.d.ts +24 -0
  65. package/dist/llm-client.d.ts.map +1 -0
  66. package/dist/llm-client.js +40 -0
  67. package/dist/llm-client.js.map +1 -0
  68. package/dist/main.d.ts +3 -0
  69. package/dist/main.d.ts.map +1 -0
  70. package/dist/main.js +41 -0
  71. package/dist/main.js.map +1 -0
  72. package/dist/memory-client.d.ts +88 -0
  73. package/dist/memory-client.d.ts.map +1 -0
  74. package/dist/memory-client.js +185 -0
  75. package/dist/memory-client.js.map +1 -0
  76. package/dist/pipeline.d.ts +2 -0
  77. package/dist/pipeline.d.ts.map +1 -0
  78. package/dist/pipeline.js +125 -0
  79. package/dist/pipeline.js.map +1 -0
  80. package/dist/prompt.d.ts +6 -0
  81. package/dist/prompt.d.ts.map +1 -0
  82. package/dist/prompt.js +75 -0
  83. package/dist/prompt.js.map +1 -0
  84. package/dist/sesame.d.ts +33 -0
  85. package/dist/sesame.d.ts.map +1 -0
  86. package/dist/sesame.js +67 -0
  87. package/dist/sesame.js.map +1 -0
  88. package/dist/start.d.ts +3 -0
  89. package/dist/start.d.ts.map +1 -0
  90. package/dist/start.js +20 -0
  91. package/dist/start.js.map +1 -0
  92. package/dist/task-engine.d.ts +32 -0
  93. package/dist/task-engine.d.ts.map +1 -0
  94. package/dist/task-engine.js +80 -0
  95. package/dist/task-engine.js.map +1 -0
  96. package/dist/worker.d.ts +73 -0
  97. package/dist/worker.d.ts.map +1 -0
  98. package/dist/worker.js +279 -0
  99. package/dist/worker.js.map +1 -0
  100. package/install.sh +186 -0
  101. package/package.json +36 -0
  102. package/packages/memory/Cargo.lock +6480 -0
  103. package/packages/memory/Cargo.toml +21 -0
  104. package/packages/memory/src/src/context.rs +179 -0
  105. package/packages/memory/src/src/embeddings.rs +51 -0
  106. package/packages/memory/src/src/main.rs +626 -0
  107. package/packages/memory/src/src/promotion.rs +637 -0
  108. package/packages/memory/src/src/scoring.rs +131 -0
  109. package/packages/memory/src/src/store.rs +460 -0
  110. 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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"}
@@ -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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"}