@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.
Files changed (37) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/http-api.md +1 -1
  4. package/dist/web/assets/{audio-preview-D1q39d7o.js → audio-preview-B94jLQ3q.js} +1 -1
  5. package/dist/web/assets/{chat-tab-SPeGRQ1l.js → chat-tab-CFBKM7KW.js} +3 -3
  6. package/dist/web/assets/{code-editor-Rv7JNVL5.js → code-editor-BS0XqRfi.js} +2 -2
  7. package/dist/web/assets/{conflict-editor-CZmYhW86.js → conflict-editor-DlzK2R77.js} +1 -1
  8. package/dist/web/assets/{database-viewer-Bz3y9xbY.js → database-viewer-DmQAw9gy.js} +1 -1
  9. package/dist/web/assets/{diff-viewer-BF3L66s4.js → diff-viewer-Cfudk32z.js} +1 -1
  10. package/dist/web/assets/{extension-webview-BffuOp8j.js → extension-webview-CX3Zy9FA.js} +1 -1
  11. package/dist/web/assets/{glide-data-grid-Be7Jml-n.js → glide-data-grid-BjmqzL0W.js} +1 -1
  12. package/dist/web/assets/{image-preview-Bp9Ayr0-.js → image-preview-hoPsIJ4L.js} +1 -1
  13. package/dist/web/assets/{index-Cw6jgiet.js → index-93yAXX48.js} +4 -4
  14. package/dist/web/assets/keybindings-store-r2rFwr1z.js +1 -0
  15. package/dist/web/assets/{markdown-renderer-DeE4gOvO.js → markdown-renderer-V6x18VG4.js} +1 -1
  16. package/dist/web/assets/notification-store-DOKX9IVr.js +1 -0
  17. package/dist/web/assets/{pdf-preview-DqedEmhO.js → pdf-preview-C4ni1irv.js} +1 -1
  18. package/dist/web/assets/{port-forwarding-tab-y6HKCN2B.js → port-forwarding-tab-DBggtaS9.js} +1 -1
  19. package/dist/web/assets/{postgres-viewer-Z1bTnKzO.js → postgres-viewer-DlSR7XsZ.js} +1 -1
  20. package/dist/web/assets/{settings-tab-Clr5MoBF.js → settings-tab-8txgkjgq.js} +1 -1
  21. package/dist/web/assets/{sql-query-editor-NZ6bv_dH.js → sql-query-editor-DiiKO8Zh.js} +1 -1
  22. package/dist/web/assets/{sqlite-viewer-Ck7-sCfC.js → sqlite-viewer-ByWTg0gn.js} +1 -1
  23. package/dist/web/assets/tab-store-S9w6U5gm.js +1 -0
  24. package/dist/web/assets/{terminal-tab-wI_VBA9S.js → terminal-tab-B9f6A9kz.js} +1 -1
  25. package/dist/web/assets/{video-preview-CfjEMqOQ.js → video-preview-Dg7c9XAy.js} +1 -1
  26. package/dist/web/index.html +2 -2
  27. package/dist/web/sw.js +1 -1
  28. package/package.json +1 -1
  29. package/src/cli/commands/restart.ts +8 -3
  30. package/src/server/index.ts +15 -4
  31. package/src/services/supervisor-state.ts +1 -1
  32. package/src/services/supervisor.ts +9 -0
  33. package/src/web/stores/notification-store.ts +6 -1
  34. package/src/web/stores/panel-utils.ts +3 -2
  35. package/dist/web/assets/keybindings-store-DF7DKf8j.js +0 -1
  36. package/dist/web/assets/notification-store-CXi7Lwm6.js +0 -1
  37. package/dist/web/assets/tab-store-Dow2Ztto.js +0 -1
@@ -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
- process.kill(supervisorPid, "SIGUSR1");
287
+ signalSupervisor("SIGUSR1");
277
288
  await waitForNewSupervisor(statusFile, supervisorPid);
278
289
  } else {
279
290
  writeCmd("resume");
280
- process.kill(supervisorPid, "SIGUSR2");
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
- process.kill(supervisorPid, "SIGUSR1");
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
- process.kill(supervisorPid, "SIGUSR2");
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
- api.post(`/api/chat/sessions/${encodeURIComponent(sessionId)}/read`).catch(() => {});
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};