@hoilab/ada-cli 0.84.11 → 0.84.13

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 (65) hide show
  1. package/dist/core/agent-session.d.ts +11 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +84 -1
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/memory-engine/audit.d.ts +46 -0
  6. package/dist/core/memory-engine/audit.d.ts.map +1 -0
  7. package/dist/core/memory-engine/audit.js +165 -0
  8. package/dist/core/memory-engine/audit.js.map +1 -0
  9. package/dist/core/memory-engine/engine.d.ts +158 -0
  10. package/dist/core/memory-engine/engine.d.ts.map +1 -0
  11. package/dist/core/memory-engine/engine.js +948 -0
  12. package/dist/core/memory-engine/engine.js.map +1 -0
  13. package/dist/core/memory-engine/inverted-index.d.ts +46 -0
  14. package/dist/core/memory-engine/inverted-index.d.ts.map +1 -0
  15. package/dist/core/memory-engine/inverted-index.js +235 -0
  16. package/dist/core/memory-engine/inverted-index.js.map +1 -0
  17. package/dist/core/memory-engine/observation-store.d.ts +101 -0
  18. package/dist/core/memory-engine/observation-store.d.ts.map +1 -0
  19. package/dist/core/memory-engine/observation-store.js +429 -0
  20. package/dist/core/memory-engine/observation-store.js.map +1 -0
  21. package/dist/core/memory-engine/scanner.d.ts +11 -0
  22. package/dist/core/memory-engine/scanner.d.ts.map +1 -0
  23. package/dist/core/memory-engine/scanner.js +66 -0
  24. package/dist/core/memory-engine/scanner.js.map +1 -0
  25. package/dist/core/memory-engine/security.d.ts +31 -0
  26. package/dist/core/memory-engine/security.d.ts.map +1 -0
  27. package/dist/core/memory-engine/security.js +180 -0
  28. package/dist/core/memory-engine/security.js.map +1 -0
  29. package/dist/core/memory-engine/session-indexer.d.ts +71 -0
  30. package/dist/core/memory-engine/session-indexer.d.ts.map +1 -0
  31. package/dist/core/memory-engine/session-indexer.js +217 -0
  32. package/dist/core/memory-engine/session-indexer.js.map +1 -0
  33. package/dist/core/memory-engine/tools.d.ts +53 -0
  34. package/dist/core/memory-engine/tools.d.ts.map +1 -0
  35. package/dist/core/memory-engine/tools.js +220 -0
  36. package/dist/core/memory-engine/tools.js.map +1 -0
  37. package/dist/core/memory-engine/types.d.ts +134 -0
  38. package/dist/core/memory-engine/types.d.ts.map +1 -0
  39. package/dist/core/memory-engine/types.js +49 -0
  40. package/dist/core/memory-engine/types.js.map +1 -0
  41. package/dist/core/resource-loader.d.ts +4 -0
  42. package/dist/core/resource-loader.d.ts.map +1 -1
  43. package/dist/core/resource-loader.js +27 -8
  44. package/dist/core/resource-loader.js.map +1 -1
  45. package/dist/core/settings-manager.d.ts +48 -0
  46. package/dist/core/settings-manager.d.ts.map +1 -1
  47. package/dist/core/settings-manager.js +75 -0
  48. package/dist/core/settings-manager.js.map +1 -1
  49. package/dist/index.d.ts +9 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +9 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/modes/interactive/components/home-screen.d.ts.map +1 -1
  54. package/dist/modes/interactive/components/home-screen.js +0 -6
  55. package/dist/modes/interactive/components/home-screen.js.map +1 -1
  56. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  57. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  58. package/dist/modes/interactive/components/settings-selector.js +12 -0
  59. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  60. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  61. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  62. package/dist/modes/interactive/interactive-mode.js +121 -0
  63. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  64. package/npm-shrinkwrap.json +2 -2
  65. package/package.json +1 -1
@@ -37,6 +37,7 @@ import { createSyntheticSourceInfo } from "./source-info.js";
37
37
  import { buildSystemPrompt } from "./system-prompt.js";
38
38
  import { createLocalBashOperations } from "./tools/bash.js";
39
39
  import { createAllToolDefinitions } from "./tools/index.js";
40
+ import { createMemoryEngineTools } from "./memory-engine/tools.js";
40
41
  import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
41
42
  import { addUsageToTotals, createUsageTotals } from "./usage-totals.js";
42
43
  /**
@@ -160,6 +161,29 @@ export class AgentSession {
160
161
  activeToolNames: this._initialActiveToolNames,
161
162
  includeAllExtensionTools: true,
162
163
  });
164
+ // Ada Memory Engine: lazy-initialize (stores, migration, session index)
165
+ // and wire the LLM callback used by review/correction/flush. Best-effort
166
+ // and never blocks startup.
167
+ const memoryEngine = this._resourceLoader.getMemoryEngine();
168
+ if (memoryEngine) {
169
+ memoryEngine.setSessionId(this.sessionManager.getSessionId());
170
+ memoryEngine.setComplete(async (systemPrompt, userContent) => {
171
+ const model = this.model;
172
+ if (!model)
173
+ throw new Error("No model selected");
174
+ const result = await this._modelRuntime.completeSimple(model, {
175
+ systemPrompt,
176
+ messages: [{ role: "user", content: userContent }],
177
+ });
178
+ return contentText(result.content, "").trim();
179
+ });
180
+ memoryEngine.setNotify((message, level) => {
181
+ this._emit({ type: "notification", message, level });
182
+ });
183
+ void memoryEngine.initialize().catch(() => {
184
+ // Memory must never break the session.
185
+ });
186
+ }
163
187
  }
164
188
  get modelRuntime() {
165
189
  return this._modelRuntime;
@@ -338,6 +362,23 @@ export class AgentSession {
338
362
  // =========================================================================
339
363
  // Automatic project memory (claude-mem style)
340
364
  // =========================================================================
365
+ /** Live-index a message for the Memory Engine session search (layer 3c). */
366
+ _indexMessageForMemory(message) {
367
+ const memoryEngine = this._resourceLoader.getMemoryEngine();
368
+ if (!memoryEngine?.isInitialized)
369
+ return;
370
+ try {
371
+ memoryEngine.indexSessionMessage({
372
+ id: message.id,
373
+ role: message.role,
374
+ content: message.content,
375
+ timestamp: message.timestamp,
376
+ });
377
+ }
378
+ catch {
379
+ // Best-effort indexing.
380
+ }
381
+ }
341
382
  static AUTO_MEMORIZE_MIN_INTERVAL_MS = 45_000;
342
383
  static AUTO_MEMORIZE_SYSTEM_PROMPT = `You maintain the shared project memory of a coding project.
343
384
  The memory is loaded into the context of every conversation of this project, so it must stay concise and durable.
@@ -438,11 +479,26 @@ Task: given the CURRENT MEMORY and the LATEST CONVERSATION TURN, produce the COM
438
479
  await this._emitExtensionEvent(event);
439
480
  // Notify all listeners
440
481
  this._emit(event.type === "agent_end" ? { ...event, willRetry: this._willRetryAfterAgentEnd(event) } : event);
482
+ // Ada Memory Engine: track user turns / corrections, run the
483
+ // background review loop, and live-index messages for session search.
484
+ const memoryEngine = this._resourceLoader.getMemoryEngine();
485
+ if (memoryEngine?.isInitialized) {
486
+ if (event.type === "message_end") {
487
+ memoryEngine.onMessageEnd(event.message);
488
+ this._indexMessageForMemory(event.message);
489
+ }
490
+ else if (event.type === "turn_end") {
491
+ void memoryEngine.onTurnEnd({ message: event.message });
492
+ }
493
+ }
441
494
  // Automatic project memory (claude-mem style): after each completed
442
495
  // agent turn with real user interaction, distill durable facts into
443
496
  // the shared project memory. Fire-and-forget; never blocks the turn.
497
+ // Disabled when the Memory Engine is active (its review loop replaces it).
444
498
  if (event.type === "agent_end") {
445
- void this._maybeAutoMemorize(event);
499
+ if (!memoryEngine?.isInitialized) {
500
+ void this._maybeAutoMemorize(event);
501
+ }
446
502
  }
447
503
  // Handle session persistence
448
504
  if (event.type === "message_end") {
@@ -644,6 +700,16 @@ Task: given the CURRENT MEMORY and the LATEST CONVERSATION TURN, produce the COM
644
700
  catch {
645
701
  // Dispose must succeed even if an abort hook throws.
646
702
  }
703
+ // Ada Memory Engine: persist the session index (best-effort).
704
+ try {
705
+ const memoryEngine = this._resourceLoader.getMemoryEngine();
706
+ if (memoryEngine?.isInitialized) {
707
+ void memoryEngine.onShutdown();
708
+ }
709
+ }
710
+ catch {
711
+ // Dispose must succeed even if memory persistence fails.
712
+ }
647
713
  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().");
648
714
  this._disconnectFromAgent();
649
715
  this._eventListeners = [];
@@ -723,6 +789,14 @@ Task: given the CURRENT MEMORY and the LATEST CONVERSATION TURN, produce the COM
723
789
  this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
724
790
  this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
725
791
  }
792
+ /**
793
+ * Rebuild the base system prompt (public) — used after settings changes
794
+ * that affect prompt content (e.g. memory injection mode).
795
+ */
796
+ rebuildSystemPrompt() {
797
+ this._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());
798
+ this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
799
+ }
726
800
  /** Whether compaction or branch summarization is currently running */
727
801
  get isCompacting() {
728
802
  return (this._autoCompactionAbortController !== undefined ||
@@ -2112,6 +2186,15 @@ Task: given the CURRENT MEMORY and the LATEST CONVERSATION TURN, produce the COM
2112
2186
  if (!this.settingsManager.getProjectMemoryEnabled()) {
2113
2187
  this._baseToolDefinitions.delete("update_project_memory");
2114
2188
  }
2189
+ // Ada Memory Engine tools (memory_add/replace/remove/search,
2190
+ // session_search, scratchpad, memory_status). Exposed when enabled.
2191
+ const memoryEngine = this._resourceLoader.getMemoryEngine();
2192
+ if (memoryEngine && this.settingsManager.getProjectMemoryEnabled()) {
2193
+ const engineTools = createMemoryEngineTools(memoryEngine);
2194
+ for (const [name, tool] of Object.entries(engineTools)) {
2195
+ this._baseToolDefinitions.set(name, tool);
2196
+ }
2197
+ }
2115
2198
  const extensionsResult = this._resourceLoader.getExtensions();
2116
2199
  if (options.flagValues) {
2117
2200
  for (const [name, value] of options.flagValues) {