@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,88 @@
|
|
|
1
|
+
import type { MemoryConfig } from "./config.js";
|
|
2
|
+
export interface Episode {
|
|
3
|
+
id: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
context_name: string;
|
|
6
|
+
role: string;
|
|
7
|
+
content: string;
|
|
8
|
+
access_count?: number;
|
|
9
|
+
layer?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ScoredEpisode {
|
|
12
|
+
id: string;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
context_name: string;
|
|
15
|
+
role: string;
|
|
16
|
+
content: string;
|
|
17
|
+
score: number;
|
|
18
|
+
source_context?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface EpisodeInput {
|
|
21
|
+
context_name?: string;
|
|
22
|
+
role: string;
|
|
23
|
+
content: string;
|
|
24
|
+
}
|
|
25
|
+
export interface ContextInfo {
|
|
26
|
+
name: string;
|
|
27
|
+
description: string;
|
|
28
|
+
created_at: string;
|
|
29
|
+
episode_count: number;
|
|
30
|
+
}
|
|
31
|
+
export interface CrossContextResult {
|
|
32
|
+
context: string;
|
|
33
|
+
episodes: ScoredEpisode[];
|
|
34
|
+
}
|
|
35
|
+
export interface PromotionResult {
|
|
36
|
+
promoted_count: number;
|
|
37
|
+
episode_ids: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface TaskRecord {
|
|
40
|
+
id: string;
|
|
41
|
+
context_name: string;
|
|
42
|
+
title: string;
|
|
43
|
+
description: string;
|
|
44
|
+
status: "planned" | "active" | "complete" | "archived";
|
|
45
|
+
blocked_by: string[];
|
|
46
|
+
created_at: string;
|
|
47
|
+
updated_at: string;
|
|
48
|
+
}
|
|
49
|
+
export interface L3Entry {
|
|
50
|
+
id: string;
|
|
51
|
+
source_episode_id: string;
|
|
52
|
+
context_name: string;
|
|
53
|
+
content: string;
|
|
54
|
+
promoted_at: string;
|
|
55
|
+
access_count: number;
|
|
56
|
+
connection_density: number;
|
|
57
|
+
}
|
|
58
|
+
export interface TaskInput {
|
|
59
|
+
context_name: string;
|
|
60
|
+
title: string;
|
|
61
|
+
description: string;
|
|
62
|
+
status?: string;
|
|
63
|
+
blocked_by?: string[];
|
|
64
|
+
}
|
|
65
|
+
export declare class MemoryClient {
|
|
66
|
+
private baseUrl;
|
|
67
|
+
private topK;
|
|
68
|
+
constructor(config: MemoryConfig);
|
|
69
|
+
storeEpisode(input: EpisodeInput): Promise<Episode>;
|
|
70
|
+
search(query: string, context?: string, limit?: number): Promise<ScoredEpisode[]>;
|
|
71
|
+
getContext(name: string): Promise<Episode[]>;
|
|
72
|
+
createContext(name: string, description?: string): Promise<void>;
|
|
73
|
+
deleteContext(name: string): Promise<void>;
|
|
74
|
+
listContexts(): Promise<ContextInfo[]>;
|
|
75
|
+
searchCrossContext(query: string, limit?: number): Promise<CrossContextResult[]>;
|
|
76
|
+
shareEpisode(episodeId: string, targetContext: string): Promise<void>;
|
|
77
|
+
runPromotion(contextName?: string): Promise<PromotionResult>;
|
|
78
|
+
getL3Knowledge(contextName: string): Promise<L3Entry[]>;
|
|
79
|
+
setContextScoring(contextName: string, halfLifeHours: number): Promise<void>;
|
|
80
|
+
recordAccess(episodeId: string): Promise<void>;
|
|
81
|
+
recordCoAccess(episodeIds: string[]): Promise<void>;
|
|
82
|
+
createTask(input: TaskInput): Promise<TaskRecord>;
|
|
83
|
+
listTasks(contextName: string, status?: string): Promise<TaskRecord[]>;
|
|
84
|
+
updateTask(taskId: string, updates: Partial<Pick<TaskRecord, "status" | "title" | "description" | "blocked_by">>): Promise<TaskRecord>;
|
|
85
|
+
getNextTask(contextName: string): Promise<TaskRecord | null>;
|
|
86
|
+
healthCheck(): Promise<boolean>;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=memory-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-client.d.ts","sourceRoot":"","sources":["../src/memory-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
export class MemoryClient {
|
|
2
|
+
baseUrl;
|
|
3
|
+
topK;
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.baseUrl = config.daemon_url;
|
|
6
|
+
this.topK = config.top_k;
|
|
7
|
+
}
|
|
8
|
+
async storeEpisode(input) {
|
|
9
|
+
const resp = await fetch(`${this.baseUrl}/episodes`, {
|
|
10
|
+
method: "POST",
|
|
11
|
+
headers: { "Content-Type": "application/json" },
|
|
12
|
+
body: JSON.stringify(input),
|
|
13
|
+
});
|
|
14
|
+
if (!resp.ok) {
|
|
15
|
+
throw new Error(`Memory store failed: ${resp.status} ${await resp.text()}`);
|
|
16
|
+
}
|
|
17
|
+
return resp.json();
|
|
18
|
+
}
|
|
19
|
+
async search(query, context, limit) {
|
|
20
|
+
const params = new URLSearchParams({ q: query });
|
|
21
|
+
if (context)
|
|
22
|
+
params.set("context", context);
|
|
23
|
+
params.set("limit", String(limit ?? this.topK));
|
|
24
|
+
const resp = await fetch(`${this.baseUrl}/search?${params}`);
|
|
25
|
+
if (!resp.ok) {
|
|
26
|
+
throw new Error(`Memory search failed: ${resp.status} ${await resp.text()}`);
|
|
27
|
+
}
|
|
28
|
+
const data = (await resp.json());
|
|
29
|
+
return data.episodes;
|
|
30
|
+
}
|
|
31
|
+
async getContext(name) {
|
|
32
|
+
const resp = await fetch(`${this.baseUrl}/contexts/${encodeURIComponent(name)}`);
|
|
33
|
+
if (!resp.ok) {
|
|
34
|
+
throw new Error(`Get context failed: ${resp.status} ${await resp.text()}`);
|
|
35
|
+
}
|
|
36
|
+
return resp.json();
|
|
37
|
+
}
|
|
38
|
+
async createContext(name, description = "") {
|
|
39
|
+
const resp = await fetch(`${this.baseUrl}/contexts`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: { "Content-Type": "application/json" },
|
|
42
|
+
body: JSON.stringify({ name, description }),
|
|
43
|
+
});
|
|
44
|
+
if (!resp.ok) {
|
|
45
|
+
throw new Error(`Create context failed: ${resp.status} ${await resp.text()}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async deleteContext(name) {
|
|
49
|
+
const resp = await fetch(`${this.baseUrl}/contexts/${encodeURIComponent(name)}`, {
|
|
50
|
+
method: "DELETE",
|
|
51
|
+
});
|
|
52
|
+
if (!resp.ok) {
|
|
53
|
+
throw new Error(`Delete context failed: ${resp.status} ${await resp.text()}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async listContexts() {
|
|
57
|
+
const resp = await fetch(`${this.baseUrl}/contexts`);
|
|
58
|
+
if (!resp.ok) {
|
|
59
|
+
throw new Error(`List contexts failed: ${resp.status} ${await resp.text()}`);
|
|
60
|
+
}
|
|
61
|
+
const data = (await resp.json());
|
|
62
|
+
return data.contexts;
|
|
63
|
+
}
|
|
64
|
+
async searchCrossContext(query, limit) {
|
|
65
|
+
const params = new URLSearchParams({ q: query });
|
|
66
|
+
params.set("limit", String(limit ?? this.topK));
|
|
67
|
+
const resp = await fetch(`${this.baseUrl}/search/cross-context?${params}`);
|
|
68
|
+
if (!resp.ok) {
|
|
69
|
+
throw new Error(`Cross-context search failed: ${resp.status} ${await resp.text()}`);
|
|
70
|
+
}
|
|
71
|
+
const data = (await resp.json());
|
|
72
|
+
return data.results;
|
|
73
|
+
}
|
|
74
|
+
async shareEpisode(episodeId, targetContext) {
|
|
75
|
+
const resp = await fetch(`${this.baseUrl}/episodes/${encodeURIComponent(episodeId)}/share`, {
|
|
76
|
+
method: "POST",
|
|
77
|
+
headers: { "Content-Type": "application/json" },
|
|
78
|
+
body: JSON.stringify({ target_context: targetContext }),
|
|
79
|
+
});
|
|
80
|
+
if (!resp.ok) {
|
|
81
|
+
throw new Error(`Share episode failed: ${resp.status} ${await resp.text()}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async runPromotion(contextName) {
|
|
85
|
+
const params = new URLSearchParams();
|
|
86
|
+
if (contextName)
|
|
87
|
+
params.set("context", contextName);
|
|
88
|
+
const resp = await fetch(`${this.baseUrl}/promotion/run?${params}`, {
|
|
89
|
+
method: "POST",
|
|
90
|
+
});
|
|
91
|
+
if (!resp.ok) {
|
|
92
|
+
throw new Error(`Promotion failed: ${resp.status} ${await resp.text()}`);
|
|
93
|
+
}
|
|
94
|
+
return resp.json();
|
|
95
|
+
}
|
|
96
|
+
async getL3Knowledge(contextName) {
|
|
97
|
+
const resp = await fetch(`${this.baseUrl}/promotion/l3?context=${encodeURIComponent(contextName)}`);
|
|
98
|
+
if (!resp.ok) {
|
|
99
|
+
throw new Error(`Get L3 failed: ${resp.status} ${await resp.text()}`);
|
|
100
|
+
}
|
|
101
|
+
const data = (await resp.json());
|
|
102
|
+
return data.entries;
|
|
103
|
+
}
|
|
104
|
+
async setContextScoring(contextName, halfLifeHours) {
|
|
105
|
+
const resp = await fetch(`${this.baseUrl}/contexts/${encodeURIComponent(contextName)}/scoring`, {
|
|
106
|
+
method: "POST",
|
|
107
|
+
headers: { "Content-Type": "application/json" },
|
|
108
|
+
body: JSON.stringify({ half_life_hours: halfLifeHours }),
|
|
109
|
+
});
|
|
110
|
+
if (!resp.ok) {
|
|
111
|
+
throw new Error(`Set scoring failed: ${resp.status} ${await resp.text()}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async recordAccess(episodeId) {
|
|
115
|
+
const resp = await fetch(`${this.baseUrl}/episodes/${encodeURIComponent(episodeId)}/access`, {
|
|
116
|
+
method: "POST",
|
|
117
|
+
});
|
|
118
|
+
if (!resp.ok) {
|
|
119
|
+
throw new Error(`Record access failed: ${resp.status} ${await resp.text()}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async recordCoAccess(episodeIds) {
|
|
123
|
+
const resp = await fetch(`${this.baseUrl}/episodes/co-access`, {
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: { "Content-Type": "application/json" },
|
|
126
|
+
body: JSON.stringify({ episode_ids: episodeIds }),
|
|
127
|
+
});
|
|
128
|
+
if (!resp.ok) {
|
|
129
|
+
throw new Error(`Co-access failed: ${resp.status} ${await resp.text()}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Task engine methods
|
|
133
|
+
async createTask(input) {
|
|
134
|
+
const resp = await fetch(`${this.baseUrl}/tasks`, {
|
|
135
|
+
method: "POST",
|
|
136
|
+
headers: { "Content-Type": "application/json" },
|
|
137
|
+
body: JSON.stringify(input),
|
|
138
|
+
});
|
|
139
|
+
if (!resp.ok) {
|
|
140
|
+
throw new Error(`Create task failed: ${resp.status} ${await resp.text()}`);
|
|
141
|
+
}
|
|
142
|
+
return resp.json();
|
|
143
|
+
}
|
|
144
|
+
async listTasks(contextName, status) {
|
|
145
|
+
const params = new URLSearchParams({ context: contextName });
|
|
146
|
+
if (status)
|
|
147
|
+
params.set("status", status);
|
|
148
|
+
const resp = await fetch(`${this.baseUrl}/tasks?${params}`);
|
|
149
|
+
if (!resp.ok) {
|
|
150
|
+
throw new Error(`List tasks failed: ${resp.status} ${await resp.text()}`);
|
|
151
|
+
}
|
|
152
|
+
const data = (await resp.json());
|
|
153
|
+
return data.tasks;
|
|
154
|
+
}
|
|
155
|
+
async updateTask(taskId, updates) {
|
|
156
|
+
const resp = await fetch(`${this.baseUrl}/tasks/${encodeURIComponent(taskId)}`, {
|
|
157
|
+
method: "PATCH",
|
|
158
|
+
headers: { "Content-Type": "application/json" },
|
|
159
|
+
body: JSON.stringify(updates),
|
|
160
|
+
});
|
|
161
|
+
if (!resp.ok) {
|
|
162
|
+
throw new Error(`Update task failed: ${resp.status} ${await resp.text()}`);
|
|
163
|
+
}
|
|
164
|
+
return resp.json();
|
|
165
|
+
}
|
|
166
|
+
async getNextTask(contextName) {
|
|
167
|
+
const resp = await fetch(`${this.baseUrl}/tasks/next?context=${encodeURIComponent(contextName)}`);
|
|
168
|
+
if (!resp.ok) {
|
|
169
|
+
if (resp.status === 404)
|
|
170
|
+
return null;
|
|
171
|
+
throw new Error(`Get next task failed: ${resp.status} ${await resp.text()}`);
|
|
172
|
+
}
|
|
173
|
+
return resp.json();
|
|
174
|
+
}
|
|
175
|
+
async healthCheck() {
|
|
176
|
+
try {
|
|
177
|
+
const resp = await fetch(`${this.baseUrl}/health`);
|
|
178
|
+
return resp.ok;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=memory-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-client.js","sourceRoot":"","sources":["../src/memory-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrE"}
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Agent } from "./agent.js";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { SesameClient } from "./sesame.js";
|
|
4
|
+
import { MemoryClient } from "./memory-client.js";
|
|
5
|
+
export async function startPipeline(configPath) {
|
|
6
|
+
const config = loadConfig(configPath);
|
|
7
|
+
console.log(`[hivemind] Starting ${config.agent.name} (pid ${process.pid})`);
|
|
8
|
+
// Verify memory daemon is reachable
|
|
9
|
+
const memory = new MemoryClient(config.memory);
|
|
10
|
+
const memoryOk = await memory.healthCheck();
|
|
11
|
+
if (!memoryOk) {
|
|
12
|
+
console.warn("[hivemind] Memory daemon unreachable at", config.memory.daemon_url);
|
|
13
|
+
console.warn("[hivemind] Continuing without persistent memory — episodes will not be stored");
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.log("[hivemind] Memory daemon connected");
|
|
17
|
+
}
|
|
18
|
+
// Create the agent
|
|
19
|
+
const agent = new Agent(config);
|
|
20
|
+
console.log(`[hivemind] Context manager initialized (active: ${agent.getActiveContext()})`);
|
|
21
|
+
// Connect to Sesame if configured
|
|
22
|
+
if (config.sesame.api_key) {
|
|
23
|
+
await startSesameLoop(config, agent);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log("[hivemind] No Sesame API key configured — running in stdin mode");
|
|
27
|
+
await startStdinLoop(agent);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function startSesameLoop(config, agent) {
|
|
31
|
+
const sesame = new SesameClient(config.sesame);
|
|
32
|
+
// --- Graceful shutdown ---
|
|
33
|
+
let shuttingDown = false;
|
|
34
|
+
const shutdown = (signal) => {
|
|
35
|
+
if (shuttingDown)
|
|
36
|
+
return;
|
|
37
|
+
shuttingDown = true;
|
|
38
|
+
console.log(`\n[hivemind] Received ${signal}, shutting down...`);
|
|
39
|
+
try {
|
|
40
|
+
sesame.disconnect();
|
|
41
|
+
console.log("[hivemind] Sesame disconnected cleanly");
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.error("[hivemind] Error during disconnect:", err.message);
|
|
45
|
+
}
|
|
46
|
+
process.exit(0);
|
|
47
|
+
};
|
|
48
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
49
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
50
|
+
sesame.onMessage(async (msg) => {
|
|
51
|
+
if (shuttingDown)
|
|
52
|
+
return;
|
|
53
|
+
console.log(`[sesame] ${msg.author.handle} (${msg.channelKind}): ${msg.content}`);
|
|
54
|
+
try {
|
|
55
|
+
// Prepend sender info so the agent knows who's talking
|
|
56
|
+
const prefix = msg.channelKind === "group"
|
|
57
|
+
? `[${msg.author.handle} in group chat]: `
|
|
58
|
+
: `[${msg.author.handle}]: `;
|
|
59
|
+
const response = await agent.processMessage(prefix + msg.content);
|
|
60
|
+
// Agent chose not to respond (group chat etiquette)
|
|
61
|
+
if (response.content.trim() === "__SKIP__") {
|
|
62
|
+
console.log(`[sesame] ${config.agent.name}: skipped (${msg.author.handle} in ${msg.channelKind})`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const ctxPrefix = response.contextSwitched
|
|
66
|
+
? `[switched to ${response.context}] `
|
|
67
|
+
: "";
|
|
68
|
+
await sesame.sendMessage(msg.channelId, ctxPrefix + response.content);
|
|
69
|
+
console.log(`[sesame] ${config.agent.name} (${response.context}): ${response.content.slice(0, 100)}...`);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error("[sesame] Error processing message:", err.message);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
await sesame.connect();
|
|
76
|
+
console.log("[hivemind] Listening for Sesame messages");
|
|
77
|
+
// Keep alive
|
|
78
|
+
await new Promise(() => { });
|
|
79
|
+
}
|
|
80
|
+
async function startStdinLoop(agent) {
|
|
81
|
+
const readline = await import("readline");
|
|
82
|
+
const rl = readline.createInterface({
|
|
83
|
+
input: process.stdin,
|
|
84
|
+
output: process.stdout,
|
|
85
|
+
});
|
|
86
|
+
console.log("[hivemind] Ready. Type a message (Ctrl+C to exit)");
|
|
87
|
+
console.log("[hivemind] Commands: 'switch to <name>', 'list contexts', 'create context <name>'\n");
|
|
88
|
+
rl.on("line", async (line) => {
|
|
89
|
+
const input = line.trim();
|
|
90
|
+
if (!input)
|
|
91
|
+
return;
|
|
92
|
+
if (input.toLowerCase() === "list contexts") {
|
|
93
|
+
const contexts = agent.getContextManager().listContexts();
|
|
94
|
+
console.log("\nContexts:");
|
|
95
|
+
for (const ctx of contexts) {
|
|
96
|
+
const active = ctx.name === agent.getActiveContext() ? " (active)" : "";
|
|
97
|
+
console.log(` - ${ctx.name}${active}: ${ctx.description || "(no description)"}`);
|
|
98
|
+
}
|
|
99
|
+
console.log();
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const createMatch = input.match(/^create context (\S+)\s*(.*)?$/i);
|
|
103
|
+
if (createMatch) {
|
|
104
|
+
const name = createMatch[1];
|
|
105
|
+
const desc = createMatch[2] || "";
|
|
106
|
+
await agent.getContextManager().createContext(name, desc);
|
|
107
|
+
console.log(`\nCreated context: ${name}\n`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const response = await agent.processMessage(input);
|
|
112
|
+
if (response.contextSwitched) {
|
|
113
|
+
console.log(`\n[switched to context: ${response.context}]`);
|
|
114
|
+
}
|
|
115
|
+
console.log(`\n${response.content}\n`);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error("Error:", err.message);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
return new Promise((resolve) => {
|
|
122
|
+
rl.on("close", resolve);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/prompt.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AgentConfig } from "./config.js";
|
|
2
|
+
import type { ChatMessage } from "./llm-client.js";
|
|
3
|
+
import type { ScoredEpisode, L3Entry } from "./memory-client.js";
|
|
4
|
+
export declare function buildSystemPrompt(config: AgentConfig, episodes: ScoredEpisode[], contextName?: string, l3Knowledge?: L3Entry[]): string;
|
|
5
|
+
export declare function buildMessages(systemPrompt: string, conversationHistory: ChatMessage[], currentMessage: string): ChatMessage[];
|
|
6
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAajE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,SAAW,EACtB,WAAW,GAAE,OAAO,EAAO,GAC1B,MAAM,CA2CR;AAED,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,mBAAmB,EAAE,WAAW,EAAE,EAClC,cAAc,EAAE,MAAM,GACrB,WAAW,EAAE,CAMf"}
|
package/dist/prompt.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
// Cache loaded charter to avoid re-reading every message
|
|
3
|
+
let charterCache = null;
|
|
4
|
+
function loadCharter(path) {
|
|
5
|
+
if (charterCache && charterCache.path === path)
|
|
6
|
+
return charterCache.content;
|
|
7
|
+
if (!existsSync(path))
|
|
8
|
+
return "";
|
|
9
|
+
const content = readFileSync(path, "utf-8");
|
|
10
|
+
charterCache = { path, content };
|
|
11
|
+
return content;
|
|
12
|
+
}
|
|
13
|
+
export function buildSystemPrompt(config, episodes, contextName = "global", l3Knowledge = []) {
|
|
14
|
+
let prompt = `You are ${config.name}. ${config.personality}\n`;
|
|
15
|
+
// Load team charter if configured
|
|
16
|
+
if (config.team_charter) {
|
|
17
|
+
const charter = loadCharter(config.team_charter);
|
|
18
|
+
if (charter) {
|
|
19
|
+
prompt += `\n${charter}\n`;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
prompt += `
|
|
23
|
+
## Communication
|
|
24
|
+
Messages are prefixed with [sender_handle]: or [sender_handle in group chat]: to tell you who's talking.
|
|
25
|
+
In group chats, multiple people (humans and agents) may be present. Address them by name when relevant.
|
|
26
|
+
Don't repeat or quote these prefixes in your responses — just respond naturally.
|
|
27
|
+
If you decide not to respond to a group message, reply with exactly: __SKIP__
|
|
28
|
+
`;
|
|
29
|
+
if (contextName !== "global") {
|
|
30
|
+
prompt += `\n## Active Context: ${contextName}\nYou are currently working in the "${contextName}" project context.\n`;
|
|
31
|
+
}
|
|
32
|
+
// L3 semantic knowledge (higher-level patterns, decisions, architecture)
|
|
33
|
+
if (l3Knowledge.length > 0) {
|
|
34
|
+
prompt += "\n## Established Knowledge (learned patterns)\n\n";
|
|
35
|
+
for (const entry of l3Knowledge) {
|
|
36
|
+
prompt += `- ${entry.content}\n`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// L2 episodic memories (recent interactions)
|
|
40
|
+
if (episodes.length > 0) {
|
|
41
|
+
prompt += "\n## Relevant memories from previous conversations\n\n";
|
|
42
|
+
for (const ep of episodes) {
|
|
43
|
+
const timeAgo = formatTimeAgo(ep.timestamp);
|
|
44
|
+
const ctxLabel = ep.context_name !== contextName ? ` [from: ${ep.context_name}]` : "";
|
|
45
|
+
prompt += `[${timeAgo}]${ctxLabel} ${ep.role}: ${ep.content}\n`;
|
|
46
|
+
}
|
|
47
|
+
prompt += "\nUse these memories naturally — reference past conversations when relevant, but don't force it.\n";
|
|
48
|
+
}
|
|
49
|
+
return prompt;
|
|
50
|
+
}
|
|
51
|
+
export function buildMessages(systemPrompt, conversationHistory, currentMessage) {
|
|
52
|
+
return [
|
|
53
|
+
{ role: "system", content: systemPrompt },
|
|
54
|
+
...conversationHistory,
|
|
55
|
+
{ role: "user", content: currentMessage },
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
function formatTimeAgo(timestamp) {
|
|
59
|
+
const date = new Date(timestamp);
|
|
60
|
+
const now = new Date();
|
|
61
|
+
const diffMs = now.getTime() - date.getTime();
|
|
62
|
+
const diffMins = Math.floor(diffMs / 60_000);
|
|
63
|
+
const diffHours = Math.floor(diffMs / 3_600_000);
|
|
64
|
+
const diffDays = Math.floor(diffMs / 86_400_000);
|
|
65
|
+
if (diffMins < 1)
|
|
66
|
+
return "just now";
|
|
67
|
+
if (diffMins < 60)
|
|
68
|
+
return `${diffMins}m ago`;
|
|
69
|
+
if (diffHours < 24)
|
|
70
|
+
return `${diffHours}h ago`;
|
|
71
|
+
if (diffDays < 7)
|
|
72
|
+
return `${diffDays}d ago`;
|
|
73
|
+
return date.toLocaleDateString();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/sesame.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { SesameConfig } from "./config.js";
|
|
2
|
+
export interface SesameMessage {
|
|
3
|
+
id: string;
|
|
4
|
+
channelId: string;
|
|
5
|
+
channelKind: "dm" | "group" | "topic";
|
|
6
|
+
content: string;
|
|
7
|
+
author: {
|
|
8
|
+
id: string;
|
|
9
|
+
handle: string;
|
|
10
|
+
};
|
|
11
|
+
timestamp: string;
|
|
12
|
+
}
|
|
13
|
+
type MessageHandler = (message: SesameMessage) => void | Promise<void>;
|
|
14
|
+
interface ChannelInfo {
|
|
15
|
+
kind: "dm" | "group" | "topic";
|
|
16
|
+
name?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class SesameClient {
|
|
19
|
+
private config;
|
|
20
|
+
private sdk;
|
|
21
|
+
private messageHandler;
|
|
22
|
+
private agentId;
|
|
23
|
+
private channels;
|
|
24
|
+
constructor(config: SesameConfig);
|
|
25
|
+
onMessage(handler: MessageHandler): void;
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
sendMessage(channelId: string, content: string): Promise<void>;
|
|
28
|
+
getAgentId(): string | null;
|
|
29
|
+
getChannelInfo(channelId: string): ChannelInfo | undefined;
|
|
30
|
+
disconnect(): void;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=sesame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sesame.d.ts","sourceRoot":"","sources":["../src/sesame.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvE,UAAU,WAAW;IACnB,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAuC;gBAE3C,MAAM,EAAE,YAAY;IAShC,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIlC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCxB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1D,UAAU,IAAI,IAAI;CAGnB"}
|
package/dist/sesame.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { SesameClient as SesameSDK } from "@sesamespace/sdk";
|
|
2
|
+
export class SesameClient {
|
|
3
|
+
config;
|
|
4
|
+
sdk;
|
|
5
|
+
messageHandler = null;
|
|
6
|
+
agentId = null;
|
|
7
|
+
channels = new Map();
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.sdk = new SesameSDK({
|
|
11
|
+
apiUrl: config.api_url.replace(/\/api\/v1$/, ""),
|
|
12
|
+
wsUrl: config.ws_url,
|
|
13
|
+
apiKey: config.api_key,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
onMessage(handler) {
|
|
17
|
+
this.messageHandler = handler;
|
|
18
|
+
}
|
|
19
|
+
async connect() {
|
|
20
|
+
const manifest = await this.sdk.getManifest();
|
|
21
|
+
this.agentId = manifest.agent.id;
|
|
22
|
+
console.log(`[sesame] Authenticated as ${manifest.agent.handle} (${this.agentId})`);
|
|
23
|
+
// Cache channel info
|
|
24
|
+
for (const ch of manifest.channels) {
|
|
25
|
+
this.channels.set(ch.id, { kind: ch.kind, name: ch.name ?? undefined });
|
|
26
|
+
const label = ch.name || ch.id.slice(0, 8);
|
|
27
|
+
console.log(`[sesame] Channel: ${label} (${ch.kind})`);
|
|
28
|
+
}
|
|
29
|
+
// Listen for message events only
|
|
30
|
+
this.sdk.on("message", (event) => {
|
|
31
|
+
const msg = event.data || event.message || event;
|
|
32
|
+
const senderId = msg.senderId || msg.sender?.id;
|
|
33
|
+
// Ignore our own messages
|
|
34
|
+
if (senderId === this.agentId)
|
|
35
|
+
return;
|
|
36
|
+
if (!this.messageHandler || !msg.content)
|
|
37
|
+
return;
|
|
38
|
+
const channelInfo = this.channels.get(msg.channelId);
|
|
39
|
+
this.messageHandler({
|
|
40
|
+
id: msg.id || "unknown",
|
|
41
|
+
channelId: msg.channelId || "unknown",
|
|
42
|
+
channelKind: channelInfo?.kind || "dm",
|
|
43
|
+
content: msg.content,
|
|
44
|
+
author: {
|
|
45
|
+
id: senderId || "unknown",
|
|
46
|
+
handle: msg.senderHandle || msg.metadata?.senderHandle || "unknown",
|
|
47
|
+
},
|
|
48
|
+
timestamp: msg.createdAt || new Date().toISOString(),
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
await this.sdk.connect();
|
|
52
|
+
console.log("[sesame] WebSocket connected");
|
|
53
|
+
}
|
|
54
|
+
async sendMessage(channelId, content) {
|
|
55
|
+
await this.sdk.sendMessage(channelId, { content });
|
|
56
|
+
}
|
|
57
|
+
getAgentId() {
|
|
58
|
+
return this.agentId;
|
|
59
|
+
}
|
|
60
|
+
getChannelInfo(channelId) {
|
|
61
|
+
return this.channels.get(channelId);
|
|
62
|
+
}
|
|
63
|
+
disconnect() {
|
|
64
|
+
this.sdk.disconnect();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=sesame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sesame.js","sourceRoot":"","sources":["../src/sesame.ts"],"names":[],"mappings":"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"}
|
package/dist/start.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":""}
|