@hienlh/ppm 0.11.14 → 0.11.15
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 +6 -0
- package/dist/web/assets/{audio-preview-DNMaA2Iy.js → audio-preview-DUTDkh1f.js} +1 -1
- package/dist/web/assets/{chat-tab-C1bWBIuO.js → chat-tab-Cf1vTYcj.js} +9 -9
- package/dist/web/assets/{code-editor-bumY3csF.js → code-editor-CggfXtFW.js} +2 -2
- package/dist/web/assets/{conflict-editor-C4vVGggc.js → conflict-editor-iWOABkhf.js} +1 -1
- package/dist/web/assets/{database-viewer-C2R4BmYb.js → database-viewer-DX9f9NyY.js} +1 -1
- package/dist/web/assets/{diff-viewer-BkLjsOlF.js → diff-viewer-B1Xncm02.js} +1 -1
- package/dist/web/assets/{extension-webview-CYdFTUiW.js → extension-webview-8b_CTllD.js} +2 -2
- package/dist/web/assets/{image-preview-D7GaiqMk.js → image-preview-s7xusRYU.js} +1 -1
- package/dist/web/assets/index-B0V_IYbX.css +2 -0
- package/dist/web/assets/index-B6mI0Eg3.js +23 -0
- package/dist/web/assets/{markdown-renderer-BUP7_3I1.js → markdown-renderer-DXOnDF6-.js} +1 -1
- package/dist/web/assets/{pdf-preview-7pWtxUJf.js → pdf-preview-CnmUqDwC.js} +1 -1
- package/dist/web/assets/{port-forwarding-tab-CJgjwcA4.js → port-forwarding-tab-CbWeIeKi.js} +1 -1
- package/dist/web/assets/{postgres-viewer-CCr2drUV.js → postgres-viewer-CSReoBEH.js} +1 -1
- package/dist/web/assets/{settings-tab-CJ9mBPMc.js → settings-tab-C8B1XEJW.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-W17NY9K0.js → sqlite-viewer-DnPhLsuv.js} +1 -1
- package/dist/web/assets/{terminal-tab-CPZdKlsT.js → terminal-tab-CEH5Ymjy.js} +1 -1
- package/dist/web/assets/{video-preview-DDqJpn2U.js → video-preview-BbCZ9v-V.js} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/web/components/chat/message-list.tsx +34 -3
- package/src/web/components/extensions/extension-webview.tsx +6 -1
- package/src/web/hooks/use-extension-ws.ts +25 -2
- package/dist/web/assets/index-DDyfOgAn.js +0 -23
- package/dist/web/assets/index-FKwHNxD8.css +0 -2
|
@@ -7,6 +7,15 @@ import { getAuthToken } from "@/lib/api-client";
|
|
|
7
7
|
import type { ExtServerMsg, ExtClientMsg } from "../../types/extension-messages.ts";
|
|
8
8
|
import { toast } from "sonner";
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Track recently closed extension viewTypes to prevent auto-reopen.
|
|
12
|
+
* When user closes an extension tab, the viewType is added here.
|
|
13
|
+
* If a `webview:create` arrives for a recently closed viewType, we skip
|
|
14
|
+
* creating a new tab (the close was intentional).
|
|
15
|
+
* Cleared when user explicitly dispatches a command for the same viewType.
|
|
16
|
+
*/
|
|
17
|
+
const recentlyClosedViews = new Set<string>();
|
|
18
|
+
|
|
10
19
|
/**
|
|
11
20
|
* Hook that manages the WebSocket connection for extension UI bridge.
|
|
12
21
|
* Dispatches server messages into the extension Zustand store.
|
|
@@ -147,7 +156,10 @@ export function useExtensionWs(enabled = true) {
|
|
|
147
156
|
title: msg.title,
|
|
148
157
|
metadata: { viewType: viewTypeSlug, panelId: msg.panelId, extensionId: msg.extensionId },
|
|
149
158
|
});
|
|
150
|
-
|
|
159
|
+
// Focus the existing tab so Cmd+G / command palette switches to it
|
|
160
|
+
useTabStore.getState().setActiveTab(existingTabId);
|
|
161
|
+
} else if (!recentlyClosedViews.has(viewTypeSlug)) {
|
|
162
|
+
// Only create a new tab if this viewType wasn't recently closed by user
|
|
151
163
|
const currentProject = useTabStore.getState().currentProject;
|
|
152
164
|
useTabStore.getState().openTab({
|
|
153
165
|
type: "extension",
|
|
@@ -207,14 +219,25 @@ export function useExtensionWs(enabled = true) {
|
|
|
207
219
|
// Listen for command:execute requests (dispatched by StatusBar / TreeView)
|
|
208
220
|
const commandHandler = (e: Event) => {
|
|
209
221
|
const { command, args } = (e as CustomEvent).detail;
|
|
222
|
+
// User explicitly opened an extension — clear "recently closed" so tab can be created
|
|
223
|
+
const slug = (command as string).replace(/\.view$/, "");
|
|
224
|
+
recentlyClosedViews.delete(slug);
|
|
210
225
|
client.send(JSON.stringify({ type: "command:execute", command, args }));
|
|
211
226
|
};
|
|
212
227
|
window.addEventListener("ext:command:execute", commandHandler);
|
|
213
228
|
|
|
214
229
|
// Listen for webview close requests (dispatched by ExtensionWebview on unmount)
|
|
215
230
|
const webviewCloseHandler = (e: Event) => {
|
|
216
|
-
const { panelId } = (e as CustomEvent).detail;
|
|
231
|
+
const { panelId, viewType } = (e as CustomEvent).detail;
|
|
217
232
|
client.send(JSON.stringify({ type: "webview:close", panelId }));
|
|
233
|
+
// Track that user intentionally closed this extension tab
|
|
234
|
+
if (viewType) {
|
|
235
|
+
const slug = (viewType as string).replace(/\.view$/, "");
|
|
236
|
+
recentlyClosedViews.add(slug);
|
|
237
|
+
// Auto-clear after 5s — stale entries are harmless but could block
|
|
238
|
+
// legitimate reopens if user waits too long
|
|
239
|
+
setTimeout(() => recentlyClosedViews.delete(slug), 5_000);
|
|
240
|
+
}
|
|
218
241
|
};
|
|
219
242
|
window.addEventListener("ext:webview:close", webviewCloseHandler);
|
|
220
243
|
|