@mariozechner/pi-coding-agent 0.37.4 → 0.37.6

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 (60) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/core/agent-session.d.ts +1 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +2 -2
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/export-html/index.d.ts +2 -2
  7. package/dist/core/export-html/index.d.ts.map +1 -1
  8. package/dist/core/export-html/index.js +24 -2
  9. package/dist/core/export-html/index.js.map +1 -1
  10. package/dist/core/export-html/template.css +44 -0
  11. package/dist/core/export-html/template.js +13 -2
  12. package/dist/core/extensions/index.d.ts +1 -1
  13. package/dist/core/extensions/index.d.ts.map +1 -1
  14. package/dist/core/extensions/index.js.map +1 -1
  15. package/dist/core/extensions/loader.d.ts.map +1 -1
  16. package/dist/core/extensions/loader.js +33 -3
  17. package/dist/core/extensions/loader.js.map +1 -1
  18. package/dist/core/extensions/runner.d.ts +4 -1
  19. package/dist/core/extensions/runner.d.ts.map +1 -1
  20. package/dist/core/extensions/runner.js +3 -0
  21. package/dist/core/extensions/runner.js.map +1 -1
  22. package/dist/core/extensions/types.d.ts +22 -4
  23. package/dist/core/extensions/types.d.ts.map +1 -1
  24. package/dist/core/extensions/types.js.map +1 -1
  25. package/dist/core/system-prompt.d.ts.map +1 -1
  26. package/dist/core/system-prompt.js +1 -1
  27. package/dist/core/system-prompt.js.map +1 -1
  28. package/dist/core/tools/index.d.ts +1 -1
  29. package/dist/core/tools/index.d.ts.map +1 -1
  30. package/dist/core/tools/index.js +1 -0
  31. package/dist/core/tools/index.js.map +1 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -2
  35. package/dist/index.js.map +1 -1
  36. package/dist/main.d.ts.map +1 -1
  37. package/dist/main.js +1 -1
  38. package/dist/main.js.map +1 -1
  39. package/dist/modes/interactive/components/index.d.ts +28 -0
  40. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  41. package/dist/modes/interactive/components/index.js +29 -0
  42. package/dist/modes/interactive/components/index.js.map +1 -0
  43. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  44. package/dist/modes/interactive/interactive-mode.js +42 -11
  45. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  46. package/dist/modes/print-mode.d.ts.map +1 -1
  47. package/dist/modes/print-mode.js +9 -0
  48. package/dist/modes/print-mode.js.map +1 -1
  49. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  50. package/dist/modes/rpc/rpc-mode.js +40 -4
  51. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  52. package/docs/extensions.md +181 -9
  53. package/docs/tui.md +220 -2
  54. package/examples/extensions/README.md +2 -0
  55. package/examples/extensions/preset.ts +398 -0
  56. package/examples/extensions/timed-confirm.ts +63 -0
  57. package/examples/extensions/truncated-tool.ts +192 -0
  58. package/examples/extensions/with-deps/package-lock.json +2 -2
  59. package/examples/extensions/with-deps/package.json +1 -1
  60. package/package.json +4 -4
@@ -414,6 +414,15 @@ export class InteractiveMode {
414
414
  this.showStatus("Navigated to selected point");
415
415
  return { cancelled: false };
416
416
  },
417
+ setModelHandler: async (model) => {
418
+ const key = await this.session.modelRegistry.getApiKey(model);
419
+ if (!key)
420
+ return false;
421
+ await this.session.setModel(model);
422
+ return true;
423
+ },
424
+ getThinkingLevelHandler: () => this.session.thinkingLevel,
425
+ setThinkingLevelHandler: (level) => this.session.setThinkingLevel(level),
417
426
  isIdle: () => !this.session.isStreaming,
418
427
  waitForIdle: () => this.session.agent.waitForIdle(),
419
428
  abort: () => {
@@ -600,9 +609,9 @@ export class InteractiveMode {
600
609
  */
601
610
  createExtensionUIContext() {
602
611
  return {
603
- select: (title, options) => this.showExtensionSelector(title, options),
604
- confirm: (title, message) => this.showExtensionConfirm(title, message),
605
- input: (title, placeholder) => this.showExtensionInput(title, placeholder),
612
+ select: (title, options, opts) => this.showExtensionSelector(title, options, opts),
613
+ confirm: (title, message, opts) => this.showExtensionConfirm(title, message, opts),
614
+ input: (title, placeholder, opts) => this.showExtensionInput(title, placeholder, opts),
606
615
  notify: (message, type) => this.showExtensionNotify(message, type),
607
616
  setStatus: (key, text) => this.setExtensionStatus(key, text),
608
617
  setWidget: (key, content) => this.setExtensionWidget(key, content),
@@ -621,12 +630,23 @@ export class InteractiveMode {
621
630
  /**
622
631
  * Show a selector for extensions.
623
632
  */
624
- showExtensionSelector(title, options) {
633
+ showExtensionSelector(title, options, opts) {
625
634
  return new Promise((resolve) => {
635
+ if (opts?.signal?.aborted) {
636
+ resolve(undefined);
637
+ return;
638
+ }
639
+ const onAbort = () => {
640
+ this.hideExtensionSelector();
641
+ resolve(undefined);
642
+ };
643
+ opts?.signal?.addEventListener("abort", onAbort, { once: true });
626
644
  this.extensionSelector = new ExtensionSelectorComponent(title, options, (option) => {
645
+ opts?.signal?.removeEventListener("abort", onAbort);
627
646
  this.hideExtensionSelector();
628
647
  resolve(option);
629
648
  }, () => {
649
+ opts?.signal?.removeEventListener("abort", onAbort);
630
650
  this.hideExtensionSelector();
631
651
  resolve(undefined);
632
652
  });
@@ -649,19 +669,30 @@ export class InteractiveMode {
649
669
  /**
650
670
  * Show a confirmation dialog for extensions.
651
671
  */
652
- async showExtensionConfirm(title, message) {
653
- const result = await this.showExtensionSelector(`${title}\n${message}`, ["Yes", "No"]);
672
+ async showExtensionConfirm(title, message, opts) {
673
+ const result = await this.showExtensionSelector(`${title}\n${message}`, ["Yes", "No"], opts);
654
674
  return result === "Yes";
655
675
  }
656
676
  /**
657
677
  * Show a text input for extensions.
658
678
  */
659
- showExtensionInput(title, placeholder) {
679
+ showExtensionInput(title, placeholder, opts) {
660
680
  return new Promise((resolve) => {
681
+ if (opts?.signal?.aborted) {
682
+ resolve(undefined);
683
+ return;
684
+ }
685
+ const onAbort = () => {
686
+ this.hideExtensionInput();
687
+ resolve(undefined);
688
+ };
689
+ opts?.signal?.addEventListener("abort", onAbort, { once: true });
661
690
  this.extensionInput = new ExtensionInputComponent(title, placeholder, (value) => {
691
+ opts?.signal?.removeEventListener("abort", onAbort);
662
692
  this.hideExtensionInput();
663
693
  resolve(value);
664
694
  }, () => {
695
+ opts?.signal?.removeEventListener("abort", onAbort);
665
696
  this.hideExtensionInput();
666
697
  resolve(undefined);
667
698
  });
@@ -872,7 +903,7 @@ export class InteractiveMode {
872
903
  return;
873
904
  }
874
905
  if (text.startsWith("/export")) {
875
- this.handleExportCommand(text);
906
+ await this.handleExportCommand(text);
876
907
  this.editor.setText("");
877
908
  return;
878
909
  }
@@ -2086,11 +2117,11 @@ export class InteractiveMode {
2086
2117
  // =========================================================================
2087
2118
  // Command handlers
2088
2119
  // =========================================================================
2089
- handleExportCommand(text) {
2120
+ async handleExportCommand(text) {
2090
2121
  const parts = text.split(/\s+/);
2091
2122
  const outputPath = parts.length > 1 ? parts[1] : undefined;
2092
2123
  try {
2093
- const filePath = this.session.exportToHtml(outputPath);
2124
+ const filePath = await this.session.exportToHtml(outputPath);
2094
2125
  this.showStatus(`Session exported to: ${filePath}`);
2095
2126
  }
2096
2127
  catch (error) {
@@ -2113,7 +2144,7 @@ export class InteractiveMode {
2113
2144
  // Export to a temp file
2114
2145
  const tmpFile = path.join(os.tmpdir(), "session.html");
2115
2146
  try {
2116
- this.session.exportToHtml(tmpFile);
2147
+ await this.session.exportToHtml(tmpFile);
2117
2148
  }
2118
2149
  catch (error) {
2119
2150
  this.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);