@hienlh/ppm 0.13.32 → 0.13.33
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 +9 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{audio-preview-CUQyzUCl.js → audio-preview-Cr3GjyH_.js} +1 -1
- package/dist/web/assets/{chat-tab-BAouVHJG.js → chat-tab-Bq8AuPPE.js} +3 -3
- package/dist/web/assets/{code-editor-CkZzq2Sd.js → code-editor-abfRXkgG.js} +2 -2
- package/dist/web/assets/{conflict-editor-CEilXhpo.js → conflict-editor-UXzd5iEO.js} +1 -1
- package/dist/web/assets/{database-viewer-oCfOGBqv.js → database-viewer-iQGshdho.js} +1 -1
- package/dist/web/assets/{diff-viewer-B3A6C9W2.js → diff-viewer-Bl-l5K9W.js} +1 -1
- package/dist/web/assets/{extension-webview-rH3etns9.js → extension-webview-CCTVAjaU.js} +1 -1
- package/dist/web/assets/{glide-data-grid-DdE7PkYl.js → glide-data-grid-DYxTrchL.js} +1 -1
- package/dist/web/assets/{image-preview-DsJpgEWA.js → image-preview-DLoL90K7.js} +1 -1
- package/dist/web/assets/{index-BQYpBWiY.js → index-BgTyEXDi.js} +10 -10
- package/dist/web/assets/keybindings-store-BP0-WBfA.js +1 -0
- package/dist/web/assets/{markdown-renderer-C_5GH1wX.js → markdown-renderer-Bv_VAy7V.js} +1 -1
- package/dist/web/assets/notification-store-SdYMFZ_D.js +1 -0
- package/dist/web/assets/{pdf-preview-CKw0C1oI.js → pdf-preview-DOnr5kiK.js} +1 -1
- package/dist/web/assets/{port-forwarding-tab-qO3QPsXx.js → port-forwarding-tab-BVT5RR_9.js} +1 -1
- package/dist/web/assets/{postgres-viewer-D5gFlUwQ.js → postgres-viewer-BfLZMw6J.js} +1 -1
- package/dist/web/assets/{settings-tab-NbsTG_aq.js → settings-tab-D-G5nGIJ.js} +1 -1
- package/dist/web/assets/{sql-query-editor-BUCPRiyQ.js → sql-query-editor-Di1gqWnG.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-PKK_aXhw.js → sqlite-viewer-DT_m_XY3.js} +1 -1
- package/dist/web/assets/{terminal-tab-CGsnXNWR.js → terminal-tab-CBOCgoJn.js} +1 -1
- package/dist/web/assets/{video-preview-BLk5vtRN.js → video-preview-B4Jz9ymO.js} +1 -1
- package/dist/web/index.html +1 -1
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/server/ws/chat.ts +4 -2
- package/src/web/components/layout/notification-bell-popover.tsx +6 -9
- package/src/web/components/layout/project-bar.tsx +3 -1
- package/src/web/hooks/use-chat.ts +2 -2
- package/src/web/stores/notification-store.ts +7 -5
- package/dist/web/assets/keybindings-store-D4HbcnQd.js +0 -1
- package/dist/web/assets/notification-store-ByLxhBXA.js +0 -1
|
@@ -483,8 +483,8 @@ export function useChat(sessionId: string | null, providerId = "claude", project
|
|
|
483
483
|
|
|
484
484
|
// Cross-tab/device unread sync — server broadcasts when unread state changes
|
|
485
485
|
if ((data as any).type === "session:unread_changed") {
|
|
486
|
-
const { sessionId: sid, unreadCount, unreadType, projectName: pn } = data as any;
|
|
487
|
-
useNotificationStore.getState().handleUnreadChanged(sid, unreadCount, unreadType, pn);
|
|
486
|
+
const { sessionId: sid, unreadCount, unreadType, projectName: pn, sessionTitle: sTitle } = data as any;
|
|
487
|
+
useNotificationStore.getState().handleUnreadChanged(sid, unreadCount, unreadType, pn, sTitle);
|
|
488
488
|
return;
|
|
489
489
|
}
|
|
490
490
|
|
|
@@ -48,13 +48,13 @@ interface NotificationStore {
|
|
|
48
48
|
/** Hydrate from backend on app load */
|
|
49
49
|
loadFromServer: (projectName: string) => Promise<void>;
|
|
50
50
|
/** Handle WS broadcast for cross-tab/device sync */
|
|
51
|
-
handleUnreadChanged: (sessionId: string, unreadCount: number, unreadType: string | null, projectName: string) => void;
|
|
51
|
+
handleUnreadChanged: (sessionId: string, unreadCount: number, unreadType: string | null, projectName: string, sessionTitle?: string | null) => void;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
55
55
|
notifications: new Map(),
|
|
56
56
|
|
|
57
|
-
addNotification: (sessionId, type, projectName) => {
|
|
57
|
+
addNotification: (sessionId, type, projectName, sessionTitle) => {
|
|
58
58
|
set((state) => {
|
|
59
59
|
const next = new Map(state.notifications);
|
|
60
60
|
const existing = next.get(sessionId);
|
|
@@ -62,6 +62,7 @@ export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
|
62
62
|
count: (existing?.count ?? 0) + 1,
|
|
63
63
|
type,
|
|
64
64
|
projectName,
|
|
65
|
+
sessionTitle: sessionTitle ?? existing?.sessionTitle ?? null,
|
|
65
66
|
});
|
|
66
67
|
return { notifications: next };
|
|
67
68
|
});
|
|
@@ -87,14 +88,14 @@ export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
|
87
88
|
|
|
88
89
|
loadFromServer: async (projectName: string) => {
|
|
89
90
|
try {
|
|
90
|
-
const entries = await api.get<Array<{ sessionId: string; unreadCount: number; unreadType: string | null; projectName: string | null }>>(
|
|
91
|
+
const entries = await api.get<Array<{ sessionId: string; unreadCount: number; unreadType: string | null; projectName: string | null; sessionTitle: string | null }>>(
|
|
91
92
|
`/api/project/${encodeURIComponent(projectName)}/chat/sessions/unread`,
|
|
92
93
|
);
|
|
93
94
|
set(() => {
|
|
94
95
|
const next = new Map<string, NotificationEntry>();
|
|
95
96
|
for (const e of entries) {
|
|
96
97
|
if (e.unreadCount > 0) {
|
|
97
|
-
next.set(e.sessionId, { count: e.unreadCount, type: e.unreadType || "done", projectName: e.projectName || "" });
|
|
98
|
+
next.set(e.sessionId, { count: e.unreadCount, type: e.unreadType || "done", projectName: e.projectName || "", sessionTitle: e.sessionTitle ?? null });
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
return { notifications: next };
|
|
@@ -102,7 +103,7 @@ export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
|
102
103
|
} catch { /* server may not support yet — keep empty */ }
|
|
103
104
|
},
|
|
104
105
|
|
|
105
|
-
handleUnreadChanged: (sessionId, unreadCount, unreadType, projectName) => {
|
|
106
|
+
handleUnreadChanged: (sessionId, unreadCount, unreadType, projectName, sessionTitle) => {
|
|
106
107
|
set((state) => {
|
|
107
108
|
const next = new Map(state.notifications);
|
|
108
109
|
if (unreadCount === 0) {
|
|
@@ -114,6 +115,7 @@ export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
|
114
115
|
count: unreadCount > 0 ? unreadCount : (existing?.count ?? 0) + 1,
|
|
115
116
|
type: unreadType || "done",
|
|
116
117
|
projectName: projectName || existing?.projectName || "",
|
|
118
|
+
sessionTitle: sessionTitle ?? existing?.sessionTitle ?? null,
|
|
117
119
|
});
|
|
118
120
|
}
|
|
119
121
|
return { notifications: next };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-0Mxgxy0L.js";import"./api-client-DIhJ5qVW.js";import{A as e}from"./index-BQYpBWiY.js";export{e as useKeybindingsStore};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-0Mxgxy0L.js";import"./api-client-DIhJ5qVW.js";import{S as e}from"./index-BQYpBWiY.js";export{e as useNotificationStore};
|