@mariozechner/pi-coding-agent 0.52.6 → 0.52.7

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 (36) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +7 -0
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/auth-storage.d.ts.map +1 -1
  6. package/dist/core/auth-storage.js +16 -0
  7. package/dist/core/auth-storage.js.map +1 -1
  8. package/dist/core/extensions/runner.d.ts +17 -2
  9. package/dist/core/extensions/runner.d.ts.map +1 -1
  10. package/dist/core/extensions/runner.js +53 -9
  11. package/dist/core/extensions/runner.js.map +1 -1
  12. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  13. package/dist/core/extensions/wrapper.js +3 -3
  14. package/dist/core/extensions/wrapper.js.map +1 -1
  15. package/dist/core/model-registry.d.ts +3 -1
  16. package/dist/core/model-registry.d.ts.map +1 -1
  17. package/dist/core/model-registry.js +133 -37
  18. package/dist/core/model-registry.js.map +1 -1
  19. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  20. package/dist/modes/interactive/components/assistant-message.js +9 -4
  21. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  22. package/dist/modes/interactive/interactive-mode.d.ts +0 -1
  23. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  24. package/dist/modes/interactive/interactive-mode.js +111 -101
  25. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  26. package/docs/extensions.md +5 -0
  27. package/docs/models.md +40 -1
  28. package/docs/providers.md +13 -0
  29. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  30. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  31. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  32. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  33. package/examples/extensions/hello.ts +1 -1
  34. package/examples/extensions/with-deps/package-lock.json +2 -2
  35. package/examples/extensions/with-deps/package.json +1 -1
  36. package/package.json +4 -4
@@ -223,9 +223,6 @@ export class InteractiveMode {
223
223
  this.autocompleteProvider = new CombinedAutocompleteProvider([...slashCommands, ...templateCommands, ...extensionCommands, ...skillCommandList], process.cwd(), fdPath);
224
224
  this.defaultEditor.setAutocompleteProvider(this.autocompleteProvider);
225
225
  }
226
- rebuildAutocomplete() {
227
- this.setupAutocomplete(this.fdPath);
228
- }
229
226
  async init() {
230
227
  if (this.isInitialized)
231
228
  return;
@@ -233,7 +230,6 @@ export class InteractiveMode {
233
230
  this.changelogMarkdown = this.getChangelogForDisplay();
234
231
  // Setup autocomplete with fd tool for file path completion
235
232
  this.fdPath = await ensureTool("fd");
236
- this.setupAutocomplete(this.fdPath);
237
233
  // Add header container as first child
238
234
  this.ui.addChild(this.headerContainer);
239
235
  // Add header with keybindings from config (unless silenced)
@@ -639,104 +635,114 @@ export class InteractiveMode {
639
635
  return lines.join("\n");
640
636
  }
641
637
  showLoadedResources(options) {
642
- const shouldShow = options?.force || this.options.verbose || !this.settingsManager.getQuietStartup();
643
- if (!shouldShow) {
638
+ const showListing = options?.force || this.options.verbose || !this.settingsManager.getQuietStartup();
639
+ const showDiagnostics = showListing || options?.showDiagnosticsWhenQuiet === true;
640
+ if (!showListing && !showDiagnostics) {
644
641
  return;
645
642
  }
646
643
  const metadata = this.session.resourceLoader.getPathMetadata();
647
644
  const sectionHeader = (name, color = "mdHeading") => theme.fg(color, `[${name}]`);
648
- const contextFiles = this.session.resourceLoader.getAgentsFiles().agentsFiles;
649
- if (contextFiles.length > 0) {
650
- this.chatContainer.addChild(new Spacer(1));
651
- const contextList = contextFiles.map((f) => theme.fg("dim", ` ${this.formatDisplayPath(f.path)}`)).join("\n");
652
- this.chatContainer.addChild(new Text(`${sectionHeader("Context")}\n${contextList}`, 0, 0));
653
- this.chatContainer.addChild(new Spacer(1));
654
- }
655
- const skills = this.session.resourceLoader.getSkills().skills;
656
- if (skills.length > 0) {
657
- const skillPaths = skills.map((s) => s.filePath);
658
- const groups = this.buildScopeGroups(skillPaths, metadata);
659
- const skillList = this.formatScopeGroups(groups, {
660
- formatPath: (p) => this.formatDisplayPath(p),
661
- formatPackagePath: (p, source) => this.getShortPath(p, source),
662
- });
663
- this.chatContainer.addChild(new Text(`${sectionHeader("Skills")}\n${skillList}`, 0, 0));
664
- this.chatContainer.addChild(new Spacer(1));
665
- }
666
- const skillDiagnostics = this.session.resourceLoader.getSkills().diagnostics;
667
- if (skillDiagnostics.length > 0) {
668
- const warningLines = this.formatDiagnostics(skillDiagnostics, metadata);
669
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Skill conflicts]")}\n${warningLines}`, 0, 0));
670
- this.chatContainer.addChild(new Spacer(1));
671
- }
672
- const templates = this.session.promptTemplates;
673
- if (templates.length > 0) {
674
- const templatePaths = templates.map((t) => t.filePath);
675
- const groups = this.buildScopeGroups(templatePaths, metadata);
676
- const templateByPath = new Map(templates.map((t) => [t.filePath, t]));
677
- const templateList = this.formatScopeGroups(groups, {
678
- formatPath: (p) => {
679
- const template = templateByPath.get(p);
680
- return template ? `/${template.name}` : this.formatDisplayPath(p);
681
- },
682
- formatPackagePath: (p) => {
683
- const template = templateByPath.get(p);
684
- return template ? `/${template.name}` : this.formatDisplayPath(p);
685
- },
686
- });
687
- this.chatContainer.addChild(new Text(`${sectionHeader("Prompts")}\n${templateList}`, 0, 0));
688
- this.chatContainer.addChild(new Spacer(1));
689
- }
690
- const promptDiagnostics = this.session.resourceLoader.getPrompts().diagnostics;
691
- if (promptDiagnostics.length > 0) {
692
- const warningLines = this.formatDiagnostics(promptDiagnostics, metadata);
693
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Prompt conflicts]")}\n${warningLines}`, 0, 0));
694
- this.chatContainer.addChild(new Spacer(1));
695
- }
696
- const extensionPaths = options?.extensionPaths ?? [];
697
- if (extensionPaths.length > 0) {
698
- const groups = this.buildScopeGroups(extensionPaths, metadata);
699
- const extList = this.formatScopeGroups(groups, {
700
- formatPath: (p) => this.formatDisplayPath(p),
701
- formatPackagePath: (p, source) => this.getShortPath(p, source),
702
- });
703
- this.chatContainer.addChild(new Text(`${sectionHeader("Extensions", "mdHeading")}\n${extList}`, 0, 0));
704
- this.chatContainer.addChild(new Spacer(1));
705
- }
706
- const extensionDiagnostics = [];
707
- const extensionErrors = this.session.resourceLoader.getExtensions().errors;
708
- if (extensionErrors.length > 0) {
709
- for (const error of extensionErrors) {
710
- extensionDiagnostics.push({ type: "error", message: error.error, path: error.path });
711
- }
712
- }
713
- const commandDiagnostics = this.session.extensionRunner?.getCommandDiagnostics() ?? [];
714
- extensionDiagnostics.push(...commandDiagnostics);
715
- const shortcutDiagnostics = this.session.extensionRunner?.getShortcutDiagnostics() ?? [];
716
- extensionDiagnostics.push(...shortcutDiagnostics);
717
- if (extensionDiagnostics.length > 0) {
718
- const warningLines = this.formatDiagnostics(extensionDiagnostics, metadata);
719
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Extension issues]")}\n${warningLines}`, 0, 0));
720
- this.chatContainer.addChild(new Spacer(1));
721
- }
722
- // Show loaded themes (excluding built-in)
723
- const loadedThemes = this.session.resourceLoader.getThemes().themes;
724
- const customThemes = loadedThemes.filter((t) => t.sourcePath);
725
- if (customThemes.length > 0) {
726
- const themePaths = customThemes.map((t) => t.sourcePath);
727
- const groups = this.buildScopeGroups(themePaths, metadata);
728
- const themeList = this.formatScopeGroups(groups, {
729
- formatPath: (p) => this.formatDisplayPath(p),
730
- formatPackagePath: (p, source) => this.getShortPath(p, source),
731
- });
732
- this.chatContainer.addChild(new Text(`${sectionHeader("Themes")}\n${themeList}`, 0, 0));
733
- this.chatContainer.addChild(new Spacer(1));
645
+ const skillsResult = this.session.resourceLoader.getSkills();
646
+ const promptsResult = this.session.resourceLoader.getPrompts();
647
+ const themesResult = this.session.resourceLoader.getThemes();
648
+ if (showListing) {
649
+ const contextFiles = this.session.resourceLoader.getAgentsFiles().agentsFiles;
650
+ if (contextFiles.length > 0) {
651
+ this.chatContainer.addChild(new Spacer(1));
652
+ const contextList = contextFiles
653
+ .map((f) => theme.fg("dim", ` ${this.formatDisplayPath(f.path)}`))
654
+ .join("\n");
655
+ this.chatContainer.addChild(new Text(`${sectionHeader("Context")}\n${contextList}`, 0, 0));
656
+ this.chatContainer.addChild(new Spacer(1));
657
+ }
658
+ const skills = skillsResult.skills;
659
+ if (skills.length > 0) {
660
+ const skillPaths = skills.map((s) => s.filePath);
661
+ const groups = this.buildScopeGroups(skillPaths, metadata);
662
+ const skillList = this.formatScopeGroups(groups, {
663
+ formatPath: (p) => this.formatDisplayPath(p),
664
+ formatPackagePath: (p, source) => this.getShortPath(p, source),
665
+ });
666
+ this.chatContainer.addChild(new Text(`${sectionHeader("Skills")}\n${skillList}`, 0, 0));
667
+ this.chatContainer.addChild(new Spacer(1));
668
+ }
669
+ const templates = this.session.promptTemplates;
670
+ if (templates.length > 0) {
671
+ const templatePaths = templates.map((t) => t.filePath);
672
+ const groups = this.buildScopeGroups(templatePaths, metadata);
673
+ const templateByPath = new Map(templates.map((t) => [t.filePath, t]));
674
+ const templateList = this.formatScopeGroups(groups, {
675
+ formatPath: (p) => {
676
+ const template = templateByPath.get(p);
677
+ return template ? `/${template.name}` : this.formatDisplayPath(p);
678
+ },
679
+ formatPackagePath: (p) => {
680
+ const template = templateByPath.get(p);
681
+ return template ? `/${template.name}` : this.formatDisplayPath(p);
682
+ },
683
+ });
684
+ this.chatContainer.addChild(new Text(`${sectionHeader("Prompts")}\n${templateList}`, 0, 0));
685
+ this.chatContainer.addChild(new Spacer(1));
686
+ }
687
+ const extensionPaths = options?.extensionPaths ?? [];
688
+ if (extensionPaths.length > 0) {
689
+ const groups = this.buildScopeGroups(extensionPaths, metadata);
690
+ const extList = this.formatScopeGroups(groups, {
691
+ formatPath: (p) => this.formatDisplayPath(p),
692
+ formatPackagePath: (p, source) => this.getShortPath(p, source),
693
+ });
694
+ this.chatContainer.addChild(new Text(`${sectionHeader("Extensions", "mdHeading")}\n${extList}`, 0, 0));
695
+ this.chatContainer.addChild(new Spacer(1));
696
+ }
697
+ // Show loaded themes (excluding built-in)
698
+ const loadedThemes = themesResult.themes;
699
+ const customThemes = loadedThemes.filter((t) => t.sourcePath);
700
+ if (customThemes.length > 0) {
701
+ const themePaths = customThemes.map((t) => t.sourcePath);
702
+ const groups = this.buildScopeGroups(themePaths, metadata);
703
+ const themeList = this.formatScopeGroups(groups, {
704
+ formatPath: (p) => this.formatDisplayPath(p),
705
+ formatPackagePath: (p, source) => this.getShortPath(p, source),
706
+ });
707
+ this.chatContainer.addChild(new Text(`${sectionHeader("Themes")}\n${themeList}`, 0, 0));
708
+ this.chatContainer.addChild(new Spacer(1));
709
+ }
734
710
  }
735
- const themeDiagnostics = this.session.resourceLoader.getThemes().diagnostics;
736
- if (themeDiagnostics.length > 0) {
737
- const warningLines = this.formatDiagnostics(themeDiagnostics, metadata);
738
- this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Theme conflicts]")}\n${warningLines}`, 0, 0));
739
- this.chatContainer.addChild(new Spacer(1));
711
+ if (showDiagnostics) {
712
+ const skillDiagnostics = skillsResult.diagnostics;
713
+ if (skillDiagnostics.length > 0) {
714
+ const warningLines = this.formatDiagnostics(skillDiagnostics, metadata);
715
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Skill conflicts]")}\n${warningLines}`, 0, 0));
716
+ this.chatContainer.addChild(new Spacer(1));
717
+ }
718
+ const promptDiagnostics = promptsResult.diagnostics;
719
+ if (promptDiagnostics.length > 0) {
720
+ const warningLines = this.formatDiagnostics(promptDiagnostics, metadata);
721
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Prompt conflicts]")}\n${warningLines}`, 0, 0));
722
+ this.chatContainer.addChild(new Spacer(1));
723
+ }
724
+ const extensionDiagnostics = [];
725
+ const extensionErrors = this.session.resourceLoader.getExtensions().errors;
726
+ if (extensionErrors.length > 0) {
727
+ for (const error of extensionErrors) {
728
+ extensionDiagnostics.push({ type: "error", message: error.error, path: error.path });
729
+ }
730
+ }
731
+ const commandDiagnostics = this.session.extensionRunner?.getCommandDiagnostics() ?? [];
732
+ extensionDiagnostics.push(...commandDiagnostics);
733
+ const shortcutDiagnostics = this.session.extensionRunner?.getShortcutDiagnostics() ?? [];
734
+ extensionDiagnostics.push(...shortcutDiagnostics);
735
+ if (extensionDiagnostics.length > 0) {
736
+ const warningLines = this.formatDiagnostics(extensionDiagnostics, metadata);
737
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Extension issues]")}\n${warningLines}`, 0, 0));
738
+ this.chatContainer.addChild(new Spacer(1));
739
+ }
740
+ const themeDiagnostics = themesResult.diagnostics;
741
+ if (themeDiagnostics.length > 0) {
742
+ const warningLines = this.formatDiagnostics(themeDiagnostics, metadata);
743
+ this.chatContainer.addChild(new Text(`${theme.fg("warning", "[Theme conflicts]")}\n${warningLines}`, 0, 0));
744
+ this.chatContainer.addChild(new Spacer(1));
745
+ }
740
746
  }
741
747
  }
742
748
  /**
@@ -813,7 +819,7 @@ export class InteractiveMode {
813
819
  },
814
820
  });
815
821
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
816
- this.rebuildAutocomplete();
822
+ this.setupAutocomplete(this.fdPath);
817
823
  const extensionRunner = this.session.extensionRunner;
818
824
  if (!extensionRunner) {
819
825
  this.showLoadedResources({ extensionPaths: [], force: false });
@@ -2529,7 +2535,7 @@ export class InteractiveMode {
2529
2535
  },
2530
2536
  onEnableSkillCommandsChange: (enabled) => {
2531
2537
  this.settingsManager.setEnableSkillCommands(enabled);
2532
- this.rebuildAutocomplete();
2538
+ this.setupAutocomplete(this.fdPath);
2533
2539
  },
2534
2540
  onSteeringModeChange: (mode) => {
2535
2541
  this.session.setSteeringMode(mode);
@@ -3131,14 +3137,18 @@ export class InteractiveMode {
3131
3137
  }
3132
3138
  this.ui.setShowHardwareCursor(this.settingsManager.getShowHardwareCursor());
3133
3139
  this.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());
3134
- this.rebuildAutocomplete();
3140
+ this.setupAutocomplete(this.fdPath);
3135
3141
  const runner = this.session.extensionRunner;
3136
3142
  if (runner) {
3137
3143
  this.setupExtensionShortcuts(runner);
3138
3144
  }
3139
3145
  this.rebuildChatFromMessages();
3140
3146
  dismissLoader(this.editor);
3141
- this.showLoadedResources({ extensionPaths: runner?.getExtensionPaths() ?? [], force: true });
3147
+ this.showLoadedResources({
3148
+ extensionPaths: runner?.getExtensionPaths() ?? [],
3149
+ force: false,
3150
+ showDiagnosticsWhenQuiet: true,
3151
+ });
3142
3152
  const modelsJsonError = this.session.modelRegistry.getError();
3143
3153
  if (modelsJsonError) {
3144
3154
  this.showError(`models.json error: ${modelsJsonError}`);