@caupulican/pi-adaptative 0.80.99 → 0.80.102

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 (129) hide show
  1. package/CHANGELOG.md +203 -0
  2. package/dist/core/agent-session.d.ts +72 -0
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +437 -46
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/autonomy/envelope-enforcement.d.ts +5 -0
  7. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  8. package/dist/core/autonomy/envelope-enforcement.js +28 -4
  9. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  10. package/dist/core/autonomy/path-scope.d.ts.map +1 -1
  11. package/dist/core/autonomy/path-scope.js +33 -2
  12. package/dist/core/autonomy/path-scope.js.map +1 -1
  13. package/dist/core/bash-executor.d.ts.map +1 -1
  14. package/dist/core/bash-executor.js +15 -7
  15. package/dist/core/bash-executor.js.map +1 -1
  16. package/dist/core/context/brain-curator.d.ts +10 -0
  17. package/dist/core/context/brain-curator.d.ts.map +1 -1
  18. package/dist/core/context/brain-curator.js +19 -2
  19. package/dist/core/context/brain-curator.js.map +1 -1
  20. package/dist/core/context-gc.d.ts +8 -3
  21. package/dist/core/context-gc.d.ts.map +1 -1
  22. package/dist/core/context-gc.js +5 -0
  23. package/dist/core/context-gc.js.map +1 -1
  24. package/dist/core/delegation/worker-actions.d.ts +0 -10
  25. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  26. package/dist/core/delegation/worker-actions.js +5 -7
  27. package/dist/core/delegation/worker-actions.js.map +1 -1
  28. package/dist/core/delegation/worker-result.d.ts +6 -0
  29. package/dist/core/delegation/worker-result.d.ts.map +1 -1
  30. package/dist/core/delegation/worker-result.js +10 -4
  31. package/dist/core/delegation/worker-result.js.map +1 -1
  32. package/dist/core/delegation/worker-runner.d.ts +3 -0
  33. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  34. package/dist/core/delegation/worker-runner.js +6 -1
  35. package/dist/core/delegation/worker-runner.js.map +1 -1
  36. package/dist/core/doctor.d.ts +66 -0
  37. package/dist/core/doctor.d.ts.map +1 -0
  38. package/dist/core/doctor.js +144 -0
  39. package/dist/core/doctor.js.map +1 -0
  40. package/dist/core/learning/learning-audit.d.ts +13 -1
  41. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  42. package/dist/core/learning/learning-audit.js +22 -1
  43. package/dist/core/learning/learning-audit.js.map +1 -1
  44. package/dist/core/learning/learning-gate.d.ts +3 -0
  45. package/dist/core/learning/learning-gate.d.ts.map +1 -1
  46. package/dist/core/learning/learning-gate.js +13 -4
  47. package/dist/core/learning/learning-gate.js.map +1 -1
  48. package/dist/core/models/default-model-suggestions.d.ts +34 -0
  49. package/dist/core/models/default-model-suggestions.d.ts.map +1 -0
  50. package/dist/core/models/default-model-suggestions.js +58 -0
  51. package/dist/core/models/default-model-suggestions.js.map +1 -0
  52. package/dist/core/models/local-registration.d.ts +2 -0
  53. package/dist/core/models/local-registration.d.ts.map +1 -1
  54. package/dist/core/models/local-registration.js +2 -1
  55. package/dist/core/models/local-registration.js.map +1 -1
  56. package/dist/core/models/local-runtime.d.ts +76 -2
  57. package/dist/core/models/local-runtime.d.ts.map +1 -1
  58. package/dist/core/models/local-runtime.js +233 -21
  59. package/dist/core/models/local-runtime.js.map +1 -1
  60. package/dist/core/profile-resource-selection.d.ts +15 -3
  61. package/dist/core/profile-resource-selection.d.ts.map +1 -1
  62. package/dist/core/profile-resource-selection.js +19 -9
  63. package/dist/core/profile-resource-selection.js.map +1 -1
  64. package/dist/core/resource-loader.d.ts +20 -0
  65. package/dist/core/resource-loader.d.ts.map +1 -1
  66. package/dist/core/resource-loader.js +42 -16
  67. package/dist/core/resource-loader.js.map +1 -1
  68. package/dist/core/settings-manager.d.ts +30 -0
  69. package/dist/core/settings-manager.d.ts.map +1 -1
  70. package/dist/core/settings-manager.js +65 -3
  71. package/dist/core/settings-manager.js.map +1 -1
  72. package/dist/core/skills.d.ts +14 -0
  73. package/dist/core/skills.d.ts.map +1 -1
  74. package/dist/core/skills.js +8 -0
  75. package/dist/core/skills.js.map +1 -1
  76. package/dist/core/slash-commands.d.ts.map +1 -1
  77. package/dist/core/slash-commands.js +1 -1
  78. package/dist/core/slash-commands.js.map +1 -1
  79. package/dist/core/tools/fff-search-backend.d.ts +34 -1
  80. package/dist/core/tools/fff-search-backend.d.ts.map +1 -1
  81. package/dist/core/tools/fff-search-backend.js +43 -4
  82. package/dist/core/tools/fff-search-backend.js.map +1 -1
  83. package/dist/core/tools/find.d.ts +16 -0
  84. package/dist/core/tools/find.d.ts.map +1 -1
  85. package/dist/core/tools/find.js +17 -3
  86. package/dist/core/tools/find.js.map +1 -1
  87. package/dist/core/tools/grep.d.ts +20 -0
  88. package/dist/core/tools/grep.d.ts.map +1 -1
  89. package/dist/core/tools/grep.js +15 -3
  90. package/dist/core/tools/grep.js.map +1 -1
  91. package/dist/main.d.ts.map +1 -1
  92. package/dist/main.js +17 -0
  93. package/dist/main.js.map +1 -1
  94. package/dist/modes/interactive/components/fitness-role-selector.d.ts +6 -2
  95. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  96. package/dist/modes/interactive/components/fitness-role-selector.js +55 -45
  97. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  98. package/dist/modes/interactive/components/model-suggestion-selector.d.ts +13 -0
  99. package/dist/modes/interactive/components/model-suggestion-selector.d.ts.map +1 -0
  100. package/dist/modes/interactive/components/model-suggestion-selector.js +40 -0
  101. package/dist/modes/interactive/components/model-suggestion-selector.js.map +1 -0
  102. package/dist/modes/interactive/components/profile-resource-editor.d.ts +3 -0
  103. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  104. package/dist/modes/interactive/components/profile-resource-editor.js +16 -2
  105. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  106. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  107. package/dist/modes/interactive/components/settings-selector.js +98 -0
  108. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  109. package/dist/modes/interactive/interactive-mode.d.ts +8 -1
  110. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  111. package/dist/modes/interactive/interactive-mode.js +57 -10
  112. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  113. package/dist/utils/safe-write-stream.d.ts +8 -0
  114. package/dist/utils/safe-write-stream.d.ts.map +1 -1
  115. package/dist/utils/safe-write-stream.js +32 -0
  116. package/dist/utils/safe-write-stream.js.map +1 -1
  117. package/dist/utils/tools-manager.d.ts +92 -2
  118. package/dist/utils/tools-manager.d.ts.map +1 -1
  119. package/dist/utils/tools-manager.js +172 -32
  120. package/dist/utils/tools-manager.js.map +1 -1
  121. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  122. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  123. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  124. package/examples/extensions/sandbox/package-lock.json +2 -2
  125. package/examples/extensions/sandbox/package.json +1 -1
  126. package/examples/extensions/with-deps/package-lock.json +2 -2
  127. package/examples/extensions/with-deps/package.json +1 -1
  128. package/npm-shrinkwrap.json +12 -36
  129. package/package.json +4 -4
@@ -22,9 +22,9 @@ import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/htt
22
22
  import { KeybindingsManager } from "../../core/keybindings.js";
23
23
  import { createCompactionSummaryMessage } from "../../core/messages.js";
24
24
  import { cliProviderAliases, defaultModelPerProvider, findExactModelReferenceMatch, resolveCliModel, resolveModelScope, } from "../../core/model-resolver.js";
25
+ import { DEFAULT_MODEL_SUGGESTIONS } from "../../core/models/default-model-suggestions.js";
25
26
  import { FitnessStore } from "../../core/models/fitness-store.js";
26
27
  import { registerLocalModel, unregisterLocalModel } from "../../core/models/local-registration.js";
27
- import { OllamaRuntime } from "../../core/models/local-runtime.js";
28
28
  import { normalizeModelSource } from "../../core/models/model-ref.js";
29
29
  import { DefaultPackageManager } from "../../core/package-manager.js";
30
30
  import { BUILT_IN_PROVIDER_DISPLAY_NAMES } from "../../core/provider-display-names.js";
@@ -68,6 +68,7 @@ import { FooterComponent } from "./components/footer.js";
68
68
  import { formatKeyText, keyDisplayText, keyHint, keyText, rawKeyHint } from "./components/keybinding-hints.js";
69
69
  import { LoginDialogComponent } from "./components/login-dialog.js";
70
70
  import { ModelSelectorComponent } from "./components/model-selector.js";
71
+ import { ModelSuggestionSelectorComponent } from "./components/model-suggestion-selector.js";
71
72
  import { OAuthSelectorComponent } from "./components/oauth-selector.js";
72
73
  import { ProfileResourceEditorComponent, resolveResourceEditPath, } from "./components/profile-resource-editor.js";
73
74
  import { ProfileSelectorComponent } from "./components/profile-selector.js";
@@ -2690,6 +2691,25 @@ export class InteractiveMode {
2690
2691
  }
2691
2692
  this.footer.invalidate();
2692
2693
  switch (event.type) {
2694
+ // Part B: general "the system is processing" feedback for the routing/prep gap before a
2695
+ // turn starts streaming (the judge is a real bounded LLM call, not instant) — independent
2696
+ // of thinking level, since this isn't model-thinking. Reuses the same working loader
2697
+ // agent_start below uses, so the hand-off into real streaming is the same
2698
+ // stop-then-recreate it already does — no distinct spinner, no double-render.
2699
+ case "routing_start":
2700
+ if (!this.session.isStreaming && !this.loadingAnimation && this.workingVisible) {
2701
+ this.loadingAnimation = this.createWorkingLoader();
2702
+ this.statusContainer.addChild(this.loadingAnimation);
2703
+ this.ui.requestRender();
2704
+ }
2705
+ break;
2706
+ case "routing_end":
2707
+ // Unconditional: covers both a clean hand-off into agent_start (which immediately
2708
+ // stops-and-recreates its own loader anyway) and a turn that failed before ever
2709
+ // starting, which must not leave the indicator spinning forever.
2710
+ this.stopWorkingLoader();
2711
+ this.ui.requestRender();
2712
+ break;
2693
2713
  case "agent_start":
2694
2714
  this.clearActiveToolCalls();
2695
2715
  if (this.settingsManager.getShowTerminalProgress()) {
@@ -5138,10 +5158,14 @@ export class InteractiveMode {
5138
5158
  this.settingsManager.setAutoLearnSettings(preset, scope);
5139
5159
  this.updateAutoLearnFooter();
5140
5160
  }
5141
- _localRuntime;
5161
+ /**
5162
+ * Delegates to the session rather than keeping its own instance (#27): the model router boots a
5163
+ * local server through AgentSession.getLocalRuntime() before a routed turn, and `/models`
5164
+ * commands need to see and be able to stop that SAME pi-managed process, not an unrelated one
5165
+ * tracked separately here.
5166
+ */
5142
5167
  get localRuntime() {
5143
- this._localRuntime ??= new OllamaRuntime({ agentDir: getAgentDir() });
5144
- return this._localRuntime;
5168
+ return this.session.getLocalRuntime();
5145
5169
  }
5146
5170
  /**
5147
5171
  * /models — USER-invoked local model lifecycle (never a model-invokable tool):
@@ -5151,6 +5175,10 @@ export class InteractiveMode {
5151
5175
  async handleModelsCommand(argsText) {
5152
5176
  const [action = "list", ...rest] = argsText.split(/\s+/).filter(Boolean);
5153
5177
  try {
5178
+ if (action === "suggest" || action === "suggestions") {
5179
+ this.showModelSuggestionSelector();
5180
+ return;
5181
+ }
5154
5182
  if (action === "stop") {
5155
5183
  const stopped = this.localRuntime.stop();
5156
5184
  this.showStatus(stopped.stopped
@@ -5162,6 +5190,7 @@ export class InteractiveMode {
5162
5190
  const rawRef = rest.join(" ");
5163
5191
  if (!rawRef) {
5164
5192
  this.showStatus("Usage: /models add <ollama-tag | hf.co/org/repo[:quant] | huggingface URL | pasted install command>");
5193
+ this.showStatus("Or start from a validated suggestion: /models suggest");
5165
5194
  return;
5166
5195
  }
5167
5196
  const source = normalizeModelSource(rawRef);
@@ -5224,7 +5253,9 @@ export class InteractiveMode {
5224
5253
  const fitness = FitnessStore.forAgentDir(getAgentDir()).getForHost();
5225
5254
  const lines = [
5226
5255
  `Local models (${status.managedByPi ? `pi-managed server, storage: ${status.ownedModelsDir}` : "system server — storage owned by the system daemon"}):`,
5227
- ...(models.length === 0 ? [" (none installed — /models add <ref>)"] : []),
5256
+ ...(models.length === 0
5257
+ ? [" (none installed — /models add <ref>, or /models suggest for a validated roster)"]
5258
+ : []),
5228
5259
  ...models.map((model) => {
5229
5260
  const report = fitness.find((entry) => entry.model === `ollama/${model.name}`);
5230
5261
  const gb = (model.sizeBytes / 1e9).toFixed(2);
@@ -5238,7 +5269,7 @@ export class InteractiveMode {
5238
5269
  for (const line of lines)
5239
5270
  this.showStatus(line);
5240
5271
  }
5241
- async addLocalModel(pullRef) {
5272
+ async addLocalModel(pullRef, preselectRole) {
5242
5273
  if (!(await this.ensureLocalServer()))
5243
5274
  return;
5244
5275
  this.showStatus(`Pulling ${pullRef}… (weights land in the server's model storage)`);
@@ -5268,7 +5299,7 @@ export class InteractiveMode {
5268
5299
  }
5269
5300
  this.session.modelRegistry.refresh();
5270
5301
  this.showStatus(`${pullRef} installed and registered as ollama/${pullRef}. Probing fitness…`);
5271
- await this.runFitnessAndAssign(`ollama/${pullRef}`);
5302
+ await this.runFitnessAndAssign(`ollama/${pullRef}`, preselectRole);
5272
5303
  }
5273
5304
  async removeLocalModel(ref, confirmed) {
5274
5305
  const status = await this.localRuntime.detect();
@@ -5305,6 +5336,21 @@ export class InteractiveMode {
5305
5336
  this.showStatus(`${ref} removed: weights deleted, registration and fitness report dropped.`);
5306
5337
  }
5307
5338
  /** /fitness with no args: pick a model from the configured registry, probe it, assign a role. */
5339
+ /** Pick a validated suggestion → install it → probe on this host → land its shaped role. */
5340
+ showModelSuggestionSelector() {
5341
+ this.showSelector((done) => {
5342
+ const selector = new ModelSuggestionSelectorComponent(DEFAULT_MODEL_SUGGESTIONS, async (suggestion) => {
5343
+ done();
5344
+ // The shaped role rides along so the post-probe selector lands on it pre-selected;
5345
+ // non-tool-callers carry curator/judge/none, never executor, so this can't footgun.
5346
+ await this.addLocalModel(suggestion.pullRef, suggestion.assignRole);
5347
+ }, () => {
5348
+ done();
5349
+ this.ui.requestRender();
5350
+ });
5351
+ return { component: selector, focus: selector };
5352
+ });
5353
+ }
5308
5354
  showFitnessModelSelector() {
5309
5355
  this.showSelector((done) => {
5310
5356
  const selector = new ModelSelectorComponent(this.ui, this.session.model, this.settingsManager, this.session.modelRegistry, this.session.scopedModels, async (model) => {
@@ -5317,8 +5363,9 @@ export class InteractiveMode {
5317
5363
  return { component: selector, focus: selector };
5318
5364
  });
5319
5365
  }
5320
- /** Probe a model's fitness, show the report, then offer one-step role assignment. */
5321
- async runFitnessAndAssign(modelRef) {
5366
+ /** Probe a model's fitness, show the report, then offer one-step role assignment. When the model
5367
+ * came from a validated suggestion, `preselectRole` lands its shaped role already highlighted. */
5368
+ async runFitnessAndAssign(modelRef, preselectRole) {
5322
5369
  this.showStatus(`Model fitness probe running on ${modelRef}… (6 surfaces; local models may take a few minutes)`);
5323
5370
  try {
5324
5371
  const outcome = await this.session.runModelFitness({ model: modelRef });
@@ -5336,7 +5383,7 @@ export class InteractiveMode {
5336
5383
  }, () => {
5337
5384
  done();
5338
5385
  this.ui.requestRender();
5339
- });
5386
+ }, preselectRole);
5340
5387
  return { component: selector, focus: selector };
5341
5388
  });
5342
5389
  }