iranti 0.3.18 → 0.3.20

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.
@@ -51,6 +51,7 @@ const client_1 = require("../src/library/client");
51
51
  const attendant_1 = require("../src/attendant");
52
52
  const assistantCheckpoint_1 = require("../src/lib/assistantCheckpoint");
53
53
  const hostMemoryFormatting_1 = require("../src/lib/hostMemoryFormatting");
54
+ const AttendantInstance_1 = require("../src/attendant/AttendantInstance");
54
55
  (0, runtimeEnv_1.loadRuntimeEnv)();
55
56
  let runtimeHostOverride = null;
56
57
  let shutdownPromise = null;
@@ -449,7 +450,7 @@ async function main() {
449
450
  }
450
451
  const server = new mcp_js_1.McpServer({
451
452
  name: 'iranti-mcp',
452
- version: '0.3.18',
453
+ version: '0.3.20',
453
454
  });
454
455
  server.registerTool('iranti_handshake', {
455
456
  description: `Initialize or refresh an agent's working-memory brief for the current task.
@@ -516,8 +517,9 @@ checkpoint state before closing the turn.`,
516
517
  syncRuntimeLedgerContext(iranti, undefined, resolvedAgent);
517
518
  const resolvedLatestMessage = resolveAttendLatestMessage({ latestMessage, message });
518
519
  try {
520
+ let postResponseCapture;
519
521
  if (phase === 'post-response') {
520
- await (0, autoRemember_1.rememberAssistantResponseFacts)({
522
+ const rememberResult = await (0, autoRemember_1.rememberAssistantResponseFacts)({
521
523
  iranti,
522
524
  response: resolvedLatestMessage,
523
525
  agent: resolvedAgent,
@@ -540,6 +542,12 @@ checkpoint state before closing the turn.`,
540
542
  },
541
543
  });
542
544
  }
545
+ postResponseCapture = {
546
+ factsExtracted: rememberResult.extracted,
547
+ factsWritten: rememberResult.written,
548
+ checkpointExtracted: checkpoint !== null && checkpoint !== undefined,
549
+ skipped: rememberResult.skipped,
550
+ };
543
551
  }
544
552
  else if ((0, autoRemember_1.isAutoRememberEnabled)()) {
545
553
  await (0, autoRemember_1.autoRememberPromptFacts)({
@@ -558,16 +566,23 @@ checkpoint state before closing the turn.`,
558
566
  forceInject,
559
567
  phase,
560
568
  });
561
- const injectionBlock = result.shouldInject
569
+ const factsBlock = result.facts.length > 0
562
570
  ? (0, hostMemoryFormatting_1.formatStructuredFactBlock)(result.facts, {
563
571
  title: 'Iranti Retrieved Memory',
564
572
  includeValues: false,
565
573
  })
566
574
  : '';
575
+ const rulesBlock = result.matchedUserRules?.length
576
+ ? `\n[User Operating Rules]\nThese rules were triggered by keywords in your current context. Follow them for this task.\n${(0, AttendantInstance_1.formatMatchedUserRules)(result.matchedUserRules)}`
577
+ : '';
578
+ const injectionBlock = factsBlock || rulesBlock
579
+ ? `${factsBlock}${rulesBlock}`
580
+ : '';
567
581
  return textResult({
568
582
  ...result,
569
583
  facts: sanitizeFacts(result.facts),
570
584
  injectionBlock,
585
+ ...(postResponseCapture ? { postResponseCapture } : {}),
571
586
  });
572
587
  }
573
588
  catch (error) {
@@ -841,6 +856,50 @@ such as issueStatus=open|resolved, severity, or resolution notes.`,
841
856
  } : {}),
842
857
  });
843
858
  });
859
+ server.registerTool('iranti_write_rule', {
860
+ description: `Write a task-scoped user operating rule with trigger keywords.
861
+ Rules surface during iranti_attend only when the current context matches
862
+ one or more trigger keywords. Use this for recurring guidelines that should
863
+ be applied to specific task types (e.g. "always use GitHub Releases, not
864
+ npm publish" triggered by "release", "publish", "npm"). Rules are stored
865
+ as rule/<rule_id> entities and persist across sessions.`,
866
+ inputSchema: {
867
+ ruleId: z.string().min(1).describe('Stable rule identifier (becomes entityId under rule/ type).'),
868
+ rule: z.string().min(1).describe('The rule text — what the agent should do or avoid.'),
869
+ triggers: z.array(z.string().min(1)).min(1).describe('Keyword triggers. The rule surfaces when any trigger matches the attend context.'),
870
+ scope: z.enum(['project', 'user', 'global']).optional().describe('Scope of the rule. Defaults to project.'),
871
+ enforcement: z.enum(['soft', 'hard']).optional().describe('Enforcement level. soft=reminder, hard=required. Defaults to soft.'),
872
+ source: z.string().optional().describe('Source label for provenance.'),
873
+ agent: z.string().optional().describe('Override the default agent id.'),
874
+ agentId: z.string().optional().describe('Alias for agent. Override the default agent id.'),
875
+ },
876
+ }, async ({ ruleId, rule, triggers, scope, enforcement, source, agent, agentId }) => {
877
+ const resolvedAgent = resolveToolAgent(agent, agentId);
878
+ syncRuntimeLedgerContext(iranti, undefined, resolvedAgent);
879
+ const normalizedId = ruleId.trim().toLowerCase().replace(/[^a-z0-9_-]/g, '_');
880
+ const result = await iranti.write({
881
+ entity: `rule/${normalizedId}`,
882
+ key: 'definition',
883
+ value: { rule, triggers, scope: scope ?? 'project', enforcement: enforcement ?? 'soft' },
884
+ summary: rule,
885
+ confidence: 100,
886
+ source: source?.trim() || defaultWriteSource(),
887
+ agent: resolvedAgent,
888
+ properties: {
889
+ triggers,
890
+ scope: scope ?? 'project',
891
+ enforcement: enforcement ?? 'soft',
892
+ durableClass: 'operating_rule',
893
+ },
894
+ });
895
+ return textResult({
896
+ ...toStructuredContent(result),
897
+ ruleId: normalizedId,
898
+ triggers,
899
+ scope: scope ?? 'project',
900
+ enforcement: enforcement ?? 'soft',
901
+ });
902
+ });
844
903
  server.registerTool('iranti_write_issue', {
845
904
  description: `Write a canonical open or resolved issue fact on a stable key.
846
905
  Use this when you want defects, bugs, or chores to remain first-class shared
@@ -50,7 +50,7 @@ const RUNTIME_AUTHORITY = (0, runtimeLifecycle_1.resolveRuntimeAuthorityFromEnv)
50
50
  const INSTANCE_DIR = RUNTIME_AUTHORITY.instanceDir;
51
51
  const INSTANCE_RUNTIME_FILE = RUNTIME_AUTHORITY.runtimeFile;
52
52
  const INSTANCE_NAME = process.env.IRANTI_INSTANCE_NAME?.trim() || (INSTANCE_DIR ? path_1.default.basename(INSTANCE_DIR) : 'adhoc');
53
- const VERSION = '0.3.18';
53
+ const VERSION = '0.3.20';
54
54
  const PORT_RAW = (process.env.IRANTI_PORT ?? '3001').trim();
55
55
  const PORT = Number.parseInt(PORT_RAW, 10);
56
56
  const runtimeMetadataHealth = (0, healthChecks_1.createHealthCheckState)({
@@ -66,6 +66,7 @@ export interface SessionComplianceState {
66
66
  counters: {
67
67
  attendsWithoutPersist: number;
68
68
  turnsWithoutWrite: number;
69
+ midTurnAttendsThisTurn: number;
69
70
  consecutivePreResponseWithoutPost: number;
70
71
  consecutiveUnusedMemoryInjections: number;
71
72
  pendingPostResponse: boolean;
@@ -172,6 +173,7 @@ export interface ObserveInput {
172
173
  priorityKeys?: string[];
173
174
  skipContextFilter?: boolean;
174
175
  recoveryKeys?: string[];
176
+ semanticFilter?: import('../lib/semanticFactTags').SemanticFilter;
175
177
  ledgerContext?: AgentContext['ledgerContext'];
176
178
  }
177
179
  export interface FactInjection {
@@ -244,13 +246,26 @@ export interface AttendSearchSuggestion {
244
246
  }
245
247
  export interface AttendResult extends ObserveResult {
246
248
  shouldInject: boolean;
247
- reason: 'forced' | 'memory_not_needed' | 'memory_needed_no_facts' | 'memory_needed_but_in_context' | 'memory_needed_injected';
249
+ reason: 'forced' | 'memory_not_needed' | 'memory_needed_no_facts' | 'memory_checked_no_match' | 'memory_needed_but_in_context' | 'memory_needed_injected';
248
250
  decision: AttendDecision;
249
251
  bootstrap?: AttendBootstrapInfo | null;
250
252
  searchSuggestion?: AttendSearchSuggestion;
251
253
  complianceWarning?: string;
252
254
  compliance: SessionComplianceState;
253
255
  memoryAttributions?: MemoryAttributionResult[];
256
+ memorySearchPerformed?: boolean;
257
+ memoryResultsConsidered?: number;
258
+ postResponseCapture?: PostResponseCaptureInfo;
259
+ matchedUserRules?: MatchedUserRule[];
260
+ }
261
+ export interface PostResponseCaptureInfo {
262
+ factsExtracted: number;
263
+ factsWritten: number;
264
+ checkpointExtracted: boolean;
265
+ skipped: Array<{
266
+ key: string;
267
+ reason: string;
268
+ }>;
254
269
  }
255
270
  export type MemoryAttributionEvidenceKind = 'write' | 'checkpoint' | 'rediscovery' | 'response_reference' | 'response_recovery';
256
271
  export interface MemoryAttributionResult {
@@ -277,6 +292,20 @@ export interface AttendBootstrapInfo {
277
292
  }
278
293
  export declare function normalizeExplicitTask(task: string | null | undefined): string | null;
279
294
  export declare function formatOperatingRulesText(rawValue: unknown, summary?: string | null, fallbackRules?: string[]): string;
295
+ export interface MatchedUserRule {
296
+ entityKey: string;
297
+ key: string;
298
+ rule: string;
299
+ triggers: string[];
300
+ scope: string;
301
+ enforcement: 'soft' | 'hard';
302
+ source: string;
303
+ lastUpdated: string;
304
+ }
305
+ export declare function extractRuleTriggers(properties: Record<string, unknown> | null | undefined): string[];
306
+ export declare function matchesRuleTriggers(triggers: string[], contextTokens: Set<string>, contextLower: string): boolean;
307
+ export declare function formatMatchedUserRules(rules: MatchedUserRule[]): string;
308
+ export declare function extractFilePathEntityHints(text: string, projectEntity: string | null): string[];
280
309
  export declare function readPersistedSessionState(agentId: string): Promise<PersistedSessionState | null>;
281
310
  export declare function summarizeSessionState(agentId: string, checkpoint: SessionCheckpointRecord | null, persistedBriefGeneratedAt?: string, compliance?: SessionComplianceState | null): SessionSummary;
282
311
  export declare class AttendantInstance {
@@ -286,6 +315,8 @@ export declare class AttendantInstance {
286
315
  private contextCallCount;
287
316
  private attendsWithoutPersist;
288
317
  private turnsWithoutWrite;
318
+ private midTurnAttendsThisTurn;
319
+ private writeOccurredThisTurn;
289
320
  private consecutivePreResponseWithoutPost;
290
321
  private consecutiveUnusedMemoryInjections;
291
322
  private lastAttendPhase;
@@ -327,6 +358,7 @@ export declare class AttendantInstance {
327
358
  getAgentId(): string;
328
359
  attend(input: AttendInput): Promise<AttendResult>;
329
360
  observe(input: ObserveInput): Promise<ObserveResult>;
361
+ private loadMatchingUserRules;
330
362
  private buildRecovery;
331
363
  private ensureSessionLoaded;
332
364
  private decideMemoryNeed;
@@ -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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"}
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AttendantInstance = exports.DEFAULT_ATTENDANT_OPERATING_RULES = void 0;
4
4
  exports.normalizeExplicitTask = normalizeExplicitTask;
5
5
  exports.formatOperatingRulesText = formatOperatingRulesText;
6
+ exports.extractRuleTriggers = extractRuleTriggers;
7
+ exports.matchesRuleTriggers = matchesRuleTriggers;
8
+ exports.formatMatchedUserRules = formatMatchedUserRules;
9
+ exports.extractFilePathEntityHints = extractFilePathEntityHints;
6
10
  exports.readPersistedSessionState = readPersistedSessionState;
7
11
  exports.summarizeSessionState = summarizeSessionState;
8
12
  const crypto_1 = require("crypto");
@@ -126,6 +130,26 @@ const MEMORY_NEED_NEGATIVE_PATTERNS = [
126
130
  /^\s*(hi|hello|hey|yo|sup|good (?:morning|afternoon|evening))\b[!.?\s]*$/i,
127
131
  /^\s*(thanks|thank you|cool|great|nice)\b[!.?\s]*$/i,
128
132
  ];
133
+ const SEARCH_SUGGESTION_STOPWORDS = new Set([
134
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
135
+ 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing',
136
+ 'will', 'would', 'could', 'should', 'may', 'might', 'shall', 'can',
137
+ 'you', 'your', 'yours', 'me', 'my', 'mine', 'we', 'our', 'ours',
138
+ 'they', 'them', 'their', 'theirs', 'he', 'she', 'his', 'her', 'its',
139
+ 'this', 'that', 'these', 'those', 'it',
140
+ 'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'for', 'with',
141
+ 'from', 'into', 'about', 'after', 'before', 'between', 'under', 'over',
142
+ 'some', 'any', 'all', 'each', 'every', 'other', 'more', 'most',
143
+ 'very', 'much', 'just', 'also', 'too', 'still', 'own',
144
+ 'what', 'how', 'when', 'where', 'which', 'who', 'why',
145
+ 'get', 'got', 'let', 'put', 'say', 'tell', 'ask', 'use', 'try',
146
+ 'give', 'take', 'make', 'come', 'see', 'look', 'think', 'know',
147
+ 'want', 'need', 'keep', 'turn', 'run',
148
+ 'way', 'now', 'here', 'there', 'then', 'than',
149
+ 'yes', 'no', 'nice', 'okay', 'sure', 'like',
150
+ 'new', 'old', 'possible', 'ideas', 'idea',
151
+ 'hey', 'per',
152
+ ]);
129
153
  const MEMORY_PARSE_FAILURE_PROJECT_CUE_PATTERNS = [
130
154
  /\b(?:status|progress|summary|summar(?:y|ize)|recap|overview|state)\b/i,
131
155
  /\b(?:decision|decisions|findings?|artifacts?|changes?|work|implementation|architecture|code(?:base)?|repo|repository)\b/i,
@@ -336,6 +360,84 @@ function applyAdvisoryOperatingRules(operatingRules, profile) {
336
360
  }
337
361
  return nextRules;
338
362
  }
363
+ function extractRuleTriggers(properties) {
364
+ if (!properties)
365
+ return [];
366
+ const triggers = properties.triggers;
367
+ if (Array.isArray(triggers)) {
368
+ return triggers
369
+ .filter((t) => typeof t === 'string' && t.trim().length > 0)
370
+ .map((t) => t.trim().toLowerCase());
371
+ }
372
+ return [];
373
+ }
374
+ function matchesRuleTriggers(triggers, contextTokens, contextLower) {
375
+ if (triggers.length === 0)
376
+ return false;
377
+ return triggers.some((trigger) => {
378
+ // Multi-word triggers: check phrase match
379
+ if (trigger.includes(' '))
380
+ return contextLower.includes(trigger);
381
+ // Single-word triggers: check token membership
382
+ return contextTokens.has(trigger);
383
+ });
384
+ }
385
+ function parseUserOperatingRule(entry) {
386
+ const triggers = extractRuleTriggers(entry.properties);
387
+ if (triggers.length === 0)
388
+ return null;
389
+ const raw = entry.valueRaw;
390
+ const ruleText = entry.valueSummary?.trim()
391
+ || (typeof raw?.rule === 'string' ? raw.rule.trim() : '');
392
+ if (!ruleText)
393
+ return null;
394
+ const enforcement = entry.properties?.enforcement === 'hard' ? 'hard' : 'soft';
395
+ const scope = typeof entry.properties?.scope === 'string' ? entry.properties.scope : 'project';
396
+ return {
397
+ entityKey: `${entry.entityType}/${entry.entityId}`,
398
+ key: entry.key,
399
+ rule: ruleText,
400
+ triggers,
401
+ scope: String(scope),
402
+ enforcement,
403
+ source: entry.source,
404
+ lastUpdated: entry.updatedAt.toISOString(),
405
+ };
406
+ }
407
+ function formatMatchedUserRules(rules) {
408
+ if (rules.length === 0)
409
+ return '';
410
+ return rules.map((r) => {
411
+ const prefix = r.enforcement === 'hard' ? 'REQUIRED RULE' : 'USER RULE';
412
+ return `- ${prefix} (${r.key}): ${r.rule}`;
413
+ }).join('\n');
414
+ }
415
+ // ─── File-Path Entity Hints ─────────────────────────────────────────────────
416
+ const FILE_PATH_PATTERN = /(?:^|[\s"'`(])([a-zA-Z]:\\(?:[^\s"'`<>|*?]+\\)*[^\s"'`<>|*?]+\.\w+|(?:\.\/|\.\.\/|\/)?(?:[a-zA-Z0-9_.-]+\/)+[a-zA-Z0-9_.-]+\.\w+)/g;
417
+ function extractFilePathEntityHints(text, projectEntity) {
418
+ if (!text || !projectEntity)
419
+ return [];
420
+ const parsed = (0, entity_resolution_1.parseEntityString)(projectEntity);
421
+ const projectId = parsed.entityId;
422
+ const seen = new Set();
423
+ const hints = [];
424
+ let match;
425
+ FILE_PATH_PATTERN.lastIndex = 0;
426
+ while ((match = FILE_PATH_PATTERN.exec(text)) !== null) {
427
+ const filePath = match[1].trim();
428
+ // Extract just the filename without extension
429
+ const basename = filePath.replace(/\\/g, '/').split('/').pop() ?? '';
430
+ const nameWithoutExt = basename.replace(/\.\w+$/, '').replace(/[^a-zA-Z0-9]/g, '_').toLowerCase();
431
+ if (!nameWithoutExt || nameWithoutExt.length < 2)
432
+ continue;
433
+ const entityHint = `project/${projectId}/file/${nameWithoutExt}`;
434
+ if (!seen.has(entityHint)) {
435
+ seen.add(entityHint);
436
+ hints.push(entityHint);
437
+ }
438
+ }
439
+ return hints;
440
+ }
339
441
  function advisoryTaskTokens(taskType) {
340
442
  if (!taskType)
341
443
  return [];
@@ -602,7 +704,7 @@ function buildSessionComplianceState(input) {
602
704
  code: 'missing_writes_across_turns',
603
705
  severity,
604
706
  count: input.turnsWithoutWrite,
605
- message: `${input.turnsWithoutWrite} completed turns without a single iranti_write or iranti_checkpoint call. Knowledge discovered during these turns is not being persisted.`,
707
+ message: `${input.turnsWithoutWrite} active turns with tool use completed without iranti_write or iranti_checkpoint calls. Findings from these turns are not being persisted.`,
606
708
  requiredAction: 'Call iranti_write for each durable finding — file edits, confirmed facts, environment state, subagent results. Every turn that discovers something should write it.',
607
709
  });
608
710
  }
@@ -646,6 +748,7 @@ function buildSessionComplianceState(input) {
646
748
  counters: {
647
749
  attendsWithoutPersist: input.attendsWithoutPersist,
648
750
  turnsWithoutWrite: input.turnsWithoutWrite,
751
+ midTurnAttendsThisTurn: input.midTurnAttendsThisTurn,
649
752
  consecutivePreResponseWithoutPost: input.consecutivePreResponseWithoutPost,
650
753
  consecutiveUnusedMemoryInjections: input.consecutiveUnusedMemoryInjections,
651
754
  pendingPostResponse,
@@ -820,6 +923,9 @@ function tokenize(text) {
820
923
  .map((part) => part.trim())
821
924
  .filter((part) => part.length > 2);
822
925
  }
926
+ function tokenizeForSearch(text) {
927
+ return tokenize(text).filter((token) => !SEARCH_SUGGESTION_STOPWORDS.has(token));
928
+ }
823
929
  function fingerprintTask(task, recentMessages = []) {
824
930
  const messageSeed = recentMessages
825
931
  .slice(-3)
@@ -1337,6 +1443,8 @@ class AttendantInstance {
1337
1443
  this.contextCallCount = 0;
1338
1444
  this.attendsWithoutPersist = 0;
1339
1445
  this.turnsWithoutWrite = 0;
1446
+ this.midTurnAttendsThisTurn = 0;
1447
+ this.writeOccurredThisTurn = false;
1340
1448
  this.consecutivePreResponseWithoutPost = 0;
1341
1449
  this.consecutiveUnusedMemoryInjections = 0;
1342
1450
  this.lastAttendPhase = undefined;
@@ -1834,6 +1942,7 @@ class AttendantInstance {
1834
1942
  return buildSessionComplianceState({
1835
1943
  attendsWithoutPersist: this.attendsWithoutPersist,
1836
1944
  turnsWithoutWrite: this.turnsWithoutWrite,
1945
+ midTurnAttendsThisTurn: this.midTurnAttendsThisTurn,
1837
1946
  consecutivePreResponseWithoutPost: this.consecutivePreResponseWithoutPost,
1838
1947
  consecutiveUnusedMemoryInjections: this.consecutiveUnusedMemoryInjections,
1839
1948
  lastAttendPhase: this.lastAttendPhase,
@@ -1843,6 +1952,7 @@ class AttendantInstance {
1843
1952
  async notifyWriteOccurred() {
1844
1953
  this.attendsWithoutPersist = 0;
1845
1954
  this.turnsWithoutWrite = 0;
1955
+ this.writeOccurredThisTurn = true;
1846
1956
  this.lastAttendPhase = undefined;
1847
1957
  this.consecutivePreResponseWithoutPost = 0;
1848
1958
  this.complianceUpdatedAt = new Date().toISOString();
@@ -2101,8 +2211,15 @@ class AttendantInstance {
2101
2211
  if (phase === 'post-response') {
2102
2212
  // Correct post-response call — reset attend counters but NOT turnsWithoutWrite
2103
2213
  // turnsWithoutWrite only resets on actual writes/checkpoints
2214
+ // Only count active turns (with mid-turn attends) toward turnsWithoutWrite.
2215
+ // Chatter-only turns (pre-response → post-response with nothing in between) are exempt.
2216
+ // Turns where a write already occurred are also exempt.
2104
2217
  this.attendsWithoutPersist = 0;
2105
- this.turnsWithoutWrite++;
2218
+ if (this.midTurnAttendsThisTurn > 0 && !this.writeOccurredThisTurn) {
2219
+ this.turnsWithoutWrite++;
2220
+ }
2221
+ this.midTurnAttendsThisTurn = 0;
2222
+ this.writeOccurredThisTurn = false;
2106
2223
  this.lastAttendPhase = 'post-response';
2107
2224
  this.consecutivePreResponseWithoutPost = 0;
2108
2225
  }
@@ -2114,10 +2231,17 @@ class AttendantInstance {
2114
2231
  else {
2115
2232
  this.consecutivePreResponseWithoutPost = 0;
2116
2233
  }
2234
+ this.midTurnAttendsThisTurn = 0;
2235
+ this.writeOccurredThisTurn = false;
2117
2236
  this.lastAttendPhase = 'pre-response';
2118
2237
  }
2238
+ else if (phase === 'mid-turn') {
2239
+ this.midTurnAttendsThisTurn++;
2240
+ this.lastAttendPhase = 'mid-turn';
2241
+ }
2119
2242
  else {
2120
- // No phase provided — fall back to heuristic counter
2243
+ // No phase provided — count as mid-turn activity
2244
+ this.midTurnAttendsThisTurn++;
2121
2245
  if (this.attendsWithoutPersist >= 3) {
2122
2246
  complianceWarning = `COMPLIANCE: iranti_attend has been called ${this.attendsWithoutPersist} times since the last iranti_write or iranti_checkpoint. You are likely missing post-response attend calls and durable writes. Call iranti_attend(phase='post-response') after every response, then persist durable findings with iranti_write or iranti_checkpoint before the next turn.`;
2123
2247
  }
@@ -2142,7 +2266,16 @@ class AttendantInstance {
2142
2266
  note: 'A handshake was auto-performed because no session brief existed. Read operatingRules now and follow any instructions there — including ACKNOWLEDGE — before replying to the user.',
2143
2267
  };
2144
2268
  }
2145
- const effectiveEntityHints = this.resolveAttendEntityHints(input.entityHints, latestMessage);
2269
+ const baseEntityHints = this.resolveAttendEntityHints(input.entityHints, latestMessage);
2270
+ // File-change demand-driven recall: extract file path mentions and add as entity hints
2271
+ const filePathHints = extractFilePathEntityHints(`${latestMessage}\n${currentContext}`, (0, autoRemember_1.getProjectMemoryEntity)() ?? null);
2272
+ const effectiveEntityHints = filePathHints.length > 0
2273
+ ? [...new Set([...baseEntityHints, ...filePathHints])]
2274
+ : baseEntityHints;
2275
+ // User operating rules: load rules whose triggers match the current context
2276
+ const matchedUserRules = phase !== 'post-response'
2277
+ ? await this.loadMatchingUserRules(`${latestMessage}\n${currentContext}`)
2278
+ : [];
2146
2279
  let watchedEntitiesChanged = this.updateWatchedEntities(effectiveEntityHints);
2147
2280
  const freshState = await this.detectRelevantFreshState(effectiveEntityHints, latestMessage);
2148
2281
  const observationContext = currentContext.trim().length > 0 ? currentContext : latestMessage;
@@ -2261,13 +2394,14 @@ class AttendantInstance {
2261
2394
  }
2262
2395
  (0, metrics_1.timeEnd)('attendant.attend_ms', t0);
2263
2396
  return {
2264
- shouldInject: false,
2397
+ shouldInject: matchedUserRules.length > 0,
2265
2398
  reason: 'memory_not_needed',
2266
2399
  decision,
2267
2400
  bootstrap,
2268
2401
  complianceWarning,
2269
2402
  compliance,
2270
2403
  memoryAttributions: [],
2404
+ matchedUserRules: matchedUserRules.length > 0 ? matchedUserRules : undefined,
2271
2405
  usageGuidance: buildUsageGuidance('attend', this.turnsWithoutWrite),
2272
2406
  facts: [],
2273
2407
  entitiesDetected: [],
@@ -2340,22 +2474,24 @@ class AttendantInstance {
2340
2474
  this.markSharedStateObserved(observeEntityHints.length > 0 ? observeEntityHints : freshState.entities);
2341
2475
  let reason = 'memory_needed_injected';
2342
2476
  const shouldInject = structuredFacts.length > 0;
2477
+ const memorySearchPerformed = true;
2478
+ const memoryResultsConsidered = observed.totalFound;
2343
2479
  let searchSuggestion;
2344
2480
  if (!shouldInject) {
2345
2481
  const allAlreadyInContext = observed.totalFound > 0 && observed.alreadyPresent >= observed.totalFound;
2346
- reason = allAlreadyInContext ? 'memory_needed_but_in_context' : 'memory_needed_no_facts';
2347
- if (reason === 'memory_needed_no_facts') {
2348
- const terms = tokenize(latestMessage).slice(0, 6);
2482
+ reason = allAlreadyInContext ? 'memory_needed_but_in_context' : 'memory_checked_no_match';
2483
+ if (reason === 'memory_checked_no_match') {
2484
+ const terms = tokenizeForSearch(latestMessage).slice(0, 6);
2349
2485
  const alternativeEntities = (observed.entitiesResolved ?? [])
2350
2486
  .map((e) => e.canonicalEntity)
2351
2487
  .filter(Boolean);
2352
- searchSuggestion = {
2353
- hint: terms.length > 0
2354
- ? `Iranti found no auto-inject facts for this turn. Call iranti_search(query='${terms.join(' ')}') BEFORE reading the codebase — empty attend facts do NOT mean data is absent; Iranti is the cross-session source of truth.`
2355
- : 'Iranti found no auto-inject facts for this turn. Call iranti_search with a relevant query BEFORE reading the codebase — do not conclude absence of data without searching first.',
2356
- suggestedTerms: terms,
2357
- alternativeEntities,
2358
- };
2488
+ if (terms.length > 0) {
2489
+ searchSuggestion = {
2490
+ hint: `Iranti searched memory but found no matching facts for this turn. Call iranti_search(query='${terms.join(' ')}') BEFORE reading the codebase — empty attend facts do NOT mean data is absent; Iranti is the cross-session source of truth.`,
2491
+ suggestedTerms: terms,
2492
+ alternativeEntities,
2493
+ };
2494
+ }
2359
2495
  }
2360
2496
  }
2361
2497
  else if (forceInject) {
@@ -2376,7 +2512,7 @@ class AttendantInstance {
2376
2512
  const attendResult = {
2377
2513
  ...observed,
2378
2514
  facts: structuredFacts,
2379
- shouldInject: structuredFacts.length > 0,
2515
+ shouldInject: structuredFacts.length > 0 || matchedUserRules.length > 0,
2380
2516
  reason,
2381
2517
  decision,
2382
2518
  bootstrap,
@@ -2384,6 +2520,9 @@ class AttendantInstance {
2384
2520
  complianceWarning,
2385
2521
  compliance,
2386
2522
  memoryAttributions,
2523
+ memorySearchPerformed,
2524
+ memoryResultsConsidered,
2525
+ matchedUserRules: matchedUserRules.length > 0 ? matchedUserRules : undefined,
2387
2526
  usageGuidance: buildUsageGuidance('attend', this.turnsWithoutWrite),
2388
2527
  };
2389
2528
  if (input.suppressEvents !== true) {
@@ -2640,6 +2779,7 @@ ${detectionWindow}`,
2640
2779
  const maxEntities = policy.maxEntitiesPerObserve ?? 5;
2641
2780
  const maxKeysPerEntity = policy.maxKeysPerEntity ?? 5;
2642
2781
  const allFacts = [];
2782
+ const entryPropertiesMap = new Map();
2643
2783
  const entitiesResolved = [];
2644
2784
  const entitiesDetected = new Set();
2645
2785
  const resolvedEntities = new Map();
@@ -2745,6 +2885,9 @@ ${detectionWindow}`,
2745
2885
  lastUpdated: entry.updatedAt.toISOString(),
2746
2886
  entryId: entry.id,
2747
2887
  });
2888
+ if (entry.properties && typeof entry.properties === 'object' && !Array.isArray(entry.properties)) {
2889
+ entryPropertiesMap.set(entry.id, entry.properties);
2890
+ }
2748
2891
  }
2749
2892
  }
2750
2893
  // Step 3 — filter out facts already present in context (skipped when forceInject)
@@ -2773,7 +2916,9 @@ ${detectionWindow}`,
2773
2916
  // Step 4 — relevance-weighted fact ranking
2774
2917
  // Profile facts (favorite_city, country_of_origin, etc.) on personal entities
2775
2918
  // are deprioritized unless the context/message shows token overlap with them.
2919
+ // When a semanticFilter is provided, facts matching the filter are boosted.
2776
2920
  const contextTokens = new Set(tokenizePresenceText(currentContext));
2921
+ const activeSemanticFilter = input.semanticFilter;
2777
2922
  const topFacts = newFacts
2778
2923
  .map((fact) => {
2779
2924
  const parts = fact.entityKey.split('/');
@@ -2784,12 +2929,16 @@ ${detectionWindow}`,
2784
2929
  const factTokens = tokenizePresenceText(fact.summary);
2785
2930
  const overlap = factTokens.filter((t) => contextTokens.has(t)).length;
2786
2931
  const relevance = factTokens.length > 0 ? overlap / factTokens.length : 0;
2932
+ // Semantic boost: if a filter is active, boost matching facts
2933
+ const properties = entryPropertiesMap.get(fact.entryId);
2934
+ const semanticScore = activeSemanticFilter ? (0, semanticFactTags_1.semanticMatchScore)(properties, activeSemanticFilter) : 0;
2935
+ const semanticBoost = semanticScore > 0 ? semanticScore * 30 : 0;
2787
2936
  // Profile facts with no relevance to the current context get deprioritized
2788
2937
  const profilePenalty = isProfile && relevance === 0 ? 50 : 0;
2789
- const effectiveConfidence = fact.confidence - profilePenalty;
2790
- return { fact, effectiveConfidence, relevance };
2938
+ const effectiveConfidence = fact.confidence - profilePenalty + semanticBoost;
2939
+ return { fact, effectiveConfidence, relevance, semanticScore };
2791
2940
  })
2792
- .sort((a, b) => b.effectiveConfidence - a.effectiveConfidence || b.relevance - a.relevance)
2941
+ .sort((a, b) => b.effectiveConfidence - a.effectiveConfidence || b.semanticScore - a.semanticScore || b.relevance - a.relevance)
2793
2942
  .slice(0, maxFacts)
2794
2943
  .map(({ fact }) => fact);
2795
2944
  await (0, queries_1.recordKnowledgeEntryAccess)(topFacts.map((fact) => fact.entryId));
@@ -2832,6 +2981,40 @@ ${detectionWindow}`,
2832
2981
  },
2833
2982
  };
2834
2983
  }
2984
+ // ── User Operating Rules ────────────────────────────────────────────────
2985
+ async loadMatchingUserRules(context) {
2986
+ try {
2987
+ const entries = await (0, queries_1.findEntriesByEntityType)('rule');
2988
+ if (entries.length === 0)
2989
+ return [];
2990
+ const contextLower = context.toLowerCase();
2991
+ const contextTokens = new Set(tokenizePresenceText(context));
2992
+ const matched = [];
2993
+ for (const entry of entries) {
2994
+ const props = entry.properties && typeof entry.properties === 'object' && !Array.isArray(entry.properties)
2995
+ ? entry.properties
2996
+ : null;
2997
+ const rule = parseUserOperatingRule({
2998
+ entityType: entry.entityType,
2999
+ entityId: entry.entityId,
3000
+ key: entry.key,
3001
+ valueSummary: entry.valueSummary,
3002
+ valueRaw: entry.valueRaw,
3003
+ source: entry.source,
3004
+ properties: props,
3005
+ updatedAt: entry.updatedAt,
3006
+ });
3007
+ if (rule && matchesRuleTriggers(rule.triggers, contextTokens, contextLower)) {
3008
+ matched.push(rule);
3009
+ }
3010
+ }
3011
+ return matched;
3012
+ }
3013
+ catch (err) {
3014
+ console.error('[attendant] failed to load user operating rules:', err);
3015
+ return [];
3016
+ }
3017
+ }
2835
3018
  // ── Private ──────────────────────────────────────────────────────────────
2836
3019
  buildRecovery(context, record) {
2837
3020
  return evaluateSessionRecovery(record, context);
@@ -3369,6 +3552,7 @@ If nothing is relevant, return: none`,
3369
3552
  this.sharedStateObservedAt = state.briefGeneratedAt;
3370
3553
  this.attendsWithoutPersist = state.compliance?.counters.attendsWithoutPersist ?? 0;
3371
3554
  this.turnsWithoutWrite = state.compliance?.counters.turnsWithoutWrite ?? 0;
3555
+ this.midTurnAttendsThisTurn = state.compliance?.counters.midTurnAttendsThisTurn ?? 0;
3372
3556
  this.consecutivePreResponseWithoutPost = state.compliance?.counters.consecutivePreResponseWithoutPost ?? 0;
3373
3557
  this.consecutiveUnusedMemoryInjections = state.compliance?.counters.consecutiveUnusedMemoryInjections ?? 0;
3374
3558
  this.lastAttendPhase = state.compliance?.counters.lastAttendPhase ?? undefined;