@hienlh/ppm 0.13.29 → 0.13.31
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 +11 -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-D1q39d7o.js → audio-preview-B94jLQ3q.js} +1 -1
- package/dist/web/assets/{chat-tab-SPeGRQ1l.js → chat-tab-CFBKM7KW.js} +3 -3
- package/dist/web/assets/{code-editor-Rv7JNVL5.js → code-editor-BS0XqRfi.js} +2 -2
- package/dist/web/assets/{conflict-editor-CZmYhW86.js → conflict-editor-DlzK2R77.js} +1 -1
- package/dist/web/assets/{database-viewer-Bz3y9xbY.js → database-viewer-DmQAw9gy.js} +1 -1
- package/dist/web/assets/{diff-viewer-BF3L66s4.js → diff-viewer-Cfudk32z.js} +1 -1
- package/dist/web/assets/{extension-webview-BffuOp8j.js → extension-webview-CX3Zy9FA.js} +1 -1
- package/dist/web/assets/{glide-data-grid-Be7Jml-n.js → glide-data-grid-BjmqzL0W.js} +1 -1
- package/dist/web/assets/{image-preview-Bp9Ayr0-.js → image-preview-hoPsIJ4L.js} +1 -1
- package/dist/web/assets/{index-Cw6jgiet.js → index-93yAXX48.js} +4 -4
- package/dist/web/assets/keybindings-store-r2rFwr1z.js +1 -0
- package/dist/web/assets/{markdown-renderer-DeE4gOvO.js → markdown-renderer-V6x18VG4.js} +1 -1
- package/dist/web/assets/notification-store-DOKX9IVr.js +1 -0
- package/dist/web/assets/{pdf-preview-DqedEmhO.js → pdf-preview-C4ni1irv.js} +1 -1
- package/dist/web/assets/{port-forwarding-tab-y6HKCN2B.js → port-forwarding-tab-DBggtaS9.js} +1 -1
- package/dist/web/assets/{postgres-viewer-Z1bTnKzO.js → postgres-viewer-DlSR7XsZ.js} +1 -1
- package/dist/web/assets/{settings-tab-Clr5MoBF.js → settings-tab-8txgkjgq.js} +1 -1
- package/dist/web/assets/{sql-query-editor-NZ6bv_dH.js → sql-query-editor-DiiKO8Zh.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-Ck7-sCfC.js → sqlite-viewer-ByWTg0gn.js} +1 -1
- package/dist/web/assets/tab-store-S9w6U5gm.js +1 -0
- package/dist/web/assets/{terminal-tab-wI_VBA9S.js → terminal-tab-B9f6A9kz.js} +1 -1
- package/dist/web/assets/{video-preview-CfjEMqOQ.js → video-preview-Dg7c9XAy.js} +1 -1
- package/dist/web/index.html +2 -2
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/cli/commands/restart.ts +8 -3
- package/src/server/index.ts +15 -4
- package/src/services/supervisor-state.ts +1 -1
- package/src/services/supervisor.ts +9 -0
- package/src/web/stores/notification-store.ts +6 -1
- package/src/web/stores/panel-utils.ts +3 -2
- package/dist/web/assets/keybindings-store-DF7DKf8j.js +0 -1
- package/dist/web/assets/notification-store-CXi7Lwm6.js +0 -1
- package/dist/web/assets/tab-store-Dow2Ztto.js +0 -1
package/src/server/index.ts
CHANGED
|
@@ -269,15 +269,26 @@ export async function startServer(options: {
|
|
|
269
269
|
const state = status.state as string;
|
|
270
270
|
const runningVersion = status.serverVersion as string;
|
|
271
271
|
|
|
272
|
+
// Helper: send signal (Unix) or write command file (Windows)
|
|
273
|
+
const signalSupervisor = (signal: "SIGUSR1" | "SIGUSR2", cmdAction?: string) => {
|
|
274
|
+
if (process.platform === "win32") {
|
|
275
|
+
const cmdFile = resolve(ppmDir, ".supervisor-cmd");
|
|
276
|
+
const action = cmdAction ?? (signal === "SIGUSR1" ? "upgrade" : "restart");
|
|
277
|
+
writeFileSync(cmdFile, JSON.stringify({ action }));
|
|
278
|
+
} else {
|
|
279
|
+
process.kill(supervisorPid, signal);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
|
|
272
283
|
if (state === "stopped") {
|
|
273
284
|
console.log(" Supervisor is alive (stopped state). Resuming server...");
|
|
274
285
|
if (runningVersion !== VERSION) {
|
|
275
286
|
console.log(` Upgrading: ${runningVersion} -> ${VERSION}`);
|
|
276
|
-
|
|
287
|
+
signalSupervisor("SIGUSR1");
|
|
277
288
|
await waitForNewSupervisor(statusFile, supervisorPid);
|
|
278
289
|
} else {
|
|
279
290
|
writeCmd("resume");
|
|
280
|
-
|
|
291
|
+
signalSupervisor("SIGUSR2", "resume");
|
|
281
292
|
await waitForServerReady(statusFile, port);
|
|
282
293
|
}
|
|
283
294
|
return;
|
|
@@ -286,7 +297,7 @@ export async function startServer(options: {
|
|
|
286
297
|
if (state === "running") {
|
|
287
298
|
if (runningVersion !== VERSION) {
|
|
288
299
|
console.log(` Supervisor running (v${runningVersion}). Upgrading to v${VERSION}...`);
|
|
289
|
-
|
|
300
|
+
signalSupervisor("SIGUSR1");
|
|
290
301
|
await waitForNewSupervisor(statusFile, supervisorPid);
|
|
291
302
|
} else {
|
|
292
303
|
console.log(`\n PPM is already running (PID: ${supervisorPid}).`);
|
|
@@ -299,7 +310,7 @@ export async function startServer(options: {
|
|
|
299
310
|
if (state === "paused") {
|
|
300
311
|
console.log(" Supervisor is paused (max restarts). Sending resume...");
|
|
301
312
|
writeCmd("resume");
|
|
302
|
-
|
|
313
|
+
signalSupervisor("SIGUSR2", "resume");
|
|
303
314
|
await waitForServerReady(statusFile, port);
|
|
304
315
|
return;
|
|
305
316
|
}
|
|
@@ -71,7 +71,7 @@ export function writeStatus(data: Record<string, unknown>) {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
// ─── Command file protocol ─────────────────────────────────────────────
|
|
74
|
-
export type CmdAction = "soft_stop" | "resume";
|
|
74
|
+
export type CmdAction = "soft_stop" | "resume" | "restart";
|
|
75
75
|
|
|
76
76
|
/** Atomically claim + read command file (rename to .claimed, read, delete) */
|
|
77
77
|
export function readAndDeleteCmd(): { action: CmdAction } | null {
|
|
@@ -985,6 +985,15 @@ export async function runSupervisor(opts: {
|
|
|
985
985
|
else if (cmd.action === "resume") {
|
|
986
986
|
if (getState() === "stopped" || getState() === "paused") triggerResume();
|
|
987
987
|
}
|
|
988
|
+
else if (cmd.action === "restart") {
|
|
989
|
+
log("INFO", "Windows command: restart server only");
|
|
990
|
+
if (getState() === "paused" || getState() === "stopped") {
|
|
991
|
+
triggerResume();
|
|
992
|
+
} else if (serverChild) {
|
|
993
|
+
serverRestartRequested = true;
|
|
994
|
+
try { serverChild.kill(); } catch {}
|
|
995
|
+
}
|
|
996
|
+
}
|
|
988
997
|
else if (cmd.action === "upgrade") {
|
|
989
998
|
log("INFO", "Windows command: upgrade, starting self-replace");
|
|
990
999
|
selfReplace().then((result) => {
|
|
@@ -67,6 +67,9 @@ export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
|
67
67
|
},
|
|
68
68
|
|
|
69
69
|
clearForSession: (sessionId) => {
|
|
70
|
+
// Grab projectName before deleting the entry
|
|
71
|
+
const entry = useNotificationStore.getState().notifications.get(sessionId);
|
|
72
|
+
const projectName = entry?.projectName;
|
|
70
73
|
set((state) => {
|
|
71
74
|
if (!state.notifications.has(sessionId)) return state;
|
|
72
75
|
const next = new Map(state.notifications);
|
|
@@ -74,7 +77,9 @@ export const useNotificationStore = create<NotificationStore>()((set) => ({
|
|
|
74
77
|
return { notifications: next };
|
|
75
78
|
});
|
|
76
79
|
// Fire-and-forget: persist to server so other tabs/devices sync
|
|
77
|
-
|
|
80
|
+
if (projectName) {
|
|
81
|
+
api.post(`/api/project/${encodeURIComponent(projectName)}/chat/sessions/${encodeURIComponent(sessionId)}/read`).catch(() => {});
|
|
82
|
+
}
|
|
78
83
|
},
|
|
79
84
|
|
|
80
85
|
clearAll: () => set({ notifications: new Map() }),
|
|
@@ -157,8 +157,8 @@ export function savePanelLayout(projectName: string, layout: PanelLayout): void
|
|
|
157
157
|
try {
|
|
158
158
|
const withTimestamp = { ...layout, updatedAt: new Date().toISOString() };
|
|
159
159
|
localStorage.setItem(storageKey(projectName), JSON.stringify(withTimestamp));
|
|
160
|
-
// Debounced server sync
|
|
161
|
-
syncWorkspaceToServer(projectName, layout);
|
|
160
|
+
// Debounced server sync — skip virtual __global__ project (not a real server project)
|
|
161
|
+
if (projectName !== "__global__") syncWorkspaceToServer(projectName, layout);
|
|
162
162
|
} catch { /* ignore */ }
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -187,6 +187,7 @@ export interface PanelLayoutWithTimestamp extends PanelLayout {
|
|
|
187
187
|
export async function fetchWorkspaceFromServer(
|
|
188
188
|
projectName: string,
|
|
189
189
|
): Promise<PanelLayoutWithTimestamp | null> {
|
|
190
|
+
if (projectName === "__global__") return null;
|
|
190
191
|
try {
|
|
191
192
|
const headers: Record<string, string> = {};
|
|
192
193
|
const token = localStorage.getItem("ppm-auth-token");
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-0Mxgxy0L.js";import"./api-client-DIhJ5qVW.js";import{A as e}from"./index-Cw6jgiet.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-Cw6jgiet.js";export{e as useNotificationStore};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./react-DMIOAtcX.js";import{r as t}from"./utils-CQux7CsO.js";function n(){return`panel-${t()}`}function r(e=[],t=null){return{id:n(),tabs:e,activeTabId:t,tabHistory:t?[t]:[]}}function i(e){return e?1:3}function a(e,t){return e.map(e=>e.filter(e=>e!==t)).filter(e=>e.length>0)}function o(e,t){for(let n=0;n<e.length;n++){let r=e[n].indexOf(t);if(r!==-1)return{row:n,col:r}}return null}function s(e){let t=0;for(let n of Object.values(e))for(let e of n.tabs){let n=e.id.match(/^editor:untitled-(\d+)$/);n&&(t=Math.max(t,Number(n[1])))}return t+1}function c(e,n){switch(e){case`editor`:return n?.viewerKey?`editor:viewer:${n.viewerKey}`:n?.isUntitled?`editor:untitled-${n.untitledNumber??1}`:`editor:${n?.filePath??`untitled`}`;case`chat`:return`chat:${n?.providerId??`default`}/${n?.sessionId??t()}`;case`terminal`:return`terminal:${n?.terminalIndex??1}`;case`database`:return`database:${n?.connectionId??`default`}:${n?.tableName??``}`;case`sqlite`:return`sqlite:${n?.filePath??`default`}`;case`postgres`:return`postgres:${n?.connectionId??`default`}:${n?.tableName??``}`;case`extension`:return`extension:${String(n?.viewType??`unknown`).replace(/\.view$/,``)}`;case`git-diff`:return`git-diff:${n?.filePath??`unknown`}`;case`conflict-editor`:return`conflict-editor:${n?.filePath??`unknown`}`;case`settings`:return`settings`;case`ports`:return`ports`;default:return`${e}:${t()}`}}function l(e){let t={...e,panels:{...e.panels}};for(let[e,n]of Object.entries(t.panels)){let r=n.tabs.map(e=>{if(e.id.startsWith(`tab-`)){let t=c(e.type,e.metadata);return{...e,id:t}}return e}),i=new Map;n.tabs.forEach((e,t)=>{e.id!==r[t].id&&i.set(e.id,r[t].id)});let a=i.get(n.activeTabId??``)??n.activeTabId,o=n.tabHistory.map(e=>i.get(e)??e);t.panels[e]={...n,tabs:r,activeTabId:a,tabHistory:o}}return t}var u=`ppm-panels-`,d=`ppm-tabs-`;function f(e){return`${u}${e}`}function p(e,t){try{let n={...t,updatedAt:new Date().toISOString()};localStorage.setItem(f(e),JSON.stringify(n)),_(e,t)}catch{}}function m(e){try{let t=localStorage.getItem(f(e));if(t)return l(JSON.parse(t))}catch{}return y(e)}async function h(e){try{let t={},n=localStorage.getItem(`ppm-auth-token`);n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{headers:t});if(!r.ok)return null;let i=await r.json();return!i.ok||!i.data?null:{...i.data.layout,updatedAt:i.data.updatedAt}}catch{return null}}var g=new Map;function _(e,t){let n=g.get(e);n&&clearTimeout(n),g.set(e,setTimeout(async()=>{g.delete(e);try{let n={"Content-Type":`application/json`},r=localStorage.getItem(`ppm-auth-token`);r&&(n.Authorization=`Bearer ${r}`);let i=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{method:`PUT`,headers:n,body:JSON.stringify({layout:t})});if(i.ok){let t=await i.json();if(t.data?.updatedAt){let n=`${u}${e}`,r=localStorage.getItem(n);if(r){let e=JSON.parse(r);e.updatedAt=t.data.updatedAt,localStorage.setItem(n,JSON.stringify(e))}}}}catch{}},1500))}function v(e,t){if(!e&&!t)return null;if(!e)return t;if(!t)return e;let n=new Date(e.updatedAt).getTime();return new Date(t.updatedAt).getTime()>=n?t:e}function y(e){try{let t=localStorage.getItem(`${d}${e}`);if(!t)return null;let n=JSON.parse(t);if(!n.tabs?.length)return null;let i=r(n.tabs,n.activeTabId),a={panels:{[i.id]:i},grid:[[i.id]],focusedPanelId:i.id};return p(e,a),localStorage.removeItem(`${d}${e}`),a}catch{return null}}var b=new Set([`settings`]),x=new Set([`projects`,`git-status`,`git-graph`]);function S(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function C(){let e=r();return{panels:{[e.id]:e},grid:[[e.id]],focusedPanelId:e.id}}var w=e()((e,t)=>{function n(){let{currentProject:e,panels:n,grid:r,focusedPanelId:i}=t();if(!e)return;let a=new Set(r.flat()),o={};for(let[e,t]of Object.entries(n))a.has(e)&&(o[e]=t);p(e,{panels:o,grid:r,focusedPanelId:i})}function s(e){return Object.values(t().panels).find(t=>t.tabs.some(t=>t.id===e))}function l(e){return e??t().focusedPanelId}return{...C(),currentProject:null,projectGrids:{},projectFocused:{},switchProject:n=>{let{currentProject:i,panels:a,grid:o,focusedPanelId:s,projectGrids:c,projectFocused:l}=t();if(i===n)return;let u={...c},d={...l};if(i){u[i]=o,d[i]=s;let e=new Set(o.flat()),t={};for(let[n,r]of Object.entries(a))e.has(n)&&(t[n]=r);p(i,{panels:t,grid:o,focusedPanelId:s})}if(u[n]){let t=u[n];e({currentProject:n,grid:t,focusedPanelId:d[n]??t[0]?.[0]??``,projectGrids:u,projectFocused:d});return}let f=m(n);if(f&&Object.keys(f.panels).length>0){let t={};for(let[e,n]of Object.entries(f.panels)){let r=n.tabs.filter(e=>!x.has(e.type)),i=n.tabHistory.filter(e=>r.some(t=>t.id===e)),a=n.activeTabId&&r.some(e=>e.id===n.activeTabId)?n.activeTabId:i[i.length-1]??r[0]?.id??null;t[e]={...n,tabs:r,tabHistory:i,activeTabId:a}}let r={...a,...t};u[n]=f.grid,d[n]=f.focusedPanelId,e({currentProject:n,panels:r,grid:f.grid,focusedPanelId:f.focusedPanelId,projectGrids:u,projectFocused:d})}else{let t=r(),i=[[t.id]],o={...a,[t.id]:t};u[n]=i,d[n]=t.id,p(n,{panels:{[t.id]:t},grid:i,focusedPanelId:t.id}),e({currentProject:n,panels:o,grid:i,focusedPanelId:t.id,projectGrids:u,projectFocused:d})}},reloadProject:n=>{let{projectGrids:r,projectFocused:i,panels:a}=t(),o={...r},s={...i};delete o[n],delete s[n];let c=r[n],l=c?new Set(c.flat()):new Set,u={...a};for(let e of l)delete u[e];e({projectGrids:o,projectFocused:s,panels:u,currentProject:null}),t().switchProject(n)},setFocusedPanel:n=>{t().panels[n]&&e({focusedPanelId:n})},openTab:(r,i)=>{let a=t().isMobile(),o=a?t().grid[0]?.[0]??l(i):l(i);if(!t().panels[o])return``;if(r.type===`terminal`&&!r.metadata?.terminalIndex){let e=Object.values(t().panels).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),n=e.length>0?Math.max(...e)+1:1;r={...r,metadata:{...r.metadata,terminalIndex:n}}}let s=c(r.type,r.metadata);if(b.has(r.type))for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>e.id===s);if(t)return e(e=>({focusedPanelId:r.id,panels:{...e.panels,[r.id]:{...r,activeTabId:t.id,tabHistory:S(r.tabHistory,t.id)}}})),n(),t.id}if(a)for(let r of t().grid.flat()){let i=t().panels[r];if(!i)continue;let a=i.tabs.find(e=>e.id===s||e.id.startsWith(`${s}@`));if(a)return e(e=>({focusedPanelId:i.id,panels:{...e.panels,[i.id]:{...i,activeTabId:a.id,tabHistory:S(i.tabHistory,a.id)}}})),n(),a.id}let u=t().panels[o],d=u.tabs.find(e=>e.id===s);if(d)return e(e=>({panels:{...e.panels,[o]:{...u,activeTabId:d.id,tabHistory:S(u.tabHistory,d.id)}}})),n(),d.id;let f=Object.values(t().panels).some(e=>e.id!==o&&e.tabs.some(e=>e.id===s))?`${s}@${o}`:s,p={...r,id:f};return e(e=>{let t=e.panels[o];return{focusedPanelId:o,panels:{...e.panels,[o]:{...t,tabs:[...t.tabs,p],activeTabId:f,tabHistory:S(t.tabHistory,f)}}}}),n(),f},closeTab:(r,i)=>{let o=i?t().panels[i]:s(r);if(!o)return;let c=o.id;e(e=>{let t=e.panels[c],n=t.tabs.filter(e=>e.id!==r),i=t.tabHistory.filter(e=>e!==r),o=t.activeTabId;if(t.activeTabId===r){let e=i.length>0?i[i.length-1]:null;o=e&&n.some(t=>t.id===e)?e:n[n.length-1]?.id??null}let s=e.grid.flat().length;if(n.length===0&&s>1){let{[c]:t,...n}=e.panels;return{panels:n,grid:a(e.grid,c),focusedPanelId:e.focusedPanelId===c?Object.keys(n)[0]:e.focusedPanelId}}return{panels:{...e.panels,[c]:{...t,tabs:n,activeTabId:o,tabHistory:i}}}}),n()},setActiveTab:(r,i)=>{let a=i?t().panels[i]:s(r);if(!a)return;let o=a.id;e(e=>{let t=e.panels[o];return{focusedPanelId:o,panels:{...e.panels,[o]:{...t,activeTabId:r,tabHistory:S(t.tabHistory,r)}}}}),n()},updateTab:(t,r)=>{let i=s(t);i&&(e(e=>({panels:{...e.panels,[i.id]:{...i,tabs:i.tabs.map(e=>e.id===t?{...e,...r}:e)}}})),n())},reorderTab:(r,i,a)=>{let o=t().panels[i];if(!o)return;let s=o.tabs.findIndex(e=>e.id===r);if(s===-1||s===a)return;let c=[...o.tabs],[l]=c.splice(s,1);c.splice(a,0,l),e(e=>({panels:{...e.panels,[i]:{...o,tabs:c}}})),n()},moveTab:(r,i,o,s)=>{if(i===o)return;let c=t().panels[i],l=t().panels[o];if(!c||!l)return;let u=c.tabs.find(e=>e.id===r);if(!u)return;let d=c.tabs.filter(e=>e.id!==r),f=c.tabHistory.filter(e=>e!==r),p=c.activeTabId===r?f[f.length-1]??d[d.length-1]?.id??null:c.activeTabId,m=[...l.tabs];s===void 0?m.push(u):m.splice(s,0,u),e(e=>{let t=e.grid.flat().length;if(d.length===0&&t>1){let{[i]:t,...n}=e.panels;return{panels:{...n,[o]:{...l,tabs:m,activeTabId:r,tabHistory:S(l.tabHistory,r)}},grid:a(e.grid,i),focusedPanelId:o}}return{focusedPanelId:o,panels:{...e.panels,[i]:{...c,tabs:d,activeTabId:p,tabHistory:f},[o]:{...l,tabs:m,activeTabId:r,tabHistory:S(l.tabHistory,r)}}}}),n()},splitPanel:(s,c,l,u)=>{let{grid:d,panels:f}=t(),p=t().isMobile(),m=f[l];if(!m)return!1;let h=m.tabs.find(e=>e.id===c);if(!h)return!1;let g=o(d,u??l);if(!g)return!1;let _=s===`left`||s===`right`,v=s===`up`||s===`down`;if(_&&(d[g.row]?.length??0)>=i(p)||v&&d.length>=3)return!1;let y=r([h],h.id);y.tabHistory=[h.id];let b=m.tabs.filter(e=>e.id!==c),x=m.tabHistory.filter(e=>e!==c),S=m.activeTabId===c?x[x.length-1]??b[b.length-1]?.id??null:m.activeTabId,C;if(_)C=d.map((e,t)=>{if(t!==g.row)return e;let n=[...e],r=s===`right`?g.col+1:g.col;return n.splice(r,0,y.id),n});else{C=[...d];let e=s===`down`?g.row+1:g.row;C.splice(e,0,[y.id])}return e(e=>{let t=e.grid.flat().length,n={...e.panels,[y.id]:y};if(b.length===0&&t>1){let{[l]:e,...t}=n;n=t,C=a(C,l)}else n[l]={...m,tabs:b,activeTabId:S,tabHistory:x};return{panels:n,grid:C,focusedPanelId:y.id}}),n(),!0},closePanel:r=>{let{panels:i,grid:s}=t();if(s.flat().length<=1)return;let c=i[r];if(!c)return;o(s,r);let l=s.flat(),u=l.indexOf(r),d=u>0?l[u-1]:l[1],f=i[d];f&&(e(e=>{let{[r]:t,...n}=e.panels,i=[...f.tabs,...c.tabs],o=f.activeTabId??c.activeTabId;return{panels:{...n,[d]:{...f,tabs:i,activeTabId:o,tabHistory:[...f.tabHistory,...c.tabHistory]}},grid:a(e.grid,r),focusedPanelId:d}}),n())},getPanelForTab:e=>s(e),isMobile:()=>typeof window<`u`&&window.innerWidth<768}}),T=e()(()=>({tabs:[],activeTabId:null,tabHistory:[],currentProject:null,switchProject:e=>{w.getState().switchProject(e),E()},openTab:e=>{let t=w.getState().openTab(e);return E(),t},closeTab:e=>{w.getState().closeTab(e),E()},setActiveTab:e=>{w.getState().setActiveTab(e),E()},updateTab:(e,t)=>{w.getState().updateTab(e,t),E()},openNewFile:()=>{let e=w.getState(),t=s(e.panels),n=e.openTab({type:`editor`,title:`Untitled-${t}`,projectId:null,metadata:{isUntitled:!0,untitledNumber:t},closable:!0});return E(),n}}));function E(){let e=w.getState(),t=e.panels[e.focusedPanelId];T.setState({tabs:t?.tabs??[],activeTabId:t?.activeTabId??null,tabHistory:t?.tabHistory??[],currentProject:e.currentProject})}w.subscribe(()=>E());export{o as a,h as i,w as n,i as o,r,v as s,T as t};
|