@earendil-works/pi-coding-agent 0.82.0 → 0.82.1

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 (46) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/cli/args.d.ts.map +1 -1
  3. package/dist/cli/args.js +1 -0
  4. package/dist/cli/args.js.map +1 -1
  5. package/dist/core/agent-session.d.ts.map +1 -1
  6. package/dist/core/agent-session.js +2 -7
  7. package/dist/core/agent-session.js.map +1 -1
  8. package/dist/core/extensions/types.d.ts +2 -0
  9. package/dist/core/extensions/types.d.ts.map +1 -1
  10. package/dist/core/extensions/types.js.map +1 -1
  11. package/dist/core/model-resolver.d.ts +1 -0
  12. package/dist/core/model-resolver.d.ts.map +1 -1
  13. package/dist/core/model-resolver.js +13 -3
  14. package/dist/core/model-resolver.js.map +1 -1
  15. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  16. package/dist/core/remote-catalog-provider.js +19 -1
  17. package/dist/core/remote-catalog-provider.js.map +1 -1
  18. package/dist/core/resource-loader.d.ts.map +1 -1
  19. package/dist/core/resource-loader.js +3 -0
  20. package/dist/core/resource-loader.js.map +1 -1
  21. package/dist/extensions/llama/provider.d.ts.map +1 -1
  22. package/dist/extensions/llama/provider.js +6 -0
  23. package/dist/extensions/llama/provider.js.map +1 -1
  24. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  25. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  26. package/dist/modes/interactive/components/custom-message.js +10 -2
  27. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  28. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  29. package/dist/modes/interactive/components/scoped-models-selector.js +22 -13
  30. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  31. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  32. package/dist/modes/interactive/interactive-mode.js +28 -16
  33. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  34. package/docs/extensions.md +2 -2
  35. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  36. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  37. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  38. package/examples/extensions/gondolin/package-lock.json +2 -2
  39. package/examples/extensions/gondolin/package.json +1 -1
  40. package/examples/extensions/message-renderer.ts +2 -2
  41. package/examples/extensions/sandbox/package-lock.json +2 -2
  42. package/examples/extensions/sandbox/package.json +1 -1
  43. package/examples/extensions/with-deps/package-lock.json +2 -2
  44. package/examples/extensions/with-deps/package.json +1 -1
  45. package/npm-shrinkwrap.json +12 -12
  46. package/package.json +4 -4
@@ -17,7 +17,7 @@ import { FooterDataProvider } from "../../core/footer-data-provider.js";
17
17
  import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
18
18
  import { KeybindingsManager } from "../../core/keybindings.js";
19
19
  import { createCompactionSummaryMessage } from "../../core/messages.js";
20
- import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScope } from "../../core/model-resolver.js";
20
+ import { defaultModelPerProvider, findExactModelReferenceMatch, resolveModelScope, resolveModelScopeWithDiagnostics, } from "../../core/model-resolver.js";
21
21
  import { DefaultPackageManager } from "../../core/package-manager.js";
22
22
  import { formatMissingSessionCwdPrompt, MissingSessionCwdError } from "../../core/session-cwd.js";
23
23
  import { SessionManager, sessionEntryToContextMessages } from "../../core/session-manager.js";
@@ -2622,7 +2622,7 @@ export class InteractiveMode {
2622
2622
  case "custom": {
2623
2623
  if (message.display) {
2624
2624
  const renderer = this.session.extensionRunner.getMessageRenderer(message.customType);
2625
- const component = new CustomMessageComponent(message, renderer, this.getMarkdownThemeWithSettings());
2625
+ const component = new CustomMessageComponent(message, renderer, this.getMarkdownThemeWithSettings(), this.outputPad);
2626
2626
  component.setExpanded(this.toolOutputExpanded);
2627
2627
  this.chatContainer.addChild(component);
2628
2628
  }
@@ -3525,7 +3525,9 @@ export class InteractiveMode {
3525
3525
  this.outputPad = padding;
3526
3526
  if (this.streamingComponent || this.session.isStreaming) {
3527
3527
  for (const child of this.chatContainer.children) {
3528
- if (child instanceof AssistantMessageComponent || child instanceof UserMessageComponent) {
3528
+ if (child instanceof AssistantMessageComponent ||
3529
+ child instanceof CustomMessageComponent ||
3530
+ child instanceof UserMessageComponent) {
3529
3531
  child.setOutputPad(padding);
3530
3532
  }
3531
3533
  }
@@ -3710,12 +3712,17 @@ export class InteractiveMode {
3710
3712
  // Get all available models
3711
3713
  await this.session.modelRuntime.refresh();
3712
3714
  const allModels = [...(await this.session.modelRuntime.getAvailable())];
3713
- if (allModels.length === 0) {
3715
+ const allModelIds = new Set(allModels.map((model) => `${model.provider}/${model.id}`));
3716
+ const configuredPatterns = this.settingsManager.getEnabledModels();
3717
+ const sessionScopedModels = this.session.scopedModels;
3718
+ if (allModels.length === 0 && !configuredPatterns?.length && sessionScopedModels.length === 0) {
3714
3719
  this.showStatus("No models available");
3715
3720
  return;
3716
3721
  }
3722
+ const configuredScope = configuredPatterns?.length
3723
+ ? await resolveModelScopeWithDiagnostics(configuredPatterns, this.session.modelRuntime)
3724
+ : undefined;
3717
3725
  // Check if session has scoped models (from previous session-only changes or CLI --models)
3718
- const sessionScopedModels = this.session.scopedModels;
3719
3726
  const hasSessionScope = sessionScopedModels.length > 0;
3720
3727
  // Build enabled model IDs from session state or settings
3721
3728
  let currentEnabledIds = null;
@@ -3723,18 +3730,22 @@ export class InteractiveMode {
3723
3730
  // Use current session's scoped models
3724
3731
  currentEnabledIds = sessionScopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3725
3732
  }
3726
- else {
3727
- // Fall back to settings
3728
- const patterns = this.settingsManager.getEnabledModels();
3729
- if (patterns !== undefined && patterns.length > 0) {
3730
- const scopedModels = await resolveModelScope(patterns, this.session.modelRuntime);
3731
- currentEnabledIds = scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3732
- }
3733
+ else if (configuredScope) {
3734
+ currentEnabledIds = configuredScope.scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`);
3735
+ }
3736
+ for (const diagnostic of configuredScope?.diagnostics ?? []) {
3737
+ if (diagnostic.code !== "no-match")
3738
+ continue;
3739
+ currentEnabledIds ??= [];
3740
+ if (!currentEnabledIds.includes(diagnostic.pattern))
3741
+ currentEnabledIds.push(diagnostic.pattern);
3733
3742
  }
3734
3743
  // Helper to update session's scoped models (session-only, no persist)
3735
3744
  const updateSessionModels = async (enabledIds) => {
3736
3745
  currentEnabledIds = enabledIds === null ? null : [...enabledIds];
3737
- if (enabledIds && enabledIds.length > 0 && enabledIds.length < allModels.length) {
3746
+ const hasEnabledAvailableModel = enabledIds?.some((id) => allModelIds.has(id)) ?? false;
3747
+ const allAvailableModelsEnabled = enabledIds !== null && [...allModelIds].every((id) => enabledIds.includes(id));
3748
+ if (enabledIds && hasEnabledAvailableModel && !allAvailableModelsEnabled) {
3738
3749
  const newScopedModels = await resolveModelScope(enabledIds, this.session.modelRuntime);
3739
3750
  this.session.setScopedModels(newScopedModels.map((sm) => ({
3740
3751
  model: sm.model,
@@ -3758,9 +3769,10 @@ export class InteractiveMode {
3758
3769
  },
3759
3770
  onPersist: (enabledIds) => {
3760
3771
  // Persist to settings
3761
- const newPatterns = enabledIds === null || enabledIds.length === allModels.length
3762
- ? undefined // All enabled = clear filter
3763
- : enabledIds;
3772
+ const allEnabled = enabledIds !== null &&
3773
+ enabledIds.length === allModels.length &&
3774
+ enabledIds.every((id) => allModelIds.has(id));
3775
+ const newPatterns = enabledIds === null || allEnabled ? undefined : enabledIds;
3764
3776
  this.settingsManager.setEnabledModels(newPatterns ? [...newPatterns] : undefined);
3765
3777
  this.showStatus("Model selection saved to settings");
3766
3778
  },