iranti 0.3.22 → 0.3.23

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.
@@ -490,7 +490,7 @@ Do not use this as a per-turn retrieval tool; use iranti_attend.`,
490
490
  description: `Ask Iranti whether memory should be injected before the next LLM turn.
491
491
  REQUIRED CALL SEQUENCE — follow this every turn, regardless of host:
492
492
  1. Call with phase='pre-response' BEFORE replying to the user.
493
- 2. Call BEFORE any lookup tool (Read, Grep, Glob, Bash, WebSearch, WebFetch) where Iranti might already hold the answer.
493
+ 2. Call BEFORE any lookup tool (Read, Grep, Glob, Bash, WebSearch, WebFetch) where Iranti might already hold the answer. When you do, pass the pendingToolCall field so Iranti can derive entity hints from the tool target (file, URL, query) and preempt the lookup with stored facts.
494
494
  3. If you just ran Edit/Write/Bash/WebSearch/WebFetch since your last iranti_write, call iranti_write FIRST — then attend.
495
495
  4. Call with phase='post-response' AFTER every reply, without exception.
496
496
 
@@ -508,11 +508,15 @@ checkpoint state before closing the turn.`,
508
508
  entityHints: z.array(z.string()).optional().describe('Optional entity hints in entityType/entityId format.'),
509
509
  maxFacts: z.number().int().min(1).max(20).optional().describe('Maximum facts to inject.'),
510
510
  forceInject: z.boolean().optional().describe('Force a memory injection decision.'),
511
- phase: z.enum(['pre-response', 'post-response', 'mid-turn']).optional().describe("Call phase: 'pre-response' before replying, 'post-response' after replying. Enables precise compliance tracking."),
511
+ phase: z.enum(['pre-response', 'post-response', 'mid-turn']).optional().describe("Call phase: 'pre-response' before replying, 'post-response' after replying, 'mid-turn' for discovery-triggered re-attends within the same turn (e.g. after reading a new file or hitting a new entity). Mid-turn attends dedup facts already injected this turn, default to a smaller fact budget (3), and skip user-rule re-scans."),
512
+ pendingToolCall: z.object({
513
+ name: z.enum(['Read', 'Grep', 'Glob', 'Bash', 'WebSearch', 'WebFetch']).describe('The name of the read-only tool the agent is about to run.'),
514
+ args: z.record(z.string(), z.unknown()).optional().describe('The tool arguments (e.g. {file_path: "src/foo.ts"} for Read, {pattern: "src/**/*.ts"} for Glob, {command: "cat scripts/bar.ts"} for Bash, {url: "https://example.com"} for WebFetch, {query: "vector backend"} for WebSearch).'),
515
+ }).optional().describe('Describe the read-only tool call the agent is about to make. Iranti derives entity hints from the tool target (file path, URL, query) and surfaces any stored facts BEFORE the tool runs, so you can preempt redundant Read/Grep/Bash/WebFetch/WebSearch calls with stored memory. The result includes a toolCallGuidance field summarising what was derived.'),
512
516
  agent: z.string().optional().describe('Override the default agent id.'),
513
517
  agentId: z.string().optional().describe('Alias for agent. Override the default agent id.'),
514
518
  },
515
- }, async ({ latestMessage, message, currentContext, entityHints, maxFacts, forceInject, phase, agent, agentId }) => {
519
+ }, async ({ latestMessage, message, currentContext, entityHints, maxFacts, forceInject, phase, pendingToolCall, agent, agentId }) => {
516
520
  const resolvedAgent = resolveToolAgent(agent, agentId);
517
521
  syncRuntimeLedgerContext(iranti, undefined, resolvedAgent);
518
522
  const resolvedLatestMessage = resolveAttendLatestMessage({ latestMessage, message });
@@ -565,6 +569,7 @@ checkpoint state before closing the turn.`,
565
569
  maxFacts,
566
570
  forceInject,
567
571
  phase,
572
+ pendingToolCall,
568
573
  });
569
574
  const factsBlock = result.facts.length > 0
570
575
  ? (0, hostMemoryFormatting_1.formatStructuredFactBlock)(result.facts, {
@@ -51,7 +51,7 @@ const RUNTIME_AUTHORITY = (0, runtimeLifecycle_1.resolveRuntimeAuthorityFromEnv)
51
51
  const INSTANCE_DIR = RUNTIME_AUTHORITY.instanceDir;
52
52
  const INSTANCE_RUNTIME_FILE = RUNTIME_AUTHORITY.runtimeFile;
53
53
  const INSTANCE_NAME = process.env.IRANTI_INSTANCE_NAME?.trim() || (INSTANCE_DIR ? path_1.default.basename(INSTANCE_DIR) : 'adhoc');
54
- const VERSION = '0.3.22';
54
+ const VERSION = '0.3.23';
55
55
  const PORT_RAW = (process.env.IRANTI_PORT ?? '3001').trim();
56
56
  const PORT = Number.parseInt(PORT_RAW, 10);
57
57
  const runtimeMetadataHealth = (0, healthChecks_1.createHealthCheckState)({
@@ -216,13 +216,20 @@ export interface ObserveResult {
216
216
  name: string;
217
217
  reason: string;
218
218
  }>;
219
+ midTurnFilteredKeys?: string[];
219
220
  };
220
221
  }
222
+ export type PendingToolCallName = 'Read' | 'Grep' | 'Glob' | 'Bash' | 'WebSearch' | 'WebFetch';
223
+ export interface PendingToolCall {
224
+ name: PendingToolCallName;
225
+ args?: Record<string, unknown>;
226
+ }
221
227
  export interface AttendInput extends ObserveInput {
222
228
  latestMessage?: string;
223
229
  forceInject?: boolean;
224
230
  suppressEvents?: boolean;
225
231
  phase?: 'pre-response' | 'post-response' | 'mid-turn';
232
+ pendingToolCall?: PendingToolCall;
226
233
  }
227
234
  export interface SessionCheckpointInput extends AgentContext {
228
235
  sessionId?: string;
@@ -257,6 +264,13 @@ export interface AttendResult extends ObserveResult {
257
264
  memoryResultsConsidered?: number;
258
265
  postResponseCapture?: PostResponseCaptureInfo;
259
266
  matchedUserRules?: MatchedUserRule[];
267
+ toolCallGuidance?: ToolCallGuidance;
268
+ }
269
+ export interface ToolCallGuidance {
270
+ toolName: PendingToolCallName;
271
+ derivedEntities: string[];
272
+ factCount: number;
273
+ note: string;
260
274
  }
261
275
  export interface PostResponseCaptureInfo {
262
276
  factsExtracted: number;
@@ -307,6 +321,13 @@ export declare function extractRuleTriggers(properties: Record<string, unknown>
307
321
  export declare function matchesRuleTriggers(triggers: string[], contextTokens: Set<string>, contextLower: string): boolean;
308
322
  export declare function formatMatchedUserRules(rules: MatchedUserRule[]): string;
309
323
  export declare function extractFilePathEntityHints(text: string, projectEntity: string | null): string[];
324
+ /**
325
+ * Derive entity hints from a pending tool call. Pure, stateless, safe to call
326
+ * from tests. Callers should merge the result into `effectiveEntityHints`
327
+ * *after* text-derived hints so text signals still take precedence when a hint
328
+ * appears in both places.
329
+ */
330
+ export declare function derivePendingToolCallEntityHints(toolCall: PendingToolCall | undefined, projectEntity: string | null): string[];
310
331
  export declare function readPersistedSessionState(agentId: string): Promise<PersistedSessionState | null>;
311
332
  export declare function summarizeSessionState(agentId: string, checkpoint: SessionCheckpointRecord | null, persistedBriefGeneratedAt?: string, compliance?: SessionComplianceState | null): SessionSummary;
312
333
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AttendantInstance.d.ts","sourceRoot":"","sources":["../../../src/attendant/AttendantInstance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AttendantInstance.d.ts","sourceRoot":"","sources":["../../../src/attendant/AttendantInstance.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ exports.extractRuleTriggers = extractRuleTriggers;
7
7
  exports.matchesRuleTriggers = matchesRuleTriggers;
8
8
  exports.formatMatchedUserRules = formatMatchedUserRules;
9
9
  exports.extractFilePathEntityHints = extractFilePathEntityHints;
10
+ exports.derivePendingToolCallEntityHints = derivePendingToolCallEntityHints;
10
11
  exports.readPersistedSessionState = readPersistedSessionState;
11
12
  exports.summarizeSessionState = summarizeSessionState;
12
13
  exports.injectedFactsAreTaskRelevant = injectedFactsAreTaskRelevant;
@@ -60,6 +61,11 @@ const SESSION_INTERRUPTION_TTL_MS = 5 * 60 * 1000;
60
61
  const PERSISTENCE_WARNING_THRESHOLD = 3;
61
62
  const PERSISTENCE_NON_COMPLIANT_THRESHOLD = 5;
62
63
  const ENTITY_DETECTION_WINDOW_CHARS = 1500;
64
+ // A1: mid-turn attends default to a smaller fact budget than pre-response.
65
+ // The agent is already deep in the task with a working memory frame; the point
66
+ // of a mid-turn attend is to surface 1-3 NEW facts on a topic shift, not to
67
+ // re-dump the whole briefing.
68
+ const MID_TURN_DEFAULT_MAX_FACTS = 3;
63
69
  const MIN_ENTITY_CONFIDENCE = 0.75;
64
70
  const MEMORY_DECISION_CONTEXT_WINDOW_CHARS = 2000;
65
71
  const LEDGER_WORKING_MEMORY_PREFIX = 'system/session_ledger/recent_learning_';
@@ -447,6 +453,174 @@ function extractFilePathEntityHints(text, projectEntity) {
447
453
  }
448
454
  return hints;
449
455
  }
456
+ // ─── A2: Pending Tool-Call Entity Hints ─────────────────────────────────────
457
+ //
458
+ // Derive entity hints from a structured tool call that the agent is about to
459
+ // make. This lets attend() preempt redundant read-only tool calls by surfacing
460
+ // stored facts keyed to the target of the tool call (a file, a URL, a query).
461
+ //
462
+ // We deliberately keep this a PURE function so it is trivially unit-testable
463
+ // and so the caller can exercise different tool shapes without spinning up an
464
+ // attendant. It returns entity hints in `entityType/entityId` form.
465
+ function normalizeWebToken(value, maxLen = 48) {
466
+ return value
467
+ .toLowerCase()
468
+ .replace(/[^a-z0-9]+/g, '_')
469
+ .replace(/^_+|_+$/g, '')
470
+ .slice(0, maxLen);
471
+ }
472
+ function deriveFileEntityFromPath(rawPath, projectId, seen, hints) {
473
+ const trimmed = rawPath.trim();
474
+ if (!trimmed)
475
+ return;
476
+ const basename = trimmed.replace(/\\/g, '/').split('/').pop() ?? '';
477
+ // Strip trailing args like "foo.ts:42" or "foo.ts,bar.ts"
478
+ const stripped = basename.split(/[,:()]/)[0] ?? basename;
479
+ const nameWithoutExt = stripped
480
+ .replace(/\.\w+$/, '')
481
+ .replace(/[^a-zA-Z0-9]/g, '_')
482
+ .toLowerCase();
483
+ if (!nameWithoutExt || nameWithoutExt.length < 2)
484
+ return;
485
+ const hint = `project/${projectId}/file/${nameWithoutExt}`;
486
+ if (!seen.has(hint)) {
487
+ seen.add(hint);
488
+ hints.push(hint);
489
+ }
490
+ }
491
+ function scanStringForPathEntities(text, projectId, seen, hints) {
492
+ if (!text)
493
+ return;
494
+ FILE_PATH_PATTERN.lastIndex = 0;
495
+ let match;
496
+ while ((match = FILE_PATH_PATTERN.exec(text)) !== null) {
497
+ deriveFileEntityFromPath(match[1], projectId, seen, hints);
498
+ }
499
+ }
500
+ function extractBasenameFromGlobPattern(pattern) {
501
+ // A glob like "src/**/*.ts" has no meaningful basename; one like
502
+ // "tests/attendant/run_mid_turn_attend_tests.ts" does. We only derive a
503
+ // file entity from the last segment if it looks like a literal filename.
504
+ const segments = pattern.replace(/\\/g, '/').split('/');
505
+ for (let i = segments.length - 1; i >= 0; i--) {
506
+ const seg = segments[i];
507
+ if (!seg || seg.includes('*') || seg.includes('?') || seg === '.' || seg === '..')
508
+ continue;
509
+ if (/\.\w+$/.test(seg))
510
+ return seg;
511
+ }
512
+ return null;
513
+ }
514
+ /**
515
+ * Derive entity hints from a pending tool call. Pure, stateless, safe to call
516
+ * from tests. Callers should merge the result into `effectiveEntityHints`
517
+ * *after* text-derived hints so text signals still take precedence when a hint
518
+ * appears in both places.
519
+ */
520
+ function derivePendingToolCallEntityHints(toolCall, projectEntity) {
521
+ if (!toolCall || !projectEntity)
522
+ return [];
523
+ const parsed = (0, entity_resolution_1.parseEntityString)(projectEntity);
524
+ const projectId = parsed.entityId;
525
+ if (!projectId)
526
+ return [];
527
+ const args = (toolCall.args ?? {});
528
+ const seen = new Set();
529
+ const hints = [];
530
+ switch (toolCall.name) {
531
+ case 'Read': {
532
+ const filePath = typeof args.file_path === 'string' ? args.file_path : '';
533
+ if (filePath) {
534
+ deriveFileEntityFromPath(filePath, projectId, seen, hints);
535
+ }
536
+ break;
537
+ }
538
+ case 'Grep': {
539
+ // Grep has pattern + optional path + optional glob. Only path/glob
540
+ // can yield file-level entities; the regex pattern itself is
541
+ // content-level and gets surfaced via the existing text hints from
542
+ // latestMessage/currentContext.
543
+ if (typeof args.path === 'string') {
544
+ deriveFileEntityFromPath(args.path, projectId, seen, hints);
545
+ }
546
+ if (typeof args.glob === 'string') {
547
+ const base = extractBasenameFromGlobPattern(args.glob);
548
+ if (base)
549
+ deriveFileEntityFromPath(base, projectId, seen, hints);
550
+ }
551
+ break;
552
+ }
553
+ case 'Glob': {
554
+ if (typeof args.pattern === 'string') {
555
+ const base = extractBasenameFromGlobPattern(args.pattern);
556
+ if (base)
557
+ deriveFileEntityFromPath(base, projectId, seen, hints);
558
+ // If the pattern has no literal basename, fall through to the
559
+ // project entity so stored project-level facts still surface.
560
+ }
561
+ if (typeof args.path === 'string') {
562
+ deriveFileEntityFromPath(args.path, projectId, seen, hints);
563
+ }
564
+ break;
565
+ }
566
+ case 'Bash': {
567
+ // Scan the command string for embedded paths. This covers
568
+ // `cat src/foo.ts`, `rm ./dist/bar.js`, `node scripts/baz.ts`, etc.
569
+ const command = typeof args.command === 'string' ? args.command : '';
570
+ scanStringForPathEntities(command, projectId, seen, hints);
571
+ break;
572
+ }
573
+ case 'WebSearch': {
574
+ const query = typeof args.query === 'string' ? args.query : '';
575
+ const token = normalizeWebToken(query);
576
+ if (token) {
577
+ const hint = `web/search_${token}`;
578
+ if (!seen.has(hint)) {
579
+ seen.add(hint);
580
+ hints.push(hint);
581
+ }
582
+ }
583
+ break;
584
+ }
585
+ case 'WebFetch': {
586
+ const url = typeof args.url === 'string' ? args.url : '';
587
+ if (url) {
588
+ try {
589
+ const parsedUrl = new URL(url);
590
+ const host = normalizeWebToken(parsedUrl.hostname);
591
+ if (host) {
592
+ const hostHint = `web/${host}`;
593
+ if (!seen.has(hostHint)) {
594
+ seen.add(hostHint);
595
+ hints.push(hostHint);
596
+ }
597
+ }
598
+ const path = normalizeWebToken(parsedUrl.pathname);
599
+ if (host && path && path.length >= 2) {
600
+ const pathHint = `web/${host}_${path}`;
601
+ if (!seen.has(pathHint)) {
602
+ seen.add(pathHint);
603
+ hints.push(pathHint);
604
+ }
605
+ }
606
+ }
607
+ catch {
608
+ // Non-URL string — fall back to a normalized token entity.
609
+ const token = normalizeWebToken(url);
610
+ if (token) {
611
+ const hint = `web/${token}`;
612
+ if (!seen.has(hint)) {
613
+ seen.add(hint);
614
+ hints.push(hint);
615
+ }
616
+ }
617
+ }
618
+ }
619
+ break;
620
+ }
621
+ }
622
+ return hints;
623
+ }
450
624
  function advisoryTaskTokens(taskType) {
451
625
  if (!taskType)
452
626
  return [];
@@ -2323,11 +2497,22 @@ class AttendantInstance {
2323
2497
  const baseEntityHints = this.resolveAttendEntityHints(input.entityHints, latestMessage);
2324
2498
  // File-change demand-driven recall: extract file path mentions and add as entity hints
2325
2499
  const filePathHints = extractFilePathEntityHints(`${latestMessage}\n${currentContext}`, (0, autoRemember_1.getProjectMemoryEntity)() ?? null);
2326
- const effectiveEntityHints = filePathHints.length > 0
2327
- ? [...new Set([...baseEntityHints, ...filePathHints])]
2328
- : baseEntityHints;
2329
- // User operating rules: load rules whose triggers match the current context
2330
- const matchedUserRules = phase !== 'post-response'
2500
+ // A2: tool-call triggered retrieval. If the caller says "I'm about to
2501
+ // run Read(file_path=X) / Grep / Bash / WebFetch / WebSearch", derive
2502
+ // structured entity hints from the tool arguments BEFORE the tool
2503
+ // runs, so stored facts can preempt the lookup.
2504
+ const toolCallHints = derivePendingToolCallEntityHints(input.pendingToolCall, (0, autoRemember_1.getProjectMemoryEntity)() ?? null);
2505
+ const allExtraHints = filePathHints.length === 0 && toolCallHints.length === 0
2506
+ ? null
2507
+ : [...filePathHints, ...toolCallHints];
2508
+ const effectiveEntityHints = allExtraHints === null
2509
+ ? baseEntityHints
2510
+ : [...new Set([...baseEntityHints, ...allExtraHints])];
2511
+ // User operating rules: load rules whose triggers match the current context.
2512
+ // Mid-turn attends skip this — rules were already surfaced at pre-response,
2513
+ // and reloading them on every mid-turn call would duplicate context and burn
2514
+ // an LLM call on the trigger match.
2515
+ const matchedUserRules = (phase !== 'post-response' && phase !== 'mid-turn')
2331
2516
  ? await this.loadMatchingUserRules(`${latestMessage}\n${currentContext}`)
2332
2517
  : [];
2333
2518
  let watchedEntitiesChanged = this.updateWatchedEntities(effectiveEntityHints);
@@ -2447,6 +2632,17 @@ class AttendantInstance {
2447
2632
  await this.persistState();
2448
2633
  }
2449
2634
  (0, metrics_1.timeEnd)('attendant.attend_ms', t0);
2635
+ // A2: even on the "memory not needed" early return, if the caller
2636
+ // passed pendingToolCall, echo the derived entities so the agent
2637
+ // can see that attend() was tool-call-aware on this call.
2638
+ const skipGuidance = input.pendingToolCall
2639
+ ? {
2640
+ toolName: input.pendingToolCall.name,
2641
+ derivedEntities: toolCallHints,
2642
+ factCount: 0,
2643
+ note: `Memory was not deemed necessary for this ${input.pendingToolCall.name} call. Proceed.`,
2644
+ }
2645
+ : undefined;
2450
2646
  return {
2451
2647
  shouldInject: matchedUserRules.length > 0,
2452
2648
  reason: 'memory_not_needed',
@@ -2472,21 +2668,28 @@ class AttendantInstance {
2472
2668
  hintsResolved: 0,
2473
2669
  dropped: [{ name: latestMessage || '(none)', reason: 'memory_not_needed' }],
2474
2670
  },
2671
+ toolCallGuidance: skipGuidance,
2475
2672
  };
2476
2673
  }
2477
2674
  // Post-compaction recovery: re-surface facts that were recently injected (likely in context
2478
2675
  // just before the compact) without blocking them on the already-in-context filter.
2479
2676
  // The flag is set by handshake(postCompaction:true) and consumed exactly once here.
2480
2677
  const postCompactionRecoveryKeys = [];
2481
- let postCompactionMaxFacts = input.maxFacts;
2678
+ let effectiveMaxFacts = input.maxFacts;
2482
2679
  if (this.postCompactionPending) {
2483
2680
  const recentInjections = this.pendingMemoryAttributions.slice(-5);
2484
2681
  for (const attr of recentInjections) {
2485
2682
  postCompactionRecoveryKeys.push(...attr.injectedKeys);
2486
2683
  }
2487
- postCompactionMaxFacts = Math.min((input.maxFacts ?? 5) * 2, 10);
2684
+ effectiveMaxFacts = Math.min((input.maxFacts ?? 5) * 2, 10);
2488
2685
  this.postCompactionPending = false;
2489
2686
  }
2687
+ else if (phase === 'mid-turn' && input.maxFacts === undefined) {
2688
+ // A1: mid-turn attends default to a smaller fact budget than pre-response.
2689
+ // The agent already has a working-memory frame from the pre-response attend;
2690
+ // mid-turn is about surfacing 1-3 NEW facts on a topic shift, not re-dumping briefs.
2691
+ effectiveMaxFacts = MID_TURN_DEFAULT_MAX_FACTS;
2692
+ }
2490
2693
  const observeEntityHints = effectiveEntityHints.length > 0 ? effectiveEntityHints : freshState.entities;
2491
2694
  const allObserveEntityHints = postCompactionRecoveryKeys.length > 0
2492
2695
  ? [...new Set([
@@ -2499,7 +2702,7 @@ class AttendantInstance {
2499
2702
  : observeEntityHints;
2500
2703
  const observed = await this.observe({
2501
2704
  currentContext: observationContext,
2502
- maxFacts: postCompactionMaxFacts,
2705
+ maxFacts: effectiveMaxFacts,
2503
2706
  entityHints: allObserveEntityHints,
2504
2707
  priorityKeys: expandContinuityPriorityKeys(Array.from(new Set([
2505
2708
  ...(mandatoryRecall.key ? [mandatoryRecall.key] : []),
@@ -2523,7 +2726,31 @@ class AttendantInstance {
2523
2726
  const remainder = slashIdx2 === -1 ? '' : fact.entityKey.slice(slashIdx2);
2524
2727
  return { ...fact, entityKey: `${canonicalPersonalType}/${canonicalPersonalId}${remainder}` };
2525
2728
  });
2526
- const structuredFacts = (0, hostMemoryFormatting_1.assignStructuredFactIds)(remappedFacts);
2729
+ // A1: mid-turn dedup — drop facts whose entityKey was already injected earlier
2730
+ // in the SAME turn. pendingMemoryAttributions is reset at post-response, so any
2731
+ // entry in that list belongs to the current turn. This prevents mid-turn attends
2732
+ // from spamming the agent with facts it already has in working memory from a
2733
+ // previous pre-response or mid-turn attend call.
2734
+ const midTurnFilteredKeys = [];
2735
+ let factsAfterDedup = remappedFacts;
2736
+ if (phase === 'mid-turn' && this.pendingMemoryAttributions.length > 0) {
2737
+ const alreadyInjectedThisTurn = new Set();
2738
+ for (const attr of this.pendingMemoryAttributions) {
2739
+ for (const key of attr.injectedKeys) {
2740
+ alreadyInjectedThisTurn.add(key);
2741
+ }
2742
+ }
2743
+ if (alreadyInjectedThisTurn.size > 0) {
2744
+ factsAfterDedup = remappedFacts.filter((fact) => {
2745
+ if (alreadyInjectedThisTurn.has(fact.entityKey)) {
2746
+ midTurnFilteredKeys.push(fact.entityKey);
2747
+ return false;
2748
+ }
2749
+ return true;
2750
+ });
2751
+ }
2752
+ }
2753
+ const structuredFacts = (0, hostMemoryFormatting_1.assignStructuredFactIds)(factsAfterDedup);
2527
2754
  watchedEntitiesChanged = this.updateWatchedEntities(observed.entitiesResolved?.map((entry) => entry.canonicalEntity) ?? []) || watchedEntitiesChanged;
2528
2755
  this.markSharedStateObserved(observeEntityHints.length > 0 ? observeEntityHints : freshState.entities);
2529
2756
  let reason = 'memory_needed_injected';
@@ -2532,8 +2759,14 @@ class AttendantInstance {
2532
2759
  const memoryResultsConsidered = observed.totalFound;
2533
2760
  let searchSuggestion;
2534
2761
  if (!shouldInject) {
2762
+ // A1: if mid-turn dedup ate everything observe returned, treat it as
2763
+ // "already in context" — the agent has these facts from an earlier attend.
2764
+ const allDroppedByMidTurnDedup = phase === 'mid-turn'
2765
+ && midTurnFilteredKeys.length > 0
2766
+ && remappedFacts.length > 0
2767
+ && factsAfterDedup.length === 0;
2535
2768
  const allAlreadyInContext = observed.totalFound > 0 && observed.alreadyPresent >= observed.totalFound;
2536
- reason = allAlreadyInContext ? 'memory_needed_but_in_context' : 'memory_checked_no_match';
2769
+ reason = (allAlreadyInContext || allDroppedByMidTurnDedup) ? 'memory_needed_but_in_context' : 'memory_checked_no_match';
2537
2770
  if (reason === 'memory_checked_no_match') {
2538
2771
  const terms = tokenizeForSearch(latestMessage).slice(0, 6);
2539
2772
  const alternativeEntities = (observed.entitiesResolved ?? [])
@@ -2564,8 +2797,30 @@ class AttendantInstance {
2564
2797
  }),
2565
2798
  ]
2566
2799
  : [];
2800
+ // A1: when mid-turn dedup filtered keys, surface them in debug so the
2801
+ // caller (and tests) can reason about which facts were suppressed.
2802
+ const debugWithMidTurn = (midTurnFilteredKeys.length > 0 && observed.debug)
2803
+ ? { ...observed.debug, midTurnFilteredKeys: [...midTurnFilteredKeys] }
2804
+ : observed.debug;
2805
+ // A2: if the caller supplied pendingToolCall, surface a guidance block
2806
+ // so the agent can see what entities were derived and how many stored
2807
+ // facts preempted the lookup. Only populated when a tool call was
2808
+ // actually passed — no allocation overhead for the common path.
2809
+ const toolCallGuidance = input.pendingToolCall
2810
+ ? {
2811
+ toolName: input.pendingToolCall.name,
2812
+ derivedEntities: toolCallHints,
2813
+ factCount: structuredFacts.length,
2814
+ note: toolCallHints.length === 0
2815
+ ? `No entity hints derived from ${input.pendingToolCall.name} args. Memory check ran on message/context only.`
2816
+ : structuredFacts.length > 0
2817
+ ? `Iranti surfaced ${structuredFacts.length} stored fact(s) for this ${input.pendingToolCall.name} call. Read them before running the tool — you may not need to run it.`
2818
+ : `No stored facts matched the ${input.pendingToolCall.name} target. Proceed with the tool call.`,
2819
+ }
2820
+ : undefined;
2567
2821
  const attendResult = {
2568
2822
  ...observed,
2823
+ debug: debugWithMidTurn,
2569
2824
  facts: structuredFacts,
2570
2825
  shouldInject: structuredFacts.length > 0 || matchedUserRules.length > 0,
2571
2826
  reason,
@@ -2579,6 +2834,7 @@ class AttendantInstance {
2579
2834
  memoryResultsConsidered,
2580
2835
  matchedUserRules: matchedUserRules.length > 0 ? matchedUserRules : undefined,
2581
2836
  usageGuidance: buildUsageGuidance('attend', this.turnsWithoutWrite),
2837
+ toolCallGuidance,
2582
2838
  };
2583
2839
  if (input.suppressEvents !== true) {
2584
2840
  (0, staffEventRegistry_1.getStaffEventEmitter)().emit({