gsd-pi 2.12.0 → 2.13.0
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/dist/cli.js +18 -1
- package/dist/resource-loader.d.ts +2 -0
- package/dist/resource-loader.js +36 -1
- package/dist/resources/extensions/gsd/auto-worktree.ts +509 -0
- package/dist/resources/extensions/gsd/auto.ts +222 -11
- package/dist/resources/extensions/gsd/doctor.ts +195 -1
- package/dist/resources/extensions/gsd/git-self-heal.ts +198 -0
- package/dist/resources/extensions/gsd/git-service.ts +11 -0
- package/dist/resources/extensions/gsd/preferences.ts +17 -1
- package/dist/resources/extensions/gsd/prompts/system.md +32 -29
- package/dist/resources/extensions/gsd/tests/auto-worktree-merge.test.ts +282 -0
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +259 -0
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +147 -0
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +246 -0
- package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +234 -0
- package/dist/resources/extensions/gsd/tests/isolation-resolver.test.ts +107 -0
- package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +88 -0
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +315 -0
- package/dist/resources/extensions/gsd/worktree-manager.ts +6 -4
- package/dist/resources/extensions/search-the-web/native-search.ts +15 -10
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js +1 -1
- package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +4 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +2 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +3 -3
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +6 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/src/cli/args.ts +1 -1
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +2 -1
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +3 -3
- package/packages/pi-coding-agent/src/core/system-prompt.ts +9 -0
- package/packages/pi-tui/dist/components/editor.d.ts +11 -0
- package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
- package/packages/pi-tui/dist/components/editor.js +64 -6
- package/packages/pi-tui/dist/components/editor.js.map +1 -1
- package/packages/pi-tui/src/components/editor.ts +71 -6
- package/src/resources/extensions/gsd/auto-worktree.ts +509 -0
- package/src/resources/extensions/gsd/auto.ts +222 -11
- package/src/resources/extensions/gsd/doctor.ts +195 -1
- package/src/resources/extensions/gsd/git-self-heal.ts +198 -0
- package/src/resources/extensions/gsd/git-service.ts +11 -0
- package/src/resources/extensions/gsd/preferences.ts +17 -1
- package/src/resources/extensions/gsd/prompts/system.md +32 -29
- package/src/resources/extensions/gsd/tests/auto-worktree-merge.test.ts +282 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +259 -0
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +246 -0
- package/src/resources/extensions/gsd/tests/git-self-heal.test.ts +234 -0
- package/src/resources/extensions/gsd/tests/isolation-resolver.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/preferences-git.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +315 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +6 -4
- package/src/resources/extensions/search-the-web/native-search.ts +15 -10
|
@@ -43,6 +43,9 @@ export declare class Editor implements Component, Focusable {
|
|
|
43
43
|
private autocompleteState;
|
|
44
44
|
private autocompletePrefix;
|
|
45
45
|
private autocompleteMaxVisible;
|
|
46
|
+
private autocompleteDebounceTimer;
|
|
47
|
+
private lastAutocompleteLookupPrefix;
|
|
48
|
+
private static readonly AUTOCOMPLETE_DEBOUNCE_MS;
|
|
46
49
|
private pastes;
|
|
47
50
|
private pasteCounter;
|
|
48
51
|
private pasteBuffer;
|
|
@@ -110,6 +113,11 @@ export declare class Editor implements Component, Focusable {
|
|
|
110
113
|
*/
|
|
111
114
|
private insertTextAtCursorInternal;
|
|
112
115
|
private insertCharacter;
|
|
116
|
+
/**
|
|
117
|
+
* Debounced version of tryTriggerAutocomplete for @ file reference context.
|
|
118
|
+
* Prevents synchronous fuzzyFind calls from blocking the event loop on every keystroke.
|
|
119
|
+
*/
|
|
120
|
+
private debouncedTriggerAutocomplete;
|
|
113
121
|
private handlePaste;
|
|
114
122
|
private addNewLine;
|
|
115
123
|
private shouldSubmitOnBackslashEnter;
|
|
@@ -220,7 +228,10 @@ export declare class Editor implements Component, Focusable {
|
|
|
220
228
|
private handleSlashCommandCompletion;
|
|
221
229
|
private forceFileAutocomplete;
|
|
222
230
|
private cancelAutocomplete;
|
|
231
|
+
private clearAutocompleteDebounce;
|
|
223
232
|
isShowingAutocomplete(): boolean;
|
|
224
233
|
private updateAutocomplete;
|
|
234
|
+
private debouncedUpdateAutocompleteSuggestions;
|
|
235
|
+
private applyAutocompleteSuggestions;
|
|
225
236
|
}
|
|
226
237
|
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAgC,MAAM,oBAAoB,CAAC;AAI7F,OAAO,EAAE,KAAK,SAAS,EAAiB,KAAK,SAAS,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAGpF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIpE;;;GAGG;AACH,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CA6DxE;AAqBD,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,UAAU,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,MAAO,YAAW,SAAS,EAAE,SAAS;IAClD,OAAO,CAAC,KAAK,CAIX;IAEF,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAS;IAEzB,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAa;IAG7B,OAAO,CAAC,SAAS,CAAc;IAG/B,OAAO,CAAC,YAAY,CAAa;IAG1B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAG5C,OAAO,CAAC,oBAAoB,CAAC,CAAuB;IACpD,OAAO,CAAC,gBAAgB,CAAC,CAAa;IACtC,OAAO,CAAC,iBAAiB,CAAoC;IAC7D,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,sBAAsB,CAAa;
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/components/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,6 +69,7 @@ export function wordWrapLine(line, maxWidth) {
|
|
|
69
69
|
return chunks;
|
|
70
70
|
}
|
|
71
71
|
export class Editor {
|
|
72
|
+
static { this.AUTOCOMPLETE_DEBOUNCE_MS = 150; }
|
|
72
73
|
constructor(tui, theme, options = {}) {
|
|
73
74
|
this.state = {
|
|
74
75
|
lines: [""],
|
|
@@ -85,6 +86,10 @@ export class Editor {
|
|
|
85
86
|
this.autocompleteState = null;
|
|
86
87
|
this.autocompletePrefix = "";
|
|
87
88
|
this.autocompleteMaxVisible = 5;
|
|
89
|
+
// Debounce for @ file autocomplete to prevent blocking the event loop
|
|
90
|
+
// with synchronous fuzzyFind calls on every keystroke
|
|
91
|
+
this.autocompleteDebounceTimer = null;
|
|
92
|
+
this.lastAutocompleteLookupPrefix = null;
|
|
88
93
|
// Paste tracking for large pastes
|
|
89
94
|
this.pastes = new Map();
|
|
90
95
|
this.pasteCounter = 0;
|
|
@@ -796,9 +801,10 @@ export class Editor {
|
|
|
796
801
|
if (this.isInSlashCommandContext(textBeforeCursor)) {
|
|
797
802
|
this.tryTriggerAutocomplete();
|
|
798
803
|
}
|
|
799
|
-
// Check if we're in an @ file reference context
|
|
804
|
+
// Check if we're in an @ file reference context (debounce to avoid
|
|
805
|
+
// blocking the event loop with synchronous fuzzyFind on every keystroke)
|
|
800
806
|
else if (textBeforeCursor.match(/(?:^|[\s])@[^\s]*$/)) {
|
|
801
|
-
this.
|
|
807
|
+
this.debouncedTriggerAutocomplete();
|
|
802
808
|
}
|
|
803
809
|
}
|
|
804
810
|
}
|
|
@@ -806,6 +812,21 @@ export class Editor {
|
|
|
806
812
|
this.updateAutocomplete();
|
|
807
813
|
}
|
|
808
814
|
}
|
|
815
|
+
/**
|
|
816
|
+
* Debounced version of tryTriggerAutocomplete for @ file reference context.
|
|
817
|
+
* Prevents synchronous fuzzyFind calls from blocking the event loop on every keystroke.
|
|
818
|
+
*/
|
|
819
|
+
debouncedTriggerAutocomplete() {
|
|
820
|
+
if (this.autocompleteDebounceTimer) {
|
|
821
|
+
clearTimeout(this.autocompleteDebounceTimer);
|
|
822
|
+
this.autocompleteDebounceTimer = null;
|
|
823
|
+
}
|
|
824
|
+
this.autocompleteDebounceTimer = setTimeout(() => {
|
|
825
|
+
this.autocompleteDebounceTimer = null;
|
|
826
|
+
this.tryTriggerAutocomplete();
|
|
827
|
+
this.tui.requestRender();
|
|
828
|
+
}, Editor.AUTOCOMPLETE_DEBOUNCE_MS);
|
|
829
|
+
}
|
|
809
830
|
handlePaste(pastedText) {
|
|
810
831
|
this.historyIndex = -1; // Exit history browsing mode
|
|
811
832
|
this.lastAction = null;
|
|
@@ -936,9 +957,9 @@ export class Editor {
|
|
|
936
957
|
if (this.isInSlashCommandContext(textBeforeCursor)) {
|
|
937
958
|
this.tryTriggerAutocomplete();
|
|
938
959
|
}
|
|
939
|
-
// @ file reference context
|
|
960
|
+
// @ file reference context (debounced to avoid blocking event loop)
|
|
940
961
|
else if (textBeforeCursor.match(/(?:^|[\s])@[^\s]*$/)) {
|
|
941
|
-
this.
|
|
962
|
+
this.debouncedTriggerAutocomplete();
|
|
942
963
|
}
|
|
943
964
|
}
|
|
944
965
|
}
|
|
@@ -1176,9 +1197,9 @@ export class Editor {
|
|
|
1176
1197
|
if (this.isInSlashCommandContext(textBeforeCursor)) {
|
|
1177
1198
|
this.tryTriggerAutocomplete();
|
|
1178
1199
|
}
|
|
1179
|
-
// @ file reference context
|
|
1200
|
+
// @ file reference context (debounced to avoid blocking event loop)
|
|
1180
1201
|
else if (textBeforeCursor.match(/(?:^|[\s])@[^\s]*$/)) {
|
|
1181
|
-
this.
|
|
1202
|
+
this.debouncedTriggerAutocomplete();
|
|
1182
1203
|
}
|
|
1183
1204
|
}
|
|
1184
1205
|
}
|
|
@@ -1670,6 +1691,14 @@ https://github.com/EsotericSoftware/spine-runtimes/actions/runs/19536643416/job/
|
|
|
1670
1691
|
this.autocompleteState = null;
|
|
1671
1692
|
this.autocompleteList = undefined;
|
|
1672
1693
|
this.autocompletePrefix = "";
|
|
1694
|
+
this.clearAutocompleteDebounce();
|
|
1695
|
+
}
|
|
1696
|
+
clearAutocompleteDebounce() {
|
|
1697
|
+
if (this.autocompleteDebounceTimer) {
|
|
1698
|
+
clearTimeout(this.autocompleteDebounceTimer);
|
|
1699
|
+
this.autocompleteDebounceTimer = null;
|
|
1700
|
+
}
|
|
1701
|
+
this.lastAutocompleteLookupPrefix = null;
|
|
1673
1702
|
}
|
|
1674
1703
|
isShowingAutocomplete() {
|
|
1675
1704
|
return this.autocompleteState !== null;
|
|
@@ -1681,6 +1710,35 @@ https://github.com/EsotericSoftware/spine-runtimes/actions/runs/19536643416/job/
|
|
|
1681
1710
|
this.forceFileAutocomplete();
|
|
1682
1711
|
return;
|
|
1683
1712
|
}
|
|
1713
|
+
// Check if we're in an @ file reference context — these trigger expensive
|
|
1714
|
+
// synchronous fuzzyFind calls that block the event loop. Debounce them so
|
|
1715
|
+
// rapid typing doesn't cascade into dozens of blocking searches.
|
|
1716
|
+
const currentLine = this.state.lines[this.state.cursorLine] || "";
|
|
1717
|
+
const textBeforeCursor = currentLine.slice(0, this.state.cursorCol);
|
|
1718
|
+
if (this.autocompletePrefix.startsWith("@") || textBeforeCursor.match(/(?:^|[\s])@[^\s]*$/)) {
|
|
1719
|
+
this.debouncedUpdateAutocompleteSuggestions();
|
|
1720
|
+
return;
|
|
1721
|
+
}
|
|
1722
|
+
this.applyAutocompleteSuggestions();
|
|
1723
|
+
}
|
|
1724
|
+
debouncedUpdateAutocompleteSuggestions() {
|
|
1725
|
+
// Clear any pending debounce
|
|
1726
|
+
if (this.autocompleteDebounceTimer) {
|
|
1727
|
+
clearTimeout(this.autocompleteDebounceTimer);
|
|
1728
|
+
this.autocompleteDebounceTimer = null;
|
|
1729
|
+
}
|
|
1730
|
+
this.autocompleteDebounceTimer = setTimeout(() => {
|
|
1731
|
+
this.autocompleteDebounceTimer = null;
|
|
1732
|
+
// Guard: autocomplete may have been cancelled during debounce wait
|
|
1733
|
+
if (!this.autocompleteState || !this.autocompleteProvider)
|
|
1734
|
+
return;
|
|
1735
|
+
this.applyAutocompleteSuggestions();
|
|
1736
|
+
this.tui.requestRender();
|
|
1737
|
+
}, Editor.AUTOCOMPLETE_DEBOUNCE_MS);
|
|
1738
|
+
}
|
|
1739
|
+
applyAutocompleteSuggestions() {
|
|
1740
|
+
if (!this.autocompleteProvider)
|
|
1741
|
+
return;
|
|
1684
1742
|
const suggestions = this.autocompleteProvider.getSuggestions(this.state.lines, this.state.cursorLine, this.state.cursorCol);
|
|
1685
1743
|
if (suggestions && suggestions.items.length > 0) {
|
|
1686
1744
|
this.autocompletePrefix = suggestions.prefix;
|