@caupulican/pi-adaptative 0.81.21 → 0.81.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/core/agent-session.d.ts +3 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +28 -21
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/failure-corpus.d.ts +10 -1
  7. package/dist/core/failure-corpus.d.ts.map +1 -1
  8. package/dist/core/failure-corpus.js +32 -26
  9. package/dist/core/failure-corpus.js.map +1 -1
  10. package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
  11. package/dist/core/model-router/intent-classifier.js +1 -1
  12. package/dist/core/model-router/intent-classifier.js.map +1 -1
  13. package/dist/core/model-router/route-judge.d.ts.map +1 -1
  14. package/dist/core/model-router/route-judge.js +10 -6
  15. package/dist/core/model-router/route-judge.js.map +1 -1
  16. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  17. package/dist/core/model-router/tool-escalation.js +2 -1
  18. package/dist/core/model-router/tool-escalation.js.map +1 -1
  19. package/dist/core/model-router-controller.d.ts.map +1 -1
  20. package/dist/core/model-router-controller.js +27 -2
  21. package/dist/core/model-router-controller.js.map +1 -1
  22. package/dist/core/session-analytics.d.ts +7 -1
  23. package/dist/core/session-analytics.d.ts.map +1 -1
  24. package/dist/core/session-analytics.js +42 -11
  25. package/dist/core/session-analytics.js.map +1 -1
  26. package/dist/core/settings-manager.d.ts +1 -1
  27. package/dist/core/settings-manager.d.ts.map +1 -1
  28. package/dist/core/settings-manager.js.map +1 -1
  29. package/dist/core/tool-recovery-log-records.d.ts +24 -0
  30. package/dist/core/tool-recovery-log-records.d.ts.map +1 -0
  31. package/dist/core/tool-recovery-log-records.js +63 -0
  32. package/dist/core/tool-recovery-log-records.js.map +1 -0
  33. package/dist/core/tool-recovery-log-worker.d.ts +2 -0
  34. package/dist/core/tool-recovery-log-worker.d.ts.map +1 -0
  35. package/dist/core/tool-recovery-log-worker.js +44 -0
  36. package/dist/core/tool-recovery-log-worker.js.map +1 -0
  37. package/dist/core/tool-recovery-logger.d.ts +59 -0
  38. package/dist/core/tool-recovery-logger.d.ts.map +1 -0
  39. package/dist/core/tool-recovery-logger.js +197 -0
  40. package/dist/core/tool-recovery-logger.js.map +1 -0
  41. package/dist/core/tool-repair-health.d.ts +2 -1
  42. package/dist/core/tool-repair-health.d.ts.map +1 -1
  43. package/dist/core/tool-repair-health.js +13 -4
  44. package/dist/core/tool-repair-health.js.map +1 -1
  45. package/dist/core/tool-repair-settings.d.ts +1 -0
  46. package/dist/core/tool-repair-settings.d.ts.map +1 -1
  47. package/dist/core/tool-repair-settings.js +2 -1
  48. package/dist/core/tool-repair-settings.js.map +1 -1
  49. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  50. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.js +25 -1
  52. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  53. package/docs/settings.md +6 -4
  54. package/docs/tool-repair.md +8 -7
  55. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  56. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  57. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  58. package/examples/extensions/sandbox/package-lock.json +2 -2
  59. package/examples/extensions/sandbox/package.json +1 -1
  60. package/examples/extensions/with-deps/package-lock.json +2 -2
  61. package/examples/extensions/with-deps/package.json +1 -1
  62. package/npm-shrinkwrap.json +12 -12
  63. package/package.json +4 -4
@@ -44,6 +44,8 @@ import { SessionAnalytics } from "./session-analytics.js";
44
44
  import { SessionTreeNavigator } from "./session-tree-navigator.js";
45
45
  import { SystemPromptBuilder } from "./system-prompt-builder.js";
46
46
  import { ToolGateController } from "./tool-gate-controller.js";
47
+ import { TOOL_RECOVERY_EVENT_LOG_FILE } from "./tool-recovery-log-records.js";
48
+ import { ToolRecoveryLogger } from "./tool-recovery-logger.js";
47
49
  import { formatToolRepairHealthReport } from "./tool-repair-health.js";
48
50
  import { resolveCurrentToolRepairSettings } from "./tool-repair-settings.js";
49
51
  // ============================================================================
@@ -207,6 +209,8 @@ export class AgentSession {
207
209
  _modelRouter;
208
210
  _billingFailover;
209
211
  _failureCorpus;
212
+ _toolRecoveryLogger;
213
+ _toolRecoveryEventLogPath;
210
214
  _skillCuratorInstance;
211
215
  _disposed = false;
212
216
  _reflectionAbort = new AbortController();
@@ -397,8 +401,17 @@ export class AgentSession {
397
401
  addSpawnedUsage: (usage, opts) => this.addSpawnedUsage(usage, opts),
398
402
  runIsolatedCompletion: (opts) => this.runIsolatedCompletion(opts),
399
403
  });
404
+ const failureCorpusPath = join(this._agentDir, "state", "failure-corpus.jsonl");
405
+ this._toolRecoveryEventLogPath = join(this._agentDir, "state", TOOL_RECOVERY_EVENT_LOG_FILE);
406
+ const toolRepairSettings = this._toolRepairSettings();
400
407
  this._failureCorpus = new FailureCorpusRecorder({
401
- filePath: join(this._agentDir, "state", "failure-corpus.jsonl"),
408
+ filePath: failureCorpusPath,
409
+ });
410
+ this._toolRecoveryLogger = new ToolRecoveryLogger({
411
+ enabled: toolRepairSettings.logging,
412
+ sessionId: this.sessionManager.getSessionId(),
413
+ eventLogPath: this._toolRecoveryEventLogPath,
414
+ failureCorpusPath,
402
415
  });
403
416
  this._billingFailover = new BillingFailoverController({
404
417
  agent: this.agent,
@@ -538,13 +551,16 @@ export class AgentSession {
538
551
  getSessionManager: () => this.sessionManager,
539
552
  getSettingsManager: () => this.settingsManager,
540
553
  getToolDefinition: (name) => this.getToolDefinition(name),
554
+ getToolRecoveryEventLogPath: () => this._toolRecoveryEventLogPath,
541
555
  });
542
556
  const previousToolArgumentValidation = this.agent.onToolArgumentValidation;
543
557
  this.agent.onToolArgumentValidation = (event) => {
544
558
  const taggedEvent = this._tagModelAdaptationRuleTeaching(event);
545
559
  previousToolArgumentValidation?.(taggedEvent);
546
- this._analytics.recordToolArgumentValidation(taggedEvent);
547
- this._recordToolValidationBounce(taggedEvent);
560
+ const logRecord = this._toolRecoveryLogger.recordToolArgumentValidation(taggedEvent);
561
+ if (!logRecord)
562
+ return;
563
+ this._analytics.recordToolArgumentValidation(logRecord);
548
564
  this._handleTextToolProtocolValidationOutcome(taggedEvent);
549
565
  this._handleModelAdaptationTelemetry(taggedEvent);
550
566
  };
@@ -920,7 +936,6 @@ export class AgentSession {
920
936
  }
921
937
  _applyToolRepairLayerSettings() {
922
938
  const settings = this._toolRepairSettings();
923
- this.agent.toolArgumentRepairEnabled = settings.repair;
924
939
  this.agent.toolArgumentTeachEnabled = settings.teach;
925
940
  }
926
941
  _getModelAdaptationRulesForPrompt() {
@@ -1273,18 +1288,6 @@ export class AgentSession {
1273
1288
  _looksLikeTextToolProtocolAttempt(text) {
1274
1289
  return /<pi:call\b|<tool_call\b|```(?:tool|tool_call)[\s\S]*"name"\s*:/i.test(text);
1275
1290
  }
1276
- _recordToolValidationBounce(event) {
1277
- if (event.outcome !== "bounced" || !event.failureShape || event.failureShape.length === 0)
1278
- return;
1279
- this._failureCorpus.recordToolValidation({
1280
- provider: event.provider ?? this.agent.state.model?.provider,
1281
- modelId: event.model ?? this.agent.state.model?.id,
1282
- tool: event.tool,
1283
- failureModes: event.failureModes,
1284
- shape: event.failureShape,
1285
- errorKeywords: event.errorKeywords,
1286
- });
1287
- }
1288
1291
  _tagModelAdaptationRuleTeaching(event) {
1289
1292
  if (!this._toolRepairSettings().teach || event.taught !== "none")
1290
1293
  return event;
@@ -1492,7 +1495,10 @@ export class AgentSession {
1492
1495
  return formatContextCompositionDashboard(this.getContextCompositionReport());
1493
1496
  }
1494
1497
  formatToolRepairHealthReport() {
1495
- return formatToolRepairHealthReport(this._modelAdaptationStore);
1498
+ return formatToolRepairHealthReport(this._modelAdaptationStore, new Date(), this._toolRecoveryLogger.getStats());
1499
+ }
1500
+ async flushToolRecoveryLogsForTests(timeoutMs = 1000) {
1501
+ await this._toolRecoveryLogger.flush(timeoutMs);
1496
1502
  }
1497
1503
  removeToolRepairRule(model, mode) {
1498
1504
  return this._modelAdaptationStore.removeRule(model, mode);
@@ -1907,6 +1913,7 @@ export class AgentSession {
1907
1913
  .getMemoryManager()
1908
1914
  .shutdownAll()
1909
1915
  .catch(() => { });
1916
+ void this._toolRecoveryLogger.shutdown().catch(() => { });
1910
1917
  cleanupSessionResources(this.sessionId);
1911
1918
  // Best-effort final sweep for any grep/find artifact already released (reference
1912
1919
  // count zero) but not yet reclaimed -- e.g. a release whose cleanup() call failed
@@ -3091,7 +3098,7 @@ export class AgentSession {
3091
3098
  willRetry: false,
3092
3099
  skipReason: "no model selected",
3093
3100
  });
3094
- return false;
3101
+ return hadQueuedMessages || this.agent.hasQueuedMessages();
3095
3102
  }
3096
3103
  const contextWindow = model.contextWindow;
3097
3104
  const margin = Math.max(0, Math.floor(0.01 * contextWindow));
@@ -3180,13 +3187,13 @@ export class AgentSession {
3180
3187
  if (outcome.kind === "failed") {
3181
3188
  if (outcome.reason === "aborted") {
3182
3189
  this._emit({ type: "compaction_end", reason, result: undefined, aborted: true, willRetry: false });
3183
- return false;
3190
+ return hadQueuedMessages || this.agent.hasQueuedMessages();
3184
3191
  }
3185
3192
  throw new Error(outcome.reason);
3186
3193
  }
3187
3194
  if (extensionCancelled || signal.aborted) {
3188
3195
  this._emit({ type: "compaction_end", reason, result: undefined, aborted: true, willRetry: false });
3189
- return false;
3196
+ return hadQueuedMessages || this.agent.hasQueuedMessages();
3190
3197
  }
3191
3198
  const result = outcome.kind === "success" ? outcome.result : lastCompaction;
3192
3199
  if (!result) {
@@ -3215,7 +3222,7 @@ export class AgentSession {
3215
3222
  ? `Context overflow recovery failed: ${errorMessage}`
3216
3223
  : `Auto-compaction failed: ${errorMessage}`,
3217
3224
  });
3218
- return false;
3225
+ return hadQueuedMessages || this.agent.hasQueuedMessages();
3219
3226
  }
3220
3227
  finally {
3221
3228
  this._autoCompactionAbortController = undefined;