@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.
Files changed (42) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/core/agent-session.d.ts +11 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +66 -0
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/context-gc.d.ts.map +1 -1
  7. package/dist/core/context-gc.js +4 -0
  8. package/dist/core/context-gc.js.map +1 -1
  9. package/dist/core/extensions/loader.d.ts.map +1 -1
  10. package/dist/core/extensions/loader.js +5 -0
  11. package/dist/core/extensions/loader.js.map +1 -1
  12. package/dist/core/extensions/runner.d.ts.map +1 -1
  13. package/dist/core/extensions/runner.js +1 -0
  14. package/dist/core/extensions/runner.js.map +1 -1
  15. package/dist/core/extensions/types.d.ts +4 -0
  16. package/dist/core/extensions/types.d.ts.map +1 -1
  17. package/dist/core/extensions/types.js.map +1 -1
  18. package/dist/core/memory/memory-manager.d.ts +22 -0
  19. package/dist/core/memory/memory-manager.d.ts.map +1 -0
  20. package/dist/core/memory/memory-manager.js +212 -0
  21. package/dist/core/memory/memory-manager.js.map +1 -0
  22. package/dist/core/memory/memory-provider.d.ts +25 -0
  23. package/dist/core/memory/memory-provider.d.ts.map +1 -0
  24. package/dist/core/memory/memory-provider.js +2 -0
  25. package/dist/core/memory/memory-provider.js.map +1 -0
  26. package/dist/core/memory/providers/file-store.d.ts +23 -0
  27. package/dist/core/memory/providers/file-store.d.ts.map +1 -0
  28. package/dist/core/memory/providers/file-store.js +212 -0
  29. package/dist/core/memory/providers/file-store.js.map +1 -0
  30. package/dist/core/sdk.d.ts +2 -0
  31. package/dist/core/sdk.d.ts.map +1 -1
  32. package/dist/core/sdk.js +1 -0
  33. package/dist/core/sdk.js.map +1 -1
  34. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  35. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  36. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  37. package/examples/extensions/sandbox/package-lock.json +2 -2
  38. package/examples/extensions/sandbox/package.json +1 -1
  39. package/examples/extensions/with-deps/package-lock.json +2 -2
  40. package/examples/extensions/with-deps/package.json +1 -1
  41. package/npm-shrinkwrap.json +12 -12
  42. 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) {