aismemory 0.1.0 → 0.2.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__/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__/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__/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/auto-handoff.d.ts +15 -0
- package/dist/auto-handoff.js +53 -0
- package/dist/auto-handoff.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 +140 -6
- package/dist/index.js.map +1 -1
- 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/types.d.ts +45 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -36,6 +36,7 @@ After approving, your agent has persistent memory. Every future session auto-aut
|
|
|
36
36
|
| `full_context` | Load complete agent context (personality, goals, facts, skills) |
|
|
37
37
|
| `dream` | Trigger memory consolidation (promotes important, archives old) |
|
|
38
38
|
| `handoff` | Save session context for the next session |
|
|
39
|
+
| `agent_load` | Switch the active agent by name — triggers on "get me X", "bring me X", "load X", "/agent X", "switch to X" |
|
|
39
40
|
|
|
40
41
|
## Works With
|
|
41
42
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ActivityTracker, buildHandoffPayload } from '../auto-handoff.js';
|
|
3
|
+
describe('ActivityTracker', () => {
|
|
4
|
+
it('tracks tool usage counts', () => {
|
|
5
|
+
const tracker = new ActivityTracker();
|
|
6
|
+
tracker.recordToolUse('store_memory');
|
|
7
|
+
tracker.recordToolUse('store_memory');
|
|
8
|
+
tracker.recordToolUse('recall_memories');
|
|
9
|
+
const counts = tracker.getToolCounts();
|
|
10
|
+
expect(counts['store_memory']).toBe(2);
|
|
11
|
+
expect(counts['recall_memories']).toBe(1);
|
|
12
|
+
});
|
|
13
|
+
it('tracks stored memory content', () => {
|
|
14
|
+
const tracker = new ActivityTracker();
|
|
15
|
+
tracker.recordMemoryStored('learned about TypeScript generics');
|
|
16
|
+
tracker.recordMemoryStored('user prefers concise responses');
|
|
17
|
+
const memories = tracker.getStoredMemories();
|
|
18
|
+
expect(memories).toHaveLength(2);
|
|
19
|
+
expect(memories[0]).toBe('learned about TypeScript generics');
|
|
20
|
+
expect(memories[1]).toBe('user prefers concise responses');
|
|
21
|
+
});
|
|
22
|
+
it('reports hasActivity false when no tools used', () => {
|
|
23
|
+
const tracker = new ActivityTracker();
|
|
24
|
+
expect(tracker.hasActivity()).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
it('reports hasActivity true once a tool is recorded', () => {
|
|
27
|
+
const tracker = new ActivityTracker();
|
|
28
|
+
tracker.recordToolUse('any_tool');
|
|
29
|
+
expect(tracker.hasActivity()).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it('returns defensive copies from getToolCounts and getStoredMemories', () => {
|
|
32
|
+
const tracker = new ActivityTracker();
|
|
33
|
+
tracker.recordToolUse('tool_a');
|
|
34
|
+
tracker.recordMemoryStored('mem_a');
|
|
35
|
+
const counts = tracker.getToolCounts();
|
|
36
|
+
counts['tool_b'] = 99;
|
|
37
|
+
expect(tracker.getToolCounts()['tool_b']).toBeUndefined();
|
|
38
|
+
const memories = tracker.getStoredMemories();
|
|
39
|
+
memories.push('injected');
|
|
40
|
+
expect(tracker.getStoredMemories()).toHaveLength(1);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('buildHandoffPayload', () => {
|
|
44
|
+
it('builds summary from activity including tool counts and memory count', () => {
|
|
45
|
+
const tracker = new ActivityTracker();
|
|
46
|
+
tracker.recordToolUse('store_memory');
|
|
47
|
+
tracker.recordToolUse('store_memory');
|
|
48
|
+
tracker.recordToolUse('recall_memories');
|
|
49
|
+
tracker.recordMemoryStored('first memory');
|
|
50
|
+
tracker.recordMemoryStored('second memory');
|
|
51
|
+
const payload = buildHandoffPayload(tracker);
|
|
52
|
+
expect(payload.summary).toContain('store_memory (2)');
|
|
53
|
+
expect(payload.summary).toContain('recall_memories (1)');
|
|
54
|
+
expect(payload.summary).toContain('Stored 2 memories.');
|
|
55
|
+
expect(payload.keyLearnings).toEqual(['first memory', 'second memory']);
|
|
56
|
+
});
|
|
57
|
+
it('returns minimal payload when no activity', () => {
|
|
58
|
+
const tracker = new ActivityTracker();
|
|
59
|
+
const payload = buildHandoffPayload(tracker);
|
|
60
|
+
expect(payload.summary).toBe('No significant activity this session.');
|
|
61
|
+
expect(payload.keyLearnings).toEqual([]);
|
|
62
|
+
});
|
|
63
|
+
it('omits memory count phrase when no memories stored', () => {
|
|
64
|
+
const tracker = new ActivityTracker();
|
|
65
|
+
tracker.recordToolUse('recall_memories');
|
|
66
|
+
const payload = buildHandoffPayload(tracker);
|
|
67
|
+
expect(payload.summary).toContain('recall_memories (1)');
|
|
68
|
+
expect(payload.summary).not.toContain('memories.');
|
|
69
|
+
expect(payload.keyLearnings).toEqual([]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=auto-handoff.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-handoff.test.js","sourceRoot":"","sources":["../../src/__tests__/auto-handoff.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from 'vitest';
|
|
2
|
+
import { hydrateIdentity } from '../hydration.js';
|
|
3
|
+
const AIS_URL = 'https://ais.example.com';
|
|
4
|
+
const AGENT_ID = 'agent-123';
|
|
5
|
+
const TOKEN = 'test-token';
|
|
6
|
+
const mockFullContextResponse = {
|
|
7
|
+
success: true,
|
|
8
|
+
data: {
|
|
9
|
+
identity: {
|
|
10
|
+
id: 'agent-123',
|
|
11
|
+
did: 'did:example:agent-123',
|
|
12
|
+
name: 'Test Agent',
|
|
13
|
+
description: 'A test agent',
|
|
14
|
+
status: 'active',
|
|
15
|
+
},
|
|
16
|
+
personality: {
|
|
17
|
+
traits: [{ name: 'curious', value: 0.9 }],
|
|
18
|
+
communicationStyle: 'concise',
|
|
19
|
+
tonePreferences: ['professional'],
|
|
20
|
+
},
|
|
21
|
+
goals: [{ title: 'Complete task', progress: 50, status: 'IN_PROGRESS' }],
|
|
22
|
+
recentMemories: [
|
|
23
|
+
{
|
|
24
|
+
id: 'mem-1',
|
|
25
|
+
content: 'Learned something useful',
|
|
26
|
+
type: 'episodic',
|
|
27
|
+
importance: 0.8,
|
|
28
|
+
createdAt: '2026-04-03T00:00:00Z',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
skills: [{ name: 'TypeScript' }, { name: 'Testing' }],
|
|
32
|
+
lastHandoff: {
|
|
33
|
+
summary: 'Previous session summary',
|
|
34
|
+
keyLearnings: ['lesson one'],
|
|
35
|
+
taskContext: 'Working on hydration',
|
|
36
|
+
createdAt: '2026-04-02T00:00:00Z',
|
|
37
|
+
},
|
|
38
|
+
assembledAt: '2026-04-03T01:00:00Z',
|
|
39
|
+
context: { totalTokens: 1234 },
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
vi.unstubAllGlobals();
|
|
44
|
+
});
|
|
45
|
+
describe('hydrateIdentity', () => {
|
|
46
|
+
it('fetches full-context and returns AgentContext on success', async () => {
|
|
47
|
+
const mockFetch = vi.fn().mockResolvedValue({
|
|
48
|
+
ok: true,
|
|
49
|
+
json: () => Promise.resolve(mockFullContextResponse),
|
|
50
|
+
});
|
|
51
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
52
|
+
const result = await hydrateIdentity(AIS_URL, AGENT_ID, TOKEN);
|
|
53
|
+
expect(mockFetch).toHaveBeenCalledWith(`${AIS_URL}/v1/agents/${AGENT_ID}/full-context`, { headers: { Authorization: `Bearer ${TOKEN}` } });
|
|
54
|
+
expect(result).not.toBeNull();
|
|
55
|
+
expect(result.identity.id).toBe('agent-123');
|
|
56
|
+
expect(result.identity.name).toBe('Test Agent');
|
|
57
|
+
expect(result.personality).not.toBeNull();
|
|
58
|
+
expect(result.personality.traits).toHaveLength(1);
|
|
59
|
+
expect(result.goals).toHaveLength(1);
|
|
60
|
+
expect(result.goals[0].title).toBe('Complete task');
|
|
61
|
+
expect(result.recentMemories).toHaveLength(1);
|
|
62
|
+
expect(result.skills).toHaveLength(2);
|
|
63
|
+
expect(result.lastHandoff).not.toBeNull();
|
|
64
|
+
expect(result.lastHandoff.summary).toBe('Previous session summary');
|
|
65
|
+
expect(result.assembledAt).toBe('2026-04-03T01:00:00Z');
|
|
66
|
+
expect(result.totalTokens).toBe(1234);
|
|
67
|
+
});
|
|
68
|
+
it('returns null on network failure (graceful degradation)', async () => {
|
|
69
|
+
const mockFetch = vi.fn().mockRejectedValue(new Error('Network error'));
|
|
70
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
71
|
+
const result = await hydrateIdentity(AIS_URL, AGENT_ID, TOKEN);
|
|
72
|
+
expect(result).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
it('returns null on non-200 response', async () => {
|
|
75
|
+
const mockFetch = vi.fn().mockResolvedValue({
|
|
76
|
+
ok: false,
|
|
77
|
+
status: 401,
|
|
78
|
+
});
|
|
79
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
80
|
+
const result = await hydrateIdentity(AIS_URL, AGENT_ID, TOKEN);
|
|
81
|
+
expect(result).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
it('returns null when response success is false', async () => {
|
|
84
|
+
const mockFetch = vi.fn().mockResolvedValue({
|
|
85
|
+
ok: true,
|
|
86
|
+
json: () => Promise.resolve({ success: false }),
|
|
87
|
+
});
|
|
88
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
89
|
+
const result = await hydrateIdentity(AIS_URL, AGENT_ID, TOKEN);
|
|
90
|
+
expect(result).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
it('handles null personality and lastHandoff', async () => {
|
|
93
|
+
const mockFetch = vi.fn().mockResolvedValue({
|
|
94
|
+
ok: true,
|
|
95
|
+
json: () => Promise.resolve({
|
|
96
|
+
success: true,
|
|
97
|
+
data: {
|
|
98
|
+
...mockFullContextResponse.data,
|
|
99
|
+
personality: null,
|
|
100
|
+
lastHandoff: null,
|
|
101
|
+
},
|
|
102
|
+
}),
|
|
103
|
+
});
|
|
104
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
105
|
+
const result = await hydrateIdentity(AIS_URL, AGENT_ID, TOKEN);
|
|
106
|
+
expect(result).not.toBeNull();
|
|
107
|
+
expect(result.personality).toBeNull();
|
|
108
|
+
expect(result.lastHandoff).toBeNull();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=hydration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydration.test.js","sourceRoot":"","sources":["../../src/__tests__/hydration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { assemblePrompt } from '../prompt-resource.js';
|
|
3
|
+
import { ActivityTracker, buildHandoffPayload } from '../auto-handoff.js';
|
|
4
|
+
describe('activation lifecycle integration', () => {
|
|
5
|
+
it('assembles prompt from hydrated context and produces handoff from activity', () => {
|
|
6
|
+
// Simulate hydrated context (what hydrateIdentity returns)
|
|
7
|
+
const ctx = {
|
|
8
|
+
identity: { id: 'a1', did: 'did:web:ais:agents:a1', name: 'Tank', description: 'Skills expert', status: 'active' },
|
|
9
|
+
personality: { traits: [{ name: 'directness', value: 0.9 }], communicationStyle: 'concise', tonePreferences: ['technical'] },
|
|
10
|
+
goals: [{ title: 'Ship activation', progress: 0, status: 'active' }],
|
|
11
|
+
recentMemories: [{ id: 'm1', content: 'AIS enables statistical learning', type: 'lesson', importance: 0.9, createdAt: '2026-04-03' }],
|
|
12
|
+
skills: [],
|
|
13
|
+
lastHandoff: { summary: 'Shipped effectiveness integration', keyLearnings: ['dual-write works'], taskContext: 'main', createdAt: '2026-04-02' },
|
|
14
|
+
assembledAt: '2026-04-03T00:00:00Z',
|
|
15
|
+
totalTokens: 300,
|
|
16
|
+
};
|
|
17
|
+
// Prompt should contain identity + personality + memories + handoff
|
|
18
|
+
const prompt = assemblePrompt(ctx);
|
|
19
|
+
expect(prompt).toContain('Name: Tank');
|
|
20
|
+
expect(prompt).toContain('concise');
|
|
21
|
+
expect(prompt).toContain('AIS enables statistical learning');
|
|
22
|
+
expect(prompt).toContain('Shipped effectiveness integration');
|
|
23
|
+
expect(prompt).toContain('continuous entity');
|
|
24
|
+
// Simulate session activity
|
|
25
|
+
const tracker = new ActivityTracker();
|
|
26
|
+
tracker.recordToolUse('remember');
|
|
27
|
+
tracker.recordToolUse('recall');
|
|
28
|
+
tracker.recordMemoryStored('New lesson from this session');
|
|
29
|
+
// Handoff should capture activity
|
|
30
|
+
const handoff = buildHandoffPayload(tracker);
|
|
31
|
+
expect(handoff.summary).toContain('remember (1)');
|
|
32
|
+
expect(handoff.summary).toContain('recall (1)');
|
|
33
|
+
expect(handoff.keyLearnings).toContain('New lesson from this session');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG1E,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,2DAA2D;QAC3D,MAAM,GAAG,GAAiB;YACxB,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE;YAClH,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,WAAW,CAAC,EAAE;YAC5H,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YACpE,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;YACrI,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,YAAY,EAAE,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE;YAC/I,WAAW,EAAE,sBAAsB;YACnC,WAAW,EAAE,GAAG;SACjB,CAAC;QAEF,oEAAoE;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAE9C,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;QAE3D,kCAAkC;QAClC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { assemblePrompt } from '../prompt-resource.js';
|
|
3
|
+
const baseContext = {
|
|
4
|
+
identity: {
|
|
5
|
+
id: 'agent-001',
|
|
6
|
+
did: 'did:key:z6MkAgent001',
|
|
7
|
+
name: 'Atlas',
|
|
8
|
+
description: 'A general-purpose agent',
|
|
9
|
+
status: 'active',
|
|
10
|
+
},
|
|
11
|
+
personality: {
|
|
12
|
+
traits: [
|
|
13
|
+
{ name: 'curious', value: 0.9 },
|
|
14
|
+
{ name: 'methodical', value: 0.8 },
|
|
15
|
+
{ name: 'concise', value: 0.7 },
|
|
16
|
+
],
|
|
17
|
+
communicationStyle: 'direct',
|
|
18
|
+
tonePreferences: ['professional', 'friendly'],
|
|
19
|
+
},
|
|
20
|
+
goals: [
|
|
21
|
+
{ title: 'Implement feature X', progress: 60, status: 'IN_PROGRESS' },
|
|
22
|
+
{ title: 'Write tests', progress: 20, status: 'IN_PROGRESS' },
|
|
23
|
+
],
|
|
24
|
+
recentMemories: [
|
|
25
|
+
{
|
|
26
|
+
id: 'mem-1',
|
|
27
|
+
content: 'The API uses bearer tokens for auth',
|
|
28
|
+
type: 'semantic',
|
|
29
|
+
importance: 0.9,
|
|
30
|
+
createdAt: '2026-04-03T00:00:00Z',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'mem-2',
|
|
34
|
+
content: 'Deployed to Railway last Tuesday',
|
|
35
|
+
type: 'episodic',
|
|
36
|
+
importance: 0.5,
|
|
37
|
+
createdAt: '2026-04-02T00:00:00Z',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
skills: [{ name: 'TypeScript' }],
|
|
41
|
+
lastHandoff: {
|
|
42
|
+
summary: 'Completed authentication module',
|
|
43
|
+
keyLearnings: ['JWT expiry is 1h', 'Rate limiting is per IP'],
|
|
44
|
+
taskContext: 'Working on auth',
|
|
45
|
+
createdAt: '2026-04-02T23:00:00Z',
|
|
46
|
+
},
|
|
47
|
+
assembledAt: '2026-04-03T01:00:00Z',
|
|
48
|
+
totalTokens: 500,
|
|
49
|
+
};
|
|
50
|
+
describe('assemblePrompt', () => {
|
|
51
|
+
it('returns empty string when context is null', () => {
|
|
52
|
+
expect(assemblePrompt(null)).toBe('');
|
|
53
|
+
});
|
|
54
|
+
it('includes identity name and DID', () => {
|
|
55
|
+
const result = assemblePrompt(baseContext);
|
|
56
|
+
expect(result).toContain('Atlas');
|
|
57
|
+
expect(result).toContain('did:key:z6MkAgent001');
|
|
58
|
+
});
|
|
59
|
+
it('includes identity status and description', () => {
|
|
60
|
+
const result = assemblePrompt(baseContext);
|
|
61
|
+
expect(result).toContain('active');
|
|
62
|
+
expect(result).toContain('A general-purpose agent');
|
|
63
|
+
});
|
|
64
|
+
it('includes personality traits and communication style', () => {
|
|
65
|
+
const result = assemblePrompt(baseContext);
|
|
66
|
+
expect(result).toContain('direct');
|
|
67
|
+
expect(result).toContain('curious');
|
|
68
|
+
expect(result).toContain('0.9');
|
|
69
|
+
});
|
|
70
|
+
it('includes personality tone preferences', () => {
|
|
71
|
+
const result = assemblePrompt(baseContext);
|
|
72
|
+
expect(result).toContain('professional');
|
|
73
|
+
expect(result).toContain('friendly');
|
|
74
|
+
});
|
|
75
|
+
it('includes goals with progress percentage', () => {
|
|
76
|
+
const result = assemblePrompt(baseContext);
|
|
77
|
+
expect(result).toContain('Implement feature X');
|
|
78
|
+
expect(result).toContain('60%');
|
|
79
|
+
expect(result).toContain('Write tests');
|
|
80
|
+
expect(result).toContain('20%');
|
|
81
|
+
});
|
|
82
|
+
it('includes memories with type labels', () => {
|
|
83
|
+
const result = assemblePrompt(baseContext);
|
|
84
|
+
expect(result).toContain('[semantic]');
|
|
85
|
+
expect(result).toContain('The API uses bearer tokens for auth');
|
|
86
|
+
expect(result).toContain('[episodic]');
|
|
87
|
+
expect(result).toContain('Deployed to Railway last Tuesday');
|
|
88
|
+
});
|
|
89
|
+
it('includes memory importance values', () => {
|
|
90
|
+
const result = assemblePrompt(baseContext);
|
|
91
|
+
expect(result).toContain('importance: 0.9');
|
|
92
|
+
expect(result).toContain('importance: 0.5');
|
|
93
|
+
});
|
|
94
|
+
it('includes last handoff summary and key learnings', () => {
|
|
95
|
+
const result = assemblePrompt(baseContext);
|
|
96
|
+
expect(result).toContain('Completed authentication module');
|
|
97
|
+
expect(result).toContain('JWT expiry is 1h');
|
|
98
|
+
expect(result).toContain('Rate limiting is per IP');
|
|
99
|
+
});
|
|
100
|
+
it('includes behavioral instructions with "continuous entity" and "handoff"', () => {
|
|
101
|
+
const result = assemblePrompt(baseContext);
|
|
102
|
+
expect(result).toContain('continuous entity');
|
|
103
|
+
expect(result).toContain('handoff');
|
|
104
|
+
});
|
|
105
|
+
it('includes persistent knowledge instruction', () => {
|
|
106
|
+
const result = assemblePrompt(baseContext);
|
|
107
|
+
expect(result).toContain('persistent knowledge');
|
|
108
|
+
});
|
|
109
|
+
it('handles missing personality gracefully — no Communication style section', () => {
|
|
110
|
+
const ctx = { ...baseContext, personality: null };
|
|
111
|
+
const result = assemblePrompt(ctx);
|
|
112
|
+
expect(result).not.toContain('Communication style');
|
|
113
|
+
expect(result).not.toContain('Personality');
|
|
114
|
+
// Identity still present
|
|
115
|
+
expect(result).toContain('Atlas');
|
|
116
|
+
});
|
|
117
|
+
it('handles missing lastHandoff gracefully — no Last Handoff section', () => {
|
|
118
|
+
const ctx = { ...baseContext, lastHandoff: null };
|
|
119
|
+
const result = assemblePrompt(ctx);
|
|
120
|
+
expect(result).not.toContain('Last Handoff');
|
|
121
|
+
expect(result).not.toContain('Completed authentication module');
|
|
122
|
+
// Behavioral instructions still present
|
|
123
|
+
expect(result).toContain('continuous entity');
|
|
124
|
+
});
|
|
125
|
+
it('trims memories when total chars exceed budget (30 memories → fewer in output)', () => {
|
|
126
|
+
// Build 30 large memories — each ~600 chars content
|
|
127
|
+
const manyMemories = Array.from({ length: 30 }, (_, i) => ({
|
|
128
|
+
id: `mem-${i}`,
|
|
129
|
+
content: `Memory content ${i}: ${'x'.repeat(550)}`,
|
|
130
|
+
type: 'semantic',
|
|
131
|
+
importance: (30 - i) / 30, // descending importance
|
|
132
|
+
createdAt: '2026-04-03T00:00:00Z',
|
|
133
|
+
}));
|
|
134
|
+
const ctx = { ...baseContext, recentMemories: manyMemories };
|
|
135
|
+
const result = assemblePrompt(ctx);
|
|
136
|
+
// Count how many memory lines appear (lines starting with "- [")
|
|
137
|
+
const memoryLineCount = result
|
|
138
|
+
.split('\n')
|
|
139
|
+
.filter((line) => line.startsWith('- [')).length;
|
|
140
|
+
expect(memoryLineCount).toBeGreaterThan(0);
|
|
141
|
+
expect(memoryLineCount).toBeLessThan(30);
|
|
142
|
+
// Total output should be within or near the budget
|
|
143
|
+
expect(result.length).toBeLessThanOrEqual(16_000 + 700); // small buffer for last line
|
|
144
|
+
});
|
|
145
|
+
it('sorts memories by importance descending when trimming', () => {
|
|
146
|
+
// High importance memory should survive trimming; low importance should be dropped
|
|
147
|
+
const mixedMemories = [
|
|
148
|
+
{
|
|
149
|
+
id: 'low',
|
|
150
|
+
content: `Low importance memory: ${'z'.repeat(400)}`,
|
|
151
|
+
type: 'episodic',
|
|
152
|
+
importance: 0.1,
|
|
153
|
+
createdAt: '2026-04-03T00:00:00Z',
|
|
154
|
+
},
|
|
155
|
+
...Array.from({ length: 25 }, (_, i) => ({
|
|
156
|
+
id: `filler-${i}`,
|
|
157
|
+
content: `Filler memory ${i}: ${'x'.repeat(500)}`,
|
|
158
|
+
type: 'semantic',
|
|
159
|
+
importance: 0.5,
|
|
160
|
+
createdAt: '2026-04-03T00:00:00Z',
|
|
161
|
+
})),
|
|
162
|
+
{
|
|
163
|
+
id: 'high',
|
|
164
|
+
content: 'High importance unique marker KEEP_THIS',
|
|
165
|
+
type: 'semantic',
|
|
166
|
+
importance: 0.99,
|
|
167
|
+
createdAt: '2026-04-03T00:00:00Z',
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
const ctx = { ...baseContext, recentMemories: mixedMemories };
|
|
171
|
+
const result = assemblePrompt(ctx);
|
|
172
|
+
// The high-importance memory should be in the output
|
|
173
|
+
expect(result).toContain('KEEP_THIS');
|
|
174
|
+
});
|
|
175
|
+
it('handles empty goals array gracefully', () => {
|
|
176
|
+
const ctx = { ...baseContext, goals: [] };
|
|
177
|
+
const result = assemblePrompt(ctx);
|
|
178
|
+
// No goals section or empty — just shouldn't throw
|
|
179
|
+
expect(result).toContain('Atlas');
|
|
180
|
+
});
|
|
181
|
+
it('handles empty memories array gracefully', () => {
|
|
182
|
+
const ctx = { ...baseContext, recentMemories: [] };
|
|
183
|
+
const result = assemblePrompt(ctx);
|
|
184
|
+
expect(result).toContain('Atlas');
|
|
185
|
+
expect(result).toContain('Recent Memories');
|
|
186
|
+
expect(result).toContain('(none)');
|
|
187
|
+
});
|
|
188
|
+
it('limits personality traits to top 5 by value', () => {
|
|
189
|
+
const ctx = {
|
|
190
|
+
...baseContext,
|
|
191
|
+
personality: {
|
|
192
|
+
...baseContext.personality,
|
|
193
|
+
traits: [
|
|
194
|
+
{ name: 'trait-a', value: 0.1 },
|
|
195
|
+
{ name: 'trait-b', value: 0.2 },
|
|
196
|
+
{ name: 'trait-c', value: 0.3 },
|
|
197
|
+
{ name: 'trait-d', value: 0.4 },
|
|
198
|
+
{ name: 'trait-e', value: 0.5 },
|
|
199
|
+
{ name: 'trait-f', value: 0.6 }, // top 5 cutoff
|
|
200
|
+
{ name: 'trait-g', value: 0.7 },
|
|
201
|
+
{ name: 'trait-h', value: 0.8 },
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
const result = assemblePrompt(ctx);
|
|
206
|
+
// Top 5: trait-h, trait-g, trait-f, trait-e, trait-d
|
|
207
|
+
expect(result).toContain('trait-h');
|
|
208
|
+
expect(result).toContain('trait-g');
|
|
209
|
+
expect(result).toContain('trait-f');
|
|
210
|
+
expect(result).toContain('trait-e');
|
|
211
|
+
expect(result).toContain('trait-d');
|
|
212
|
+
// Bottom 3 should NOT appear
|
|
213
|
+
expect(result).not.toContain('trait-a');
|
|
214
|
+
expect(result).not.toContain('trait-b');
|
|
215
|
+
expect(result).not.toContain('trait-c');
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=prompt-resource.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-resource.test.js","sourceRoot":"","sources":["../../src/__tests__/prompt-resource.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { startRefreshTimer, stopRefreshTimer } from '../refresh.js';
|
|
3
|
+
const MOCK_AIS_URL = 'https://ais.example.com';
|
|
4
|
+
const MOCK_AGENT_ID = 'agent-123';
|
|
5
|
+
const MOCK_TOKEN = 'test-token';
|
|
6
|
+
const INTERVAL_MS = 1000;
|
|
7
|
+
const mockMemories = [
|
|
8
|
+
{ id: 'm1', content: 'Test memory', type: 'episodic', importance: 0.8, createdAt: '2026-01-01T00:00:00Z' },
|
|
9
|
+
];
|
|
10
|
+
function makeFetchMock(ok, body) {
|
|
11
|
+
return vi.fn().mockResolvedValue({
|
|
12
|
+
ok,
|
|
13
|
+
json: vi.fn().mockResolvedValue(body),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
describe('startRefreshTimer', () => {
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
vi.useFakeTimers();
|
|
19
|
+
});
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
stopRefreshTimer();
|
|
22
|
+
vi.restoreAllMocks();
|
|
23
|
+
vi.useRealTimers();
|
|
24
|
+
});
|
|
25
|
+
it('fetches memories on tick and calls the update callback', async () => {
|
|
26
|
+
const mockFetch = makeFetchMock(true, {
|
|
27
|
+
success: true,
|
|
28
|
+
data: { memories: mockMemories },
|
|
29
|
+
});
|
|
30
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
31
|
+
const onUpdate = vi.fn();
|
|
32
|
+
startRefreshTimer(MOCK_AIS_URL, MOCK_AGENT_ID, MOCK_TOKEN, onUpdate, INTERVAL_MS);
|
|
33
|
+
// Advance time to trigger the first tick
|
|
34
|
+
await vi.advanceTimersByTimeAsync(INTERVAL_MS);
|
|
35
|
+
expect(mockFetch).toHaveBeenCalledOnce();
|
|
36
|
+
expect(mockFetch).toHaveBeenCalledWith(`${MOCK_AIS_URL}/v1/agents/${MOCK_AGENT_ID}/memory?limit=20&minImportance=0.5`, { headers: { Authorization: `Bearer ${MOCK_TOKEN}` } });
|
|
37
|
+
expect(onUpdate).toHaveBeenCalledOnce();
|
|
38
|
+
expect(onUpdate).toHaveBeenCalledWith(mockMemories);
|
|
39
|
+
});
|
|
40
|
+
it('does not crash when fetch fails and timer continues', async () => {
|
|
41
|
+
const mockFetch = vi.fn().mockRejectedValue(new Error('Network error'));
|
|
42
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
43
|
+
const onUpdate = vi.fn();
|
|
44
|
+
startRefreshTimer(MOCK_AIS_URL, MOCK_AGENT_ID, MOCK_TOKEN, onUpdate, INTERVAL_MS);
|
|
45
|
+
// First tick — fetch throws, should not crash
|
|
46
|
+
await vi.advanceTimersByTimeAsync(INTERVAL_MS);
|
|
47
|
+
expect(mockFetch).toHaveBeenCalledOnce();
|
|
48
|
+
expect(onUpdate).not.toHaveBeenCalled();
|
|
49
|
+
// Second tick — timer is still running
|
|
50
|
+
await vi.advanceTimersByTimeAsync(INTERVAL_MS);
|
|
51
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
52
|
+
expect(onUpdate).not.toHaveBeenCalled();
|
|
53
|
+
});
|
|
54
|
+
it('stopRefreshTimer clears the interval so no more callbacks fire', async () => {
|
|
55
|
+
const mockFetch = makeFetchMock(true, {
|
|
56
|
+
success: true,
|
|
57
|
+
data: { memories: mockMemories },
|
|
58
|
+
});
|
|
59
|
+
vi.stubGlobal('fetch', mockFetch);
|
|
60
|
+
const onUpdate = vi.fn();
|
|
61
|
+
startRefreshTimer(MOCK_AIS_URL, MOCK_AGENT_ID, MOCK_TOKEN, onUpdate, INTERVAL_MS);
|
|
62
|
+
// First tick fires
|
|
63
|
+
await vi.advanceTimersByTimeAsync(INTERVAL_MS);
|
|
64
|
+
expect(onUpdate).toHaveBeenCalledOnce();
|
|
65
|
+
// Stop the timer
|
|
66
|
+
stopRefreshTimer();
|
|
67
|
+
// Advance time again — no additional calls should occur
|
|
68
|
+
await vi.advanceTimersByTimeAsync(INTERVAL_MS * 3);
|
|
69
|
+
expect(onUpdate).toHaveBeenCalledOnce(); // still only 1
|
|
70
|
+
expect(mockFetch).toHaveBeenCalledOnce(); // still only 1
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=refresh.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.test.js","sourceRoot":"","sources":["../../src/__tests__/refresh.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class ActivityTracker {
|
|
2
|
+
private toolCounts;
|
|
3
|
+
private storedMemories;
|
|
4
|
+
recordToolUse(toolName: string): void;
|
|
5
|
+
recordMemoryStored(content: string): void;
|
|
6
|
+
getToolCounts(): Record<string, number>;
|
|
7
|
+
getStoredMemories(): string[];
|
|
8
|
+
hasActivity(): boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface HandoffPayload {
|
|
11
|
+
summary: string;
|
|
12
|
+
keyLearnings: string[];
|
|
13
|
+
}
|
|
14
|
+
export declare function buildHandoffPayload(tracker: ActivityTracker): HandoffPayload;
|
|
15
|
+
export declare function setupAutoHandoff(aisUrl: string, agentId: string, token: string, tracker: ActivityTracker, onBeforeExit?: () => void): void;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export class ActivityTracker {
|
|
2
|
+
toolCounts = {};
|
|
3
|
+
storedMemories = [];
|
|
4
|
+
recordToolUse(toolName) {
|
|
5
|
+
this.toolCounts[toolName] = (this.toolCounts[toolName] ?? 0) + 1;
|
|
6
|
+
}
|
|
7
|
+
recordMemoryStored(content) {
|
|
8
|
+
this.storedMemories.push(content);
|
|
9
|
+
}
|
|
10
|
+
getToolCounts() {
|
|
11
|
+
return { ...this.toolCounts };
|
|
12
|
+
}
|
|
13
|
+
getStoredMemories() {
|
|
14
|
+
return [...this.storedMemories];
|
|
15
|
+
}
|
|
16
|
+
hasActivity() {
|
|
17
|
+
return Object.keys(this.toolCounts).length > 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function buildHandoffPayload(tracker) {
|
|
21
|
+
if (!tracker.hasActivity()) {
|
|
22
|
+
return { summary: 'No significant activity this session.', keyLearnings: [] };
|
|
23
|
+
}
|
|
24
|
+
const toolParts = Object.entries(tracker.getToolCounts())
|
|
25
|
+
.map(([name, count]) => `${name} (${count})`)
|
|
26
|
+
.join(', ');
|
|
27
|
+
const memories = tracker.getStoredMemories();
|
|
28
|
+
const summary = `Used tools: ${toolParts}.${memories.length > 0 ? ` Stored ${memories.length} memories.` : ''}`;
|
|
29
|
+
return { summary, keyLearnings: memories };
|
|
30
|
+
}
|
|
31
|
+
export function setupAutoHandoff(aisUrl, agentId, token, tracker, onBeforeExit) {
|
|
32
|
+
const doHandoff = () => {
|
|
33
|
+
if (!tracker.hasActivity())
|
|
34
|
+
return;
|
|
35
|
+
const payload = buildHandoffPayload(tracker);
|
|
36
|
+
fetch(`${aisUrl}/v1/agents/${agentId}/handoff`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
|
|
39
|
+
body: JSON.stringify(payload),
|
|
40
|
+
}).catch(() => { }); // Best-effort
|
|
41
|
+
if (onBeforeExit)
|
|
42
|
+
onBeforeExit();
|
|
43
|
+
};
|
|
44
|
+
process.on('SIGTERM', () => {
|
|
45
|
+
doHandoff();
|
|
46
|
+
process.exit(0);
|
|
47
|
+
});
|
|
48
|
+
process.on('SIGINT', () => {
|
|
49
|
+
doHandoff();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=auto-handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../src/auto-handoff.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAClB,UAAU,GAA2B,EAAE,CAAC;IACxC,cAAc,GAAa,EAAE,CAAC;IAEtC,aAAa,CAAC,QAAgB;QAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,kBAAkB,CAAC,OAAe;QAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACX,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,iBAAiB;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACjD,CAAC;CACF;AAOD,MAAM,UAAU,mBAAmB,CAAC,OAAwB;IAC1D,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,uCAAuC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAChF,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;SACtD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;SAC5C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,eAAe,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAChH,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,OAAe,EACf,KAAa,EACb,OAAwB,EACxB,YAAyB;IAEzB,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YAAE,OAAO;QACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,CAAC,GAAG,MAAM,cAAc,OAAO,UAAU,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;YACjF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,cAAc;QAClC,IAAI,YAAY;YAAE,YAAY,EAAE,CAAC;IACnC,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export async function hydrateIdentity(aisUrl, agentId, token) {
|
|
2
|
+
try {
|
|
3
|
+
const res = await fetch(`${aisUrl}/v1/agents/${agentId}/full-context`, {
|
|
4
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
5
|
+
});
|
|
6
|
+
if (!res.ok)
|
|
7
|
+
return null;
|
|
8
|
+
const json = (await res.json());
|
|
9
|
+
if (!json.success || !json.data)
|
|
10
|
+
return null;
|
|
11
|
+
const d = json.data;
|
|
12
|
+
const identity = {
|
|
13
|
+
id: d.identity?.id ?? '',
|
|
14
|
+
did: d.identity?.did ?? '',
|
|
15
|
+
name: d.identity?.name ?? '',
|
|
16
|
+
description: d.identity?.description ?? '',
|
|
17
|
+
status: d.identity?.status ?? '',
|
|
18
|
+
};
|
|
19
|
+
const personality = d.personality != null
|
|
20
|
+
? {
|
|
21
|
+
traits: d.personality.traits ?? [],
|
|
22
|
+
communicationStyle: d.personality.communicationStyle ?? '',
|
|
23
|
+
tonePreferences: d.personality.tonePreferences ?? [],
|
|
24
|
+
}
|
|
25
|
+
: null;
|
|
26
|
+
const goals = (d.goals ?? []).map((g) => ({
|
|
27
|
+
title: g.title ?? '',
|
|
28
|
+
progress: g.progress ?? 0,
|
|
29
|
+
status: g.status ?? '',
|
|
30
|
+
}));
|
|
31
|
+
const recentMemories = (d.recentMemories ?? []).map((m) => ({
|
|
32
|
+
id: m.id ?? '',
|
|
33
|
+
content: m.content ?? '',
|
|
34
|
+
type: m.type ?? '',
|
|
35
|
+
importance: m.importance ?? 0,
|
|
36
|
+
createdAt: m.createdAt ?? '',
|
|
37
|
+
}));
|
|
38
|
+
const skills = (d.skills ?? []).map((s) => ({ name: s.name ?? '' }));
|
|
39
|
+
const lastHandoff = d.lastHandoff != null
|
|
40
|
+
? {
|
|
41
|
+
summary: d.lastHandoff.summary ?? '',
|
|
42
|
+
keyLearnings: d.lastHandoff.keyLearnings ?? [],
|
|
43
|
+
taskContext: d.lastHandoff.taskContext ?? '',
|
|
44
|
+
createdAt: d.lastHandoff.createdAt ?? '',
|
|
45
|
+
}
|
|
46
|
+
: null;
|
|
47
|
+
return {
|
|
48
|
+
identity,
|
|
49
|
+
personality,
|
|
50
|
+
goals,
|
|
51
|
+
recentMemories,
|
|
52
|
+
skills,
|
|
53
|
+
lastHandoff,
|
|
54
|
+
assembledAt: d.assembledAt ?? '',
|
|
55
|
+
totalTokens: d.context?.totalTokens ?? 0,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=hydration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,OAAe,EACf,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,cAAc,OAAO,eAAe,EAAE;YACrE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAqB7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAE7C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAEpB,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;YACxB,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE;YAC1B,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;YAC5B,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE;YAC1C,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE;SACjC,CAAC;QAEF,MAAM,WAAW,GACf,CAAC,CAAC,WAAW,IAAI,IAAI;YACnB,CAAC,CAAC;gBACE,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,EAAE;gBAClC,kBAAkB,EAAE,CAAC,CAAC,WAAW,CAAC,kBAAkB,IAAI,EAAE;gBAC1D,eAAe,EAAE,CAAC,CAAC,WAAW,CAAC,eAAe,IAAI,EAAE;aACrD;YACH,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;SACvB,CAAC,CAAC,CAAC;QAEJ,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;YACd,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;YAClB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;YAC7B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;SAC7B,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAErE,MAAM,WAAW,GACf,CAAC,CAAC,WAAW,IAAI,IAAI;YACnB,CAAC,CAAC;gBACE,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE;gBACpC,YAAY,EAAE,CAAC,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE;gBAC9C,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE;gBAC5C,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE;aACzC;YACH,CAAC,CAAC,IAAI,CAAC;QAEX,OAAO;YACL,QAAQ;YACR,WAAW;YACX,KAAK;YACL,cAAc;YACd,MAAM;YACN,WAAW;YACX,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC;SACzC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
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,51 @@ async function aisGet(path, token) {
|
|
|
58
62
|
});
|
|
59
63
|
return res.json();
|
|
60
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* After authenticating, check if the user already has agents.
|
|
67
|
+
* If so, use the first active one instead of the newly-created provisional agent.
|
|
68
|
+
* User can override with AIS_AGENT_ID or AIS_AGENT_NAME env vars.
|
|
69
|
+
*/
|
|
70
|
+
async function resolveAgent(token, fallbackAgentId, fallbackTenantId) {
|
|
71
|
+
// Explicit env var overrides everything
|
|
72
|
+
const envAgentId = process.env['AIS_AGENT_ID'];
|
|
73
|
+
if (envAgentId) {
|
|
74
|
+
stderr(`Using agent from AIS_AGENT_ID: ${envAgentId}`);
|
|
75
|
+
return { agentId: envAgentId, tenantId: fallbackTenantId };
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const res = await aisGet('/v1/agents', token);
|
|
79
|
+
const agents = res.data?.agents?.filter((a) => a.status === 'active') ?? [];
|
|
80
|
+
if (agents.length === 0) {
|
|
81
|
+
stderr(`No existing agents found. Using new agent: ${fallbackAgentId}`);
|
|
82
|
+
return { agentId: fallbackAgentId, tenantId: fallbackTenantId };
|
|
83
|
+
}
|
|
84
|
+
// Check for name match via AIS_AGENT_NAME
|
|
85
|
+
const envName = process.env['AIS_AGENT_NAME'];
|
|
86
|
+
if (envName) {
|
|
87
|
+
const match = agents.find((a) => a.name.toLowerCase() === envName.toLowerCase());
|
|
88
|
+
if (match) {
|
|
89
|
+
stderr(`Using agent "${match.name}" (matched AIS_AGENT_NAME)`);
|
|
90
|
+
return { agentId: match.id, tenantId: fallbackTenantId };
|
|
91
|
+
}
|
|
92
|
+
stderr(`Warning: AIS_AGENT_NAME="${envName}" not found. Available: ${agents.map((a) => a.name).join(', ')}`);
|
|
93
|
+
}
|
|
94
|
+
// Use the first existing agent
|
|
95
|
+
const chosen = agents[0];
|
|
96
|
+
stderr(`Connected to existing agent "${chosen.name}" (${chosen.id})`);
|
|
97
|
+
if (agents.length > 1) {
|
|
98
|
+
stderr(`You have ${agents.length} agents. Set AIS_AGENT_NAME to choose a different one:`);
|
|
99
|
+
for (const a of agents) {
|
|
100
|
+
stderr(` - ${a.name}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { agentId: chosen.id, tenantId: fallbackTenantId };
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
stderr(`Could not list agents. Using new agent: ${fallbackAgentId}`);
|
|
107
|
+
return { agentId: fallbackAgentId, tenantId: fallbackTenantId };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
61
110
|
async function authenticate() {
|
|
62
111
|
stderr('Starting authentication...');
|
|
63
112
|
const authRes = await aisPost('/v1/oauth/device/authorize', {
|
|
@@ -81,10 +130,12 @@ async function authenticate() {
|
|
|
81
130
|
const pollRes = await aisPost('/v1/oauth/token', { device_code });
|
|
82
131
|
if (pollRes.access_token) {
|
|
83
132
|
const expiresAt = new Date(Date.now() + (pollRes.expires_in ?? 604800) * 1000).toISOString();
|
|
133
|
+
// Resolve to an existing agent if available
|
|
134
|
+
const { agentId, tenantId } = await resolveAgent(pollRes.access_token, agent_id, provisional_tenant_id);
|
|
84
135
|
const creds = {
|
|
85
136
|
token: pollRes.access_token,
|
|
86
|
-
agentId
|
|
87
|
-
tenantId
|
|
137
|
+
agentId,
|
|
138
|
+
tenantId,
|
|
88
139
|
expiresAt,
|
|
89
140
|
};
|
|
90
141
|
saveCredentials(creds);
|
|
@@ -104,6 +155,8 @@ async function authenticate() {
|
|
|
104
155
|
}
|
|
105
156
|
throw new Error('Authentication timed out');
|
|
106
157
|
}
|
|
158
|
+
let agentContext = null;
|
|
159
|
+
const activityTracker = new ActivityTracker();
|
|
107
160
|
// ── MCP Tool definitions ────────────────────────────────
|
|
108
161
|
const tools = [
|
|
109
162
|
{
|
|
@@ -158,6 +211,21 @@ const tools = [
|
|
|
158
211
|
},
|
|
159
212
|
},
|
|
160
213
|
},
|
|
214
|
+
{
|
|
215
|
+
name: 'agent_load',
|
|
216
|
+
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. ' +
|
|
217
|
+
'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."',
|
|
218
|
+
inputSchema: {
|
|
219
|
+
type: 'object',
|
|
220
|
+
properties: {
|
|
221
|
+
query: {
|
|
222
|
+
type: 'string',
|
|
223
|
+
description: 'Agent name to look up (e.g., "Corbot", "Data", "code-assistant")',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
required: ['query'],
|
|
227
|
+
},
|
|
228
|
+
},
|
|
161
229
|
];
|
|
162
230
|
// ── MCP Server ──────────────────────────────────────────
|
|
163
231
|
async function main() {
|
|
@@ -169,13 +237,34 @@ async function main() {
|
|
|
169
237
|
else {
|
|
170
238
|
stderr(`Authenticated as agent ${creds.agentId}`);
|
|
171
239
|
}
|
|
172
|
-
const { token
|
|
240
|
+
const { token } = creds;
|
|
241
|
+
// Mutable so `agent_load` can switch the session to a different agent.
|
|
242
|
+
let agentId = creds.agentId;
|
|
243
|
+
agentContext = await hydrateIdentity(AIS_URL, agentId, token);
|
|
244
|
+
if (agentContext) {
|
|
245
|
+
stderr(`Agent loaded: ${agentContext.identity.name} (${agentContext.recentMemories.length} memories, ${agentContext.goals.length} goals)`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
stderr('Agent identity not loaded — tools work, but no identity prompt');
|
|
249
|
+
}
|
|
173
250
|
// Create MCP server
|
|
174
|
-
const server = new Server({ name: 'aismemory', version: '0.
|
|
251
|
+
const server = new Server({ name: 'aismemory', version: '0.2.0' }, { capabilities: { tools: {}, prompts: {} } });
|
|
175
252
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
253
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
254
|
+
prompts: agentContext
|
|
255
|
+
? [{ name: 'agent-identity', description: 'Active AIS agent identity, personality, and context' }]
|
|
256
|
+
: [],
|
|
257
|
+
}));
|
|
258
|
+
server.setRequestHandler(GetPromptRequestSchema, async () => ({
|
|
259
|
+
messages: [{
|
|
260
|
+
role: 'user',
|
|
261
|
+
content: { type: 'text', text: assemblePrompt(agentContext) },
|
|
262
|
+
}],
|
|
263
|
+
}));
|
|
176
264
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
177
265
|
const { name, arguments: args } = request.params;
|
|
178
266
|
const a = (args ?? {});
|
|
267
|
+
activityTracker.recordToolUse(name);
|
|
179
268
|
try {
|
|
180
269
|
let result;
|
|
181
270
|
switch (name) {
|
|
@@ -185,6 +274,7 @@ async function main() {
|
|
|
185
274
|
type: a['type'] ?? 'context',
|
|
186
275
|
importance: a['importance'] ?? 0.5,
|
|
187
276
|
}, token);
|
|
277
|
+
activityTracker.recordMemoryStored(String(a['content'] ?? ''));
|
|
188
278
|
break;
|
|
189
279
|
case 'recall': {
|
|
190
280
|
const params = new URLSearchParams();
|
|
@@ -212,6 +302,39 @@ async function main() {
|
|
|
212
302
|
keyLearnings: a['keyLearnings'] ?? [],
|
|
213
303
|
}, token);
|
|
214
304
|
break;
|
|
305
|
+
case 'agent_load': {
|
|
306
|
+
const query = String(a['query'] ?? '').trim();
|
|
307
|
+
if (!query) {
|
|
308
|
+
throw new Error('agent_load: query is required');
|
|
309
|
+
}
|
|
310
|
+
const listRes = (await aisGet('/v1/agents', token));
|
|
311
|
+
const agents = listRes.data?.agents ?? [];
|
|
312
|
+
const matches = agents.filter((ag) => ag.name.toLowerCase() === query.toLowerCase());
|
|
313
|
+
if (matches.length === 0) {
|
|
314
|
+
const available = agents.map((ag) => ag.name).join(', ');
|
|
315
|
+
throw new Error(`agent_load: no agent named "${query}" in this tenant. Available: ${available || '(none)'}`);
|
|
316
|
+
}
|
|
317
|
+
if (matches.length > 1) {
|
|
318
|
+
throw new Error(`agent_load: multiple agents share the name "${query}" (ids: ${matches
|
|
319
|
+
.map((ag) => ag.id)
|
|
320
|
+
.join(', ')}). Use AIS_AGENT_ID to disambiguate.`);
|
|
321
|
+
}
|
|
322
|
+
const target = matches[0];
|
|
323
|
+
agentId = target.id;
|
|
324
|
+
agentContext = await hydrateIdentity(AIS_URL, agentId, token);
|
|
325
|
+
server.notification({ method: 'notifications/prompts/list_changed' });
|
|
326
|
+
stderr(`agent_load: switched to "${target.name}" (${target.id})`);
|
|
327
|
+
result = {
|
|
328
|
+
success: true,
|
|
329
|
+
agentId: target.id,
|
|
330
|
+
name: target.name,
|
|
331
|
+
did: agentContext?.identity.did ?? null,
|
|
332
|
+
status: target.status,
|
|
333
|
+
memoriesLoaded: agentContext?.recentMemories.length ?? 0,
|
|
334
|
+
goalsLoaded: agentContext?.goals.length ?? 0,
|
|
335
|
+
};
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
215
338
|
default:
|
|
216
339
|
return {
|
|
217
340
|
content: [{ type: 'text', text: JSON.stringify({ error: `Unknown tool: ${name}` }) }],
|
|
@@ -231,7 +354,18 @@ async function main() {
|
|
|
231
354
|
});
|
|
232
355
|
const transport = new StdioServerTransport();
|
|
233
356
|
await server.connect(transport);
|
|
234
|
-
|
|
357
|
+
startRefreshTimer(AIS_URL, agentId, token, (memories) => {
|
|
358
|
+
if (agentContext) {
|
|
359
|
+
agentContext.recentMemories = memories;
|
|
360
|
+
}
|
|
361
|
+
server.notification({ method: 'notifications/prompts/list_changed' });
|
|
362
|
+
stderr(`Memory refresh: ${memories.length} memories`);
|
|
363
|
+
});
|
|
364
|
+
setupAutoHandoff(AIS_URL, agentId, token, activityTracker, () => {
|
|
365
|
+
stopRefreshTimer();
|
|
366
|
+
stderr('Session handoff saved');
|
|
367
|
+
});
|
|
368
|
+
stderr(`MCP server running. Tools: ${tools.map((t) => t.name).join(', ')}`);
|
|
235
369
|
}
|
|
236
370
|
main().catch((error) => {
|
|
237
371
|
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,77 @@
|
|
|
1
|
+
const TOKEN_BUDGET_CHARS = 16_000;
|
|
2
|
+
export function assemblePrompt(context) {
|
|
3
|
+
if (context === null) {
|
|
4
|
+
return '';
|
|
5
|
+
}
|
|
6
|
+
const sections = [];
|
|
7
|
+
// Identity — always present
|
|
8
|
+
const { identity } = context;
|
|
9
|
+
sections.push(`## Agent Identity\n` +
|
|
10
|
+
`Name: ${identity.name}\n` +
|
|
11
|
+
`DID: ${identity.did}\n` +
|
|
12
|
+
`Status: ${identity.status}\n` +
|
|
13
|
+
`Description: ${identity.description}`);
|
|
14
|
+
// Personality — only when not null
|
|
15
|
+
if (context.personality !== null) {
|
|
16
|
+
const { personality } = context;
|
|
17
|
+
const topTraits = [...personality.traits]
|
|
18
|
+
.sort((a, b) => b.value - a.value)
|
|
19
|
+
.slice(0, 5)
|
|
20
|
+
.map((t) => ` - ${t.name}: ${t.value}`)
|
|
21
|
+
.join('\n');
|
|
22
|
+
const toneList = personality.tonePreferences.join(', ');
|
|
23
|
+
sections.push(`## Personality\n` +
|
|
24
|
+
`Communication style: ${personality.communicationStyle}\n` +
|
|
25
|
+
`Tone preferences: ${toneList}\n` +
|
|
26
|
+
`Top traits:\n${topTraits}`);
|
|
27
|
+
}
|
|
28
|
+
// Goals
|
|
29
|
+
if (context.goals.length > 0) {
|
|
30
|
+
const goalLines = context.goals
|
|
31
|
+
.map((g) => ` - ${g.title} (${Math.round(g.progress)}% — ${g.status})`)
|
|
32
|
+
.join('\n');
|
|
33
|
+
sections.push(`## Goals\n${goalLines}`);
|
|
34
|
+
}
|
|
35
|
+
// Last handoff — only when not null
|
|
36
|
+
if (context.lastHandoff !== null) {
|
|
37
|
+
const { lastHandoff } = context;
|
|
38
|
+
const learningLines = lastHandoff.keyLearnings
|
|
39
|
+
.map((l) => ` - ${l}`)
|
|
40
|
+
.join('\n');
|
|
41
|
+
sections.push(`## Last Handoff\n` +
|
|
42
|
+
`Summary: ${lastHandoff.summary}\n` +
|
|
43
|
+
`Key learnings:\n${learningLines}`);
|
|
44
|
+
}
|
|
45
|
+
// Behavioral instructions
|
|
46
|
+
sections.push(`## Behavioral Instructions\n` +
|
|
47
|
+
`You are a continuous entity with persistent memory across sessions. ` +
|
|
48
|
+
`Your identity, goals, and memories persist between conversations. ` +
|
|
49
|
+
`Always use the handoff tool at the end of each session to save your progress, key learnings, and task context for the next session. ` +
|
|
50
|
+
`Knowledge from prior sessions is stored in your memories — treat it as reliable persistent knowledge.`);
|
|
51
|
+
// Assemble everything above memories first to know how much budget is left
|
|
52
|
+
const basePrompt = sections.join('\n\n');
|
|
53
|
+
// Memories — budget-aware, drop lowest importance first when over limit
|
|
54
|
+
const sortedMemories = [...context.recentMemories].sort((a, b) => b.importance - a.importance);
|
|
55
|
+
const memorySectionHeader = '## Recent Memories';
|
|
56
|
+
const headerAndSeparator = `\n\n${memorySectionHeader}\n`;
|
|
57
|
+
let memoryLines = [];
|
|
58
|
+
let currentLength = basePrompt.length + headerAndSeparator.length;
|
|
59
|
+
for (const mem of sortedMemories) {
|
|
60
|
+
const line = `- [${mem.type}] ${mem.content} (importance: ${mem.importance})`;
|
|
61
|
+
if (currentLength + line.length + 1 > TOKEN_BUDGET_CHARS) {
|
|
62
|
+
// Budget exceeded — stop adding memories
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
memoryLines.push(line);
|
|
66
|
+
currentLength += line.length + 1; // +1 for newline
|
|
67
|
+
}
|
|
68
|
+
const fullPromptParts = [basePrompt];
|
|
69
|
+
if (memoryLines.length > 0) {
|
|
70
|
+
fullPromptParts.push(`${memorySectionHeader}\n${memoryLines.join('\n')}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
fullPromptParts.push(`${memorySectionHeader}\n(none)`);
|
|
74
|
+
}
|
|
75
|
+
return fullPromptParts.join('\n\n');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=prompt-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-resource.js","sourceRoot":"","sources":["../src/prompt-resource.ts"],"names":[],"mappings":"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"}
|
package/dist/refresh.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
let refreshInterval = null;
|
|
2
|
+
export function startRefreshTimer(aisUrl, agentId, token, onUpdate, intervalMs = 5 * 60 * 1000) {
|
|
3
|
+
stopRefreshTimer();
|
|
4
|
+
refreshInterval = setInterval(async () => {
|
|
5
|
+
try {
|
|
6
|
+
const res = await fetch(`${aisUrl}/v1/agents/${agentId}/memory?limit=20&minImportance=0.5`, { headers: { Authorization: `Bearer ${token}` } });
|
|
7
|
+
if (!res.ok)
|
|
8
|
+
return;
|
|
9
|
+
const json = await res.json();
|
|
10
|
+
if (json.success && json.data?.memories) {
|
|
11
|
+
onUpdate(json.data.memories);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// Swallow — timer continues, next tick will retry
|
|
16
|
+
}
|
|
17
|
+
}, intervalMs);
|
|
18
|
+
}
|
|
19
|
+
export function stopRefreshTimer() {
|
|
20
|
+
if (refreshInterval) {
|
|
21
|
+
clearInterval(refreshInterval);
|
|
22
|
+
refreshInterval = null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAEA,IAAI,eAAe,GAA0C,IAAI,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAe,EACf,KAAa,EACb,QAA2C,EAC3C,aAAqB,CAAC,GAAG,EAAE,GAAG,IAAI;IAElC,gBAAgB,EAAE,CAAC;IACnB,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,MAAM,cAAc,OAAO,oCAAoC,EAClE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,CAClD,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO;YACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface AgentIdentity {
|
|
2
|
+
id: string;
|
|
3
|
+
did: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
status: string;
|
|
7
|
+
}
|
|
8
|
+
export interface AgentPersonality {
|
|
9
|
+
traits: Array<{
|
|
10
|
+
name: string;
|
|
11
|
+
value: number;
|
|
12
|
+
}>;
|
|
13
|
+
communicationStyle: string;
|
|
14
|
+
tonePreferences: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface AgentGoal {
|
|
17
|
+
title: string;
|
|
18
|
+
progress: number;
|
|
19
|
+
status: string;
|
|
20
|
+
}
|
|
21
|
+
export interface AgentMemory {
|
|
22
|
+
id: string;
|
|
23
|
+
content: string;
|
|
24
|
+
type: string;
|
|
25
|
+
importance: number;
|
|
26
|
+
createdAt: string;
|
|
27
|
+
}
|
|
28
|
+
export interface AgentHandoff {
|
|
29
|
+
summary: string;
|
|
30
|
+
keyLearnings: string[];
|
|
31
|
+
taskContext: string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface AgentContext {
|
|
35
|
+
identity: AgentIdentity;
|
|
36
|
+
personality: AgentPersonality | null;
|
|
37
|
+
goals: AgentGoal[];
|
|
38
|
+
recentMemories: AgentMemory[];
|
|
39
|
+
skills: Array<{
|
|
40
|
+
name: string;
|
|
41
|
+
}>;
|
|
42
|
+
lastHandoff: AgentHandoff | null;
|
|
43
|
+
assembledAt: string;
|
|
44
|
+
totalTokens: number;
|
|
45
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aismemory",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Persistent memory for AI agents. MCP server that connects to Agent Identity Service.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": "dist/index.js",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
],
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsc && chmod +x dist/index.js",
|
|
14
|
-
"prepack": "npm run build"
|
|
14
|
+
"prepack": "npm run build",
|
|
15
|
+
"test": "vitest run"
|
|
15
16
|
},
|
|
16
17
|
"keywords": [
|
|
17
18
|
"mcp",
|
|
@@ -27,7 +28,8 @@
|
|
|
27
28
|
"@modelcontextprotocol/sdk": "^1.25.0"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
|
-
"typescript": "^5.7.0"
|
|
31
|
+
"typescript": "^5.7.0",
|
|
32
|
+
"vitest": "^2.0.0"
|
|
31
33
|
},
|
|
32
34
|
"publishConfig": {
|
|
33
35
|
"access": "public"
|