@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.
- package/CHANGELOG.md +22 -0
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +2 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/export-html/index.d.ts +2 -2
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +24 -2
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +44 -0
- package/dist/core/export-html/template.js +13 -2
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +33 -3
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +4 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +22 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +28 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +29 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +42 -11
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +9 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +40 -4
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/docs/extensions.md +181 -9
- package/docs/tui.md +220 -2
- package/examples/extensions/README.md +2 -0
- package/examples/extensions/preset.ts +398 -0
- package/examples/extensions/timed-confirm.ts +63 -0
- package/examples/extensions/truncated-tool.ts +192 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- 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"}`);
|