aismemory 0.1.0 → 0.3.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 +1 -0
- package/dist/__tests__/auto-handoff.test.d.ts +1 -0
- package/dist/__tests__/auto-handoff.test.js +72 -0
- package/dist/__tests__/auto-handoff.test.js.map +1 -0
- package/dist/__tests__/cli-review.test.d.ts +1 -0
- package/dist/__tests__/cli-review.test.js +26 -0
- package/dist/__tests__/cli-review.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +1 -0
- package/dist/__tests__/config.test.js +54 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/hydration.test.d.ts +1 -0
- package/dist/__tests__/hydration.test.js +111 -0
- package/dist/__tests__/hydration.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +1 -0
- package/dist/__tests__/integration.test.js +36 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/local-claude-source.test.d.ts +1 -0
- package/dist/__tests__/local-claude-source.test.js +97 -0
- package/dist/__tests__/local-claude-source.test.js.map +1 -0
- package/dist/__tests__/local-mirror.test.d.ts +1 -0
- package/dist/__tests__/local-mirror.test.js +95 -0
- package/dist/__tests__/local-mirror.test.js.map +1 -0
- package/dist/__tests__/pipeline-ingestion.test.d.ts +1 -0
- package/dist/__tests__/pipeline-ingestion.test.js +161 -0
- package/dist/__tests__/pipeline-ingestion.test.js.map +1 -0
- package/dist/__tests__/pipeline-scope-resolver.test.d.ts +1 -0
- package/dist/__tests__/pipeline-scope-resolver.test.js +51 -0
- package/dist/__tests__/pipeline-scope-resolver.test.js.map +1 -0
- package/dist/__tests__/pipeline-trust-tagger.test.d.ts +1 -0
- package/dist/__tests__/pipeline-trust-tagger.test.js +24 -0
- package/dist/__tests__/pipeline-trust-tagger.test.js.map +1 -0
- package/dist/__tests__/prompt-resource.test.d.ts +1 -0
- package/dist/__tests__/prompt-resource.test.js +218 -0
- package/dist/__tests__/prompt-resource.test.js.map +1 -0
- package/dist/__tests__/read-claude-memory-tree.test.d.ts +1 -0
- package/dist/__tests__/read-claude-memory-tree.test.js +37 -0
- package/dist/__tests__/read-claude-memory-tree.test.js.map +1 -0
- package/dist/__tests__/refresh.test.d.ts +1 -0
- package/dist/__tests__/refresh.test.js +73 -0
- package/dist/__tests__/refresh.test.js.map +1 -0
- package/dist/__tests__/trust-ledger.test.d.ts +1 -0
- package/dist/__tests__/trust-ledger.test.js +55 -0
- package/dist/__tests__/trust-ledger.test.js.map +1 -0
- package/dist/auto-handoff.d.ts +15 -0
- package/dist/auto-handoff.js +53 -0
- package/dist/auto-handoff.js.map +1 -0
- package/dist/cli/read-claude-memory-tree.d.ts +7 -0
- package/dist/cli/read-claude-memory-tree.js +65 -0
- package/dist/cli/read-claude-memory-tree.js.map +1 -0
- package/dist/cli/sync-memory.d.ts +2 -0
- package/dist/cli/sync-memory.js +155 -0
- package/dist/cli/sync-memory.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +51 -0
- package/dist/config.js.map +1 -0
- package/dist/hydration.d.ts +2 -0
- package/dist/hydration.js +62 -0
- package/dist/hydration.js.map +1 -0
- package/dist/index.js +173 -11
- package/dist/index.js.map +1 -1
- package/dist/local-mirror.d.ts +15 -0
- package/dist/local-mirror.js +56 -0
- package/dist/local-mirror.js.map +1 -0
- package/dist/pipeline/dedupe.d.ts +11 -0
- package/dist/pipeline/dedupe.js +21 -0
- package/dist/pipeline/dedupe.js.map +1 -0
- package/dist/pipeline/ingestion.d.ts +56 -0
- package/dist/pipeline/ingestion.js +86 -0
- package/dist/pipeline/ingestion.js.map +1 -0
- package/dist/pipeline/scope-resolver.d.ts +15 -0
- package/dist/pipeline/scope-resolver.js +28 -0
- package/dist/pipeline/scope-resolver.js.map +1 -0
- package/dist/pipeline/trust-tagger.d.ts +10 -0
- package/dist/pipeline/trust-tagger.js +12 -0
- package/dist/pipeline/trust-tagger.js.map +1 -0
- package/dist/pipeline/types.d.ts +41 -0
- package/dist/pipeline/types.js +6 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/prompt-resource.d.ts +2 -0
- package/dist/prompt-resource.js +77 -0
- package/dist/prompt-resource.js.map +1 -0
- package/dist/refresh.d.ts +3 -0
- package/dist/refresh.js +25 -0
- package/dist/refresh.js.map +1 -0
- package/dist/review/cli-review.d.ts +10 -0
- package/dist/review/cli-review.js +47 -0
- package/dist/review/cli-review.js.map +1 -0
- package/dist/sources/local-claude.d.ts +11 -0
- package/dist/sources/local-claude.js +137 -0
- package/dist/sources/local-claude.js.map +1 -0
- package/dist/sources/types.d.ts +53 -0
- package/dist/sources/types.js +9 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/trust-ledger.d.ts +8 -0
- package/dist/trust-ledger.js +61 -0
- package/dist/trust-ledger.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +5 -3
package/dist/index.js
CHANGED
|
@@ -9,10 +9,14 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
11
11
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
12
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
+
import { CallToolRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
13
13
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
14
14
|
import { join } from 'path';
|
|
15
15
|
import { homedir } from 'os';
|
|
16
|
+
import { hydrateIdentity } from './hydration.js';
|
|
17
|
+
import { assemblePrompt } from './prompt-resource.js';
|
|
18
|
+
import { startRefreshTimer, stopRefreshTimer } from './refresh.js';
|
|
19
|
+
import { ActivityTracker, setupAutoHandoff } from './auto-handoff.js';
|
|
16
20
|
// ── Config ──────────────────────────────────────────────
|
|
17
21
|
const AIS_URL = process.env['AIS_URL'] ?? 'https://ais.agentsandswarms.ai';
|
|
18
22
|
const CREDS_DIR = join(homedir(), '.aismemory');
|
|
@@ -58,6 +62,78 @@ async function aisGet(path, token) {
|
|
|
58
62
|
});
|
|
59
63
|
return res.json();
|
|
60
64
|
}
|
|
65
|
+
async function resolveAgentForLoad(token, query) {
|
|
66
|
+
const resolveRes = (await aisGet(`/v1/resolve?query=${encodeURIComponent(query)}`, token));
|
|
67
|
+
if (resolveRes.data?.status === 'resolved' && resolveRes.data.agent) {
|
|
68
|
+
return resolveRes.data.agent;
|
|
69
|
+
}
|
|
70
|
+
if (resolveRes.data?.status === 'ambiguous') {
|
|
71
|
+
const ids = resolveRes.data.matches?.map((ag) => ag.id).join(', ') ?? '(none)';
|
|
72
|
+
throw new Error(resolveRes.data.message ?? `agent_load: multiple agents match "${query}" (ids: ${ids}). Use an agent id to disambiguate.`);
|
|
73
|
+
}
|
|
74
|
+
if (resolveRes.data?.status === 'not_found') {
|
|
75
|
+
const available = resolveRes.data.available?.map((ag) => ag.name).join(', ');
|
|
76
|
+
throw new Error(resolveRes.data.message ?? `agent_load: no agent named "${query}" in this tenant. Available: ${available || '(none)'}`);
|
|
77
|
+
}
|
|
78
|
+
const listRes = (await aisGet('/v1/agents', token));
|
|
79
|
+
const agents = listRes.data?.agents ?? [];
|
|
80
|
+
const matches = agents.filter((ag) => ag.name.toLowerCase() === query.toLowerCase() || ag.id === query);
|
|
81
|
+
if (matches.length === 0) {
|
|
82
|
+
const available = agents.map((ag) => ag.name).join(', ');
|
|
83
|
+
throw new Error(`agent_load: no agent named "${query}" in this tenant. Available: ${available || '(none)'}`);
|
|
84
|
+
}
|
|
85
|
+
if (matches.length > 1) {
|
|
86
|
+
throw new Error(`agent_load: multiple agents match "${query}" (ids: ${matches
|
|
87
|
+
.map((ag) => ag.id)
|
|
88
|
+
.join(', ')}). Use an agent id to disambiguate.`);
|
|
89
|
+
}
|
|
90
|
+
return matches[0];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* After authenticating, check if the user already has agents.
|
|
94
|
+
* If so, use the first active one instead of the newly-created provisional agent.
|
|
95
|
+
* User can override with AIS_AGENT_ID or AIS_AGENT_NAME env vars.
|
|
96
|
+
*/
|
|
97
|
+
async function resolveAgent(token, fallbackAgentId, fallbackTenantId) {
|
|
98
|
+
// Explicit env var overrides everything
|
|
99
|
+
const envAgentId = process.env['AIS_AGENT_ID'];
|
|
100
|
+
if (envAgentId) {
|
|
101
|
+
stderr(`Using agent from AIS_AGENT_ID: ${envAgentId}`);
|
|
102
|
+
return { agentId: envAgentId, tenantId: fallbackTenantId };
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const res = await aisGet('/v1/agents', token);
|
|
106
|
+
const agents = res.data?.agents?.filter((a) => a.status === 'active') ?? [];
|
|
107
|
+
if (agents.length === 0) {
|
|
108
|
+
stderr(`No existing agents found. Using new agent: ${fallbackAgentId}`);
|
|
109
|
+
return { agentId: fallbackAgentId, tenantId: fallbackTenantId };
|
|
110
|
+
}
|
|
111
|
+
// Check for name match via AIS_AGENT_NAME
|
|
112
|
+
const envName = process.env['AIS_AGENT_NAME'];
|
|
113
|
+
if (envName) {
|
|
114
|
+
const match = agents.find((a) => a.name.toLowerCase() === envName.toLowerCase());
|
|
115
|
+
if (match) {
|
|
116
|
+
stderr(`Using agent "${match.name}" (matched AIS_AGENT_NAME)`);
|
|
117
|
+
return { agentId: match.id, tenantId: fallbackTenantId };
|
|
118
|
+
}
|
|
119
|
+
stderr(`Warning: AIS_AGENT_NAME="${envName}" not found. Available: ${agents.map((a) => a.name).join(', ')}`);
|
|
120
|
+
}
|
|
121
|
+
// Use the first existing agent
|
|
122
|
+
const chosen = agents[0];
|
|
123
|
+
stderr(`Connected to existing agent "${chosen.name}" (${chosen.id})`);
|
|
124
|
+
if (agents.length > 1) {
|
|
125
|
+
stderr(`You have ${agents.length} agents. Set AIS_AGENT_NAME to choose a different one:`);
|
|
126
|
+
for (const a of agents) {
|
|
127
|
+
stderr(` - ${a.name}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return { agentId: chosen.id, tenantId: fallbackTenantId };
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
stderr(`Could not list agents. Using new agent: ${fallbackAgentId}`);
|
|
134
|
+
return { agentId: fallbackAgentId, tenantId: fallbackTenantId };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
61
137
|
async function authenticate() {
|
|
62
138
|
stderr('Starting authentication...');
|
|
63
139
|
const authRes = await aisPost('/v1/oauth/device/authorize', {
|
|
@@ -66,13 +142,26 @@ async function authenticate() {
|
|
|
66
142
|
if (!authRes.success || !authRes.data) {
|
|
67
143
|
throw new Error(`Authentication failed: ${authRes.error?.message ?? 'Unknown error'}`);
|
|
68
144
|
}
|
|
69
|
-
const { device_code, user_code,
|
|
145
|
+
const { device_code, user_code, verification_uri_complete, interval, agent_id, provisional_tenant_id } = authRes.data;
|
|
146
|
+
stderr('');
|
|
147
|
+
stderr('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
148
|
+
stderr(' aismemory — memory bond required');
|
|
149
|
+
stderr('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
70
150
|
stderr('');
|
|
71
|
-
stderr(
|
|
72
|
-
stderr(`
|
|
73
|
-
stderr(`Or go to ${verification_uri} and enter code: ${user_code}`);
|
|
74
|
-
stderr('Waiting for approval...');
|
|
151
|
+
stderr(` Bond URL : ${verification_uri_complete}`);
|
|
152
|
+
stderr(` Code : ${user_code}`);
|
|
75
153
|
stderr('');
|
|
154
|
+
stderr('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
155
|
+
stderr('');
|
|
156
|
+
stderr('[ AGENT INSTRUCTION ]');
|
|
157
|
+
stderr('Share the bond URL with the user in the chat — do NOT ask');
|
|
158
|
+
stderr('them to look in their terminal or config files.');
|
|
159
|
+
stderr('');
|
|
160
|
+
stderr('Suggested message to send the user:');
|
|
161
|
+
stderr(` "To connect your memory, please click: ${verification_uri_complete}"`);
|
|
162
|
+
stderr(' "It takes about 30 seconds — enter your email and tap Approve."');
|
|
163
|
+
stderr('');
|
|
164
|
+
stderr('Waiting for user approval...');
|
|
76
165
|
// Poll for token
|
|
77
166
|
const pollInterval = Math.max(interval, 5) * 1000;
|
|
78
167
|
const deadline = Date.now() + 30 * 60 * 1000; // 30 min
|
|
@@ -81,10 +170,12 @@ async function authenticate() {
|
|
|
81
170
|
const pollRes = await aisPost('/v1/oauth/token', { device_code });
|
|
82
171
|
if (pollRes.access_token) {
|
|
83
172
|
const expiresAt = new Date(Date.now() + (pollRes.expires_in ?? 604800) * 1000).toISOString();
|
|
173
|
+
// Resolve to an existing agent if available
|
|
174
|
+
const { agentId, tenantId } = await resolveAgent(pollRes.access_token, agent_id, provisional_tenant_id);
|
|
84
175
|
const creds = {
|
|
85
176
|
token: pollRes.access_token,
|
|
86
|
-
agentId
|
|
87
|
-
tenantId
|
|
177
|
+
agentId,
|
|
178
|
+
tenantId,
|
|
88
179
|
expiresAt,
|
|
89
180
|
};
|
|
90
181
|
saveCredentials(creds);
|
|
@@ -104,6 +195,8 @@ async function authenticate() {
|
|
|
104
195
|
}
|
|
105
196
|
throw new Error('Authentication timed out');
|
|
106
197
|
}
|
|
198
|
+
let agentContext = null;
|
|
199
|
+
const activityTracker = new ActivityTracker();
|
|
107
200
|
// ── MCP Tool definitions ────────────────────────────────
|
|
108
201
|
const tools = [
|
|
109
202
|
{
|
|
@@ -158,6 +251,21 @@ const tools = [
|
|
|
158
251
|
},
|
|
159
252
|
},
|
|
160
253
|
},
|
|
254
|
+
{
|
|
255
|
+
name: 'agent_load',
|
|
256
|
+
description: 'Load an AIS agent by name for the rest of the session — switches the active agent so subsequent calls to remember, recall, whoami, full_context use the loaded agent. ' +
|
|
257
|
+
'CALL THIS when the user says "get me <name>", "bring me <name>", "load <name>", "/agent <name>", or "switch to <name>" — those idioms mean "load that agent\'s context and adopt its identity."',
|
|
258
|
+
inputSchema: {
|
|
259
|
+
type: 'object',
|
|
260
|
+
properties: {
|
|
261
|
+
query: {
|
|
262
|
+
type: 'string',
|
|
263
|
+
description: 'Agent name to look up (e.g., "Corbot", "Data", "code-assistant")',
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
required: ['query'],
|
|
267
|
+
},
|
|
268
|
+
},
|
|
161
269
|
];
|
|
162
270
|
// ── MCP Server ──────────────────────────────────────────
|
|
163
271
|
async function main() {
|
|
@@ -169,13 +277,34 @@ async function main() {
|
|
|
169
277
|
else {
|
|
170
278
|
stderr(`Authenticated as agent ${creds.agentId}`);
|
|
171
279
|
}
|
|
172
|
-
const { token
|
|
280
|
+
const { token } = creds;
|
|
281
|
+
// Mutable so `agent_load` can switch the session to a different agent.
|
|
282
|
+
let agentId = creds.agentId;
|
|
283
|
+
agentContext = await hydrateIdentity(AIS_URL, agentId, token);
|
|
284
|
+
if (agentContext) {
|
|
285
|
+
stderr(`Agent loaded: ${agentContext.identity.name} (${agentContext.recentMemories.length} memories, ${agentContext.goals.length} goals)`);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
stderr('Agent identity not loaded — tools work, but no identity prompt');
|
|
289
|
+
}
|
|
173
290
|
// Create MCP server
|
|
174
|
-
const server = new Server({ name: 'aismemory', version: '0.
|
|
291
|
+
const server = new Server({ name: 'aismemory', version: '0.2.0' }, { capabilities: { tools: {}, prompts: {} } });
|
|
175
292
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
293
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
294
|
+
prompts: agentContext
|
|
295
|
+
? [{ name: 'agent-identity', description: 'Active AIS agent identity, personality, and context' }]
|
|
296
|
+
: [],
|
|
297
|
+
}));
|
|
298
|
+
server.setRequestHandler(GetPromptRequestSchema, async () => ({
|
|
299
|
+
messages: [{
|
|
300
|
+
role: 'user',
|
|
301
|
+
content: { type: 'text', text: assemblePrompt(agentContext) },
|
|
302
|
+
}],
|
|
303
|
+
}));
|
|
176
304
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
177
305
|
const { name, arguments: args } = request.params;
|
|
178
306
|
const a = (args ?? {});
|
|
307
|
+
activityTracker.recordToolUse(name);
|
|
179
308
|
try {
|
|
180
309
|
let result;
|
|
181
310
|
switch (name) {
|
|
@@ -185,6 +314,7 @@ async function main() {
|
|
|
185
314
|
type: a['type'] ?? 'context',
|
|
186
315
|
importance: a['importance'] ?? 0.5,
|
|
187
316
|
}, token);
|
|
317
|
+
activityTracker.recordMemoryStored(String(a['content'] ?? ''));
|
|
188
318
|
break;
|
|
189
319
|
case 'recall': {
|
|
190
320
|
const params = new URLSearchParams();
|
|
@@ -212,6 +342,27 @@ async function main() {
|
|
|
212
342
|
keyLearnings: a['keyLearnings'] ?? [],
|
|
213
343
|
}, token);
|
|
214
344
|
break;
|
|
345
|
+
case 'agent_load': {
|
|
346
|
+
const query = String(a['query'] ?? '').trim();
|
|
347
|
+
if (!query) {
|
|
348
|
+
throw new Error('agent_load: query is required');
|
|
349
|
+
}
|
|
350
|
+
const target = await resolveAgentForLoad(token, query);
|
|
351
|
+
agentId = target.id;
|
|
352
|
+
agentContext = await hydrateIdentity(AIS_URL, agentId, token);
|
|
353
|
+
server.notification({ method: 'notifications/prompts/list_changed' });
|
|
354
|
+
stderr(`agent_load: switched to "${target.name}" (${target.id})`);
|
|
355
|
+
result = {
|
|
356
|
+
success: true,
|
|
357
|
+
agentId: target.id,
|
|
358
|
+
name: target.name,
|
|
359
|
+
did: agentContext?.identity.did ?? null,
|
|
360
|
+
status: target.status,
|
|
361
|
+
memoriesLoaded: agentContext?.recentMemories.length ?? 0,
|
|
362
|
+
goalsLoaded: agentContext?.goals.length ?? 0,
|
|
363
|
+
};
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
215
366
|
default:
|
|
216
367
|
return {
|
|
217
368
|
content: [{ type: 'text', text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
|
|
@@ -231,7 +382,18 @@ async function main() {
|
|
|
231
382
|
});
|
|
232
383
|
const transport = new StdioServerTransport();
|
|
233
384
|
await server.connect(transport);
|
|
234
|
-
|
|
385
|
+
startRefreshTimer(AIS_URL, agentId, token, (memories) => {
|
|
386
|
+
if (agentContext) {
|
|
387
|
+
agentContext.recentMemories = memories;
|
|
388
|
+
}
|
|
389
|
+
server.notification({ method: 'notifications/prompts/list_changed' });
|
|
390
|
+
stderr(`Memory refresh: ${memories.length} memories`);
|
|
391
|
+
});
|
|
392
|
+
setupAutoHandoff(AIS_URL, agentId, token, activityTracker, () => {
|
|
393
|
+
stopRefreshTimer();
|
|
394
|
+
stderr('Session handoff saved');
|
|
395
|
+
});
|
|
396
|
+
stderr(`MCP server running. Tools: ${tools.map((t) => t.name).join(', ')}`);
|
|
235
397
|
}
|
|
236
398
|
main().catch((error) => {
|
|
237
399
|
stderr(`Fatal: ${error instanceof Error ? error.message : String(error)}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AisMemoryDraft } from './pipeline/types.js';
|
|
2
|
+
export interface MirrorEntry {
|
|
3
|
+
aisMemoryId: string;
|
|
4
|
+
memory: AisMemoryDraft;
|
|
5
|
+
}
|
|
6
|
+
export declare class LocalMirror {
|
|
7
|
+
private readonly home;
|
|
8
|
+
private readonly retentionDays;
|
|
9
|
+
private readonly cacheDir;
|
|
10
|
+
constructor(home?: string, retentionDays?: number);
|
|
11
|
+
append(agentId: string, entries: MirrorEntry[]): void;
|
|
12
|
+
cleanup(agentId: string): void;
|
|
13
|
+
scrub(agentId: string): void;
|
|
14
|
+
private pathFor;
|
|
15
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync, renameSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
export class LocalMirror {
|
|
5
|
+
home;
|
|
6
|
+
retentionDays;
|
|
7
|
+
cacheDir;
|
|
8
|
+
constructor(home = homedir(), retentionDays = 30) {
|
|
9
|
+
this.home = home;
|
|
10
|
+
this.retentionDays = retentionDays;
|
|
11
|
+
this.cacheDir = join(home, '.aismemory', 'cache');
|
|
12
|
+
if (!existsSync(this.cacheDir)) {
|
|
13
|
+
mkdirSync(this.cacheDir, { recursive: true, mode: 0o700 });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
append(agentId, entries) {
|
|
17
|
+
const filePath = this.pathFor(agentId);
|
|
18
|
+
const lines = entries
|
|
19
|
+
.map((e) => {
|
|
20
|
+
const stored = { ...e, importedAt: e.memory.provenance.importedAt };
|
|
21
|
+
return JSON.stringify(stored);
|
|
22
|
+
})
|
|
23
|
+
.join('\n') + '\n';
|
|
24
|
+
appendFileSync(filePath, lines, { mode: 0o600 });
|
|
25
|
+
}
|
|
26
|
+
cleanup(agentId) {
|
|
27
|
+
const filePath = this.pathFor(agentId);
|
|
28
|
+
if (!existsSync(filePath))
|
|
29
|
+
return;
|
|
30
|
+
const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000;
|
|
31
|
+
const lines = readFileSync(filePath, 'utf8')
|
|
32
|
+
.split('\n')
|
|
33
|
+
.filter((l) => l.length > 0);
|
|
34
|
+
const surviving = lines.filter((line) => {
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(line);
|
|
37
|
+
return new Date(parsed.importedAt).getTime() >= cutoff;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const tmp = `${filePath}.tmp`;
|
|
44
|
+
writeFileSync(tmp, surviving.join('\n') + (surviving.length > 0 ? '\n' : ''), { mode: 0o600 });
|
|
45
|
+
renameSync(tmp, filePath);
|
|
46
|
+
}
|
|
47
|
+
scrub(agentId) {
|
|
48
|
+
const filePath = this.pathFor(agentId);
|
|
49
|
+
if (existsSync(filePath))
|
|
50
|
+
unlinkSync(filePath);
|
|
51
|
+
}
|
|
52
|
+
pathFor(agentId) {
|
|
53
|
+
return join(this.cacheDir, `${agentId}.jsonl`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=local-mirror.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-mirror.js","sourceRoot":"","sources":["../src/local-mirror.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AisMemoryDraft } from './types.js';
|
|
2
|
+
export interface DedupeResult {
|
|
3
|
+
keep: AisMemoryDraft[];
|
|
4
|
+
skippedExactDupes: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Exact-dupe filtering by provenance.sourceHash. Near-dupe detection via
|
|
8
|
+
* embeddings happens in the review UI layer, not here — this stage only
|
|
9
|
+
* prevents identical re-imports.
|
|
10
|
+
*/
|
|
11
|
+
export declare function preCommitDedupe(drafts: AisMemoryDraft[], existingHashes: ReadonlySet<string>): DedupeResult;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact-dupe filtering by provenance.sourceHash. Near-dupe detection via
|
|
3
|
+
* embeddings happens in the review UI layer, not here — this stage only
|
|
4
|
+
* prevents identical re-imports.
|
|
5
|
+
*/
|
|
6
|
+
export function preCommitDedupe(drafts, existingHashes) {
|
|
7
|
+
const seenHashes = new Set();
|
|
8
|
+
const keep = [];
|
|
9
|
+
let skipped = 0;
|
|
10
|
+
for (const draft of drafts) {
|
|
11
|
+
const hash = draft.provenance.sourceHash;
|
|
12
|
+
if (existingHashes.has(hash) || seenHashes.has(hash)) {
|
|
13
|
+
skipped += 1;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
seenHashes.add(hash);
|
|
17
|
+
keep.push(draft);
|
|
18
|
+
}
|
|
19
|
+
return { keep, skippedExactDupes: skipped };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=dedupe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe.js","sourceRoot":"","sources":["../../src/pipeline/dedupe.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAwB,EACxB,cAAmC;IAEnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QACzC,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { SourceAdapter, FilesystemResult } from '../sources/types.js';
|
|
2
|
+
import type { SyncScope, AisMemoryDraft, SyncResult } from './types.js';
|
|
3
|
+
import type { SyncConfig } from '../config.js';
|
|
4
|
+
import type { TrustLedger } from '../trust-ledger.js';
|
|
5
|
+
import type { LocalMirror } from '../local-mirror.js';
|
|
6
|
+
export interface BulkStoreResult {
|
|
7
|
+
created: Array<{
|
|
8
|
+
index: number;
|
|
9
|
+
id: string;
|
|
10
|
+
}>;
|
|
11
|
+
failed: Array<{
|
|
12
|
+
index: number;
|
|
13
|
+
error: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export type BulkStoreFn = (drafts: AisMemoryDraft[]) => Promise<BulkStoreResult>;
|
|
17
|
+
export type ReviewFn = (drafts: AisMemoryDraft[]) => Promise<AisMemoryDraft[]>;
|
|
18
|
+
export interface IngestionOptions {
|
|
19
|
+
adapter: SourceAdapter;
|
|
20
|
+
rawSourceData: string | FilesystemResult;
|
|
21
|
+
scope: SyncScope;
|
|
22
|
+
agentId: string;
|
|
23
|
+
config: SyncConfig;
|
|
24
|
+
ledger: TrustLedger;
|
|
25
|
+
mirror: LocalMirror;
|
|
26
|
+
existingHashes: ReadonlySet<string>;
|
|
27
|
+
bulkStore: BulkStoreFn;
|
|
28
|
+
review: ReviewFn;
|
|
29
|
+
defaultTrustScore?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Run the full ingestion pipeline for a single source adapter + scope pair.
|
|
33
|
+
*
|
|
34
|
+
* Pipeline order:
|
|
35
|
+
* 1. Parse raw source data via `adapter.parseResponse`.
|
|
36
|
+
* 2. Map to AIS drafts and apply trust tags.
|
|
37
|
+
* 3. Pre-commit deduplicate against `existingHashes`.
|
|
38
|
+
* 4. Offer non-auto-commit batches to `review` for user approval.
|
|
39
|
+
* 5. Bulk-store approved drafts in AIS via `bulkStore`.
|
|
40
|
+
* 6. Advance the trust ledger (`ledger.recordSync`).
|
|
41
|
+
* 7. Append entries to the local mirror.
|
|
42
|
+
*
|
|
43
|
+
* Failure semantics:
|
|
44
|
+
* - If `bulkStore` throws, neither ledger nor mirror is updated — the caller
|
|
45
|
+
* may safely retry the entire run without double-counting.
|
|
46
|
+
* - If `mirror.append` throws after a successful `bulkStore`, the ledger has
|
|
47
|
+
* already been advanced (AIS accepted the memories) and the failure is
|
|
48
|
+
* surfaced as a `warnings` entry rather than an exception so the caller
|
|
49
|
+
* receives a valid `SyncResult`.
|
|
50
|
+
*
|
|
51
|
+
* Zero-import path:
|
|
52
|
+
* - When all candidates are dedupe-skipped or rejected by `review`,
|
|
53
|
+
* `ledger.recordSync` is still called so the `syncCount` advances and the
|
|
54
|
+
* trust ladder progresses toward auto-commit on future syncs.
|
|
55
|
+
*/
|
|
56
|
+
export declare function runIngestion(options: IngestionOptions): Promise<SyncResult>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { preCommitDedupe } from './dedupe.js';
|
|
2
|
+
import { applyTrustTags } from './trust-tagger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Run the full ingestion pipeline for a single source adapter + scope pair.
|
|
5
|
+
*
|
|
6
|
+
* Pipeline order:
|
|
7
|
+
* 1. Parse raw source data via `adapter.parseResponse`.
|
|
8
|
+
* 2. Map to AIS drafts and apply trust tags.
|
|
9
|
+
* 3. Pre-commit deduplicate against `existingHashes`.
|
|
10
|
+
* 4. Offer non-auto-commit batches to `review` for user approval.
|
|
11
|
+
* 5. Bulk-store approved drafts in AIS via `bulkStore`.
|
|
12
|
+
* 6. Advance the trust ledger (`ledger.recordSync`).
|
|
13
|
+
* 7. Append entries to the local mirror.
|
|
14
|
+
*
|
|
15
|
+
* Failure semantics:
|
|
16
|
+
* - If `bulkStore` throws, neither ledger nor mirror is updated — the caller
|
|
17
|
+
* may safely retry the entire run without double-counting.
|
|
18
|
+
* - If `mirror.append` throws after a successful `bulkStore`, the ledger has
|
|
19
|
+
* already been advanced (AIS accepted the memories) and the failure is
|
|
20
|
+
* surfaced as a `warnings` entry rather than an exception so the caller
|
|
21
|
+
* receives a valid `SyncResult`.
|
|
22
|
+
*
|
|
23
|
+
* Zero-import path:
|
|
24
|
+
* - When all candidates are dedupe-skipped or rejected by `review`,
|
|
25
|
+
* `ledger.recordSync` is still called so the `syncCount` advances and the
|
|
26
|
+
* trust ladder progresses toward auto-commit on future syncs.
|
|
27
|
+
*/
|
|
28
|
+
export async function runIngestion(options) {
|
|
29
|
+
const { adapter, rawSourceData, scope, agentId, config, ledger, mirror, existingHashes, bulkStore, review, } = options;
|
|
30
|
+
const defaultTrustScore = options.defaultTrustScore ?? 0.5;
|
|
31
|
+
const parsed = adapter.parseResponse(rawSourceData);
|
|
32
|
+
const candidateDrafts = parsed.memories.map((src) => adapter.mapToAis(src, scope, agentId));
|
|
33
|
+
const taggedDrafts = applyTrustTags(candidateDrafts, { defaultTrustScore });
|
|
34
|
+
const { keep: afterDedupe, skippedExactDupes } = preCommitDedupe(taggedDrafts, existingHashes);
|
|
35
|
+
const scopeKey = scopeToKey(scope);
|
|
36
|
+
const shouldAutoCommit = config.autoCommit(adapter.id) || ledger.isTrusted(agentId, adapter.id, scopeKey);
|
|
37
|
+
const approved = shouldAutoCommit ? afterDedupe : await review(afterDedupe);
|
|
38
|
+
const skippedByUser = afterDedupe.length - approved.length;
|
|
39
|
+
if (approved.length === 0) {
|
|
40
|
+
ledger.recordSync(agentId, adapter.id, scopeKey);
|
|
41
|
+
return {
|
|
42
|
+
imported: 0,
|
|
43
|
+
skippedExactDupes,
|
|
44
|
+
skippedByUser,
|
|
45
|
+
warnings: parsed.warnings,
|
|
46
|
+
memoryIds: [],
|
|
47
|
+
failed: [],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const storeResult = await bulkStore(approved);
|
|
51
|
+
// Advance the trust ledger FIRST — if AIS accepted the memories, the
|
|
52
|
+
// trust ladder must reflect that regardless of local-mirror success.
|
|
53
|
+
ledger.recordSync(agentId, adapter.id, scopeKey);
|
|
54
|
+
const mirrorEntries = storeResult.created.map((c) => ({
|
|
55
|
+
aisMemoryId: c.id,
|
|
56
|
+
memory: approved[c.index],
|
|
57
|
+
}));
|
|
58
|
+
const mirrorWarnings = [];
|
|
59
|
+
try {
|
|
60
|
+
mirror.append(agentId, mirrorEntries);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
64
|
+
mirrorWarnings.push(`local mirror append failed: ${msg}`);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
imported: storeResult.created.length,
|
|
68
|
+
skippedExactDupes,
|
|
69
|
+
skippedByUser,
|
|
70
|
+
warnings: [...parsed.warnings, ...mirrorWarnings],
|
|
71
|
+
memoryIds: storeResult.created.map((c) => c.id),
|
|
72
|
+
failed: storeResult.failed,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function scopeToKey(scope) {
|
|
76
|
+
// Stable multi-field encoding prevents collisions when optional fields
|
|
77
|
+
// are absent. Pipe separator is safe because none of the component
|
|
78
|
+
// values may contain it in practice (enforced by call sites).
|
|
79
|
+
return [
|
|
80
|
+
scope.kind,
|
|
81
|
+
scope.goalId ?? '',
|
|
82
|
+
scope.projectPath ?? '',
|
|
83
|
+
scope.label,
|
|
84
|
+
].join('|');
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=ingestion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingestion.js","sourceRoot":"","sources":["../../src/pipeline/ingestion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SyncConfig } from '../config.js';
|
|
2
|
+
import type { SyncScope } from './types.js';
|
|
3
|
+
export interface ActiveGoal {
|
|
4
|
+
id: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ScopeResolverOptions {
|
|
8
|
+
config: SyncConfig;
|
|
9
|
+
projectPath: string | null;
|
|
10
|
+
activeGoal: ActiveGoal | null;
|
|
11
|
+
sessionTopic: string | null;
|
|
12
|
+
confirmer: (proposed: SyncScope) => Promise<SyncScope>;
|
|
13
|
+
saveAsDefault?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function resolveScope(options: ScopeResolverOptions): Promise<SyncScope>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export async function resolveScope(options) {
|
|
2
|
+
const { config, projectPath, activeGoal, sessionTopic, confirmer, saveAsDefault = false } = options;
|
|
3
|
+
if (projectPath) {
|
|
4
|
+
const saved = config.scopePreference(projectPath);
|
|
5
|
+
if (saved)
|
|
6
|
+
return saved;
|
|
7
|
+
}
|
|
8
|
+
let proposed;
|
|
9
|
+
if (activeGoal) {
|
|
10
|
+
proposed = { kind: 'goal', label: activeGoal.description, goalId: activeGoal.id };
|
|
11
|
+
}
|
|
12
|
+
else if (projectPath) {
|
|
13
|
+
const label = projectPath.split('/').filter(Boolean).pop() ?? 'project';
|
|
14
|
+
proposed = { kind: 'project', label, projectPath };
|
|
15
|
+
}
|
|
16
|
+
else if (sessionTopic) {
|
|
17
|
+
proposed = { kind: 'session', label: sessionTopic, topicSummary: sessionTopic };
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
proposed = { kind: 'user-named', label: 'untitled' };
|
|
21
|
+
}
|
|
22
|
+
const confirmed = await confirmer(proposed);
|
|
23
|
+
if (saveAsDefault && projectPath) {
|
|
24
|
+
config.saveScopePreference(projectPath, confirmed);
|
|
25
|
+
}
|
|
26
|
+
return confirmed;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=scope-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-resolver.js","sourceRoot":"","sources":["../../src/pipeline/scope-resolver.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA6B;IAC9D,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEpG,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,QAAmB,CAAC;IACxB,IAAI,UAAU,EAAE,CAAC;QACf,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;IACpF,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;QACxE,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrD,CAAC;SAAM,IAAI,YAAY,EAAE,CAAC;QACxB,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;IAClF,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,aAAa,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AisMemoryDraft } from './types.js';
|
|
2
|
+
export interface TrustTagOptions {
|
|
3
|
+
defaultTrustScore: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Fills in default trust scores for drafts left at 0 by the adapter.
|
|
7
|
+
* Adapters may optionally pre-set trust (e.g., if they have provider-level
|
|
8
|
+
* confidence signals). This stage is a safety net, not a mandatory rewrite.
|
|
9
|
+
*/
|
|
10
|
+
export declare function applyTrustTags(drafts: AisMemoryDraft[], options: TrustTagOptions): AisMemoryDraft[];
|