@caupulican/pi-adaptative 0.80.55 → 0.80.57
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/CHANGELOG.md +4 -0
- package/dist/core/agent-session.d.ts +11 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +66 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +4 -0
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +5 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/memory/memory-manager.d.ts +22 -0
- package/dist/core/memory/memory-manager.d.ts.map +1 -0
- package/dist/core/memory/memory-manager.js +212 -0
- package/dist/core/memory/memory-manager.js.map +1 -0
- package/dist/core/memory/memory-provider.d.ts +25 -0
- package/dist/core/memory/memory-provider.d.ts.map +1 -0
- package/dist/core/memory/memory-provider.js +2 -0
- package/dist/core/memory/memory-provider.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +23 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -0
- package/dist/core/memory/providers/file-store.js +212 -0
- package/dist/core/memory/providers/file-store.js.map +1 -0
- package/dist/core/sdk.d.ts +2 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -31,6 +31,8 @@ import { createCoreDiagnosticsToolDefinitions } from "./extensions/builtin.js";
|
|
|
31
31
|
import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
|
|
32
32
|
import { disposeExtensionEventSubscriptions } from "./extensions/loader.js";
|
|
33
33
|
import { emitSessionShutdownEvent } from "./extensions/runner.js";
|
|
34
|
+
import { MemoryManager } from "./memory/memory-manager.js";
|
|
35
|
+
import { FileStoreProvider } from "./memory/providers/file-store.js";
|
|
34
36
|
import { compactToolResultDetailsForRetention } from "./message-retention.js";
|
|
35
37
|
import { resolveProfileModelSettings } from "./model-resolver.js";
|
|
36
38
|
import { expandPromptTemplate } from "./prompt-templates.js";
|
|
@@ -112,6 +114,11 @@ export class AgentSession {
|
|
|
112
114
|
_toolProfileFilter;
|
|
113
115
|
_isExplicitModel;
|
|
114
116
|
_isExplicitThinking;
|
|
117
|
+
/** Plug-and-play memory subsystem. Recreated on each (re)initialize so reload is safe. */
|
|
118
|
+
_memoryManager = new MemoryManager();
|
|
119
|
+
_isChildSession;
|
|
120
|
+
/** Memory providers registered by extensions via pi.registerMemoryProvider, applied on (re)init. */
|
|
121
|
+
_pendingMemoryProviders = [];
|
|
115
122
|
_baseToolsOverride;
|
|
116
123
|
_sessionStartEvent;
|
|
117
124
|
_extensionUIContext;
|
|
@@ -150,6 +157,7 @@ export class AgentSession {
|
|
|
150
157
|
: undefined;
|
|
151
158
|
this._isExplicitModel = config.isExplicitModel ?? false;
|
|
152
159
|
this._isExplicitThinking = config.isExplicitThinking ?? false;
|
|
160
|
+
this._isChildSession = config.isChildSession ?? process.env.PI_CHILD_SESSION === "1";
|
|
153
161
|
this._baseToolsOverride = config.baseToolsOverride;
|
|
154
162
|
this._sessionStartEvent = config.sessionStartEvent ?? { type: "session_start", reason: "startup" };
|
|
155
163
|
// Always subscribe to agent events for internal handling
|
|
@@ -651,6 +659,9 @@ export class AgentSession {
|
|
|
651
659
|
this._extensionRunner.invalidate("This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().");
|
|
652
660
|
this._disconnectFromAgent();
|
|
653
661
|
this._eventListeners = [];
|
|
662
|
+
// Best-effort memory cleanup (release locks/handles). Write-side onSessionEnd is wired on a
|
|
663
|
+
// true session-end hook (P3); file-store shutdown is a no-op.
|
|
664
|
+
void this._memoryManager.shutdownAll().catch(() => { });
|
|
654
665
|
cleanupSessionResources(this.sessionId);
|
|
655
666
|
}
|
|
656
667
|
// =========================================================================
|
|
@@ -867,6 +878,8 @@ export class AgentSession {
|
|
|
867
878
|
const appendSystemPromptParts = [
|
|
868
879
|
this._buildSelfModificationPrompt(),
|
|
869
880
|
this._buildAutonomyPrompt(),
|
|
881
|
+
// Memory subsystem: static, frozen-per-session block (e.g. file-store MEMORY.md/USER.md).
|
|
882
|
+
this._memoryManager.buildSystemPromptBlock() || undefined,
|
|
870
883
|
...loaderAppendSystemPrompt,
|
|
871
884
|
].filter((part) => Boolean(part));
|
|
872
885
|
const appendSystemPrompt = appendSystemPromptParts.length > 0 ? appendSystemPromptParts.join("\n\n") : undefined;
|
|
@@ -1938,6 +1951,8 @@ export class AgentSession {
|
|
|
1938
1951
|
this._applyExtensionBindings(this._extensionRunner);
|
|
1939
1952
|
await this._extensionRunner.emit(this._sessionStartEvent);
|
|
1940
1953
|
await this.extendResourcesFromExtensions(this._sessionStartEvent.reason === "reload" ? "reload" : "startup");
|
|
1954
|
+
// Initialize the memory subsystem after extensions have had a chance to register providers.
|
|
1955
|
+
await this._initializeMemory();
|
|
1941
1956
|
}
|
|
1942
1957
|
async extendResourcesFromExtensions(reason) {
|
|
1943
1958
|
if (!this._extensionRunner.hasHandlers("resources_discover")) {
|
|
@@ -2066,6 +2081,7 @@ export class AgentSession {
|
|
|
2066
2081
|
getThinkingLevel: () => this.thinkingLevel,
|
|
2067
2082
|
setThinkingLevel: (level) => this.setThinkingLevel(level),
|
|
2068
2083
|
getExternalResourceRoots: () => this.settingsManager.getEffectiveExternalResourceRoots(),
|
|
2084
|
+
registerMemoryProvider: (provider) => this.registerMemoryProvider(provider),
|
|
2069
2085
|
}, {
|
|
2070
2086
|
getModel: () => this.model,
|
|
2071
2087
|
isIdle: () => !this.isStreaming,
|
|
@@ -2163,6 +2179,47 @@ export class AgentSession {
|
|
|
2163
2179
|
this.setThinkingLevel(profileSettings.thinkingLevel);
|
|
2164
2180
|
}
|
|
2165
2181
|
}
|
|
2182
|
+
/**
|
|
2183
|
+
* (Re)build the memory subsystem: a fresh MemoryManager (reload-safe), register the bundled
|
|
2184
|
+
* file-store + any extension-contributed providers, initialize, then surface the memory tools and
|
|
2185
|
+
* the frozen system-prompt block. Best-effort: never throws into the session lifecycle.
|
|
2186
|
+
*/
|
|
2187
|
+
async _initializeMemory() {
|
|
2188
|
+
try {
|
|
2189
|
+
// Release the previous generation's providers (locks/handles) before recreating, so a
|
|
2190
|
+
// reload does not orphan the old MemoryManager. No-op on first init / for file-store.
|
|
2191
|
+
await this._memoryManager.shutdownAll().catch(() => { });
|
|
2192
|
+
const manager = new MemoryManager();
|
|
2193
|
+
manager.registerProvider(new FileStoreProvider());
|
|
2194
|
+
for (const provider of this._pendingMemoryProviders) {
|
|
2195
|
+
try {
|
|
2196
|
+
manager.registerProvider(provider);
|
|
2197
|
+
}
|
|
2198
|
+
catch {
|
|
2199
|
+
// Duplicate name or reserved-tool collision — skip this provider, keep the rest.
|
|
2200
|
+
}
|
|
2201
|
+
}
|
|
2202
|
+
this._memoryManager = manager;
|
|
2203
|
+
await manager.initializeAll(this.sessionManager.getSessionId(), {
|
|
2204
|
+
agentDir: this._agentDir,
|
|
2205
|
+
cwd: this._cwd,
|
|
2206
|
+
isChildSession: this._isChildSession,
|
|
2207
|
+
});
|
|
2208
|
+
// Surface memory tools + the frozen memory block now that providers are initialized.
|
|
2209
|
+
// _refreshToolRegistry() ends in setActiveToolsByName(), which rebuilds AND assigns the
|
|
2210
|
+
// system prompt (including the memory block), so no explicit _rebuildSystemPrompt is needed.
|
|
2211
|
+
this._refreshToolRegistry();
|
|
2212
|
+
}
|
|
2213
|
+
catch (error) {
|
|
2214
|
+
console.error("Memory subsystem init failed:", error instanceof Error ? error.message : String(error));
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
/** Register a memory provider contributed by an extension; applied on the next memory (re)init. */
|
|
2218
|
+
registerMemoryProvider(provider) {
|
|
2219
|
+
if (!this._pendingMemoryProviders.some((p) => p.name === provider.name)) {
|
|
2220
|
+
this._pendingMemoryProviders.push(provider);
|
|
2221
|
+
}
|
|
2222
|
+
}
|
|
2166
2223
|
_refreshToolRegistry(options) {
|
|
2167
2224
|
const previousRegistryNames = new Set(this._toolRegistry.keys());
|
|
2168
2225
|
const previousActiveToolNames = this.getActiveToolNames();
|
|
@@ -2190,6 +2247,11 @@ export class AgentSession {
|
|
|
2190
2247
|
definition,
|
|
2191
2248
|
sourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, { source: "sdk" }),
|
|
2192
2249
|
})),
|
|
2250
|
+
// Memory subsystem provider tools (e.g. file-store's `memory` tool).
|
|
2251
|
+
...this._memoryManager.getToolDefinitions().map((definition) => ({
|
|
2252
|
+
definition,
|
|
2253
|
+
sourceInfo: createSyntheticSourceInfo(`<memory:${definition.name}>`, { source: "sdk" }),
|
|
2254
|
+
})),
|
|
2193
2255
|
].filter((tool) => isAllowedTool(tool.definition.name));
|
|
2194
2256
|
const definitionRegistry = new Map(Array.from(this._baseToolDefinitions.entries())
|
|
2195
2257
|
.filter(([name]) => isAllowedTool(name))
|
|
@@ -2381,6 +2443,8 @@ export class AgentSession {
|
|
|
2381
2443
|
});
|
|
2382
2444
|
try {
|
|
2383
2445
|
this._doctorReloadRuntime();
|
|
2446
|
+
// Reload starts memory providers fresh; loaded extensions re-register below.
|
|
2447
|
+
this._pendingMemoryProviders = [];
|
|
2384
2448
|
const hasBindings = this._extensionUIContext ||
|
|
2385
2449
|
this._extensionCommandContextActions ||
|
|
2386
2450
|
this._extensionShutdownHandler ||
|
|
@@ -2400,6 +2464,8 @@ export class AgentSession {
|
|
|
2400
2464
|
await emitSessionShutdownEvent(previousRunner, { type: "session_shutdown", reason: "reload" });
|
|
2401
2465
|
previousRunner.invalidate();
|
|
2402
2466
|
this._resourceLoader.commitReload?.();
|
|
2467
|
+
// Re-derive the memory subsystem from the reloaded settings/providers.
|
|
2468
|
+
await this._initializeMemory();
|
|
2403
2469
|
}
|
|
2404
2470
|
catch (error) {
|
|
2405
2471
|
if (newRunner && newRunner !== previousRunner) {
|