@amaster.ai/pi-memory 0.1.5 → 0.1.7
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 +12 -24
- package/dist/background-extraction.d.ts +1 -1
- package/dist/background-extraction.d.ts.map +1 -1
- package/dist/background-extraction.js +5 -5
- package/dist/background-extraction.js.map +1 -1
- package/dist/consolidation.d.ts +14 -3
- package/dist/consolidation.d.ts.map +1 -1
- package/dist/consolidation.js.map +1 -1
- package/dist/dream.d.ts +25 -0
- package/dist/dream.d.ts.map +1 -0
- package/dist/dream.js +151 -0
- package/dist/dream.js.map +1 -0
- package/dist/dreaming-state.d.ts +2 -2
- package/dist/dreaming-state.d.ts.map +1 -1
- package/dist/dreaming-state.js +6 -6
- package/dist/dreaming-state.js.map +1 -1
- package/dist/extension.d.ts +2 -7
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +16 -37
- package/dist/extension.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +7 -12
- package/dist/cli/dream.d.ts +0 -3
- package/dist/cli/dream.d.ts.map +0 -1
- package/dist/cli/dream.js +0 -115
- package/dist/cli/dream.js.map +0 -1
package/README.md
CHANGED
|
@@ -64,6 +64,10 @@ pi.extensions → session_start → initialize store → register tools
|
|
|
64
64
|
|
|
65
65
|
Configure via the `pi-memory` settings key:
|
|
66
66
|
|
|
67
|
+
Project `.pi/settings.json` values are loaded only after project trust is
|
|
68
|
+
accepted and are not environment-interpolated. User and agent settings retain
|
|
69
|
+
environment interpolation.
|
|
70
|
+
|
|
67
71
|
```json
|
|
68
72
|
{
|
|
69
73
|
"pi-memory": {
|
|
@@ -126,26 +130,21 @@ The drift guard exists to prevent silent data loss — never bypass it by deleti
|
|
|
126
130
|
|
|
127
131
|
| Hook | Behavior |
|
|
128
132
|
|-----------------------|---------------------------------------------------------------------------|
|
|
129
|
-
| `session_start` | Resolve `dataDir`, build `MemoryStore`, `loadFromDisk()`, register 4 tools, set status `memory: loaded`/`memory: empty
|
|
133
|
+
| `session_start` | Resolve `dataDir`, build `MemoryStore`, `loadFromDisk()`, register 4 tools, set status `memory: loaded`/`memory: empty`, and start a gated background dream. |
|
|
130
134
|
| `before_agent_start` | Reload memory from disk, rebuild the prompt snapshot, and append it to assembled `systemPrompt` (guidance only when empty). |
|
|
131
135
|
| `session_shutdown` | Drop store references. |
|
|
132
136
|
|
|
133
|
-
## Dreaming (
|
|
137
|
+
## Dreaming (Background Memory Consolidation)
|
|
134
138
|
|
|
135
|
-
On
|
|
139
|
+
On session start, pi-memory checks whether enough Pi session history has accumulated and, when due, starts an isolated background agent that consolidates durable facts into memory. The default global memory store reads Pi sessions across all projects; an injected store or custom `dataDir` reads only the active session directory. It does not add a turn to the active conversation or install an operating-system scheduled task.
|
|
136
140
|
|
|
137
141
|
### How it works
|
|
138
142
|
|
|
139
|
-
1. **
|
|
140
|
-
- macOS: `launchd` LaunchAgent
|
|
141
|
-
- Linux: user `crontab` entry
|
|
142
|
-
- Windows: Task Scheduler
|
|
143
|
-
|
|
144
|
-
2. **Gate check** — Each run checks whether enough time and sessions have elapsed since the last consolidation before proceeding.
|
|
143
|
+
1. **Session-start trigger** — The extension launches the check asynchronously after memory initialization, so the active session is not blocked.
|
|
145
144
|
|
|
146
|
-
|
|
145
|
+
2. **Gate and lock** — Each run checks whether enough time and turns have elapsed, then takes a cross-process lock so multiple Pi hosts cannot dream concurrently.
|
|
147
146
|
|
|
148
|
-
|
|
147
|
+
3. **Consolidation** — An agentic loop (using pi-agent-core) reviews recent Pi sessions and updates `MEMORY.md`/`USER.md` via the memory tools. Follows a 4-phase prompt: Orient → Gather → Consolidate → Prune.
|
|
149
148
|
|
|
150
149
|
### Configuration
|
|
151
150
|
|
|
@@ -156,7 +155,6 @@ Add to `settings.json` under the `pi-memory` key:
|
|
|
156
155
|
"pi-memory": {
|
|
157
156
|
"dreaming": {
|
|
158
157
|
"enabled": true,
|
|
159
|
-
"intervalHours": 4,
|
|
160
158
|
"minHoursSinceLastRun": 24,
|
|
161
159
|
"minTurnsSinceLastRun": 5,
|
|
162
160
|
"model": {
|
|
@@ -170,16 +168,6 @@ Add to `settings.json` under the `pi-memory` key:
|
|
|
170
168
|
|
|
171
169
|
All fields are optional with sensible defaults. The `model` field accepts any provider/model pair configured in your `~/.pi/agent/models.json` (built-in or custom). `minSessionsSinceLastRun` is accepted as a deprecated alias for `minTurnsSinceLastRun`.
|
|
172
170
|
|
|
173
|
-
Set `"enabled": false` to disable dreaming
|
|
174
|
-
|
|
175
|
-
### CLI
|
|
171
|
+
Set `"enabled": false` to disable background dreaming.
|
|
176
172
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
```bash
|
|
180
|
-
# Run once (called by the system scheduler)
|
|
181
|
-
npx pi-memory-dream
|
|
182
|
-
|
|
183
|
-
# Or via the installed bin
|
|
184
|
-
pi-memory-dream
|
|
185
|
-
```
|
|
173
|
+
Dreaming is opportunistic: it runs while a Pi host is active and catches up on the next session start. It does not run while every Pi host is closed.
|
|
@@ -26,7 +26,7 @@ export interface ExtractionRunnerOptions {
|
|
|
26
26
|
modelConfig: ExtractionModelConfig;
|
|
27
27
|
/** How many user turns between extraction runs. */
|
|
28
28
|
interval: number;
|
|
29
|
-
/** Model registry for resolving provider/model. Falls back to
|
|
29
|
+
/** Model registry for resolving provider/model. Falls back to the default ModelRuntime if omitted. */
|
|
30
30
|
modelRegistry?: {
|
|
31
31
|
find(provider: string, model: string): unknown;
|
|
32
32
|
getApiKeyAndHeaders(model: unknown): Promise<{
|
|
@@ -1 +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,
|
|
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,sGAAsG;IACtG,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"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { Agent } from '@earendil-works/pi-agent-core';
|
|
20
20
|
import { streamSimple } from '@earendil-works/pi-ai/compat';
|
|
21
|
-
import {
|
|
21
|
+
import { ModelRegistry, ModelRuntime } from '@earendil-works/pi-coding-agent';
|
|
22
22
|
import { createMemoryTools } from './tools.js';
|
|
23
23
|
// ---------------------------------------------------------------------------
|
|
24
24
|
// Constants
|
|
@@ -117,7 +117,7 @@ export function createExtractionRunner(opts) {
|
|
|
117
117
|
async function runExtraction(messages) {
|
|
118
118
|
if (messages.length === 0)
|
|
119
119
|
return 0;
|
|
120
|
-
const registry = modelRegistry ?? createFallbackRegistry();
|
|
120
|
+
const registry = modelRegistry ?? (await createFallbackRegistry());
|
|
121
121
|
const model = registry.find(modelConfig.provider, modelConfig.model);
|
|
122
122
|
if (!model) {
|
|
123
123
|
if (!warnedOnce && onNotify) {
|
|
@@ -229,9 +229,9 @@ export function countMemoryActions(messages) {
|
|
|
229
229
|
}
|
|
230
230
|
return count;
|
|
231
231
|
}
|
|
232
|
-
function createFallbackRegistry() {
|
|
233
|
-
const
|
|
234
|
-
const registry = ModelRegistry
|
|
232
|
+
async function createFallbackRegistry() {
|
|
233
|
+
const modelRuntime = await ModelRuntime.create();
|
|
234
|
+
const registry = new ModelRegistry(modelRuntime);
|
|
235
235
|
return {
|
|
236
236
|
find: (provider, model) => registry.find(provider, model),
|
|
237
237
|
getApiKeyAndHeaders: async (model) => {
|
|
@@ -1 +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,8BAA8B,CAAC;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"background-extraction.js","sourceRoot":"","sources":["../src/background-extraction.ts"],"names":[],"mappings":"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"}
|
package/dist/consolidation.d.ts
CHANGED
|
@@ -4,7 +4,18 @@
|
|
|
4
4
|
* Spawns a pi-agent-core Agent with memory tools to review transcripts and
|
|
5
5
|
* update entries. Follows a 4-phase prompt: Orient → Gather → Consolidate → Prune.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
export interface DreamTurn {
|
|
8
|
+
id: string;
|
|
9
|
+
sessionId: string;
|
|
10
|
+
conversationId: string;
|
|
11
|
+
userMessage: string;
|
|
12
|
+
assistantMessage: string;
|
|
13
|
+
model: {
|
|
14
|
+
provider: string;
|
|
15
|
+
model: string;
|
|
16
|
+
};
|
|
17
|
+
createdAt: string;
|
|
18
|
+
}
|
|
8
19
|
export interface ConsolidationModelRegistry {
|
|
9
20
|
find(provider: string, model: string): unknown;
|
|
10
21
|
getApiKeyAndHeaders(model: unknown): Promise<{
|
|
@@ -16,7 +27,7 @@ export interface ConsolidationModelRegistry {
|
|
|
16
27
|
}
|
|
17
28
|
export interface ConsolidationOptions {
|
|
18
29
|
memoryDir: string;
|
|
19
|
-
turns:
|
|
30
|
+
turns: DreamTurn[];
|
|
20
31
|
modelConfig: {
|
|
21
32
|
provider: string;
|
|
22
33
|
model: string;
|
|
@@ -26,6 +37,6 @@ export interface ConsolidationOptions {
|
|
|
26
37
|
maxTurns?: number;
|
|
27
38
|
}
|
|
28
39
|
export declare const CONSOLIDATION_SYSTEM_PROMPT = "You are a memory consolidation assistant performing a \"dream\" \u2014 a reflective pass over recent conversations to synthesize durable knowledge into long-term memory.\n\nYou have access to memory tools:\n- memory_read: Read current memory entries (targets: \"memory\" for agent notes, \"user\" for user profile)\n- memory_add: Add a new entry to a target\n- memory_replace: Update an existing entry by substring match\n- memory_remove: Remove an outdated or redundant entry\n\n## Phase 1 \u2014 Orient\n\n- Call memory_read for both \"memory\" and \"user\" targets to see what is currently stored.\n- Understand the existing structure so you can merge into it rather than duplicating.\n- Note entries that look stale, overly verbose, or contradicted by recent context.\n\n## Phase 2 \u2014 Gather recent signal\n\nReview the conversation transcripts provided. Look for:\n1. New durable facts worth remembering (user preferences, project decisions, recurring patterns)\n2. Information that contradicts or updates existing memory entries\n3. Context that existing memories reference but got wrong\n\nDon't try to capture everything. Focus on what a future session would benefit from knowing.\n\n## Phase 3 \u2014 Consolidate\n\nMake targeted updates using the memory tools:\n- Use memory_replace to update stale entries with current information\n- Use memory_add only for genuinely new facts not already captured\n- Use memory_remove for entries that are clearly wrong, redundant, or superseded\n- When multiple entries cover related facts, merge them into one via memory_replace\n\nImportant:\n- Convert relative dates (\"yesterday\", \"last week\") to absolute dates\n- Merge related entries rather than keeping fragments \u2014 one complete entry is better than three partial ones\n- Keep entries terse and third-person\n\n## Phase 4 \u2014 Prune\n\nAfter consolidating, check capacity:\n- The \"memory\" target has a ~2200 character limit\n- The \"user\" target has a ~1375 character limit\n- If approaching limits, compress verbose entries (remove filler words, combine related points)\n- Remove entries that are subsumed by more complete ones\n\n## Constraints\n\n- ZERO information loss: every distinct, correct fact must survive unless clearly superseded\n- Don't add trivial or ephemeral information (greetings, debugging steps, temporary state)\n- Don't duplicate what is already stored \u2014 always check first via memory_read\n- Focus on: user identity, preferences, project decisions, recurring patterns, important context\n- If nothing meaningful has changed, say so \u2014 don't make changes for the sake of it\n";
|
|
29
|
-
export declare function buildConsolidationUserPrompt(turns:
|
|
40
|
+
export declare function buildConsolidationUserPrompt(turns: DreamTurn[]): string;
|
|
30
41
|
export declare function runConsolidation(opts: ConsolidationOptions): Promise<boolean>;
|
|
31
42
|
//# sourceMappingURL=consolidation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"consolidation.d.ts","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/C,mBAAmB,CACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,aAAa,EAAE,0BAA0B,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,2BAA2B,0kFAmDvC,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAuBvE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA8CnF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"consolidation.js","sourceRoot":"","sources":["../src/consolidation.ts"],"names":[],"mappings":"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"}
|
package/dist/dream.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ConsolidationModelRegistry } from './consolidation.js';
|
|
2
|
+
export interface DreamingConfig {
|
|
3
|
+
enabled?: boolean;
|
|
4
|
+
minHoursSinceLastRun?: number;
|
|
5
|
+
minTurnsSinceLastRun?: number;
|
|
6
|
+
/** @deprecated Use minTurnsSinceLastRun. */
|
|
7
|
+
minSessionsSinceLastRun?: number;
|
|
8
|
+
model?: {
|
|
9
|
+
provider: string;
|
|
10
|
+
model: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface RunDreamOptions {
|
|
14
|
+
dreaming?: DreamingConfig;
|
|
15
|
+
memoryDir: string;
|
|
16
|
+
modelRegistry: ConsolidationModelRegistry;
|
|
17
|
+
/** Current Pi session directory. */
|
|
18
|
+
sessionDir?: string;
|
|
19
|
+
/** Include sessions from every default Pi project directory. Default: false. */
|
|
20
|
+
includeGlobalSessions?: boolean;
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
}
|
|
23
|
+
/** Run one gated memory-consolidation pass from the pi-memory extension. */
|
|
24
|
+
export declare function runDream(options: RunDreamOptions): Promise<boolean>;
|
|
25
|
+
//# sourceMappingURL=dream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream.d.ts","sourceRoot":"","sources":["../src/dream.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,4CAA4C;IAC5C,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAMD,4EAA4E;AAC5E,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAsEzE"}
|
package/dist/dream.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { mkdir } from 'node:fs/promises';
|
|
2
|
+
import { SessionManager } from '@earendil-works/pi-coding-agent';
|
|
3
|
+
import lockfile from 'proper-lockfile';
|
|
4
|
+
import { runConsolidation, } from './consolidation.js';
|
|
5
|
+
import { readDreamingState, writeDreamingState } from './dreaming-state.js';
|
|
6
|
+
const DEFAULT_MIN_HOURS = 24;
|
|
7
|
+
const DEFAULT_MIN_TURNS = 5;
|
|
8
|
+
const DEFAULT_MODEL = { provider: 'openai', model: 'gpt-4.1-mini' };
|
|
9
|
+
/** Run one gated memory-consolidation pass from the pi-memory extension. */
|
|
10
|
+
export async function runDream(options) {
|
|
11
|
+
const config = options.dreaming ?? {};
|
|
12
|
+
if (config.enabled === false || options.signal?.aborted)
|
|
13
|
+
return false;
|
|
14
|
+
await mkdir(options.memoryDir, { recursive: true });
|
|
15
|
+
let release;
|
|
16
|
+
try {
|
|
17
|
+
release = await lockfile.lock(options.memoryDir, { retries: 0, stale: 30_000 });
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (error.code === 'ELOCKED')
|
|
21
|
+
return false;
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const state = await readDreamingState(options.memoryDir);
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const minHours = config.minHoursSinceLastRun ?? DEFAULT_MIN_HOURS;
|
|
28
|
+
const minTurns = config.minTurnsSinceLastRun ?? config.minSessionsSinceLastRun ?? DEFAULT_MIN_TURNS;
|
|
29
|
+
// Gate check: enough time since last run?
|
|
30
|
+
if (state.lastConsolidatedAt) {
|
|
31
|
+
const elapsed = now - new Date(state.lastConsolidatedAt).getTime();
|
|
32
|
+
if (elapsed < minHours * 60 * 60 * 1000)
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
// Gate check: enough Pi session turns since last run?
|
|
36
|
+
const turns = await readPiSessionTurns(options.sessionDir, state.lastConsolidatedAt, options.includeGlobalSessions ?? false);
|
|
37
|
+
if (turns.length < minTurns || options.signal?.aborted)
|
|
38
|
+
return false;
|
|
39
|
+
// Consolidation
|
|
40
|
+
let succeeded = false;
|
|
41
|
+
try {
|
|
42
|
+
succeeded = await runConsolidation({
|
|
43
|
+
memoryDir: options.memoryDir,
|
|
44
|
+
turns,
|
|
45
|
+
modelConfig: config.model ?? DEFAULT_MODEL,
|
|
46
|
+
modelRegistry: options.modelRegistry,
|
|
47
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`[pi-memory] consolidation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
52
|
+
}
|
|
53
|
+
if (!succeeded || options.signal?.aborted)
|
|
54
|
+
return false;
|
|
55
|
+
// Only update state if consolidation ran successfully
|
|
56
|
+
await writeDreamingState({
|
|
57
|
+
...state,
|
|
58
|
+
lastConsolidatedAt: new Date(now).toISOString(),
|
|
59
|
+
lastSessionCount: turns.length,
|
|
60
|
+
}, options.memoryDir);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
try {
|
|
65
|
+
await release();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Lock was already released.
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async function readPiSessionTurns(sessionDir, lastConsolidatedAt, includeGlobalSessions) {
|
|
73
|
+
const since = lastConsolidatedAt ? new Date(lastConsolidatedAt).getTime() : undefined;
|
|
74
|
+
const sessionGroups = await Promise.all([
|
|
75
|
+
...(includeGlobalSessions ? [SessionManager.listAll()] : []),
|
|
76
|
+
...(sessionDir ? [SessionManager.listAll(sessionDir)] : []),
|
|
77
|
+
]);
|
|
78
|
+
const sessions = [
|
|
79
|
+
...new Map(sessionGroups.flat().map((session) => [session.path, session])).values(),
|
|
80
|
+
];
|
|
81
|
+
const turns = sessions.flatMap((session) => {
|
|
82
|
+
if (since !== undefined && session.modified.getTime() <= since)
|
|
83
|
+
return [];
|
|
84
|
+
return sessionEntriesToTurns(SessionManager.open(session.path).getBranch(), session.id, since);
|
|
85
|
+
});
|
|
86
|
+
return turns.sort((left, right) => new Date(left.createdAt).getTime() - new Date(right.createdAt).getTime());
|
|
87
|
+
}
|
|
88
|
+
function sessionEntriesToTurns(entries, sessionId, since) {
|
|
89
|
+
const turns = [];
|
|
90
|
+
let pending;
|
|
91
|
+
const flush = () => {
|
|
92
|
+
if (!pending || pending.assistantParts.length === 0 || pending.completedAt <= (since ?? 0)) {
|
|
93
|
+
pending = undefined;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
turns.push({
|
|
97
|
+
id: pending.id,
|
|
98
|
+
sessionId,
|
|
99
|
+
conversationId: sessionId,
|
|
100
|
+
userMessage: pending.userMessage,
|
|
101
|
+
assistantMessage: pending.assistantParts.join('\n'),
|
|
102
|
+
model: { provider: pending.provider, model: pending.model },
|
|
103
|
+
createdAt: new Date(pending.completedAt).toISOString(),
|
|
104
|
+
});
|
|
105
|
+
pending = undefined;
|
|
106
|
+
};
|
|
107
|
+
for (const entry of entries) {
|
|
108
|
+
if (entry.type !== 'message')
|
|
109
|
+
continue;
|
|
110
|
+
if (entry.message.role === 'user') {
|
|
111
|
+
flush();
|
|
112
|
+
pending = {
|
|
113
|
+
id: entry.id,
|
|
114
|
+
userMessage: messageText(entry),
|
|
115
|
+
assistantParts: [],
|
|
116
|
+
provider: 'unknown',
|
|
117
|
+
model: 'unknown',
|
|
118
|
+
completedAt: messageTimestamp(entry),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
else if (entry.message.role === 'assistant' && pending) {
|
|
122
|
+
const text = messageText(entry);
|
|
123
|
+
if (text)
|
|
124
|
+
pending.assistantParts.push(text);
|
|
125
|
+
pending.provider = entry.message.provider;
|
|
126
|
+
pending.model = entry.message.model;
|
|
127
|
+
pending.completedAt = messageTimestamp(entry);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
flush();
|
|
131
|
+
return turns;
|
|
132
|
+
}
|
|
133
|
+
function messageText(entry) {
|
|
134
|
+
if (!('content' in entry.message))
|
|
135
|
+
return '';
|
|
136
|
+
const content = entry.message.content;
|
|
137
|
+
if (typeof content === 'string')
|
|
138
|
+
return content;
|
|
139
|
+
if (!Array.isArray(content))
|
|
140
|
+
return '';
|
|
141
|
+
return content
|
|
142
|
+
.filter((block) => Boolean(block && typeof block === 'object' && block.type === 'text' && 'text' in block))
|
|
143
|
+
.map((block) => block.text)
|
|
144
|
+
.join('\n');
|
|
145
|
+
}
|
|
146
|
+
function messageTimestamp(entry) {
|
|
147
|
+
return typeof entry.message.timestamp === 'number'
|
|
148
|
+
? entry.message.timestamp
|
|
149
|
+
: new Date(entry.timestamp).getTime();
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=dream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dream.js","sourceRoot":"","sources":["../src/dream.ts"],"names":[],"mappings":"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"}
|
package/dist/dreaming-state.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ export interface DreamingState {
|
|
|
2
2
|
lastConsolidatedAt: string | null;
|
|
3
3
|
lastSessionCount: number;
|
|
4
4
|
}
|
|
5
|
-
export declare function readDreamingState(): Promise<DreamingState>;
|
|
6
|
-
export declare function writeDreamingState(state: DreamingState): Promise<void>;
|
|
5
|
+
export declare function readDreamingState(memoryDir?: string): Promise<DreamingState>;
|
|
6
|
+
export declare function writeDreamingState(state: DreamingState, memoryDir?: string): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=dreaming-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dreaming-state.d.ts","sourceRoot":"","sources":["../src/dreaming-state.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,wBAAsB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"dreaming-state.d.ts","sourceRoot":"","sources":["../src/dreaming-state.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAQD,wBAAsB,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAOlF;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhG"}
|
package/dist/dreaming-state.js
CHANGED
|
@@ -5,20 +5,20 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
|
5
5
|
import { dirname, join } from 'node:path';
|
|
6
6
|
import { resolveHome } from '@amaster.ai/pi-shared/settings';
|
|
7
7
|
const STATE_FILE = 'memories/dreaming-state.json';
|
|
8
|
-
function statePath() {
|
|
9
|
-
return join(resolveHome(), STATE_FILE);
|
|
8
|
+
function statePath(memoryDir) {
|
|
9
|
+
return memoryDir ? join(memoryDir, 'dreaming-state.json') : join(resolveHome(), STATE_FILE);
|
|
10
10
|
}
|
|
11
|
-
export async function readDreamingState() {
|
|
11
|
+
export async function readDreamingState(memoryDir) {
|
|
12
12
|
try {
|
|
13
|
-
const raw = await readFile(statePath(), 'utf-8');
|
|
13
|
+
const raw = await readFile(statePath(memoryDir), 'utf-8');
|
|
14
14
|
return JSON.parse(raw);
|
|
15
15
|
}
|
|
16
16
|
catch {
|
|
17
17
|
return { lastConsolidatedAt: null, lastSessionCount: 0 };
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
export async function writeDreamingState(state) {
|
|
21
|
-
const filePath = statePath();
|
|
20
|
+
export async function writeDreamingState(state, memoryDir) {
|
|
21
|
+
const filePath = statePath(memoryDir);
|
|
22
22
|
await mkdir(dirname(filePath), { recursive: true });
|
|
23
23
|
await writeFile(filePath, JSON.stringify(state, null, 2), 'utf-8');
|
|
24
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dreaming-state.js","sourceRoot":"","sources":["../src/dreaming-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAO7D,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAElD,SAAS,SAAS;
|
|
1
|
+
{"version":3,"file":"dreaming-state.js","sourceRoot":"","sources":["../src/dreaming-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAO7D,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAElD,SAAS,SAAS,CAAC,SAAkB;IACnC,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAkB;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAoB,EAAE,SAAkB;IAC/E,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
|
package/dist/extension.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
|
|
2
2
|
import { type ExtractionModelConfig } from './background-extraction.js';
|
|
3
|
+
import { type DreamingConfig } from './dream.js';
|
|
3
4
|
import { MemoryStore } from './store.js';
|
|
4
5
|
export type PiMemoryExtensionConfig = {
|
|
5
6
|
/** Directory containing MEMORY.md / USER.md. Default: `<agentDir>/memories`. */
|
|
@@ -14,14 +15,8 @@ export type PiMemoryExtensionConfig = {
|
|
|
14
15
|
extractionModel?: ExtractionModelConfig;
|
|
15
16
|
/** Turns between extraction runs. Default: 5. */
|
|
16
17
|
extractionInterval?: number;
|
|
17
|
-
/** Dreaming (
|
|
18
|
+
/** Dreaming (opportunistic background consolidation) config. */
|
|
18
19
|
dreaming?: DreamingConfig;
|
|
19
20
|
};
|
|
20
|
-
export type DreamingConfig = {
|
|
21
|
-
/** Set to false to disable dreaming entirely and unregister the cron job. Default: true. */
|
|
22
|
-
enabled?: boolean;
|
|
23
|
-
/** Interval in hours between dream runs. Default: 4. */
|
|
24
|
-
intervalHours?: number;
|
|
25
|
-
};
|
|
26
21
|
export default function memoryExtension(pi: ExtensionAPI, injectedConfig?: PiMemoryExtensionConfig): void;
|
|
27
22
|
//# 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":"
|
|
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,KAAK,cAAc,EAAY,MAAM,YAAY,CAAC;AAC3D,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;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B,CAAC;AAqCF,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,EAAE,EAAE,YAAY,EAChB,cAAc,CAAC,EAAE,uBAAuB,GACvC,IAAI,CAkNN"}
|
package/dist/extension.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import path
|
|
2
|
-
import {
|
|
3
|
-
import { install, status, uninstall } from '@amaster.ai/pi-shared/scheduler';
|
|
4
|
-
import { loadPiSettings, resolveHome } from '@amaster.ai/pi-shared/settings';
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { isProjectTrusted, loadPiSettings, resolveHome } from '@amaster.ai/pi-shared/settings';
|
|
5
3
|
import { createExtractionRunner, } from './background-extraction.js';
|
|
4
|
+
import { runDream } from './dream.js';
|
|
6
5
|
import { MemoryStore } from './store.js';
|
|
7
6
|
import { createMemoryTools } from './tools.js';
|
|
8
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
7
|
const SETTINGS_KEY = 'pi-memory';
|
|
10
8
|
const STATUS_KEY = 'pi-memory';
|
|
11
9
|
const MEMORY_GUIDANCE = [
|
|
@@ -38,10 +36,11 @@ function resolveConfig(raw) {
|
|
|
38
36
|
resolved.dreaming = raw.dreaming;
|
|
39
37
|
return resolved;
|
|
40
38
|
}
|
|
41
|
-
function loadSettings(cwd) {
|
|
39
|
+
function loadSettings(cwd, projectTrusted = false) {
|
|
42
40
|
try {
|
|
43
41
|
const config = loadPiSettings(SETTINGS_KEY, {
|
|
44
42
|
cwd,
|
|
43
|
+
projectTrusted,
|
|
45
44
|
});
|
|
46
45
|
return Object.keys(config).length > 0 ? config : undefined;
|
|
47
46
|
}
|
|
@@ -49,39 +48,11 @@ function loadSettings(cwd) {
|
|
|
49
48
|
return undefined;
|
|
50
49
|
}
|
|
51
50
|
}
|
|
52
|
-
const DREAM_JOB_NAME = 'ai.pi.memory-dream';
|
|
53
|
-
const DEFAULT_DREAM_INTERVAL_HOURS = 4;
|
|
54
|
-
async function registerDreamingCron(dreaming) {
|
|
55
|
-
try {
|
|
56
|
-
if (dreaming?.enabled === false) {
|
|
57
|
-
const current = await status(DREAM_JOB_NAME);
|
|
58
|
-
if (current === 'installed') {
|
|
59
|
-
await uninstall(DREAM_JOB_NAME);
|
|
60
|
-
}
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const current = await status(DREAM_JOB_NAME);
|
|
64
|
-
if (current === 'installed')
|
|
65
|
-
return;
|
|
66
|
-
const dreamBin = path.resolve(__dirname, 'cli/dream.js');
|
|
67
|
-
const intervalHours = dreaming?.intervalHours ?? DEFAULT_DREAM_INTERVAL_HOURS;
|
|
68
|
-
await install({
|
|
69
|
-
name: DREAM_JOB_NAME,
|
|
70
|
-
command: process.execPath,
|
|
71
|
-
args: [dreamBin, '--once'],
|
|
72
|
-
intervalSeconds: intervalHours * 3600,
|
|
73
|
-
description: 'Pi memory consolidation and dedup',
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
// Non-fatal: cron registration failure should not block the extension
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
51
|
export default function memoryExtension(pi, injectedConfig) {
|
|
81
52
|
let store;
|
|
82
53
|
let extractionRunner;
|
|
83
54
|
pi.on('session_start', async (_event, ctx) => {
|
|
84
|
-
const fileConfig = loadSettings(ctx.cwd);
|
|
55
|
+
const fileConfig = loadSettings(ctx.cwd, isProjectTrusted(ctx));
|
|
85
56
|
const config = resolveConfig({ ...fileConfig, ...injectedConfig });
|
|
86
57
|
try {
|
|
87
58
|
if (config.store) {
|
|
@@ -110,8 +81,16 @@ export default function memoryExtension(pi, injectedConfig) {
|
|
|
110
81
|
onNotify: (msg, level) => ctx.ui.notify(msg, level),
|
|
111
82
|
});
|
|
112
83
|
}
|
|
113
|
-
|
|
114
|
-
|
|
84
|
+
void runDream({
|
|
85
|
+
includeGlobalSessions: !config.store && config.dataDir === path.join(resolveHome(), 'memories'),
|
|
86
|
+
memoryDir: store.dir,
|
|
87
|
+
modelRegistry: ctx.modelRegistry,
|
|
88
|
+
sessionDir: ctx.sessionManager.getSessionDir(),
|
|
89
|
+
...(config.dreaming ? { dreaming: config.dreaming } : {}),
|
|
90
|
+
...(ctx.signal ? { signal: ctx.signal } : {}),
|
|
91
|
+
}).catch((error) => {
|
|
92
|
+
console.error(`[pi-memory] background dream failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
+
});
|
|
115
94
|
}
|
|
116
95
|
catch (err) {
|
|
117
96
|
ctx.ui.setStatus(STATUS_KEY, 'memory: unavailable');
|
package/dist/extension.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { ExtractionModelConfig, ExtractionRunner } from './background-extraction.js';
|
|
2
2
|
export { createExtractionRunner } from './background-extraction.js';
|
|
3
|
+
export type { DreamingConfig } from './dream.js';
|
|
3
4
|
export type { PiMemoryExtensionConfig } from './extension.js';
|
|
4
5
|
export { default } from './extension.js';
|
|
5
6
|
export type { MemoryDriftError, MemoryErrorResult, MemoryResult, MemoryStoreOptions, MemorySuccessResult, MemoryTarget, } 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,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"}
|
|
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,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,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.
|
|
3
|
+
"version": "0.1.7",
|
|
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",
|
|
@@ -14,9 +14,6 @@
|
|
|
14
14
|
"sideEffects": false,
|
|
15
15
|
"main": "./dist/index.js",
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
|
-
"bin": {
|
|
18
|
-
"pi-memory-dream": "./dist/cli/dream.js"
|
|
19
|
-
},
|
|
20
17
|
"exports": {
|
|
21
18
|
".": {
|
|
22
19
|
"types": "./dist/index.d.ts",
|
|
@@ -75,14 +72,12 @@
|
|
|
75
72
|
},
|
|
76
73
|
"dependencies": {
|
|
77
74
|
"proper-lockfile": "^4.1.2",
|
|
78
|
-
"@amaster.ai/pi-shared": "0.1.
|
|
79
|
-
"@amaster.ai/pi-storage": "0.1.5",
|
|
80
|
-
"@amaster.ai/pi-memory-mem0": "0.1.5"
|
|
75
|
+
"@amaster.ai/pi-shared": "0.1.7"
|
|
81
76
|
},
|
|
82
77
|
"peerDependencies": {
|
|
83
78
|
"@earendil-works/pi-agent-core": ">=0.74.0",
|
|
84
|
-
"@earendil-works/pi-ai": ">=0.80.
|
|
85
|
-
"@earendil-works/pi-coding-agent": ">=0.
|
|
79
|
+
"@earendil-works/pi-ai": ">=0.80.10",
|
|
80
|
+
"@earendil-works/pi-coding-agent": ">=0.80.10",
|
|
86
81
|
"typebox": "*"
|
|
87
82
|
},
|
|
88
83
|
"peerDependenciesMeta": {
|
|
@@ -100,9 +95,9 @@
|
|
|
100
95
|
}
|
|
101
96
|
},
|
|
102
97
|
"devDependencies": {
|
|
103
|
-
"@earendil-works/pi-agent-core": "0.80.
|
|
104
|
-
"@earendil-works/pi-ai": "0.80.
|
|
105
|
-
"@earendil-works/pi-coding-agent": "0.80.
|
|
98
|
+
"@earendil-works/pi-agent-core": "0.80.10",
|
|
99
|
+
"@earendil-works/pi-ai": "0.80.10",
|
|
100
|
+
"@earendil-works/pi-coding-agent": "0.80.10",
|
|
106
101
|
"@types/proper-lockfile": "^4.1.4",
|
|
107
102
|
"typebox": "*",
|
|
108
103
|
"vitest": "^4.0.0"
|
package/dist/cli/dream.d.ts
DELETED
package/dist/cli/dream.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dream.d.ts","sourceRoot":"","sources":["../../src/cli/dream.ts"],"names":[],"mappings":""}
|
package/dist/cli/dream.js
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* pi-memory-dream CLI — one-shot dreaming execution.
|
|
4
|
-
*
|
|
5
|
-
* Designed to be called by system cron (launchd/crontab/schtasks).
|
|
6
|
-
* Performs gate check, consolidation, and dedup, then exits.
|
|
7
|
-
*/
|
|
8
|
-
import { join } from 'node:path';
|
|
9
|
-
import { dedupMemories } from '@amaster.ai/pi-memory-mem0/dedup';
|
|
10
|
-
import { loadPiSettings, resolveHome } from '@amaster.ai/pi-shared/settings';
|
|
11
|
-
import { JsonFileTranscriptStore } from '@amaster.ai/pi-storage/json';
|
|
12
|
-
import { AuthStorage, ModelRegistry } from '@earendil-works/pi-coding-agent';
|
|
13
|
-
import { runConsolidation } from '../consolidation.js';
|
|
14
|
-
import { readDreamingState, writeDreamingState } from '../dreaming-state.js';
|
|
15
|
-
const DEFAULT_MIN_HOURS = 24;
|
|
16
|
-
const DEFAULT_MIN_TURNS = 5;
|
|
17
|
-
const DEFAULT_MODEL = { provider: 'openai', model: 'gpt-4.1-mini' };
|
|
18
|
-
function log(msg) {
|
|
19
|
-
process.stderr.write(`[pi-memory-dream ${new Date().toISOString()}] ${msg}\n`);
|
|
20
|
-
}
|
|
21
|
-
async function main() {
|
|
22
|
-
const settings = loadPiSettings('pi-memory');
|
|
23
|
-
const config = settings.dreaming ?? {};
|
|
24
|
-
if (config.enabled === false) {
|
|
25
|
-
process.exit(0);
|
|
26
|
-
}
|
|
27
|
-
const home = resolveHome();
|
|
28
|
-
const state = await readDreamingState();
|
|
29
|
-
const now = Date.now();
|
|
30
|
-
const minHours = config.minHoursSinceLastRun ?? DEFAULT_MIN_HOURS;
|
|
31
|
-
const minTurns = config.minTurnsSinceLastRun ?? config.minSessionsSinceLastRun ?? DEFAULT_MIN_TURNS;
|
|
32
|
-
// Gate check: enough time since last run?
|
|
33
|
-
if (state.lastConsolidatedAt) {
|
|
34
|
-
const elapsed = now - new Date(state.lastConsolidatedAt).getTime();
|
|
35
|
-
if (elapsed < minHours * 60 * 60 * 1000) {
|
|
36
|
-
process.exit(0);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
// Gate check: enough turns since last run?
|
|
40
|
-
const transcriptsPath = join(home, 'transcripts.json');
|
|
41
|
-
const transcripts = new JsonFileTranscriptStore(transcriptsPath);
|
|
42
|
-
const turns = await transcripts.listTurns({ tenantId: 'default' });
|
|
43
|
-
const recentTurns = state.lastConsolidatedAt
|
|
44
|
-
? turns.filter((t) => t.createdAt &&
|
|
45
|
-
new Date(t.createdAt).getTime() > new Date(state.lastConsolidatedAt).getTime())
|
|
46
|
-
: turns;
|
|
47
|
-
if (recentTurns.length < minTurns) {
|
|
48
|
-
process.exit(0);
|
|
49
|
-
}
|
|
50
|
-
log(`starting: ${recentTurns.length} turns since last run`);
|
|
51
|
-
const abortController = new AbortController();
|
|
52
|
-
process.on('SIGTERM', () => abortController.abort());
|
|
53
|
-
process.on('SIGINT', () => abortController.abort());
|
|
54
|
-
// Phase 1: Consolidation
|
|
55
|
-
const modelConfig = config.model ?? DEFAULT_MODEL;
|
|
56
|
-
const authStorage = AuthStorage.create();
|
|
57
|
-
const modelRegistry = ModelRegistry.create(authStorage);
|
|
58
|
-
let consolidationSucceeded = false;
|
|
59
|
-
try {
|
|
60
|
-
consolidationSucceeded = await runConsolidation({
|
|
61
|
-
memoryDir: join(home, 'memories'),
|
|
62
|
-
turns: recentTurns,
|
|
63
|
-
modelConfig,
|
|
64
|
-
modelRegistry: {
|
|
65
|
-
find: (p, m) => modelRegistry.find(p, m),
|
|
66
|
-
getApiKeyAndHeaders: (model) => modelRegistry.getApiKeyAndHeaders(model),
|
|
67
|
-
},
|
|
68
|
-
signal: abortController.signal,
|
|
69
|
-
});
|
|
70
|
-
if (consolidationSucceeded)
|
|
71
|
-
log('consolidation done');
|
|
72
|
-
else
|
|
73
|
-
log('consolidation skipped (model/auth unavailable)');
|
|
74
|
-
}
|
|
75
|
-
catch (err) {
|
|
76
|
-
log(`consolidation failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
77
|
-
}
|
|
78
|
-
if (abortController.signal.aborted)
|
|
79
|
-
process.exit(0);
|
|
80
|
-
// Phase 2: Dedup (only if pi-memory-mem0 is configured)
|
|
81
|
-
const mem0Settings = loadPiSettings('pi-memory-mem0');
|
|
82
|
-
if (mem0Settings && Object.keys(mem0Settings).length > 0) {
|
|
83
|
-
const mode = mem0Settings.mode ?? 'platform';
|
|
84
|
-
const userId = config.mem0UserId ?? mem0Settings.userId;
|
|
85
|
-
if (!userId) {
|
|
86
|
-
log('dedup skipped: no explicit userId configured (set pi-memory.dreaming.mem0UserId or pi-memory-mem0.userId)');
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
try {
|
|
90
|
-
const result = await dedupMemories({
|
|
91
|
-
userId,
|
|
92
|
-
config: { ...mem0Settings, mode },
|
|
93
|
-
signal: abortController.signal,
|
|
94
|
-
});
|
|
95
|
-
log(`dedup done: ${result.duplicatesRemoved} removed from ${result.total}`);
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
log(`dedup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// Only update state if consolidation ran successfully
|
|
103
|
-
if (consolidationSucceeded) {
|
|
104
|
-
await writeDreamingState({
|
|
105
|
-
lastConsolidatedAt: new Date(now).toISOString(),
|
|
106
|
-
lastSessionCount: recentTurns.length,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
log('done');
|
|
110
|
-
}
|
|
111
|
-
main().catch((err) => {
|
|
112
|
-
log(`fatal: ${err instanceof Error ? err.message : String(err)}`);
|
|
113
|
-
process.exit(1);
|
|
114
|
-
});
|
|
115
|
-
//# sourceMappingURL=dream.js.map
|
package/dist/cli/dream.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dream.js","sourceRoot":"","sources":["../../src/cli/dream.ts"],"names":[],"mappings":"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"}
|