@hienlh/ppm 0.12.10 → 0.12.12

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 (96) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/bun.lock +2062 -0
  3. package/bunfig.toml +2 -0
  4. package/dist/web/assets/ai-settings-section-NNWp6nw7.js +1 -0
  5. package/dist/web/assets/{api-settings-DAk7D-NP.js → api-settings-C3T95dWg.js} +1 -1
  6. package/dist/web/assets/architecture-PBZL5I3N-DDuzYaUV.js +1 -0
  7. package/dist/web/assets/{audio-preview-DnQmf9fu.js → audio-preview-BkbgGtDH.js} +1 -1
  8. package/dist/web/assets/chat-tab-BZlP1qjX.js +12 -0
  9. package/dist/web/assets/chevron-up-BWBvMZkp.js +1 -0
  10. package/dist/web/assets/{code-editor-B-lU1fz3.js → code-editor-BtspASkW.js} +4 -4
  11. package/dist/web/assets/{conflict-editor-BYzf3LuW.js → conflict-editor-Dgsu6fmj.js} +1 -1
  12. package/dist/web/assets/{csv-preview-HMSavgBb.js → csv-preview-DcWCjQkZ.js} +1 -1
  13. package/dist/web/assets/{database-viewer-DjvnIn8p.js → database-viewer-C85RxdMV.js} +2 -2
  14. package/dist/web/assets/diff-viewer-2pPy97Tl.js +4 -0
  15. package/dist/web/assets/{esm-K1XIK4vc.js → esm-_CLpyLJ_.js} +1 -1
  16. package/dist/web/assets/{extension-store-3yZYn07W.js → extension-store-BZDZ9QRc.js} +1 -1
  17. package/dist/web/assets/{extension-webview-4xMREn_x.js → extension-webview-U1lMYZ0p.js} +1 -1
  18. package/dist/web/assets/{file-store-BrbCNyLm.js → file-store-4BpOJthN.js} +1 -1
  19. package/dist/web/assets/gitGraph-HDMCJU4V-BURAevTc.js +1 -0
  20. package/dist/web/assets/{image-preview-CkS2PVdQ.js → image-preview-BcT1SbY2.js} +1 -1
  21. package/dist/web/assets/index-BWSRKVZn.js +23 -0
  22. package/dist/web/assets/index-b6tIZImC.css +2 -0
  23. package/dist/web/assets/info-3K5VOQVL-tSD4Fpi3.js +1 -0
  24. package/dist/web/assets/{input-Dk49gO8E.js → input-2eDVjcRZ.js} +1 -1
  25. package/dist/web/assets/{keybindings-store-B-zET-0o.js → keybindings-store-BOG1yviy.js} +1 -1
  26. package/dist/web/assets/keybindings-store-BvdUoEC7.js +1 -0
  27. package/dist/web/assets/{markdown-renderer-Bj2B05Km.js → markdown-renderer-Dbam_-04.js} +3 -3
  28. package/dist/web/assets/packet-RMMSAZCW-DmDLZUrV.js +1 -0
  29. package/dist/web/assets/{pdf-preview-CCyw5cuH.js → pdf-preview-BmHVGx32.js} +1 -1
  30. package/dist/web/assets/pie-UPGHQEXC-w03Pc9ZR.js +1 -0
  31. package/dist/web/assets/{port-forwarding-tab-Cebb5Eix.js → port-forwarding-tab-Dkq1upWC.js} +1 -1
  32. package/dist/web/assets/{postgres-viewer-BrOiliEv.js → postgres-viewer-BgBJAJ9q.js} +3 -3
  33. package/dist/web/assets/pre-compact-button-Dp7Hs49L.js +1 -0
  34. package/dist/web/assets/pre-compact-section-DnM5fGSR.js +1 -0
  35. package/dist/web/assets/radar-KQ55EAFF-C9XQvoey.js +1 -0
  36. package/dist/web/assets/{scroll-area-BEllam7_.js → scroll-area-CdxNNnN-.js} +1 -1
  37. package/dist/web/assets/{settings-store-BLLR7ed8.js → settings-store-CMAssqyb.js} +2 -2
  38. package/dist/web/assets/settings-tab-zYWKTq5z.js +1 -0
  39. package/dist/web/assets/{sql-query-editor-CVAnRFbi.js → sql-query-editor-b7zJ8XPp.js} +1 -1
  40. package/dist/web/assets/{sqlite-viewer-OEVq_-Po.js → sqlite-viewer-4lLAz1es.js} +1 -1
  41. package/dist/web/assets/{tab-store-B3M9hjho.js → tab-store-DNBsLdPn.js} +1 -1
  42. package/dist/web/assets/{terminal-tab-MjmJaQyA.js → terminal-tab-BtnqkN1H.js} +1 -1
  43. package/dist/web/assets/treemap-KZPCXAKY-lmftxSky.js +1 -0
  44. package/dist/web/assets/{use-blob-url-e9uTXjv5.js → use-blob-url-QX-XajU8.js} +1 -1
  45. package/dist/web/assets/{use-monaco-theme-BkZDwoVd.js → use-monaco-theme-D68oX3XU.js} +1 -1
  46. package/dist/web/assets/{vendor-mermaid-Dx86tuVP.js → vendor-mermaid-sQS4C_iL.js} +2 -2
  47. package/dist/web/assets/{video-preview-B819qvlp.js → video-preview-CkOKvVLt.js} +1 -1
  48. package/dist/web/index.html +18 -18
  49. package/dist/web/sw.js +1 -1
  50. package/package.json +1 -1
  51. package/src/cli/commands/autostart.ts +1 -3
  52. package/src/cli/commands/init.ts +5 -8
  53. package/src/cli/commands/restart.ts +4 -5
  54. package/src/index.ts +0 -5
  55. package/src/providers/claude-agent-sdk.ts +1 -135
  56. package/src/server/index.ts +9 -13
  57. package/src/server/routes/chat.ts +18 -0
  58. package/src/server/routes/git.ts +16 -0
  59. package/src/services/autostart-generator.ts +1 -6
  60. package/src/services/config.service.ts +3 -96
  61. package/src/services/git.service.ts +34 -0
  62. package/src/services/jsonl-transcript-parser.ts +216 -0
  63. package/src/services/ppmbot/cli-reference-default.ts +1 -4
  64. package/src/services/supervisor.ts +5 -6
  65. package/src/web/components/chat/message-list.tsx +41 -2
  66. package/src/web/components/chat/pre-compact-button.tsx +50 -0
  67. package/src/web/components/chat/pre-compact-section.tsx +69 -0
  68. package/src/web/components/editor/diff-viewer.tsx +21 -5
  69. package/dist/web/assets/ai-settings-section-QE6nBNgN.js +0 -1
  70. package/dist/web/assets/architecture-PBZL5I3N-DvZbltvY.js +0 -1
  71. package/dist/web/assets/chat-tab-Cf6T3mGO.js +0 -12
  72. package/dist/web/assets/diff-viewer-CP2jcR5J.js +0 -4
  73. package/dist/web/assets/gitGraph-HDMCJU4V-BxhdxFgj.js +0 -1
  74. package/dist/web/assets/index-BTjuH4fn.css +0 -2
  75. package/dist/web/assets/index-FGlF8IWZ.js +0 -23
  76. package/dist/web/assets/info-3K5VOQVL-BwAZ2zd8.js +0 -1
  77. package/dist/web/assets/keybindings-store-DaBV6qhz.js +0 -1
  78. package/dist/web/assets/packet-RMMSAZCW-tx2n5Qry.js +0 -1
  79. package/dist/web/assets/pie-UPGHQEXC-D6S2MqVT.js +0 -1
  80. package/dist/web/assets/plus-51UQ45rf.js +0 -1
  81. package/dist/web/assets/radar-KQ55EAFF-BviZcL-b.js +0 -1
  82. package/dist/web/assets/settings-tab-D0XjupJm.js +0 -1
  83. package/dist/web/assets/treemap-KZPCXAKY-CM54VdaB.js +0 -1
  84. /package/dist/web/assets/{api-client-Dvzcc_EO.js → api-client-DIhJ5qVW.js} +0 -0
  85. /package/dist/web/assets/{csv-parser--2WJNgS7.js → csv-parser-B5QW8pZ6.js} +0 -0
  86. /package/dist/web/assets/{dist-im4ynINo.js → dist-GtkSekuX.js} +0 -0
  87. /package/dist/web/assets/{katex-CKoArbIw.js → katex-C3cZrCvP.js} +0 -0
  88. /package/dist/web/assets/{lib-DQHnkzGy.js → lib-Bu71-TFS.js} +0 -0
  89. /package/dist/web/assets/{react-GqWghJ-L.js → react-DMIOAtcX.js} +0 -0
  90. /package/dist/web/assets/{refresh-cw-LlbZDJpO.js → refresh-cw-BjrAbUJe.js} +0 -0
  91. /package/dist/web/assets/{sql-completion-provider-C3cq9j99.js → sql-completion-provider-CULTsCqR.js} +0 -0
  92. /package/dist/web/assets/{table-Dq575bPF.js → table-tf7pRkME.js} +0 -0
  93. /package/dist/web/assets/{text-wrap-Cn6BNQfq.js → text-wrap-BV-R4Vvy.js} +0 -0
  94. /package/dist/web/assets/{trash-2-CJYoLw7Q.js → trash-2-DjQOpgUV.js} +0 -0
  95. /package/dist/web/assets/{utils-CTg5uAYR.js → utils-CQux7CsO.js} +0 -0
  96. /package/dist/web/assets/{vendor-xterm-CU2c3f0A.js → vendor-xterm-K3_Xwigj.js} +0 -0
@@ -1 +1 @@
1
- import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-BwzaQ50n.js";import"./api-client-Dvzcc_EO.js";import{I as n}from"./index-FGlF8IWZ.js";import{t as r}from"./use-blob-url-e9uTXjv5.js";var i=e();function a({filePath:e,projectName:a}){let{blobUrl:o,error:s}=r(e,a);return s?(0,i.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,i.jsx)(t,{className:`size-10 text-text-subtle`}),(0,i.jsx)(`p`,{className:`text-sm`,children:`Failed to load video.`})]}):o?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full p-4 bg-surface overflow-auto`,children:(0,i.jsx)(`video`,{src:o,controls:!0,className:`max-w-full max-h-full`})}):(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,i.jsx)(n,{className:`size-5 animate-spin text-text-subtle`})})}export{a as VideoPreview};
1
+ import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-BwzaQ50n.js";import"./api-client-DIhJ5qVW.js";import{L as n}from"./index-BWSRKVZn.js";import{t as r}from"./use-blob-url-QX-XajU8.js";var i=e();function a({filePath:e,projectName:a}){let{blobUrl:o,error:s}=r(e,a);return s?(0,i.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,i.jsx)(t,{className:`size-10 text-text-subtle`}),(0,i.jsx)(`p`,{className:`text-sm`,children:`Failed to load video.`})]}):o?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full p-4 bg-surface overflow-auto`,children:(0,i.jsx)(`video`,{src:o,controls:!0,className:`max-w-full max-h-full`})}):(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,i.jsx)(n,{className:`size-5 animate-spin text-text-subtle`})})}export{a as VideoPreview};
@@ -39,32 +39,32 @@
39
39
  <link rel="preconnect" href="https://fonts.googleapis.com" />
40
40
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
41
41
  <link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600;700&family=Geist:wght@400;500;600;700&display=swap" rel="stylesheet" />
42
- <script type="module" crossorigin src="/assets/index-FGlF8IWZ.js"></script>
42
+ <script type="module" crossorigin src="/assets/index-BWSRKVZn.js"></script>
43
43
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-FhOqtrmT.js">
44
- <link rel="modulepreload" crossorigin href="/assets/vendor-mermaid-Dx86tuVP.js">
44
+ <link rel="modulepreload" crossorigin href="/assets/vendor-mermaid-sQS4C_iL.js">
45
45
  <link rel="modulepreload" crossorigin href="/assets/vendor-markdown-0Mxgxy0L.js">
46
46
  <link rel="modulepreload" crossorigin href="/assets/vendor-ui-B-89Uj8i.js">
47
- <link rel="modulepreload" crossorigin href="/assets/utils-CTg5uAYR.js">
47
+ <link rel="modulepreload" crossorigin href="/assets/utils-CQux7CsO.js">
48
48
  <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-BjHrJDVb.js">
49
49
  <link rel="modulepreload" crossorigin href="/assets/x-DlFGzN8d.js">
50
- <link rel="modulepreload" crossorigin href="/assets/input-Dk49gO8E.js">
51
- <link rel="modulepreload" crossorigin href="/assets/react-GqWghJ-L.js">
52
- <link rel="modulepreload" crossorigin href="/assets/api-client-Dvzcc_EO.js">
53
- <link rel="modulepreload" crossorigin href="/assets/settings-store-BLLR7ed8.js">
54
- <link rel="modulepreload" crossorigin href="/assets/scroll-area-BEllam7_.js">
50
+ <link rel="modulepreload" crossorigin href="/assets/input-2eDVjcRZ.js">
51
+ <link rel="modulepreload" crossorigin href="/assets/react-DMIOAtcX.js">
52
+ <link rel="modulepreload" crossorigin href="/assets/api-client-DIhJ5qVW.js">
53
+ <link rel="modulepreload" crossorigin href="/assets/settings-store-CMAssqyb.js">
54
+ <link rel="modulepreload" crossorigin href="/assets/scroll-area-CdxNNnN-.js">
55
55
  <link rel="modulepreload" crossorigin href="/assets/dist-D7KGU7Vl.js">
56
- <link rel="modulepreload" crossorigin href="/assets/plus-51UQ45rf.js">
57
- <link rel="modulepreload" crossorigin href="/assets/refresh-cw-LlbZDJpO.js">
58
- <link rel="modulepreload" crossorigin href="/assets/trash-2-CJYoLw7Q.js">
59
- <link rel="modulepreload" crossorigin href="/assets/api-settings-DAk7D-NP.js">
60
- <link rel="modulepreload" crossorigin href="/assets/ai-settings-section-QE6nBNgN.js">
56
+ <link rel="modulepreload" crossorigin href="/assets/chevron-up-BWBvMZkp.js">
57
+ <link rel="modulepreload" crossorigin href="/assets/refresh-cw-BjrAbUJe.js">
58
+ <link rel="modulepreload" crossorigin href="/assets/trash-2-DjQOpgUV.js">
59
+ <link rel="modulepreload" crossorigin href="/assets/api-settings-C3T95dWg.js">
60
+ <link rel="modulepreload" crossorigin href="/assets/ai-settings-section-NNWp6nw7.js">
61
61
  <link rel="modulepreload" crossorigin href="/assets/chevron-right-BzAdxJRG.js">
62
62
  <link rel="modulepreload" crossorigin href="/assets/database-D4DIhgi-.js">
63
- <link rel="modulepreload" crossorigin href="/assets/extension-store-3yZYn07W.js">
64
- <link rel="modulepreload" crossorigin href="/assets/file-store-BrbCNyLm.js">
65
- <link rel="modulepreload" crossorigin href="/assets/keybindings-store-B-zET-0o.js">
66
- <link rel="modulepreload" crossorigin href="/assets/tab-store-B3M9hjho.js">
67
- <link rel="stylesheet" crossorigin href="/assets/index-BTjuH4fn.css">
63
+ <link rel="modulepreload" crossorigin href="/assets/extension-store-BZDZ9QRc.js">
64
+ <link rel="modulepreload" crossorigin href="/assets/file-store-4BpOJthN.js">
65
+ <link rel="modulepreload" crossorigin href="/assets/keybindings-store-BOG1yviy.js">
66
+ <link rel="modulepreload" crossorigin href="/assets/tab-store-DNBsLdPn.js">
67
+ <link rel="stylesheet" crossorigin href="/assets/index-b6tIZImC.css">
68
68
  <link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
69
69
  <body class="bg-[#0f1419] text-[#e5e7eb] font-sans antialiased">
70
70
  <div id="root"></div>
package/dist/web/sw.js CHANGED
@@ -1 +1 @@
1
- try{self[`workbox:core:7.3.0`]&&_()}catch{}var e=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n},t=class extends Error{constructor(t,n){let r=e(t,n);super(r),this.name=t,this.details=n}},n={googleAnalytics:`googleAnalytics`,precache:`precache-v2`,prefix:`workbox`,runtime:`runtime`,suffix:typeof registration<`u`?registration.scope:``},r=e=>[n.prefix,e,n.suffix].filter(e=>e&&e.length>0).join(`-`),i=e=>{for(let t of Object.keys(n))e(t)},a={updateDetails:e=>{i(t=>{typeof e[t]==`string`&&(n[t]=e[t])})},getGoogleAnalyticsName:e=>e||r(n.googleAnalytics),getPrecacheName:e=>e||r(n.precache),getPrefix:()=>n.prefix,getRuntimeName:e=>e||r(n.runtime),getSuffix:()=>n.suffix};function o(e,t){let n=t();return e.waitUntil(n),n}try{self[`workbox:precaching:7.3.0`]&&_()}catch{}var s=`__WB_REVISION__`;function c(e){if(!e)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(typeof e==`string`){let t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}let{revision:n,url:r}=e;if(!r)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(!n){let e=new URL(r,location.href);return{cacheKey:e.href,url:e.href}}let i=new URL(r,location.href),a=new URL(r,location.href);return i.searchParams.set(s,n),{cacheKey:i.href,url:a.href}}var l=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if(e.type===`install`&&t&&t.originalRequest&&t.originalRequest instanceof Request){let e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}},u=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{let n=t?.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n,{headers:e.headers}):e},this._precacheController=e}},d;function f(){if(d===void 0){let e=new Response(``);if(`body`in e)try{new Response(e.body),d=!0}catch{d=!1}d=!1}return d}async function p(e,n){let r=null;if(e.url&&(r=new URL(e.url).origin),r!==self.location.origin)throw new t(`cross-origin-copy-response`,{origin:r});let i=e.clone(),a={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=n?n(a):a,s=f()?i.body:await i.blob();return new Response(s,o)}var m=e=>new URL(String(e),location.href).href.replace(RegExp(`^${location.origin}`),``);function h(e,t){let n=new URL(e);for(let e of t)n.searchParams.delete(e);return n.href}async function g(e,t,n,r){let i=h(t.url,n);if(t.url===i)return e.match(t,r);let a=Object.assign(Object.assign({},r),{ignoreSearch:!0}),o=await e.keys(t,a);for(let t of o)if(i===h(t.url,n))return e.match(t,r)}var v=class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},y=new Set;async function b(){for(let e of y)await e()}function x(e){return new Promise(t=>setTimeout(t,e))}try{self[`workbox:strategies:7.3.0`]&&_()}catch{}function S(e){return typeof e==`string`?new Request(e):e}var C=class{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new v,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:n}=this,r=S(e);if(r.mode===`navigate`&&n instanceof FetchEvent&&n.preloadResponse){let e=await n.preloadResponse;if(e)return e}let i=this.hasCallback(`fetchDidFail`)?r.clone():null;try{for(let e of this.iterateCallbacks(`requestWillFetch`))r=await e({request:r.clone(),event:n})}catch(e){if(e instanceof Error)throw new t(`plugin-error-request-will-fetch`,{thrownErrorMessage:e.message})}let a=r.clone();try{let e;e=await fetch(r,r.mode===`navigate`?void 0:this._strategy.fetchOptions);for(let t of this.iterateCallbacks(`fetchDidSucceed`))e=await t({event:n,request:a,response:e});return e}catch(e){throw i&&await this.runCallbacks(`fetchDidFail`,{error:e,event:n,originalRequest:i.clone(),request:a.clone()}),e}}async fetchAndCachePut(e){let t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){let t=S(e),n,{cacheName:r,matchOptions:i}=this._strategy,a=await this.getCacheKey(t,`read`),o=Object.assign(Object.assign({},i),{cacheName:r});n=await caches.match(a,o);for(let e of this.iterateCallbacks(`cachedResponseWillBeUsed`))n=await e({cacheName:r,matchOptions:i,cachedResponse:n,request:a,event:this.event})||void 0;return n}async cachePut(e,n){let r=S(e);await x(0);let i=await this.getCacheKey(r,`write`);if(!n)throw new t(`cache-put-with-no-response`,{url:m(i.url)});let a=await this._ensureResponseSafeToCache(n);if(!a)return!1;let{cacheName:o,matchOptions:s}=this._strategy,c=await self.caches.open(o),l=this.hasCallback(`cacheDidUpdate`),u=l?await g(c,i.clone(),[`__WB_REVISION__`],s):null;try{await c.put(i,l?a.clone():a)}catch(e){if(e instanceof Error)throw e.name===`QuotaExceededError`&&await b(),e}for(let e of this.iterateCallbacks(`cacheDidUpdate`))await e({cacheName:o,oldResponse:u,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){let n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let r=e;for(let e of this.iterateCallbacks(`cacheKeyWillBeUsed`))r=S(await e({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[n]=r}return this._cacheKeys[n]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]==`function`){let n=this._pluginStateMap.get(t);yield r=>{let i=Object.assign(Object.assign({},r),{state:n});return t[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){let e=this._extendLifetimePromises.splice(0),t=(await Promise.allSettled(e)).find(e=>e.status===`rejected`);if(t)throw t.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(let e of this.iterateCallbacks(`cacheWillUpdate`))if(t=await e({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}},w=class{constructor(e={}){this.cacheName=a.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,n=typeof e.request==`string`?new Request(e.request):e.request,r=`params`in e?e.params:void 0,i=new C(this,{event:t,request:n,params:r}),a=this._getResponse(i,n,t);return[a,this._awaitComplete(a,i,n,t)]}async _getResponse(e,n,r){await e.runCallbacks(`handlerWillStart`,{event:r,request:n});let i;try{if(i=await this._handle(n,e),!i||i.type===`error`)throw new t(`no-response`,{url:n.url})}catch(t){if(t instanceof Error){for(let a of e.iterateCallbacks(`handlerDidError`))if(i=await a({error:t,event:r,request:n}),i)break}if(!i)throw t}for(let t of e.iterateCallbacks(`handlerWillRespond`))i=await t({event:r,request:n,response:i});return i}async _awaitComplete(e,t,n,r){let i,a;try{i=await e}catch{}try{await t.runCallbacks(`handlerDidRespond`,{event:r,request:n,response:i}),await t.doneWaiting()}catch(e){e instanceof Error&&(a=e)}if(await t.runCallbacks(`handlerDidComplete`,{event:r,request:n,response:i,error:a}),t.destroy(),a)throw a}},T=class e extends w{constructor(t={}){t.cacheName=a.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(e.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){return await t.cacheMatch(e)||(t.event&&t.event.type===`install`?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,n){let r,i=n.params||{};if(this._fallbackToNetwork){let t=i.integrity,a=e.integrity,o=!a||a===t;r=await n.fetch(new Request(e,{integrity:e.mode===`no-cors`?void 0:a||t})),t&&o&&e.mode!==`no-cors`&&(this._useDefaultCacheabilityPluginIfNeeded(),await n.cachePut(e,r.clone()))}else throw new t(`missing-precache-entry`,{cacheName:this.cacheName,url:e.url});return r}async _handleInstall(e,n){this._useDefaultCacheabilityPluginIfNeeded();let r=await n.fetch(e);if(!await n.cachePut(e,r.clone()))throw new t(`bad-precaching-response`,{url:e.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,n=0;for(let[r,i]of this.plugins.entries())i!==e.copyRedirectedCacheableResponsesPlugin&&(i===e.defaultPrecacheCacheabilityPlugin&&(t=r),i.cacheWillUpdate&&n++);n===0?this.plugins.push(e.defaultPrecacheCacheabilityPlugin):n>1&&t!==null&&this.plugins.splice(t,1)}};T.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},T.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};var E=class{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new T({cacheName:a.getPrecacheName(e),plugins:[...t,new u({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||=(self.addEventListener(`install`,this.install),self.addEventListener(`activate`,this.activate),!0)}addToCacheList(e){let n=[];for(let r of e){typeof r==`string`?n.push(r):r&&r.revision===void 0&&n.push(r.url);let{cacheKey:e,url:i}=c(r),a=typeof r!=`string`&&r.revision?`reload`:`default`;if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==e)throw new t(`add-to-cache-list-conflicting-entries`,{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:e});if(typeof r!=`string`&&r.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==r.integrity)throw new t(`add-to-cache-list-conflicting-integrities`,{url:i});this._cacheKeysToIntegrities.set(e,r.integrity)}if(this._urlsToCacheKeys.set(i,e),this._urlsToCacheModes.set(i,a),n.length>0){let e=`Workbox is precaching URLs without revision info: ${n.join(`, `)}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return o(e,async()=>{let t=new l;this.strategy.plugins.push(t);for(let[t,n]of this._urlsToCacheKeys){let r=this._cacheKeysToIntegrities.get(n),i=this._urlsToCacheModes.get(t),a=new Request(t,{integrity:r,cache:i,credentials:`same-origin`});await Promise.all(this.strategy.handleAll({params:{cacheKey:n},request:a,event:e}))}let{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return o(e,async()=>{let e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(let i of t)n.has(i.url)||(await e.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n)return(await self.caches.open(this.strategy.cacheName)).match(n)}createHandlerBoundToURL(e){let n=this.getCacheKeyForURL(e);if(!n)throw new t(`non-precached-url`,{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:n},t.params),this.strategy.handle(t))}},D,O=()=>(D||=new E,D);try{self[`workbox:routing:7.3.0`]&&_()}catch{}var k=e=>e&&typeof e==`object`?e:{handle:e},A=class{constructor(e,t,n=`GET`){this.handler=k(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=k(e)}},j=class extends A{constructor(e,t,n){super(({url:t})=>{let n=e.exec(t.href);if(n&&!(t.origin!==location.origin&&n.index!==0))return n.slice(1)},t,n)}},M=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener(`fetch`,(e=>{let{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)}))}addCacheListener(){self.addEventListener(`message`,(e=>{if(e.data&&e.data.type===`CACHE_URLS`){let{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(t=>{typeof t==`string`&&(t=[t]);let n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){let n=new URL(e.url,location.href);if(!n.protocol.startsWith(`http`))return;let r=n.origin===location.origin,{params:i,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n}),o=a&&a.handler,s=e.method;if(!o&&this._defaultHandlerMap.has(s)&&(o=this._defaultHandlerMap.get(s)),!o)return;let c;try{c=o.handle({url:n,request:e,event:t,params:i})}catch(e){c=Promise.reject(e)}let l=a&&a.catchHandler;return c instanceof Promise&&(this._catchHandler||l)&&(c=c.catch(async r=>{if(l)try{return await l.handle({url:n,request:e,event:t,params:i})}catch(e){e instanceof Error&&(r=e)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw r})),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){let i=this._routes.get(n.method)||[];for(let a of i){let i,o=a.match({url:e,sameOrigin:t,request:n,event:r});if(o)return i=o,(Array.isArray(i)&&i.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o==`boolean`)&&(i=void 0),{route:a,params:i}}return{}}setDefaultHandler(e,t=`GET`){this._defaultHandlerMap.set(t,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t(`unregister-route-but-not-found-with-method`,{method:e.method});let n=this._routes.get(e.method).indexOf(e);if(n>-1)this._routes.get(e.method).splice(n,1);else throw new t(`unregister-route-route-not-registered`)}},N,P=()=>(N||(N=new M,N.addFetchListener(),N.addCacheListener()),N);function F(e,n,r){let i;if(typeof e==`string`){let t=new URL(e,location.href);i=new A(({url:e})=>e.href===t.href,n,r)}else if(e instanceof RegExp)i=new j(e,n,r);else if(typeof e==`function`)i=new A(e,n,r);else if(e instanceof A)i=e;else throw new t(`unsupported-route-type`,{moduleName:`workbox-routing`,funcName:`registerRoute`,paramName:`capture`});return P().registerRoute(i),i}function I(e,t=[]){for(let n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*L(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n=`index.html`,cleanURLs:r=!0,urlManipulation:i}={}){let a=new URL(e,location.href);a.hash=``,yield a.href;let o=I(a,t);if(yield o.href,n&&o.pathname.endsWith(`/`)){let e=new URL(o.href);e.pathname+=n,yield e.href}if(r){let e=new URL(o.href);e.pathname+=`.html`,yield e.href}if(i){let e=i({url:a});for(let t of e)yield t.href}}var R=class extends A{constructor(e,t){super(({request:n})=>{let r=e.getURLsToCacheKeys();for(let i of L(n.url,t)){let t=r.get(i);if(t)return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}},e.strategy)}};function z(e){F(new R(O(),e))}function B(e){O().precache(e)}function V(e,t){B(e),z(t)}V([{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"ef266ba2bae293df7fe4f1c88e521a45","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/dist-D7KGU7Vl.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/scroll-area-BEllam7_.js"},{"revision":null,"url":"assets/database-D4DIhgi-.js"},{"revision":null,"url":"assets/csv-parser--2WJNgS7.js"},{"revision":null,"url":"assets/x-DlFGzN8d.js"},{"revision":null,"url":"assets/keybindings-store-B-zET-0o.js"},{"revision":null,"url":"assets/use-blob-url-e9uTXjv5.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-BviZcL-b.js"},{"revision":null,"url":"assets/vendor-xterm-CU2c3f0A.js"},{"revision":null,"url":"assets/input-Dk49gO8E.js"},{"revision":null,"url":"assets/diff-viewer-CP2jcR5J.js"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/refresh-cw-LlbZDJpO.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-D6S2MqVT.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-CM54VdaB.js"},{"revision":null,"url":"assets/react-GqWghJ-L.js"},{"revision":null,"url":"assets/database-viewer-DjvnIn8p.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/vendor-mermaid-Dx86tuVP.js"},{"revision":null,"url":"assets/ai-settings-section-QE6nBNgN.js"},{"revision":null,"url":"assets/conflict-editor-BYzf3LuW.js"},{"revision":null,"url":"assets/image-preview-CkS2PVdQ.js"},{"revision":null,"url":"assets/csv-preview-HMSavgBb.js"},{"revision":null,"url":"assets/katex-CKoArbIw.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/info-3K5VOQVL-BwAZ2zd8.js"},{"revision":null,"url":"assets/index-BTjuH4fn.css"},{"revision":null,"url":"assets/chevron-right-BzAdxJRG.js"},{"revision":null,"url":"assets/extension-store-3yZYn07W.js"},{"revision":null,"url":"assets/terminal-tab-MjmJaQyA.js"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/code-editor-B-lU1fz3.js"},{"revision":null,"url":"assets/audio-preview-DnQmf9fu.js"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/port-forwarding-tab-Cebb5Eix.js"},{"revision":null,"url":"assets/settings-tab-D0XjupJm.js"},{"revision":null,"url":"assets/api-client-Dvzcc_EO.js"},{"revision":null,"url":"assets/pdf-preview-CCyw5cuH.js"},{"revision":null,"url":"assets/dist-im4ynINo.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/table-Dq575bPF.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/packet-RMMSAZCW-tx2n5Qry.js"},{"revision":null,"url":"assets/postgres-viewer-BrOiliEv.js"},{"revision":null,"url":"assets/plus-51UQ45rf.js"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/arrow-up-Dtrfv490.js"},{"revision":null,"url":"assets/api-settings-DAk7D-NP.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-DvZbltvY.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/extension-webview-4xMREn_x.js"},{"revision":null,"url":"assets/settings-store-BLLR7ed8.js"},{"revision":null,"url":"assets/use-monaco-theme-BkZDwoVd.js"},{"revision":null,"url":"assets/video-preview-B819qvlp.js"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/github-dark-dimmed.min-BrpRStFV.css"},{"revision":null,"url":"assets/text-wrap-Cn6BNQfq.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/trash-2-CJYoLw7Q.js"},{"revision":null,"url":"assets/file-exclamation-point-BwzaQ50n.js"},{"revision":null,"url":"assets/file-store-BrbCNyLm.js"},{"revision":null,"url":"assets/index-FGlF8IWZ.js"},{"revision":null,"url":"assets/utils-CTg5uAYR.js"},{"revision":null,"url":"assets/columns-2-4fQcE4PF.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/sqlite-viewer-OEVq_-Po.js"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/tab-store-B3M9hjho.js"},{"revision":null,"url":"assets/keybindings-store-DaBV6qhz.js"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/code-CuravVys.js"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/sql-completion-provider-C3cq9j99.js"},{"revision":null,"url":"assets/markdown-renderer-Bj2B05Km.js"},{"revision":null,"url":"assets/vendor-ui-B-89Uj8i.js"},{"revision":null,"url":"assets/esm-K1XIK4vc.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-BxhdxFgj.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/chat-tab-Cf6T3mGO.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/lib-DQHnkzGy.js"},{"revision":null,"url":"assets/sql-query-editor-CVAnRFbi.js"},{"revision":"d0f94ce046cf8cf09605ee7664dac557","url":"monacoeditorwork/html.worker.bundle.js"},{"revision":"a424156a79b9c1b907db93aa3180585a","url":"monacoeditorwork/editor.worker.bundle.js"},{"revision":"b3a7f967560c9816492a1567b3f7f0dc","url":"monacoeditorwork/css.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.js"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"79c8870653c8f419f2e3323085e1f4be","url":"manifest.webmanifest"}]),self.addEventListener(`push`,e=>{e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{if(t.some(e=>e.visibilityState===`visible`))return;let n=e.data?.json()??{title:`PPM`,body:`Chat completed`};return self.registration.showNotification(n.title,{body:n.body,icon:`/icon-192.png`,badge:`/icon-192.png`,tag:`ppm-chat-done`,silent:!1,data:{url:self.location.origin}})}))}),self.addEventListener(`notificationclick`,e=>{e.notification.close(),e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{for(let e of t)if(e.url.includes(self.location.origin)&&`focus`in e)return e.focus();return self.clients.openWindow(e.notification.data?.url||`/`)}))});
1
+ try{self[`workbox:core:7.3.0`]&&_()}catch{}var e=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n},t=class extends Error{constructor(t,n){let r=e(t,n);super(r),this.name=t,this.details=n}},n={googleAnalytics:`googleAnalytics`,precache:`precache-v2`,prefix:`workbox`,runtime:`runtime`,suffix:typeof registration<`u`?registration.scope:``},r=e=>[n.prefix,e,n.suffix].filter(e=>e&&e.length>0).join(`-`),i=e=>{for(let t of Object.keys(n))e(t)},a={updateDetails:e=>{i(t=>{typeof e[t]==`string`&&(n[t]=e[t])})},getGoogleAnalyticsName:e=>e||r(n.googleAnalytics),getPrecacheName:e=>e||r(n.precache),getPrefix:()=>n.prefix,getRuntimeName:e=>e||r(n.runtime),getSuffix:()=>n.suffix};function o(e,t){let n=t();return e.waitUntil(n),n}try{self[`workbox:precaching:7.3.0`]&&_()}catch{}var s=`__WB_REVISION__`;function c(e){if(!e)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(typeof e==`string`){let t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}let{revision:n,url:r}=e;if(!r)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(!n){let e=new URL(r,location.href);return{cacheKey:e.href,url:e.href}}let i=new URL(r,location.href),a=new URL(r,location.href);return i.searchParams.set(s,n),{cacheKey:i.href,url:a.href}}var l=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if(e.type===`install`&&t&&t.originalRequest&&t.originalRequest instanceof Request){let e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}},u=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{let n=t?.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n,{headers:e.headers}):e},this._precacheController=e}},d;function f(){if(d===void 0){let e=new Response(``);if(`body`in e)try{new Response(e.body),d=!0}catch{d=!1}d=!1}return d}async function p(e,n){let r=null;if(e.url&&(r=new URL(e.url).origin),r!==self.location.origin)throw new t(`cross-origin-copy-response`,{origin:r});let i=e.clone(),a={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=n?n(a):a,s=f()?i.body:await i.blob();return new Response(s,o)}var m=e=>new URL(String(e),location.href).href.replace(RegExp(`^${location.origin}`),``);function h(e,t){let n=new URL(e);for(let e of t)n.searchParams.delete(e);return n.href}async function g(e,t,n,r){let i=h(t.url,n);if(t.url===i)return e.match(t,r);let a=Object.assign(Object.assign({},r),{ignoreSearch:!0}),o=await e.keys(t,a);for(let t of o)if(i===h(t.url,n))return e.match(t,r)}var v=class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},y=new Set;async function b(){for(let e of y)await e()}function x(e){return new Promise(t=>setTimeout(t,e))}try{self[`workbox:strategies:7.3.0`]&&_()}catch{}function S(e){return typeof e==`string`?new Request(e):e}var C=class{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new v,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:n}=this,r=S(e);if(r.mode===`navigate`&&n instanceof FetchEvent&&n.preloadResponse){let e=await n.preloadResponse;if(e)return e}let i=this.hasCallback(`fetchDidFail`)?r.clone():null;try{for(let e of this.iterateCallbacks(`requestWillFetch`))r=await e({request:r.clone(),event:n})}catch(e){if(e instanceof Error)throw new t(`plugin-error-request-will-fetch`,{thrownErrorMessage:e.message})}let a=r.clone();try{let e;e=await fetch(r,r.mode===`navigate`?void 0:this._strategy.fetchOptions);for(let t of this.iterateCallbacks(`fetchDidSucceed`))e=await t({event:n,request:a,response:e});return e}catch(e){throw i&&await this.runCallbacks(`fetchDidFail`,{error:e,event:n,originalRequest:i.clone(),request:a.clone()}),e}}async fetchAndCachePut(e){let t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){let t=S(e),n,{cacheName:r,matchOptions:i}=this._strategy,a=await this.getCacheKey(t,`read`),o=Object.assign(Object.assign({},i),{cacheName:r});n=await caches.match(a,o);for(let e of this.iterateCallbacks(`cachedResponseWillBeUsed`))n=await e({cacheName:r,matchOptions:i,cachedResponse:n,request:a,event:this.event})||void 0;return n}async cachePut(e,n){let r=S(e);await x(0);let i=await this.getCacheKey(r,`write`);if(!n)throw new t(`cache-put-with-no-response`,{url:m(i.url)});let a=await this._ensureResponseSafeToCache(n);if(!a)return!1;let{cacheName:o,matchOptions:s}=this._strategy,c=await self.caches.open(o),l=this.hasCallback(`cacheDidUpdate`),u=l?await g(c,i.clone(),[`__WB_REVISION__`],s):null;try{await c.put(i,l?a.clone():a)}catch(e){if(e instanceof Error)throw e.name===`QuotaExceededError`&&await b(),e}for(let e of this.iterateCallbacks(`cacheDidUpdate`))await e({cacheName:o,oldResponse:u,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){let n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let r=e;for(let e of this.iterateCallbacks(`cacheKeyWillBeUsed`))r=S(await e({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[n]=r}return this._cacheKeys[n]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]==`function`){let n=this._pluginStateMap.get(t);yield r=>{let i=Object.assign(Object.assign({},r),{state:n});return t[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){let e=this._extendLifetimePromises.splice(0),t=(await Promise.allSettled(e)).find(e=>e.status===`rejected`);if(t)throw t.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(let e of this.iterateCallbacks(`cacheWillUpdate`))if(t=await e({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}},w=class{constructor(e={}){this.cacheName=a.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,n=typeof e.request==`string`?new Request(e.request):e.request,r=`params`in e?e.params:void 0,i=new C(this,{event:t,request:n,params:r}),a=this._getResponse(i,n,t);return[a,this._awaitComplete(a,i,n,t)]}async _getResponse(e,n,r){await e.runCallbacks(`handlerWillStart`,{event:r,request:n});let i;try{if(i=await this._handle(n,e),!i||i.type===`error`)throw new t(`no-response`,{url:n.url})}catch(t){if(t instanceof Error){for(let a of e.iterateCallbacks(`handlerDidError`))if(i=await a({error:t,event:r,request:n}),i)break}if(!i)throw t}for(let t of e.iterateCallbacks(`handlerWillRespond`))i=await t({event:r,request:n,response:i});return i}async _awaitComplete(e,t,n,r){let i,a;try{i=await e}catch{}try{await t.runCallbacks(`handlerDidRespond`,{event:r,request:n,response:i}),await t.doneWaiting()}catch(e){e instanceof Error&&(a=e)}if(await t.runCallbacks(`handlerDidComplete`,{event:r,request:n,response:i,error:a}),t.destroy(),a)throw a}},T=class e extends w{constructor(t={}){t.cacheName=a.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(e.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){return await t.cacheMatch(e)||(t.event&&t.event.type===`install`?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,n){let r,i=n.params||{};if(this._fallbackToNetwork){let t=i.integrity,a=e.integrity,o=!a||a===t;r=await n.fetch(new Request(e,{integrity:e.mode===`no-cors`?void 0:a||t})),t&&o&&e.mode!==`no-cors`&&(this._useDefaultCacheabilityPluginIfNeeded(),await n.cachePut(e,r.clone()))}else throw new t(`missing-precache-entry`,{cacheName:this.cacheName,url:e.url});return r}async _handleInstall(e,n){this._useDefaultCacheabilityPluginIfNeeded();let r=await n.fetch(e);if(!await n.cachePut(e,r.clone()))throw new t(`bad-precaching-response`,{url:e.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,n=0;for(let[r,i]of this.plugins.entries())i!==e.copyRedirectedCacheableResponsesPlugin&&(i===e.defaultPrecacheCacheabilityPlugin&&(t=r),i.cacheWillUpdate&&n++);n===0?this.plugins.push(e.defaultPrecacheCacheabilityPlugin):n>1&&t!==null&&this.plugins.splice(t,1)}};T.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},T.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};var E=class{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new T({cacheName:a.getPrecacheName(e),plugins:[...t,new u({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||=(self.addEventListener(`install`,this.install),self.addEventListener(`activate`,this.activate),!0)}addToCacheList(e){let n=[];for(let r of e){typeof r==`string`?n.push(r):r&&r.revision===void 0&&n.push(r.url);let{cacheKey:e,url:i}=c(r),a=typeof r!=`string`&&r.revision?`reload`:`default`;if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==e)throw new t(`add-to-cache-list-conflicting-entries`,{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:e});if(typeof r!=`string`&&r.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==r.integrity)throw new t(`add-to-cache-list-conflicting-integrities`,{url:i});this._cacheKeysToIntegrities.set(e,r.integrity)}if(this._urlsToCacheKeys.set(i,e),this._urlsToCacheModes.set(i,a),n.length>0){let e=`Workbox is precaching URLs without revision info: ${n.join(`, `)}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return o(e,async()=>{let t=new l;this.strategy.plugins.push(t);for(let[t,n]of this._urlsToCacheKeys){let r=this._cacheKeysToIntegrities.get(n),i=this._urlsToCacheModes.get(t),a=new Request(t,{integrity:r,cache:i,credentials:`same-origin`});await Promise.all(this.strategy.handleAll({params:{cacheKey:n},request:a,event:e}))}let{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return o(e,async()=>{let e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(let i of t)n.has(i.url)||(await e.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n)return(await self.caches.open(this.strategy.cacheName)).match(n)}createHandlerBoundToURL(e){let n=this.getCacheKeyForURL(e);if(!n)throw new t(`non-precached-url`,{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:n},t.params),this.strategy.handle(t))}},D,O=()=>(D||=new E,D);try{self[`workbox:routing:7.3.0`]&&_()}catch{}var k=e=>e&&typeof e==`object`?e:{handle:e},A=class{constructor(e,t,n=`GET`){this.handler=k(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=k(e)}},j=class extends A{constructor(e,t,n){super(({url:t})=>{let n=e.exec(t.href);if(n&&!(t.origin!==location.origin&&n.index!==0))return n.slice(1)},t,n)}},M=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener(`fetch`,(e=>{let{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)}))}addCacheListener(){self.addEventListener(`message`,(e=>{if(e.data&&e.data.type===`CACHE_URLS`){let{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(t=>{typeof t==`string`&&(t=[t]);let n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){let n=new URL(e.url,location.href);if(!n.protocol.startsWith(`http`))return;let r=n.origin===location.origin,{params:i,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n}),o=a&&a.handler,s=e.method;if(!o&&this._defaultHandlerMap.has(s)&&(o=this._defaultHandlerMap.get(s)),!o)return;let c;try{c=o.handle({url:n,request:e,event:t,params:i})}catch(e){c=Promise.reject(e)}let l=a&&a.catchHandler;return c instanceof Promise&&(this._catchHandler||l)&&(c=c.catch(async r=>{if(l)try{return await l.handle({url:n,request:e,event:t,params:i})}catch(e){e instanceof Error&&(r=e)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw r})),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){let i=this._routes.get(n.method)||[];for(let a of i){let i,o=a.match({url:e,sameOrigin:t,request:n,event:r});if(o)return i=o,(Array.isArray(i)&&i.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o==`boolean`)&&(i=void 0),{route:a,params:i}}return{}}setDefaultHandler(e,t=`GET`){this._defaultHandlerMap.set(t,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t(`unregister-route-but-not-found-with-method`,{method:e.method});let n=this._routes.get(e.method).indexOf(e);if(n>-1)this._routes.get(e.method).splice(n,1);else throw new t(`unregister-route-route-not-registered`)}},N,P=()=>(N||(N=new M,N.addFetchListener(),N.addCacheListener()),N);function F(e,n,r){let i;if(typeof e==`string`){let t=new URL(e,location.href);i=new A(({url:e})=>e.href===t.href,n,r)}else if(e instanceof RegExp)i=new j(e,n,r);else if(typeof e==`function`)i=new A(e,n,r);else if(e instanceof A)i=e;else throw new t(`unsupported-route-type`,{moduleName:`workbox-routing`,funcName:`registerRoute`,paramName:`capture`});return P().registerRoute(i),i}function I(e,t=[]){for(let n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*L(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n=`index.html`,cleanURLs:r=!0,urlManipulation:i}={}){let a=new URL(e,location.href);a.hash=``,yield a.href;let o=I(a,t);if(yield o.href,n&&o.pathname.endsWith(`/`)){let e=new URL(o.href);e.pathname+=n,yield e.href}if(r){let e=new URL(o.href);e.pathname+=`.html`,yield e.href}if(i){let e=i({url:a});for(let t of e)yield t.href}}var R=class extends A{constructor(e,t){super(({request:n})=>{let r=e.getURLsToCacheKeys();for(let i of L(n.url,t)){let t=r.get(i);if(t)return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}},e.strategy)}};function z(e){F(new R(O(),e))}function B(e){O().precache(e)}function V(e,t){B(e),z(t)}V([{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"d710532a61c26061cd24e7558883cbfd","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/refresh-cw-BjrAbUJe.js"},{"revision":null,"url":"assets/chevron-up-BWBvMZkp.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-w03Pc9ZR.js"},{"revision":null,"url":"assets/csv-parser-B5QW8pZ6.js"},{"revision":null,"url":"assets/info-3K5VOQVL-tSD4Fpi3.js"},{"revision":null,"url":"assets/dist-D7KGU7Vl.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/database-D4DIhgi-.js"},{"revision":null,"url":"assets/csv-preview-DcWCjQkZ.js"},{"revision":null,"url":"assets/use-blob-url-QX-XajU8.js"},{"revision":null,"url":"assets/x-DlFGzN8d.js"},{"revision":null,"url":"assets/port-forwarding-tab-Dkq1upWC.js"},{"revision":null,"url":"assets/extension-store-BZDZ9QRc.js"},{"revision":null,"url":"assets/use-monaco-theme-D68oX3XU.js"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/vendor-mermaid-sQS4C_iL.js"},{"revision":null,"url":"assets/extension-webview-U1lMYZ0p.js"},{"revision":null,"url":"assets/image-preview-BcT1SbY2.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-BURAevTc.js"},{"revision":null,"url":"assets/index-BWSRKVZn.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/terminal-tab-BtnqkN1H.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/database-viewer-C85RxdMV.js"},{"revision":null,"url":"assets/postgres-viewer-BgBJAJ9q.js"},{"revision":null,"url":"assets/chevron-right-BzAdxJRG.js"},{"revision":null,"url":"assets/audio-preview-BkbgGtDH.js"},{"revision":null,"url":"assets/esm-_CLpyLJ_.js"},{"revision":null,"url":"assets/pre-compact-button-Dp7Hs49L.js"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/packet-RMMSAZCW-DmDLZUrV.js"},{"revision":null,"url":"assets/index-b6tIZImC.css"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/diff-viewer-2pPy97Tl.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/trash-2-DjQOpgUV.js"},{"revision":null,"url":"assets/vendor-xterm-K3_Xwigj.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/markdown-renderer-Dbam_-04.js"},{"revision":null,"url":"assets/settings-store-CMAssqyb.js"},{"revision":null,"url":"assets/dist-GtkSekuX.js"},{"revision":null,"url":"assets/tab-store-DNBsLdPn.js"},{"revision":null,"url":"assets/file-store-4BpOJthN.js"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/arrow-up-Dtrfv490.js"},{"revision":null,"url":"assets/react-DMIOAtcX.js"},{"revision":null,"url":"assets/lib-Bu71-TFS.js"},{"revision":null,"url":"assets/utils-CQux7CsO.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/katex-C3cZrCvP.js"},{"revision":null,"url":"assets/ai-settings-section-NNWp6nw7.js"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/pdf-preview-BmHVGx32.js"},{"revision":null,"url":"assets/github-dark-dimmed.min-BrpRStFV.css"},{"revision":null,"url":"assets/keybindings-store-BOG1yviy.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-lmftxSky.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/text-wrap-BV-R4Vvy.js"},{"revision":null,"url":"assets/file-exclamation-point-BwzaQ50n.js"},{"revision":null,"url":"assets/chat-tab-BZlP1qjX.js"},{"revision":null,"url":"assets/api-client-DIhJ5qVW.js"},{"revision":null,"url":"assets/input-2eDVjcRZ.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-DDuzYaUV.js"},{"revision":null,"url":"assets/scroll-area-CdxNNnN-.js"},{"revision":null,"url":"assets/sql-completion-provider-CULTsCqR.js"},{"revision":null,"url":"assets/sql-query-editor-b7zJ8XPp.js"},{"revision":null,"url":"assets/columns-2-4fQcE4PF.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/sqlite-viewer-4lLAz1es.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/conflict-editor-Dgsu6fmj.js"},{"revision":null,"url":"assets/keybindings-store-BvdUoEC7.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/code-CuravVys.js"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/table-tf7pRkME.js"},{"revision":null,"url":"assets/api-settings-C3T95dWg.js"},{"revision":null,"url":"assets/pre-compact-section-DnM5fGSR.js"},{"revision":null,"url":"assets/vendor-ui-B-89Uj8i.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-C9XQvoey.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/video-preview-CkOKvVLt.js"},{"revision":null,"url":"assets/settings-tab-zYWKTq5z.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/code-editor-BtspASkW.js"},{"revision":"d0f94ce046cf8cf09605ee7664dac557","url":"monacoeditorwork/html.worker.bundle.js"},{"revision":"a424156a79b9c1b907db93aa3180585a","url":"monacoeditorwork/editor.worker.bundle.js"},{"revision":"b3a7f967560c9816492a1567b3f7f0dc","url":"monacoeditorwork/css.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.js"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"79c8870653c8f419f2e3323085e1f4be","url":"manifest.webmanifest"}]),self.addEventListener(`push`,e=>{e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{if(t.some(e=>e.visibilityState===`visible`))return;let n=e.data?.json()??{title:`PPM`,body:`Chat completed`};return self.registration.showNotification(n.title,{body:n.body,icon:`/icon-192.png`,badge:`/icon-192.png`,tag:`ppm-chat-done`,silent:!1,data:{url:self.location.origin}})}))}),self.addEventListener(`notificationclick`,e=>{e.notification.close(),e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{for(let e of t)if(e.url.includes(self.location.origin)&&`focus`in e)return e.focus();return self.clients.openWindow(e.notification.data?.url||`/`)}))});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hienlh/ppm",
3
- "version": "0.12.10",
3
+ "version": "0.12.12",
4
4
  "description": "Personal Project Manager — mobile-first web IDE with AI assistance",
5
5
  "author": "hienlh",
6
6
  "license": "MIT",
@@ -11,12 +11,11 @@ export function registerAutoStartCommands(program: Command): void {
11
11
  .description("Register PPM to start automatically on boot")
12
12
  .option("-p, --port <port>", "Override port")
13
13
  .option("-s, --share", "(deprecated) Tunnel is now always enabled")
14
- .option("-c, --config <path>", "Config file path")
15
14
  .option("--profile <name>", "DB profile name")
16
15
  .action(async (options) => {
17
16
  const { enableAutoStart } = await import("../../services/autostart-register.ts");
18
17
 
19
- configService.load(options.config);
18
+ configService.load();
20
19
  const port = parseInt(options.port ?? String(configService.get("port")), 10);
21
20
  const host = configService.get("host") ?? "0.0.0.0";
22
21
 
@@ -24,7 +23,6 @@ export function registerAutoStartCommands(program: Command): void {
24
23
  port,
25
24
  host,
26
25
  share: !!options.share,
27
- configPath: options.config,
28
26
  profile: options.profile,
29
27
  };
30
28
 
@@ -1,7 +1,5 @@
1
1
  import { resolve, basename } from "node:path";
2
2
  import { homedir } from "node:os";
3
- import { existsSync } from "node:fs";
4
- import { getPpmDir } from "../../services/ppm-dir.ts";
5
3
  import { input, confirm, select, password } from "@inquirer/prompts";
6
4
  import { configService } from "../../services/config.service.ts";
7
5
  import { projectService } from "../../services/project.service.ts";
@@ -19,15 +17,14 @@ export interface InitOptions {
19
17
  yes?: boolean;
20
18
  }
21
19
 
22
- /** Check if config already exists */
23
- /** Check if config already exists (DB or legacy YAML) */
20
+ /** Check if config already exists in SQLite */
24
21
  export function hasConfig(): boolean {
25
22
  try {
26
23
  const dbConfig = getAllConfig();
27
- if (Object.keys(dbConfig).length > 0) return true;
28
- } catch {}
29
- const globalConfig = resolve(getPpmDir(), "config.yaml");
30
- return existsSync(globalConfig);
24
+ return Object.keys(dbConfig).length > 0;
25
+ } catch {
26
+ return false;
27
+ }
31
28
  }
32
29
 
33
30
  export async function initProject(options: InitOptions = {}) {
@@ -8,7 +8,7 @@ const restartingFlag = () => resolve(getPpmDir(), ".restarting");
8
8
  const restartResult = () => resolve(getPpmDir(), ".restart-result");
9
9
 
10
10
  /** Restart only the server process, keeping the tunnel alive */
11
- export async function restartServer(options: { config?: string; force?: boolean }) {
11
+ export async function restartServer(options: { force?: boolean }) {
12
12
  // Ignore SIGHUP so this process survives when PPM terminal dies
13
13
  process.on("SIGHUP", () => {});
14
14
 
@@ -114,7 +114,7 @@ export async function restartServer(options: { config?: string; force?: boolean
114
114
  : resolve(import.meta.dir, "../../server/index.ts");
115
115
 
116
116
  const { configService } = await import("../../services/config.service.ts");
117
- configService.load(options.config);
117
+ configService.load();
118
118
  const port = status.port as number ?? configService.get("port");
119
119
  const host = status.host as string ?? configService.get("host");
120
120
 
@@ -133,7 +133,6 @@ export async function restartServer(options: { config?: string; force?: boolean
133
133
  // terminal (and its process group) to receive SIGHUP.
134
134
  const params = JSON.stringify({
135
135
  serverPid, port, host, serverScript,
136
- config: options.config ?? "",
137
136
  statusFile: statusFile(),
138
137
  pidFile: pidFile(),
139
138
  restartingFlag: restartingFlag(),
@@ -204,8 +203,8 @@ async function main() {
204
203
  // Compiled binary: execPath IS the server, no "run script" needed
205
204
  const isCompiled = !process.execPath.includes("bun");
206
205
  const serverArgs = isCompiled
207
- ? ["__serve__", String(P.port), P.host, P.config].filter(Boolean)
208
- : ["run", P.serverScript, "__serve__", String(P.port), P.host, P.config].filter(Boolean);
206
+ ? ["__serve__", String(P.port), P.host]
207
+ : ["run", P.serverScript, "__serve__", String(P.port), P.host];
209
208
 
210
209
  if (process.platform === "win32") {
211
210
  const bunExe = process.execPath.replace(/\\\\/g, "\\\\\\\\");
package/src/index.ts CHANGED
@@ -18,15 +18,12 @@ program
18
18
  .description("Start the PPM server (background by default)")
19
19
  .option("-p, --port <port>", "Port to listen on")
20
20
  .option("-s, --share", "(deprecated) Tunnel is now always enabled")
21
- .option("-c, --config <path>", "Path to config file (YAML import into DB)")
22
21
  .option("--profile <name>", "DB profile name (e.g. 'dev' → ppm.dev.db)")
23
22
  .action(async (options) => {
24
23
  // Set DB profile before any DB access
25
24
  const { setDbProfile } = await import("./services/db.service.ts");
26
25
  if (options.profile) {
27
26
  setDbProfile(options.profile);
28
- } else if (options.config && /dev/i.test(options.config)) {
29
- setDbProfile("dev");
30
27
  }
31
28
  // Auto-init on first run
32
29
  const { hasConfig, initProject } = await import("./cli/commands/init.ts");
@@ -58,7 +55,6 @@ program
58
55
  program
59
56
  .command("restart")
60
57
  .description("Restart the server (keeps tunnel alive)")
61
- .option("-c, --config <path>", "Path to config file")
62
58
  .option("--force", "Force resume from paused state")
63
59
  .action(async (options) => {
64
60
  const { restartServer } = await import("./cli/commands/restart.ts");
@@ -78,7 +74,6 @@ program
78
74
  program
79
75
  .command("open")
80
76
  .description("Open PPM in browser")
81
- .option("-c, --config <path>", "Path to config file")
82
77
  .action(async () => {
83
78
  const { openBrowser } = await import("./cli/commands/open.ts");
84
79
  await openBrowser();
@@ -19,6 +19,7 @@ import { updateFromSdkEvent } from "../services/claude-usage.service.ts";
19
19
  import { getSessionProjectPath, setSessionMetadata, getSessionTitles } from "../services/db.service.ts";
20
20
  import { accountSelector } from "../services/account-selector.service.ts";
21
21
  import { accountService, type AccountWithTokens } from "../services/account.service.ts";
22
+ import { parseSessionMessage, nestChildEvents } from "../services/jsonl-transcript-parser.ts";
22
23
  import { resolve } from "node:path";
23
24
  import { existsSync, readdirSync, unlinkSync, readFileSync, statSync } from "node:fs";
24
25
  import { homedir } from "node:os";
@@ -1587,135 +1588,6 @@ export class ClaudeAgentSdkProvider implements AIProvider {
1587
1588
  }
1588
1589
  }
1589
1590
 
1590
- /** Parse SDK SessionMessage into ChatMessage with events for tool_use blocks */
1591
- function parseSessionMessage(msg: { uuid: string; type: string; message: unknown; parent_tool_use_id?: string | null }): ChatMessage {
1592
- const message = msg.message as Record<string, unknown> | undefined;
1593
- const role = msg.type as "user" | "assistant";
1594
- const parentId = (msg as any).parent_tool_use_id as string | undefined;
1595
-
1596
- // Filter synthetic SDK-generated error messages (auth failures, rate limits, etc.).
1597
- // Structure: { isApiErrorMessage: true, error: "authentication_failed"|"rate_limit"|...,
1598
- // message: { model: "<synthetic>", content: [{text: "Failed to authenticate..."}] } }
1599
- // Our retry loop handles these; the raw text must not render in chat history.
1600
- const isSdkErrorMessage =
1601
- (msg as any).isApiErrorMessage === true ||
1602
- typeof (msg as any).error === "string" ||
1603
- (message && (message as any).model === "<synthetic>" &&
1604
- Array.isArray(message.content) &&
1605
- (message.content as Array<Record<string, unknown>>).some(
1606
- (b) => b.type === "text" && typeof b.text === "string" &&
1607
- /Failed to authenticate|API Error: 40[13]|hit your limit|rate.?limit/i.test(b.text as string),
1608
- ));
1609
- if (isSdkErrorMessage) {
1610
- return {
1611
- id: msg.uuid,
1612
- role,
1613
- content: "",
1614
- timestamp: new Date().toISOString(),
1615
- sdkUuid: msg.uuid,
1616
- };
1617
- }
1618
-
1619
- // Parse content blocks for both user and assistant messages
1620
- const events: ChatEvent[] = [];
1621
- let textContent = "";
1622
-
1623
- if (message && Array.isArray(message.content)) {
1624
- for (const block of message.content as Array<Record<string, unknown>>) {
1625
- if (block.type === "text" && typeof block.text === "string") {
1626
- const cleaned = role === "assistant" ? stripTeammateXml(block.text) : block.text;
1627
- textContent += cleaned;
1628
- if (role === "assistant" && cleaned) {
1629
- events.push({ type: "text", content: cleaned, ...(parentId && { parentToolUseId: parentId }) });
1630
- }
1631
- } else if (block.type === "tool_use") {
1632
- events.push({
1633
- type: "tool_use",
1634
- tool: (block.name as string) ?? "unknown",
1635
- input: block.input ?? {},
1636
- toolUseId: block.id as string | undefined,
1637
- ...(parentId && { parentToolUseId: parentId }),
1638
- });
1639
- } else if (block.type === "tool_result") {
1640
- const output = block.content ?? block.output ?? "";
1641
- events.push({
1642
- type: "tool_result",
1643
- output: typeof output === "string" ? output : JSON.stringify(output),
1644
- isError: !!(block as Record<string, unknown>).is_error,
1645
- toolUseId: block.tool_use_id as string | undefined,
1646
- ...(parentId && { parentToolUseId: parentId }),
1647
- });
1648
- }
1649
- }
1650
- } else {
1651
- textContent = extractText(message);
1652
- }
1653
-
1654
- // SDK-generated user messages carry system text (tool_result blocks,
1655
- // <teammate-message> XML, <task-notification> XML) — not actual user input.
1656
- // Clear so they don't render as user bubbles.
1657
- if (role === "user" && (events.some((e) => e.type === "tool_result") || textContent.includes("<teammate-message"))) {
1658
- textContent = "";
1659
- }
1660
-
1661
- return {
1662
- id: msg.uuid,
1663
- role,
1664
- content: textContent,
1665
- events: events.length > 0 ? events : undefined,
1666
- timestamp: new Date().toISOString(),
1667
- sdkUuid: msg.uuid,
1668
- };
1669
- }
1670
-
1671
- /**
1672
- * Move events with parentToolUseId into their parent Agent/Task tool_use's children array.
1673
- * Mutates the array in-place: child events are removed from the top level and pushed into parent.children.
1674
- */
1675
- function nestChildEvents(events: ChatEvent[]): void {
1676
- // Build map of Agent/Task tool_use events by toolUseId
1677
- const parentMap = new Map<string, ChatEvent & { type: "tool_use" }>();
1678
- for (const ev of events) {
1679
- if (ev.type === "tool_use" && (ev.tool === "Agent" || ev.tool === "Task") && ev.toolUseId) {
1680
- parentMap.set(ev.toolUseId, ev);
1681
- }
1682
- }
1683
- if (parentMap.size === 0) return;
1684
-
1685
- // Collect indices of child events to remove
1686
- const childIndices: number[] = [];
1687
- for (let i = 0; i < events.length; i++) {
1688
- const ev = events[i]!;
1689
- const pid = (ev as any).parentToolUseId as string | undefined;
1690
- if (!pid) continue;
1691
- const parent = parentMap.get(pid);
1692
- if (parent) {
1693
- if (!parent.children) parent.children = [];
1694
- parent.children.push(ev);
1695
- childIndices.push(i);
1696
- }
1697
- }
1698
-
1699
- // Remove children from flat array (reverse order to keep indices valid)
1700
- for (let i = childIndices.length - 1; i >= 0; i--) {
1701
- events.splice(childIndices[i]!, 1);
1702
- }
1703
- }
1704
-
1705
- /** Extract plain text from message payload */
1706
- function extractText(message: unknown): string {
1707
- if (!message || typeof message !== "object") return "";
1708
- const msg = message as Record<string, unknown>;
1709
- if (typeof msg.content === "string") return msg.content;
1710
- if (Array.isArray(msg.content)) {
1711
- return (msg.content as Array<Record<string, unknown>>)
1712
- .filter((b) => b.type === "text" && typeof b.text === "string")
1713
- .map((b) => b.text as string)
1714
- .join("");
1715
- }
1716
- return "";
1717
- }
1718
-
1719
1591
  /**
1720
1592
  * Scan a JSONL project directory for sessions that the SDK's listSessions missed.
1721
1593
  * The SDK uses a 64KB head buffer; sessions with very large first messages
@@ -1791,9 +1663,3 @@ function findMissingSessions(
1791
1663
  return results;
1792
1664
  }
1793
1665
 
1794
- /** Strip SDK teammate-message XML tags from assistant text */
1795
- const TEAMMATE_MSG_RE = /<teammate-message[^>]*>[\s\S]*?<\/teammate-message>/g;
1796
- function stripTeammateXml(text: string): string {
1797
- if (!text.includes("<teammate-message")) return text;
1798
- return text.replace(TEAMMATE_MSG_RE, "").replace(/\n{3,}/g, "\n\n").trim();
1799
- }
@@ -219,14 +219,13 @@ async function waitForServerReady(statusFile: string, port: number) {
219
219
  export async function startServer(options: {
220
220
  port?: string;
221
221
  share?: boolean;
222
- config?: string;
223
222
  profile?: string;
224
223
  }) {
225
224
  // Tunnel always enabled — cloudflared shares the server publicly
226
225
  options.share = true;
227
226
 
228
227
  // Load config
229
- configService.load(options.config);
228
+ configService.load();
230
229
  const port = parseInt(options.port ?? String(configService.get("port")), 10);
231
230
  const host = configService.get("host");
232
231
 
@@ -368,11 +367,11 @@ export async function startServer(options: {
368
367
  if (process.platform === "linux") {
369
368
  // Update service file in case config changed (port, share, etc.)
370
369
  const { enableAutoStart } = await import("../services/autostart-register.ts");
371
- await enableAutoStart({ port, host, share: !!options.share, configPath: options.config, profile: options.profile });
370
+ await enableAutoStart({ port, host, share: !!options.share, profile: options.profile });
372
371
  startedViaService = true;
373
372
  } else if (process.platform === "darwin") {
374
373
  const { enableAutoStart } = await import("../services/autostart-register.ts");
375
- await enableAutoStart({ port, host, share: !!options.share, configPath: options.config, profile: options.profile });
374
+ await enableAutoStart({ port, host, share: !!options.share, profile: options.profile });
376
375
  startedViaService = true;
377
376
  }
378
377
  }
@@ -392,7 +391,7 @@ export async function startServer(options: {
392
391
  } else if (process.platform === "win32") {
393
392
  const superviseArgs = [
394
393
  "__supervise__", String(port), host,
395
- options.config ?? "", options.profile ?? "",
394
+ options.profile ?? "",
396
395
  ];
397
396
  if (options.share) superviseArgs.push("--share");
398
397
  while (superviseArgs.length > 1 && superviseArgs[superviseArgs.length - 1] === "") superviseArgs.pop();
@@ -423,7 +422,7 @@ export async function startServer(options: {
423
422
  } else {
424
423
  const superviseArgs = [
425
424
  "__supervise__", String(port), host,
426
- options.config ?? "", options.profile ?? "",
425
+ options.profile ?? "",
427
426
  ];
428
427
  if (options.share) superviseArgs.push("--share");
429
428
  while (superviseArgs.length > 1 && superviseArgs[superviseArgs.length - 1] === "") superviseArgs.pop();
@@ -508,7 +507,6 @@ export async function startServer(options: {
508
507
  const autoConfig = {
509
508
  port, host,
510
509
  share: !!options.share,
511
- configPath: options.config,
512
510
  profile: options.profile,
513
511
  };
514
512
  // skipStart: supervisor is already running from direct spawn above
@@ -532,18 +530,16 @@ if (process.argv.includes("__serve__")) {
532
530
  const idx = process.argv.indexOf("__serve__");
533
531
  const port = parseInt(process.argv[idx + 1] ?? "8080", 10);
534
532
  const host = process.argv[idx + 2] ?? "0.0.0.0";
535
- const configPath = process.argv[idx + 3] && process.argv[idx + 3] !== "_" ? process.argv[idx + 3] : undefined;
536
- const profileArg = process.argv[idx + 4] && process.argv[idx + 4] !== "_" ? process.argv[idx + 4] : undefined;
533
+ const profileRaw = process.argv[idx + 3];
534
+ const profileArg = profileRaw && profileRaw !== "_" && !profileRaw.startsWith("--") ? profileRaw : undefined;
537
535
 
538
- // Set DB profile for daemon child — explicit --profile takes priority over config-path detection
536
+ // Set DB profile for daemon child
539
537
  const { setDbProfile } = await import("../services/db.service.ts");
540
538
  if (profileArg) {
541
539
  setDbProfile(profileArg);
542
- } else if (configPath && /dev/i.test(configPath)) {
543
- setDbProfile("dev");
544
540
  }
545
541
 
546
- configService.load(configPath);
542
+ configService.load();
547
543
  await setupLogFile();
548
544
 
549
545
  // Sync externally-started tunnel URL + PID into tunnelService
@@ -9,6 +9,7 @@ import { listSlashItems, searchSlashItems, invalidateCache } from "../../service
9
9
  import { upsertSlashRecent, getSlashRecents } from "../../services/db.service.ts";
10
10
  import { getCachedUsage, refreshUsageNow } from "../../services/claude-usage.service.ts";
11
11
  import { getSessionLog } from "../../services/session-log.service.ts";
12
+ import { parseJsonlTranscript, validateJsonlPath } from "../../services/jsonl-transcript-parser.ts";
12
13
  import { getSessionProjectPath, setSessionMetadata, setSessionTitle, getPinnedSessionIds, pinSession, unpinSession, deleteSessionMapping, deleteSessionMetadata, deleteSessionTitle } from "../../services/db.service.ts";
13
14
  import { setSessionTag, bulkSetSessionTag, getTagById, getSessionTags, getProjectDefaultTagId } from "../../services/tag.service.ts";
14
15
  import { ok, err } from "../../types/api.ts";
@@ -363,6 +364,23 @@ chatRoutes.get("/sessions/:id/debug", (c) => {
363
364
  return c.json(ok({ sessionId, jsonlPath: jsonlExists ? jsonlPath : null, jsonlDir, projectPath }));
364
365
  });
365
366
 
367
+ /** GET /chat/pre-compact-messages — read and parse a JSONL transcript file (for expand-compact feature) */
368
+ chatRoutes.get("/pre-compact-messages", async (c) => {
369
+ try {
370
+ const jsonlPath = c.req.query("jsonlPath");
371
+ if (!jsonlPath) return c.json(err("jsonlPath query param required"), 400);
372
+ const validated = validateJsonlPath(jsonlPath);
373
+ const messages = await parseJsonlTranscript(validated);
374
+ return c.json(ok(messages));
375
+ } catch (e) {
376
+ const message = e instanceof Error ? e.message : "Unknown error";
377
+ const status = /not found/i.test(message) ? 404
378
+ : /denied|traversal|Invalid path|too large|Not a regular/i.test(message) ? 403
379
+ : 500;
380
+ return c.json(err(message), status);
381
+ }
382
+ });
383
+
366
384
  /** POST /chat/upload — upload files for chat attachments, returns server-side paths */
367
385
  chatRoutes.post("/upload", async (c) => {
368
386
  try {
@@ -57,6 +57,22 @@ gitRoutes.get("/file-diff", async (c) => {
57
57
  }
58
58
  });
59
59
 
60
+ /** GET /git/file-full-diff?file=&ref=
61
+ * Returns full file contents (VSCode-style) for both sides:
62
+ * { original: <ref version>, modified: <working tree> } */
63
+ gitRoutes.get("/file-full-diff", async (c) => {
64
+ try {
65
+ const projectPath = c.get("projectPath");
66
+ const file = c.req.query("file");
67
+ if (!file) return c.json(err("Missing query: file"), 400);
68
+ const ref = c.req.query("ref") || "HEAD";
69
+ const result = await gitService.fileFullDiff(projectPath, file, ref);
70
+ return c.json(ok(result));
71
+ } catch (e) {
72
+ return c.json(err((e as Error).message), 500);
73
+ }
74
+ });
75
+
60
76
  /** GET /git/graph?max=200&skip=0 */
61
77
  gitRoutes.get("/graph", async (c) => {
62
78
  try {
@@ -5,7 +5,6 @@ export interface AutoStartConfig {
5
5
  port: number;
6
6
  host: string;
7
7
  share: boolean;
8
- configPath?: string;
9
8
  profile?: string;
10
9
  }
11
10
 
@@ -44,20 +43,16 @@ export function buildExecCommand(config: AutoStartConfig): string[] {
44
43
  if (isCompiledBinary()) {
45
44
  // Compiled binary: just run self with __supervise__ args
46
45
  const args = [process.execPath, "__supervise__", String(config.port), config.host];
47
- if (config.configPath) args.push(config.configPath);
48
46
  if (config.profile) args.push(config.profile);
49
47
  if (config.share) args.push("--share");
50
48
  return args;
51
49
  }
52
50
 
53
- // Bun runtime: bun run <script> __supervise__ <port> <host> [config] [profile]
51
+ // Bun runtime: bun run <script> __supervise__ <port> <host> [profile]
54
52
  const bunPath = resolveBunPath();
55
53
  const scriptPath = resolve(import.meta.dir, "supervisor.ts");
56
54
  const args = [bunPath, "run", scriptPath, "__supervise__", String(config.port), config.host];
57
- if (config.configPath) args.push(config.configPath);
58
- else args.push(""); // placeholder
59
55
  if (config.profile) args.push(config.profile);
60
- else args.push(""); // placeholder
61
56
  if (config.share) args.push("--share");
62
57
  return args;
63
58
  }