@amaster.ai/pi-memory 0.1.2-beta.24 → 0.1.2-beta.26
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/dist/background-extraction.d.ts +89 -0
- package/dist/background-extraction.d.ts.map +1 -0
- package/dist/background-extraction.js +243 -0
- package/dist/background-extraction.js.map +1 -0
- package/dist/extension.d.ts +5 -0
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +117 -10
- package/dist/extension.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +16 -2
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background memory extraction via a sub-agent loop.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by hermes-agent's `background_review`: every N turns, a background
|
|
5
|
+
* Agent (from pi-agent-core) is spawned with access to the memory tools. It
|
|
6
|
+
* reads the current memory state, analyzes recent conversation, and
|
|
7
|
+
* autonomously adds/replaces/removes entries — handling capacity management
|
|
8
|
+
* that a single-shot LLM call cannot.
|
|
9
|
+
*
|
|
10
|
+
* Key design choices:
|
|
11
|
+
* - Full agent loop (not a single `complete()` call) so the sub-agent can
|
|
12
|
+
* react to tool results (e.g., capacity errors) and retry with replace.
|
|
13
|
+
* - Reuses `createMemoryTools(store)` from tools.ts — same tool definitions
|
|
14
|
+
* the main agent uses, cast to AgentTool (structurally compatible).
|
|
15
|
+
* - Fire-and-forget: extraction runs async, never blocks the main agent.
|
|
16
|
+
* - Mutual exclusion: skips if the main agent already wrote memory this turn.
|
|
17
|
+
* - Bounded: max 8 turns per extraction run (abort via subscriber).
|
|
18
|
+
*/
|
|
19
|
+
import type { MemoryStore } from './store.js';
|
|
20
|
+
export interface ExtractionModelConfig {
|
|
21
|
+
provider: string;
|
|
22
|
+
model: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ExtractionRunnerOptions {
|
|
25
|
+
store: MemoryStore;
|
|
26
|
+
modelConfig: ExtractionModelConfig;
|
|
27
|
+
/** How many user turns between extraction runs. */
|
|
28
|
+
interval: number;
|
|
29
|
+
/** Model registry for resolving provider/model. Falls back to AuthStorage if omitted. */
|
|
30
|
+
modelRegistry?: {
|
|
31
|
+
find(provider: string, model: string): unknown;
|
|
32
|
+
getApiKeyAndHeaders(model: unknown): Promise<{
|
|
33
|
+
ok: boolean;
|
|
34
|
+
apiKey?: string;
|
|
35
|
+
headers?: Record<string, string>;
|
|
36
|
+
error?: string;
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
39
|
+
/** Callback for user-visible notifications. */
|
|
40
|
+
onNotify?: (message: string, level: 'info' | 'warning') => void;
|
|
41
|
+
}
|
|
42
|
+
export interface ExtractionRunner {
|
|
43
|
+
/** Called on every turn_end event from the extension. Manages cadence internally. */
|
|
44
|
+
onTurnEnd(event: TurnEndEvent): void;
|
|
45
|
+
/** Signal that the session is ending — abort any in-flight extraction. */
|
|
46
|
+
shutdown(): void;
|
|
47
|
+
}
|
|
48
|
+
export interface TurnEndEvent {
|
|
49
|
+
turnIndex: number;
|
|
50
|
+
message: AgentMessage;
|
|
51
|
+
toolResults: ToolResultMessage[];
|
|
52
|
+
}
|
|
53
|
+
interface AgentMessage {
|
|
54
|
+
role: string;
|
|
55
|
+
content?: unknown;
|
|
56
|
+
timestamp?: number;
|
|
57
|
+
}
|
|
58
|
+
interface ToolResultMessage {
|
|
59
|
+
toolName: string;
|
|
60
|
+
isError: boolean;
|
|
61
|
+
content?: unknown;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Creates a background extraction runner that periodically spawns a sub-agent
|
|
65
|
+
* to review recent conversation and write to the memory store.
|
|
66
|
+
*
|
|
67
|
+
* The runner is stateful: it counts turns, buffers messages, and manages
|
|
68
|
+
* the in-flight state of the background agent.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createExtractionRunner(opts: ExtractionRunnerOptions): ExtractionRunner;
|
|
71
|
+
/** Check if main agent successfully wrote memory this turn. */
|
|
72
|
+
export declare function mainAgentWroteMemory(toolResults: ToolResultMessage[]): boolean;
|
|
73
|
+
/** Extract plain text from a message content (string or content-block array). */
|
|
74
|
+
export declare function extractTextFromMessage(msg: AgentMessage): string;
|
|
75
|
+
/**
|
|
76
|
+
* Serialize messages into a compact text format for the sub-agent, capped at
|
|
77
|
+
* MAX_CONTEXT_CHARS. Works backwards from newest to preserve the most recent context.
|
|
78
|
+
*/
|
|
79
|
+
export declare function serializeMessages(messages: Array<{
|
|
80
|
+
role: string;
|
|
81
|
+
text: string;
|
|
82
|
+
}>): string;
|
|
83
|
+
/**
|
|
84
|
+
* Count successful memory write actions in the sub-agent's transcript.
|
|
85
|
+
* Looks for toolResult messages with success:true for add/replace/remove tools.
|
|
86
|
+
*/
|
|
87
|
+
export declare function countMemoryActions(messages: unknown[]): number;
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=background-extraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-extraction.d.ts","sourceRoot":"","sources":["../src/background-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,qBAAqB,CAAC;IACnC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,aAAa,CAAC,EAAE;QACd,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,mBAAmB,CACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC;YAAE,EAAE,EAAE,OAAO,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAChG,CAAC;IACF,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,0EAA0E;IAC1E,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAsCD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,uBAAuB,GAAG,gBAAgB,CA8HtF;AAMD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAE9E;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAShE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAazF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAkB9D"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background memory extraction via a sub-agent loop.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by hermes-agent's `background_review`: every N turns, a background
|
|
5
|
+
* Agent (from pi-agent-core) is spawned with access to the memory tools. It
|
|
6
|
+
* reads the current memory state, analyzes recent conversation, and
|
|
7
|
+
* autonomously adds/replaces/removes entries — handling capacity management
|
|
8
|
+
* that a single-shot LLM call cannot.
|
|
9
|
+
*
|
|
10
|
+
* Key design choices:
|
|
11
|
+
* - Full agent loop (not a single `complete()` call) so the sub-agent can
|
|
12
|
+
* react to tool results (e.g., capacity errors) and retry with replace.
|
|
13
|
+
* - Reuses `createMemoryTools(store)` from tools.ts — same tool definitions
|
|
14
|
+
* the main agent uses, cast to AgentTool (structurally compatible).
|
|
15
|
+
* - Fire-and-forget: extraction runs async, never blocks the main agent.
|
|
16
|
+
* - Mutual exclusion: skips if the main agent already wrote memory this turn.
|
|
17
|
+
* - Bounded: max 8 turns per extraction run (abort via subscriber).
|
|
18
|
+
*/
|
|
19
|
+
import { Agent } from '@earendil-works/pi-agent-core';
|
|
20
|
+
import { streamSimple } from '@earendil-works/pi-ai';
|
|
21
|
+
import { AuthStorage, ModelRegistry } from '@earendil-works/pi-coding-agent';
|
|
22
|
+
import { createMemoryTools } from './tools.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Constants
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/** Tool names that count as "main agent wrote memory this turn". */
|
|
27
|
+
const MEMORY_WRITE_TOOLS = new Set(['memory_add', 'memory_replace']);
|
|
28
|
+
/** Max chars of serialized conversation to pass to the sub-agent. */
|
|
29
|
+
const MAX_CONTEXT_CHARS = 4000;
|
|
30
|
+
/** Hard cap on sub-agent turns to prevent runaway loops. */
|
|
31
|
+
const MAX_AGENT_TURNS = 8;
|
|
32
|
+
const REVIEW_SYSTEM_PROMPT = `You are a background memory reviewer. You analyze recent conversations and save any durable facts the main agent missed.
|
|
33
|
+
|
|
34
|
+
You have access to memory_read, memory_add, memory_replace, and memory_remove tools.
|
|
35
|
+
|
|
36
|
+
WORKFLOW:
|
|
37
|
+
1. First call memory_read for both targets to see current state and capacity.
|
|
38
|
+
2. Identify new facts from the conversation worth saving (preferences, corrections, environment, conventions).
|
|
39
|
+
3. For each fact: if it updates an existing entry, use memory_replace. If it's new, use memory_add. If an entry is now stale/wrong, use memory_remove.
|
|
40
|
+
4. When done (or nothing to save), respond with a brief summary of actions taken.
|
|
41
|
+
|
|
42
|
+
RULES:
|
|
43
|
+
- Only save facts that will matter in future sessions.
|
|
44
|
+
- Do NOT save task progress, PRs, commits, or anything stale in a week.
|
|
45
|
+
- Write entries as declarative facts, not instructions. "User prefers tabs" not "Always use tabs".
|
|
46
|
+
- Prefer "user" target for personal preferences, habits, identity. Use "memory" for project/environment/tool facts.
|
|
47
|
+
- Respect capacity limits — if full, replace or remove before adding.
|
|
48
|
+
- Be conservative: when in doubt, don't save. Only save what clearly reduces future user corrections.
|
|
49
|
+
- Keep each entry concise (under 120 characters when possible).`;
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Runner factory
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Creates a background extraction runner that periodically spawns a sub-agent
|
|
55
|
+
* to review recent conversation and write to the memory store.
|
|
56
|
+
*
|
|
57
|
+
* The runner is stateful: it counts turns, buffers messages, and manages
|
|
58
|
+
* the in-flight state of the background agent.
|
|
59
|
+
*/
|
|
60
|
+
export function createExtractionRunner(opts) {
|
|
61
|
+
const { store, modelConfig, interval, modelRegistry, onNotify } = opts;
|
|
62
|
+
let turnsSinceExtraction = 0;
|
|
63
|
+
let lastExtractionTurnIndex = -1;
|
|
64
|
+
let inFlight = false;
|
|
65
|
+
let shutdownFlag = false;
|
|
66
|
+
let warnedOnce = false;
|
|
67
|
+
/** Rolling buffer of conversation messages for the sub-agent's context. */
|
|
68
|
+
const messageBuffer = [];
|
|
69
|
+
function onTurnEnd(event) {
|
|
70
|
+
bufferMessage(event);
|
|
71
|
+
turnsSinceExtraction++;
|
|
72
|
+
if (!shouldExtract(event))
|
|
73
|
+
return;
|
|
74
|
+
inFlight = true;
|
|
75
|
+
turnsSinceExtraction = 0;
|
|
76
|
+
const sinceTurn = lastExtractionTurnIndex;
|
|
77
|
+
lastExtractionTurnIndex = event.turnIndex;
|
|
78
|
+
// Only pass messages since last extraction to avoid re-processing.
|
|
79
|
+
const messagesToAnalyze = messageBuffer.filter((m) => sinceTurn < 0 || m.turnIndex > sinceTurn);
|
|
80
|
+
// Fire-and-forget: never block the main agent.
|
|
81
|
+
runExtraction(messagesToAnalyze)
|
|
82
|
+
.then((actionCount) => {
|
|
83
|
+
if (actionCount > 0 && onNotify) {
|
|
84
|
+
onNotify(`Background memory: ${actionCount} action${actionCount === 1 ? '' : 's'} taken.`, 'info');
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
.catch(() => { })
|
|
88
|
+
.finally(() => {
|
|
89
|
+
inFlight = false;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/** Gate checks — cheapest first. */
|
|
93
|
+
function shouldExtract(event) {
|
|
94
|
+
if (turnsSinceExtraction < interval)
|
|
95
|
+
return false;
|
|
96
|
+
if (inFlight)
|
|
97
|
+
return false;
|
|
98
|
+
if (shutdownFlag)
|
|
99
|
+
return false;
|
|
100
|
+
// Skip if main agent already wrote memory this turn (avoid redundant work).
|
|
101
|
+
if (mainAgentWroteMemory(event.toolResults)) {
|
|
102
|
+
turnsSinceExtraction = 0;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function bufferMessage(event) {
|
|
108
|
+
const text = extractTextFromMessage(event.message);
|
|
109
|
+
if (text) {
|
|
110
|
+
messageBuffer.push({ role: event.message.role, text, turnIndex: event.turnIndex });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Spawn a sub-agent with memory tools, let it analyze conversation and write.
|
|
115
|
+
* Returns the number of successful memory actions taken.
|
|
116
|
+
*/
|
|
117
|
+
async function runExtraction(messages) {
|
|
118
|
+
if (messages.length === 0)
|
|
119
|
+
return 0;
|
|
120
|
+
const registry = modelRegistry ?? createFallbackRegistry();
|
|
121
|
+
const model = registry.find(modelConfig.provider, modelConfig.model);
|
|
122
|
+
if (!model) {
|
|
123
|
+
if (!warnedOnce && onNotify) {
|
|
124
|
+
onNotify(`Background extraction: model "${modelConfig.provider}/${modelConfig.model}" not found.`, 'warning');
|
|
125
|
+
warnedOnce = true;
|
|
126
|
+
}
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
129
|
+
const auth = await registry.getApiKeyAndHeaders(model);
|
|
130
|
+
if (!auth.ok)
|
|
131
|
+
return 0;
|
|
132
|
+
// Reuse the same tool definitions as the main agent — structurally compatible.
|
|
133
|
+
const tools = createMemoryTools(store);
|
|
134
|
+
const serialized = serializeMessages(messages);
|
|
135
|
+
const userPrompt = `Analyze this recent conversation and save any durable facts worth remembering:\n\n${serialized}`;
|
|
136
|
+
let turnCount = 0;
|
|
137
|
+
const agent = new Agent({
|
|
138
|
+
initialState: {
|
|
139
|
+
systemPrompt: REVIEW_SYSTEM_PROMPT,
|
|
140
|
+
model: model,
|
|
141
|
+
tools,
|
|
142
|
+
},
|
|
143
|
+
streamFn: (m, ctx, streamOpts) => {
|
|
144
|
+
const merged = { ...streamOpts };
|
|
145
|
+
if (auth.apiKey)
|
|
146
|
+
merged.apiKey = auth.apiKey;
|
|
147
|
+
if (auth.headers)
|
|
148
|
+
merged.headers = auth.headers;
|
|
149
|
+
return streamSimple(m, ctx, merged);
|
|
150
|
+
},
|
|
151
|
+
convertToLlm: (msgs) => msgs,
|
|
152
|
+
});
|
|
153
|
+
// Bound compute: abort after MAX_AGENT_TURNS to prevent runaway loops.
|
|
154
|
+
agent.subscribe((event) => {
|
|
155
|
+
if (event.type === 'turn_end') {
|
|
156
|
+
turnCount++;
|
|
157
|
+
if (turnCount >= MAX_AGENT_TURNS || shutdownFlag) {
|
|
158
|
+
agent.abort();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
await agent.prompt(userPrompt);
|
|
163
|
+
return countMemoryActions(agent.state.messages);
|
|
164
|
+
}
|
|
165
|
+
function shutdown() {
|
|
166
|
+
shutdownFlag = true;
|
|
167
|
+
}
|
|
168
|
+
return { onTurnEnd, shutdown };
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Helpers (exported for testing)
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/** Check if main agent successfully wrote memory this turn. */
|
|
174
|
+
export function mainAgentWroteMemory(toolResults) {
|
|
175
|
+
return toolResults.some((tr) => MEMORY_WRITE_TOOLS.has(tr.toolName) && !tr.isError);
|
|
176
|
+
}
|
|
177
|
+
/** Extract plain text from a message content (string or content-block array). */
|
|
178
|
+
export function extractTextFromMessage(msg) {
|
|
179
|
+
if (typeof msg.content === 'string')
|
|
180
|
+
return msg.content;
|
|
181
|
+
if (Array.isArray(msg.content)) {
|
|
182
|
+
return msg.content
|
|
183
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
184
|
+
.map((c) => c.text)
|
|
185
|
+
.join('\n');
|
|
186
|
+
}
|
|
187
|
+
return '';
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Serialize messages into a compact text format for the sub-agent, capped at
|
|
191
|
+
* MAX_CONTEXT_CHARS. Works backwards from newest to preserve the most recent context.
|
|
192
|
+
*/
|
|
193
|
+
export function serializeMessages(messages) {
|
|
194
|
+
const lines = [];
|
|
195
|
+
let totalChars = 0;
|
|
196
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
197
|
+
const m = messages[i];
|
|
198
|
+
const line = `[${m.role}] ${m.text}`;
|
|
199
|
+
if (totalChars + line.length > MAX_CONTEXT_CHARS && lines.length > 0)
|
|
200
|
+
break;
|
|
201
|
+
lines.unshift(line);
|
|
202
|
+
totalChars += line.length;
|
|
203
|
+
}
|
|
204
|
+
return lines.join('\n\n');
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Count successful memory write actions in the sub-agent's transcript.
|
|
208
|
+
* Looks for toolResult messages with success:true for add/replace/remove tools.
|
|
209
|
+
*/
|
|
210
|
+
export function countMemoryActions(messages) {
|
|
211
|
+
let count = 0;
|
|
212
|
+
for (const msg of messages) {
|
|
213
|
+
const m = msg;
|
|
214
|
+
if (m.role !== 'toolResult')
|
|
215
|
+
continue;
|
|
216
|
+
if (!m.toolName || m.toolName === 'memory_read')
|
|
217
|
+
continue;
|
|
218
|
+
if (m.isError)
|
|
219
|
+
continue;
|
|
220
|
+
const text = Array.isArray(m.content)
|
|
221
|
+
? m.content
|
|
222
|
+
.filter((c) => c.type === 'text')
|
|
223
|
+
.map((c) => c.text ?? '')
|
|
224
|
+
.join('')
|
|
225
|
+
: '';
|
|
226
|
+
if (text.includes('"success": true') || text.includes('"success":true')) {
|
|
227
|
+
count++;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return count;
|
|
231
|
+
}
|
|
232
|
+
function createFallbackRegistry() {
|
|
233
|
+
const authStorage = AuthStorage.create();
|
|
234
|
+
const registry = ModelRegistry.create(authStorage);
|
|
235
|
+
return {
|
|
236
|
+
find: (provider, model) => registry.find(provider, model),
|
|
237
|
+
getApiKeyAndHeaders: async (model) => {
|
|
238
|
+
const auth = await registry.getApiKeyAndHeaders(model);
|
|
239
|
+
return auth;
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=background-extraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-extraction.js","sourceRoot":"","sources":["../src/background-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,EAAkB,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoD/C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAErE,qEAAqE;AACrE,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,4DAA4D;AAC5D,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;gEAiBmC,CAAC;AAEjE,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAA6B;IAClE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAEvE,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,uBAAuB,GAAG,CAAC,CAAC,CAAC;IACjC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,2EAA2E;IAC3E,MAAM,aAAa,GAA6D,EAAE,CAAC;IAEnF,SAAS,SAAS,CAAC,KAAmB;QACpC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,oBAAoB,EAAE,CAAC;QAEvB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO;QAElC,QAAQ,GAAG,IAAI,CAAC;QAChB,oBAAoB,GAAG,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,uBAAuB,CAAC;QAC1C,uBAAuB,GAAG,KAAK,CAAC,SAAS,CAAC;QAE1C,mEAAmE;QACnE,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;QAEhG,+CAA+C;QAC/C,aAAa,CAAC,iBAAiB,CAAC;aAC7B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;YACpB,IAAI,WAAW,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAChC,QAAQ,CACN,sBAAsB,WAAW,UAAU,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,EAChF,MAAM,CACP,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,oCAAoC;IACpC,SAAS,aAAa,CAAC,KAAmB;QACxC,IAAI,oBAAoB,GAAG,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClD,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,YAAY;YAAE,OAAO,KAAK,CAAC;QAC/B,4EAA4E;QAC5E,IAAI,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,oBAAoB,GAAG,CAAC,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,aAAa,CAAC,KAAmB;QACxC,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,IAAI,EAAE,CAAC;YACT,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,UAAU,aAAa,CAAC,QAA+C;QAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,aAAa,IAAI,sBAAsB,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;gBAC5B,QAAQ,CACN,iCAAiC,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,cAAc,EACxF,SAAS,CACV,CAAC;gBACF,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC;QAEvB,+EAA+E;QAC/E,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAA2B,CAAC;QACjE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,qFAAqF,UAAU,EAAE,CAAC;QAErH,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,YAAY,EAAE;gBACZ,YAAY,EAAE,oBAAoB;gBAClC,KAAK,EAAE,KAAc;gBACrB,KAAK;aACN;YACD,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;gBAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,MAAM;oBAAG,MAAkC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC1E,IAAI,IAAI,CAAC,OAAO;oBAAG,MAAkC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7E,OAAO,YAAY,CAAC,CAAU,EAAE,GAAY,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;YACD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAe;SACxC,CAAC,CAAC;QAEH,uEAAuE;QACvE,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,IAAI,eAAe,IAAI,YAAY,EAAE,CAAC;oBACjD,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/B,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,SAAS,QAAQ;QACf,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,WAAgC;IACnE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,sBAAsB,CAAC,GAAiB;IACtD,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAQ,GAAG,CAAC,OAAkD;aAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;aAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAK,CAAC;aACnB,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAA+C;IAC/E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,iBAAiB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM;QAC5E,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAmB;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,GAAiF,CAAC;QAC5F,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS;QACtC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,aAAa;YAAE,SAAS;QAC1D,IAAI,CAAC,CAAC,OAAO;YAAE,SAAS;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,CAAC,CAAE,CAAC,CAAC,OAAmD;iBACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;iBACxB,IAAI,CAAC,EAAE,CAAC;YACb,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxE,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB;IAC7B,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO;QACL,IAAI,EAAE,CAAC,QAAgB,EAAE,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;QACzE,mBAAmB,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,KAAc,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/extension.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
import { type ExtractionModelConfig } from './background-extraction.js';
|
|
2
3
|
import { MemoryStore } from './store.js';
|
|
3
4
|
export type PiMemoryExtensionConfig = {
|
|
4
5
|
/** Directory containing MEMORY.md / USER.md. Default: `<agentDir>/memories`. */
|
|
@@ -9,6 +10,10 @@ export type PiMemoryExtensionConfig = {
|
|
|
9
10
|
userCharLimit?: number;
|
|
10
11
|
/** Pre-built store (host-controlled mode). */
|
|
11
12
|
store?: MemoryStore;
|
|
13
|
+
/** Model for background memory extraction. Omit to disable extraction. */
|
|
14
|
+
extractionModel?: ExtractionModelConfig;
|
|
15
|
+
/** Turns between extraction runs. Default: 5. */
|
|
16
|
+
extractionInterval?: number;
|
|
12
17
|
};
|
|
13
18
|
export default function memoryExtension(pi: ExtensionAPI, injectedConfig?: PiMemoryExtensionConfig): void;
|
|
14
19
|
//# sourceMappingURL=extension.d.ts.map
|
package/dist/extension.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoBzC,MAAM,MAAM,uBAAuB,GAAG;IACpC,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoBzC,MAAM,MAAM,uBAAuB,GAAG;IACpC,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAkCF,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,EAAE,EAAE,YAAY,EAChB,cAAc,CAAC,EAAE,uBAAuB,GACvC,IAAI,CAkMN"}
|
package/dist/extension.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { loadPiSettings,
|
|
2
|
+
import { loadPiSettings, resolveHome } from '@amaster.ai/pi-shared/settings';
|
|
3
|
+
import { createExtractionRunner, } from './background-extraction.js';
|
|
3
4
|
import { MemoryStore } from './store.js';
|
|
4
5
|
import { createMemoryTools } from './tools.js';
|
|
5
6
|
const SETTINGS_KEY = 'pi-memory';
|
|
@@ -19,7 +20,8 @@ const MEMORY_GUIDANCE = [
|
|
|
19
20
|
].join('\n');
|
|
20
21
|
function resolveConfig(raw) {
|
|
21
22
|
const resolved = {
|
|
22
|
-
dataDir: raw?.dataDir?.trim() || path.join(
|
|
23
|
+
dataDir: raw?.dataDir?.trim() || path.join(resolveHome(), 'memories'),
|
|
24
|
+
extractionInterval: raw?.extractionInterval ?? 5,
|
|
23
25
|
};
|
|
24
26
|
if (raw?.memoryCharLimit !== undefined)
|
|
25
27
|
resolved.memoryCharLimit = raw.memoryCharLimit;
|
|
@@ -27,13 +29,14 @@ function resolveConfig(raw) {
|
|
|
27
29
|
resolved.userCharLimit = raw.userCharLimit;
|
|
28
30
|
if (raw?.store)
|
|
29
31
|
resolved.store = raw.store;
|
|
32
|
+
if (raw?.extractionModel)
|
|
33
|
+
resolved.extractionModel = raw.extractionModel;
|
|
30
34
|
return resolved;
|
|
31
35
|
}
|
|
32
36
|
function loadSettings(cwd) {
|
|
33
37
|
try {
|
|
34
38
|
const config = loadPiSettings(SETTINGS_KEY, {
|
|
35
39
|
cwd,
|
|
36
|
-
agentDir: resolveAgentDir(),
|
|
37
40
|
});
|
|
38
41
|
return Object.keys(config).length > 0 ? config : undefined;
|
|
39
42
|
}
|
|
@@ -44,6 +47,7 @@ function loadSettings(cwd) {
|
|
|
44
47
|
export default function memoryExtension(pi, injectedConfig) {
|
|
45
48
|
let store;
|
|
46
49
|
let snapshot = '';
|
|
50
|
+
let extractionRunner;
|
|
47
51
|
pi.on('session_start', async (_event, ctx) => {
|
|
48
52
|
const fileConfig = loadSettings(ctx.cwd);
|
|
49
53
|
const config = resolveConfig({ ...fileConfig, ...injectedConfig });
|
|
@@ -65,13 +69,26 @@ export default function memoryExtension(pi, injectedConfig) {
|
|
|
65
69
|
for (const tool of createMemoryTools(store)) {
|
|
66
70
|
pi.registerTool(tool);
|
|
67
71
|
}
|
|
72
|
+
if (config.extractionModel && store) {
|
|
73
|
+
extractionRunner = createExtractionRunner({
|
|
74
|
+
store,
|
|
75
|
+
modelConfig: config.extractionModel,
|
|
76
|
+
interval: config.extractionInterval,
|
|
77
|
+
modelRegistry: ctx.modelRegistry,
|
|
78
|
+
onNotify: (msg, level) => ctx.ui.notify(msg, level),
|
|
79
|
+
});
|
|
80
|
+
}
|
|
68
81
|
}
|
|
69
82
|
catch (err) {
|
|
70
83
|
ctx.ui.setStatus(STATUS_KEY, 'memory: unavailable');
|
|
71
|
-
// Surface as a notification only — registration failure shouldn't crash the session.
|
|
72
84
|
ctx.ui.notify(`pi-memory failed to initialize: ${err instanceof Error ? err.message : String(err)}`, 'error');
|
|
73
85
|
}
|
|
74
86
|
});
|
|
87
|
+
pi.on('turn_end', async (event) => {
|
|
88
|
+
if (!extractionRunner)
|
|
89
|
+
return;
|
|
90
|
+
extractionRunner.onTurnEnd(event);
|
|
91
|
+
});
|
|
75
92
|
pi.on('before_agent_start', async (event) => {
|
|
76
93
|
const block = snapshot ? `${MEMORY_GUIDANCE}\n\n${snapshot}` : MEMORY_GUIDANCE;
|
|
77
94
|
return {
|
|
@@ -79,19 +96,109 @@ export default function memoryExtension(pi, injectedConfig) {
|
|
|
79
96
|
};
|
|
80
97
|
});
|
|
81
98
|
pi.on('session_shutdown', async () => {
|
|
99
|
+
extractionRunner?.shutdown();
|
|
100
|
+
extractionRunner = undefined;
|
|
82
101
|
store = undefined;
|
|
83
102
|
snapshot = '';
|
|
84
103
|
});
|
|
85
|
-
pi.registerCommand('
|
|
86
|
-
description: '
|
|
87
|
-
|
|
104
|
+
pi.registerCommand('memory', {
|
|
105
|
+
description: 'Manage persistent memory. Subcommands: status, read, add, replace, remove.',
|
|
106
|
+
getArgumentCompletions: (prefix) => {
|
|
107
|
+
const subcommands = ['status', 'read', 'add', 'replace', 'remove'];
|
|
108
|
+
const matches = subcommands.filter((s) => s.startsWith(prefix.trim().toLowerCase()));
|
|
109
|
+
return matches.map((s) => ({ label: s, value: s }));
|
|
110
|
+
},
|
|
111
|
+
handler: async (args, ctx) => {
|
|
88
112
|
if (!store) {
|
|
89
113
|
ctx.ui.notify('pi-memory is not loaded.', 'warning');
|
|
90
114
|
return;
|
|
91
115
|
}
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
116
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
117
|
+
const subcommand = parts[0]?.toLowerCase() ?? 'status';
|
|
118
|
+
const rest = parts.slice(1).join(' ').trim();
|
|
119
|
+
switch (subcommand) {
|
|
120
|
+
case 'status': {
|
|
121
|
+
const memResult = await store.read('memory');
|
|
122
|
+
const userResult = await store.read('user');
|
|
123
|
+
ctx.ui.notify(`MEMORY.md: ${memResult.entryCount} entries (${memResult.usage})\nUSER.md: ${userResult.entryCount} entries (${userResult.usage})`, 'info');
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
case 'read': {
|
|
127
|
+
const target = rest === 'user' ? 'user' : 'memory';
|
|
128
|
+
const result = await store.read(target);
|
|
129
|
+
if (result.entries.length === 0) {
|
|
130
|
+
ctx.ui.notify(`${target}: (empty)`, 'info');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
ctx.ui.notify(`${target} [${result.usage}]:\n${result.entries.map((e, i) => `${i + 1}. ${e}`).join('\n')}`, 'info');
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
case 'add': {
|
|
138
|
+
if (!rest) {
|
|
139
|
+
ctx.ui.notify('Usage: /memory add [user|memory] <content>', 'warning');
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
const addParts = rest.split(/\s+/);
|
|
143
|
+
let target = 'memory';
|
|
144
|
+
let content = rest;
|
|
145
|
+
if (addParts[0] === 'user' || addParts[0] === 'memory') {
|
|
146
|
+
target = addParts[0];
|
|
147
|
+
content = addParts.slice(1).join(' ');
|
|
148
|
+
}
|
|
149
|
+
if (!content) {
|
|
150
|
+
ctx.ui.notify('Usage: /memory add [user|memory] <content>', 'warning');
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
const addResult = await store.add(target, content);
|
|
154
|
+
ctx.ui.notify(addResult.success ? `Added to ${target}.` : `Failed: ${addResult.error}`, addResult.success ? 'info' : 'warning');
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case 'replace': {
|
|
158
|
+
// Format: /memory replace [target] <oldText> -> <newContent>
|
|
159
|
+
if (!rest?.includes('->')) {
|
|
160
|
+
ctx.ui.notify('Usage: /memory replace [user|memory] <oldText> -> <newContent>', 'warning');
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
const replaceParts = rest.split(/\s+/);
|
|
164
|
+
let rTarget = 'memory';
|
|
165
|
+
let replaceBody = rest;
|
|
166
|
+
if (replaceParts[0] === 'user' || replaceParts[0] === 'memory') {
|
|
167
|
+
rTarget = replaceParts[0];
|
|
168
|
+
replaceBody = replaceParts.slice(1).join(' ');
|
|
169
|
+
}
|
|
170
|
+
const [oldText, newContent] = replaceBody.split('->').map((s) => s.trim());
|
|
171
|
+
if (!oldText || !newContent) {
|
|
172
|
+
ctx.ui.notify('Usage: /memory replace [user|memory] <oldText> -> <newContent>', 'warning');
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
const replaceResult = await store.replace(rTarget, oldText, newContent);
|
|
176
|
+
ctx.ui.notify(replaceResult.success ? `Replaced in ${rTarget}.` : `Failed: ${replaceResult.error}`, replaceResult.success ? 'info' : 'warning');
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
case 'remove': {
|
|
180
|
+
if (!rest) {
|
|
181
|
+
ctx.ui.notify('Usage: /memory remove [user|memory] <substring>', 'warning');
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
const rmParts = rest.split(/\s+/);
|
|
185
|
+
let rmTarget = 'memory';
|
|
186
|
+
let rmText = rest;
|
|
187
|
+
if (rmParts[0] === 'user' || rmParts[0] === 'memory') {
|
|
188
|
+
rmTarget = rmParts[0];
|
|
189
|
+
rmText = rmParts.slice(1).join(' ');
|
|
190
|
+
}
|
|
191
|
+
if (!rmText) {
|
|
192
|
+
ctx.ui.notify('Usage: /memory remove [user|memory] <substring>', 'warning');
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
const rmResult = await store.remove(rmTarget, rmText);
|
|
196
|
+
ctx.ui.notify(rmResult.success ? `Removed from ${rmTarget}.` : `Failed: ${rmResult.error}`, rmResult.success ? 'info' : 'warning');
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
default:
|
|
200
|
+
ctx.ui.notify('Unknown subcommand. Available: status, read, add, replace, remove.', 'warning');
|
|
201
|
+
}
|
|
95
202
|
},
|
|
96
203
|
});
|
|
97
204
|
}
|
package/dist/extension.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
export type { ExtractionModelConfig, ExtractionRunner } from './background-extraction.js';
|
|
2
|
+
export { createExtractionRunner } from './background-extraction.js';
|
|
3
|
+
export type { PiMemoryExtensionConfig } from './extension.js';
|
|
1
4
|
export { default } from './extension.js';
|
|
2
5
|
export type { MemoryDriftError, MemoryErrorResult, MemoryResult, MemoryStoreOptions, MemorySuccessResult, MemoryTarget, } from './store.js';
|
|
3
6
|
export { ENTRY_DELIMITER, MemoryStore } from './store.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AASzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amaster.ai/pi-memory",
|
|
3
|
-
"version": "0.1.2-beta.
|
|
3
|
+
"version": "0.1.2-beta.26",
|
|
4
4
|
"description": "Pi extension providing persistent curated memory (MEMORY.md + USER.md) injected into the system prompt as a frozen snapshot.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package",
|
|
@@ -35,6 +35,10 @@
|
|
|
35
35
|
"types": "./dist/threat-patterns.d.ts",
|
|
36
36
|
"default": "./dist/threat-patterns.js"
|
|
37
37
|
},
|
|
38
|
+
"./background-extraction": {
|
|
39
|
+
"types": "./dist/background-extraction.d.ts",
|
|
40
|
+
"default": "./dist/background-extraction.js"
|
|
41
|
+
},
|
|
38
42
|
"./package.json": {
|
|
39
43
|
"default": "./package.json"
|
|
40
44
|
}
|
|
@@ -60,13 +64,21 @@
|
|
|
60
64
|
},
|
|
61
65
|
"dependencies": {
|
|
62
66
|
"proper-lockfile": "^4.1.2",
|
|
63
|
-
"@amaster.ai/pi-shared": "0.1.2-beta.
|
|
67
|
+
"@amaster.ai/pi-shared": "0.1.2-beta.26"
|
|
64
68
|
},
|
|
65
69
|
"peerDependencies": {
|
|
70
|
+
"@earendil-works/pi-agent-core": ">=0.74.0",
|
|
71
|
+
"@earendil-works/pi-ai": ">=0.74.0",
|
|
66
72
|
"@earendil-works/pi-coding-agent": ">=0.74.0",
|
|
67
73
|
"typebox": "*"
|
|
68
74
|
},
|
|
69
75
|
"peerDependenciesMeta": {
|
|
76
|
+
"@earendil-works/pi-agent-core": {
|
|
77
|
+
"optional": true
|
|
78
|
+
},
|
|
79
|
+
"@earendil-works/pi-ai": {
|
|
80
|
+
"optional": true
|
|
81
|
+
},
|
|
70
82
|
"@earendil-works/pi-coding-agent": {
|
|
71
83
|
"optional": true
|
|
72
84
|
},
|
|
@@ -75,6 +87,8 @@
|
|
|
75
87
|
}
|
|
76
88
|
},
|
|
77
89
|
"devDependencies": {
|
|
90
|
+
"@earendil-works/pi-agent-core": "0.74.0",
|
|
91
|
+
"@earendil-works/pi-ai": "0.74.0",
|
|
78
92
|
"@earendil-works/pi-coding-agent": "0.74.0",
|
|
79
93
|
"@types/proper-lockfile": "^4.1.4",
|
|
80
94
|
"typebox": "*",
|