gsd-pi 2.24.0 → 2.26.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/README.md +13 -3
- package/dist/headless.js +24 -4
- package/dist/models-resolver.d.ts +0 -11
- package/dist/models-resolver.js +0 -15
- package/dist/resource-loader.d.ts +0 -1
- package/dist/resource-loader.js +0 -9
- package/dist/resources/GSD-WORKFLOW.md +12 -9
- package/dist/resources/extensions/async-jobs/index.ts +9 -1
- package/dist/resources/extensions/bg-shell/index.ts +3 -2
- package/dist/resources/extensions/bg-shell/overlay.ts +18 -17
- package/dist/resources/extensions/get-secrets-from-user.ts +5 -23
- package/dist/resources/extensions/gsd/activity-log.ts +5 -3
- package/dist/resources/extensions/gsd/auto-prompts.ts +14 -0
- package/dist/resources/extensions/gsd/auto-recovery.ts +7 -4
- package/dist/resources/extensions/gsd/auto-worktree.ts +132 -3
- package/dist/resources/extensions/gsd/auto.ts +265 -48
- package/dist/resources/extensions/gsd/cache.ts +3 -1
- package/dist/resources/extensions/gsd/doctor-proactive.ts +7 -6
- package/dist/resources/extensions/gsd/doctor.ts +26 -1
- package/dist/resources/extensions/gsd/files.ts +13 -2
- package/dist/resources/extensions/gsd/git-service.ts +74 -14
- package/dist/resources/extensions/gsd/gsd-db.ts +78 -1
- package/dist/resources/extensions/gsd/guided-flow.ts +54 -22
- package/dist/resources/extensions/gsd/index.ts +62 -8
- package/dist/resources/extensions/gsd/memory-extractor.ts +352 -0
- package/dist/resources/extensions/gsd/memory-store.ts +441 -0
- package/dist/resources/extensions/gsd/migrate/command.ts +2 -2
- package/dist/resources/extensions/gsd/migrate/writer.ts +39 -0
- package/dist/resources/extensions/gsd/parallel-orchestrator.ts +122 -4
- package/dist/resources/extensions/gsd/preferences.ts +2 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +4 -4
- package/dist/resources/extensions/gsd/prompts/discuss.md +5 -5
- package/dist/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/dist/resources/extensions/gsd/roadmap-slices.ts +45 -1
- package/dist/resources/extensions/gsd/state.ts +17 -6
- package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/dist/resources/extensions/gsd/tests/derive-state.test.ts +70 -0
- package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +23 -3
- package/dist/resources/extensions/gsd/tests/git-service.test.ts +70 -4
- package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/md-importer.test.ts +2 -3
- package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +180 -0
- package/dist/resources/extensions/gsd/tests/memory-store.test.ts +345 -0
- package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +13 -7
- package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +171 -0
- package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +8 -4
- package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +147 -2
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +88 -10
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +314 -87
- package/dist/resources/extensions/gsd/triage-ui.ts +1 -1
- package/dist/resources/extensions/gsd/types.ts +2 -0
- package/dist/resources/extensions/gsd/visualizer-data.ts +291 -10
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +237 -28
- package/dist/resources/extensions/gsd/visualizer-views.ts +462 -48
- package/dist/resources/extensions/gsd/worktree.ts +9 -2
- package/dist/resources/extensions/search-the-web/native-search.ts +19 -5
- package/dist/resources/extensions/shared/path-display.ts +19 -0
- package/package.json +1 -6
- package/packages/pi-agent-core/dist/agent-loop.js +2 -0
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/src/agent-loop.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +64 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/mistral.js +3 -0
- package/packages/pi-ai/dist/providers/mistral.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +23 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/src/providers/anthropic.ts +65 -1
- package/packages/pi-ai/src/providers/mistral.ts +3 -0
- package/packages/pi-ai/src/types.ts +19 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +7 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +32 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/keybindings.js +1 -1
- package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +12 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +7 -0
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +8 -3
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
- package/packages/pi-coding-agent/dist/core/slash-commands.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 +2 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +5 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +41 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +301 -62
- package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +17 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +5 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +135 -30
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/path-display.test.d.ts +8 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.js +60 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/utils/clipboard-image.js +32 -6
- package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
- package/packages/pi-coding-agent/dist/utils/path-display.d.ts +34 -0
- package/packages/pi-coding-agent/dist/utils/path-display.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/utils/path-display.js +36 -0
- package/packages/pi-coding-agent/dist/utils/path-display.js.map +1 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +36 -0
- package/packages/pi-coding-agent/src/core/keybindings.ts +1 -1
- package/packages/pi-coding-agent/src/core/lsp/client.ts +11 -1
- package/packages/pi-coding-agent/src/core/lsp/index.ts +7 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +17 -1
- package/packages/pi-coding-agent/src/core/settings-manager.ts +11 -0
- package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +2 -1
- package/packages/pi-coding-agent/src/index.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +347 -62
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +18 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +124 -4
- package/packages/pi-coding-agent/src/tests/path-display.test.ts +85 -0
- package/packages/pi-coding-agent/src/utils/clipboard-image.ts +33 -6
- package/packages/pi-coding-agent/src/utils/path-display.ts +36 -0
- package/src/resources/GSD-WORKFLOW.md +12 -9
- package/src/resources/extensions/async-jobs/index.ts +9 -1
- package/src/resources/extensions/bg-shell/index.ts +3 -2
- package/src/resources/extensions/bg-shell/overlay.ts +18 -17
- package/src/resources/extensions/get-secrets-from-user.ts +5 -23
- package/src/resources/extensions/gsd/activity-log.ts +5 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +14 -0
- package/src/resources/extensions/gsd/auto-recovery.ts +7 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +132 -3
- package/src/resources/extensions/gsd/auto.ts +265 -48
- package/src/resources/extensions/gsd/cache.ts +3 -1
- package/src/resources/extensions/gsd/doctor-proactive.ts +7 -6
- package/src/resources/extensions/gsd/doctor.ts +26 -1
- package/src/resources/extensions/gsd/files.ts +13 -2
- package/src/resources/extensions/gsd/git-service.ts +74 -14
- package/src/resources/extensions/gsd/gsd-db.ts +78 -1
- package/src/resources/extensions/gsd/guided-flow.ts +54 -22
- package/src/resources/extensions/gsd/index.ts +62 -8
- package/src/resources/extensions/gsd/memory-extractor.ts +352 -0
- package/src/resources/extensions/gsd/memory-store.ts +441 -0
- package/src/resources/extensions/gsd/migrate/command.ts +2 -2
- package/src/resources/extensions/gsd/migrate/writer.ts +39 -0
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +122 -4
- package/src/resources/extensions/gsd/preferences.ts +2 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +4 -4
- package/src/resources/extensions/gsd/prompts/discuss.md +5 -5
- package/src/resources/extensions/gsd/prompts/execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/queue.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
- package/src/resources/extensions/gsd/roadmap-slices.ts +45 -1
- package/src/resources/extensions/gsd/state.ts +17 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +23 -3
- package/src/resources/extensions/gsd/tests/git-service.test.ts +70 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +345 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +147 -2
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +88 -10
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +314 -87
- package/src/resources/extensions/gsd/triage-ui.ts +1 -1
- package/src/resources/extensions/gsd/types.ts +2 -0
- package/src/resources/extensions/gsd/visualizer-data.ts +291 -10
- package/src/resources/extensions/gsd/visualizer-overlay.ts +237 -28
- package/src/resources/extensions/gsd/visualizer-views.ts +462 -48
- package/src/resources/extensions/gsd/worktree.ts +9 -2
- package/src/resources/extensions/search-the-web/native-search.ts +19 -5
- package/src/resources/extensions/shared/path-display.ts +19 -0
|
@@ -885,6 +885,32 @@ export class InteractiveMode {
|
|
|
885
885
|
const registeredTool = tools.find((t) => t.definition.name === toolName);
|
|
886
886
|
return registeredTool?.definition;
|
|
887
887
|
}
|
|
888
|
+
/**
|
|
889
|
+
* Format web search result content for display in the TUI.
|
|
890
|
+
*/
|
|
891
|
+
formatWebSearchResult(content) {
|
|
892
|
+
if (!content)
|
|
893
|
+
return "Web search completed";
|
|
894
|
+
// Error result
|
|
895
|
+
if (typeof content === "object" && "type" in content && content.type === "web_search_tool_result_error") {
|
|
896
|
+
const error = content;
|
|
897
|
+
return `Search error: ${error.error_code || "unknown"}`;
|
|
898
|
+
}
|
|
899
|
+
// Array of search results
|
|
900
|
+
if (Array.isArray(content)) {
|
|
901
|
+
const results = content.filter((r) => r.type === "web_search_result");
|
|
902
|
+
if (results.length === 0)
|
|
903
|
+
return "No results found";
|
|
904
|
+
return results
|
|
905
|
+
.map((r) => {
|
|
906
|
+
const title = r.title || "Untitled";
|
|
907
|
+
const url = r.url || "";
|
|
908
|
+
return `${title}\n ${url}`;
|
|
909
|
+
})
|
|
910
|
+
.join("\n");
|
|
911
|
+
}
|
|
912
|
+
return "Web search completed";
|
|
913
|
+
}
|
|
888
914
|
/**
|
|
889
915
|
* Set up keyboard shortcuts registered by extensions.
|
|
890
916
|
*/
|
|
@@ -1649,6 +1675,12 @@ export class InteractiveMode {
|
|
|
1649
1675
|
this.handleThinkingCommand(arg);
|
|
1650
1676
|
return;
|
|
1651
1677
|
}
|
|
1678
|
+
if (text === "/edit-mode" || text.startsWith("/edit-mode ")) {
|
|
1679
|
+
const arg = text.startsWith("/edit-mode ") ? text.slice(11).trim() : undefined;
|
|
1680
|
+
this.editor.setText("");
|
|
1681
|
+
this.handleEditModeCommand(arg);
|
|
1682
|
+
return;
|
|
1683
|
+
}
|
|
1652
1684
|
if (text === "/debug") {
|
|
1653
1685
|
this.handleDebugCommand();
|
|
1654
1686
|
this.editor.setText("");
|
|
@@ -1793,6 +1825,31 @@ export class InteractiveMode {
|
|
|
1793
1825
|
}
|
|
1794
1826
|
}
|
|
1795
1827
|
}
|
|
1828
|
+
else if (content.type === "serverToolUse") {
|
|
1829
|
+
// Server-side tool (e.g., native web search) — show as pending tool execution
|
|
1830
|
+
if (!this.pendingTools.has(content.id)) {
|
|
1831
|
+
const component = new ToolExecutionComponent(content.name, content.input ?? {}, {
|
|
1832
|
+
showImages: this.settingsManager.getShowImages(),
|
|
1833
|
+
}, undefined, this.ui);
|
|
1834
|
+
component.setExpanded(this.toolOutputExpanded);
|
|
1835
|
+
this.chatContainer.addChild(component);
|
|
1836
|
+
this.pendingTools.set(content.id, component);
|
|
1837
|
+
}
|
|
1838
|
+
}
|
|
1839
|
+
else if (content.type === "webSearchResult") {
|
|
1840
|
+
// Server-side tool result — resolve the pending server tool execution
|
|
1841
|
+
const component = this.pendingTools.get(content.toolUseId);
|
|
1842
|
+
if (component) {
|
|
1843
|
+
const searchContent = content.content;
|
|
1844
|
+
const isError = searchContent && typeof searchContent === "object" && "type" in searchContent && searchContent.type === "web_search_tool_result_error";
|
|
1845
|
+
const resultText = this.formatWebSearchResult(searchContent);
|
|
1846
|
+
component.updateResult({
|
|
1847
|
+
content: [{ type: "text", text: resultText }],
|
|
1848
|
+
isError: !!isError,
|
|
1849
|
+
});
|
|
1850
|
+
this.pendingTools.delete(content.toolUseId);
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1796
1853
|
}
|
|
1797
1854
|
this.ui.requestRender();
|
|
1798
1855
|
}
|
|
@@ -2129,6 +2186,27 @@ export class InteractiveMode {
|
|
|
2129
2186
|
this.pendingTools.set(content.id, component);
|
|
2130
2187
|
}
|
|
2131
2188
|
}
|
|
2189
|
+
else if (content.type === "serverToolUse") {
|
|
2190
|
+
// Server-side tool (e.g., native web search)
|
|
2191
|
+
const component = new ToolExecutionComponent(content.name, content.input ?? {}, { showImages: this.settingsManager.getShowImages() }, undefined, this.ui);
|
|
2192
|
+
component.setExpanded(this.toolOutputExpanded);
|
|
2193
|
+
this.chatContainer.addChild(component);
|
|
2194
|
+
// Find matching webSearchResult in this message's content
|
|
2195
|
+
const resultBlock = message.content.find((c) => c.type === "webSearchResult" && c.toolUseId === content.id);
|
|
2196
|
+
if (resultBlock && resultBlock.type === "webSearchResult") {
|
|
2197
|
+
const searchContent = resultBlock.content;
|
|
2198
|
+
const isError = searchContent && typeof searchContent === "object" && "type" in searchContent && searchContent.type === "web_search_tool_result_error";
|
|
2199
|
+
const resultText = this.formatWebSearchResult(searchContent);
|
|
2200
|
+
component.updateResult({
|
|
2201
|
+
content: [{ type: "text", text: resultText }],
|
|
2202
|
+
isError: !!isError,
|
|
2203
|
+
});
|
|
2204
|
+
}
|
|
2205
|
+
else {
|
|
2206
|
+
// No result yet (aborted stream?) — show as pending
|
|
2207
|
+
this.pendingTools.set(content.id, component);
|
|
2208
|
+
}
|
|
2209
|
+
}
|
|
2132
2210
|
}
|
|
2133
2211
|
}
|
|
2134
2212
|
else if (message.role === "toolResult") {
|
|
@@ -2316,6 +2394,24 @@ export class InteractiveMode {
|
|
|
2316
2394
|
}
|
|
2317
2395
|
this.showThinkingSelector();
|
|
2318
2396
|
}
|
|
2397
|
+
handleEditModeCommand(arg) {
|
|
2398
|
+
const modes = ["standard", "hashline"];
|
|
2399
|
+
if (arg) {
|
|
2400
|
+
const mode = arg.toLowerCase();
|
|
2401
|
+
if (!modes.includes(mode)) {
|
|
2402
|
+
this.showStatus(`Invalid edit mode "${arg}". Available: standard, hashline`);
|
|
2403
|
+
return;
|
|
2404
|
+
}
|
|
2405
|
+
this.session.setEditMode(mode);
|
|
2406
|
+
this.showStatus(`Edit mode: ${mode}${mode === "hashline" ? " (LINE#ID anchored edits)" : " (text-match edits)"}`);
|
|
2407
|
+
return;
|
|
2408
|
+
}
|
|
2409
|
+
// Toggle
|
|
2410
|
+
const current = this.session.editMode;
|
|
2411
|
+
const next = current === "standard" ? "hashline" : "standard";
|
|
2412
|
+
this.session.setEditMode(next);
|
|
2413
|
+
this.showStatus(`Edit mode: ${next}${next === "hashline" ? " (LINE#ID anchored edits)" : " (text-match edits)"}`);
|
|
2414
|
+
}
|
|
2319
2415
|
showThinkingSelector() {
|
|
2320
2416
|
const availableLevels = this.session.getAvailableThinkingLevels();
|
|
2321
2417
|
this.showSelector((done) => {
|
|
@@ -3165,41 +3261,50 @@ export class InteractiveMode {
|
|
|
3165
3261
|
}
|
|
3166
3262
|
}
|
|
3167
3263
|
this.showSelector((done) => {
|
|
3168
|
-
const selector = new OAuthSelectorComponent(mode, this.session.modelRegistry.authStorage,
|
|
3264
|
+
const selector = new OAuthSelectorComponent(mode, this.session.modelRegistry.authStorage, (providerId) => {
|
|
3169
3265
|
done();
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3190
|
-
|
|
3266
|
+
// OAuthSelectorComponent calls this synchronously (no await),
|
|
3267
|
+
// so we must catch async errors here to prevent unhandled rejections
|
|
3268
|
+
// when the user cancels the login dialog (#821).
|
|
3269
|
+
const handleAsync = async () => {
|
|
3270
|
+
if (mode === "login") {
|
|
3271
|
+
await this.showLoginDialog(providerId);
|
|
3272
|
+
}
|
|
3273
|
+
else {
|
|
3274
|
+
// Logout flow
|
|
3275
|
+
const providerInfo = this.session.modelRegistry.authStorage
|
|
3276
|
+
.getOAuthProviders()
|
|
3277
|
+
.find((p) => p.id === providerId);
|
|
3278
|
+
const providerName = providerInfo?.name || providerId;
|
|
3279
|
+
try {
|
|
3280
|
+
this.session.modelRegistry.authStorage.logout(providerId);
|
|
3281
|
+
this.session.modelRegistry.refresh();
|
|
3282
|
+
await this.updateAvailableProviderCount();
|
|
3283
|
+
// Auto-switch model if current model belongs to the logged-out provider
|
|
3284
|
+
const currentModel = this.session.model;
|
|
3285
|
+
if (currentModel?.provider === providerId) {
|
|
3286
|
+
try {
|
|
3287
|
+
const available = this.session.modelRegistry.getAvailable();
|
|
3288
|
+
const fallback = available.find((m) => m.provider !== providerId);
|
|
3289
|
+
if (fallback) {
|
|
3290
|
+
await this.session.setModel(fallback);
|
|
3291
|
+
}
|
|
3292
|
+
}
|
|
3293
|
+
catch {
|
|
3294
|
+
// Model switch failed — user can manually switch via /model
|
|
3191
3295
|
}
|
|
3192
3296
|
}
|
|
3193
|
-
|
|
3194
|
-
|
|
3195
|
-
|
|
3297
|
+
this.showStatus(`Logged out of ${providerName}`);
|
|
3298
|
+
}
|
|
3299
|
+
catch (error) {
|
|
3300
|
+
this.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
3196
3301
|
}
|
|
3197
|
-
this.showStatus(`Logged out of ${providerName}`);
|
|
3198
|
-
}
|
|
3199
|
-
catch (error) {
|
|
3200
|
-
this.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
3201
3302
|
}
|
|
3202
|
-
}
|
|
3303
|
+
};
|
|
3304
|
+
handleAsync().catch(() => {
|
|
3305
|
+
// Swallow — showLoginDialog already handles its own errors.
|
|
3306
|
+
// This prevents unhandled rejections when login is cancelled.
|
|
3307
|
+
});
|
|
3203
3308
|
}, () => {
|
|
3204
3309
|
done();
|
|
3205
3310
|
this.ui.requestRender();
|