@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.
- package/CHANGELOG.md +17 -0
- package/bun.lock +2062 -0
- package/bunfig.toml +2 -0
- package/dist/web/assets/ai-settings-section-NNWp6nw7.js +1 -0
- package/dist/web/assets/{api-settings-DAk7D-NP.js → api-settings-C3T95dWg.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-DDuzYaUV.js +1 -0
- package/dist/web/assets/{audio-preview-DnQmf9fu.js → audio-preview-BkbgGtDH.js} +1 -1
- package/dist/web/assets/chat-tab-BZlP1qjX.js +12 -0
- package/dist/web/assets/chevron-up-BWBvMZkp.js +1 -0
- package/dist/web/assets/{code-editor-B-lU1fz3.js → code-editor-BtspASkW.js} +4 -4
- package/dist/web/assets/{conflict-editor-BYzf3LuW.js → conflict-editor-Dgsu6fmj.js} +1 -1
- package/dist/web/assets/{csv-preview-HMSavgBb.js → csv-preview-DcWCjQkZ.js} +1 -1
- package/dist/web/assets/{database-viewer-DjvnIn8p.js → database-viewer-C85RxdMV.js} +2 -2
- package/dist/web/assets/diff-viewer-2pPy97Tl.js +4 -0
- package/dist/web/assets/{esm-K1XIK4vc.js → esm-_CLpyLJ_.js} +1 -1
- package/dist/web/assets/{extension-store-3yZYn07W.js → extension-store-BZDZ9QRc.js} +1 -1
- package/dist/web/assets/{extension-webview-4xMREn_x.js → extension-webview-U1lMYZ0p.js} +1 -1
- package/dist/web/assets/{file-store-BrbCNyLm.js → file-store-4BpOJthN.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-BURAevTc.js +1 -0
- package/dist/web/assets/{image-preview-CkS2PVdQ.js → image-preview-BcT1SbY2.js} +1 -1
- package/dist/web/assets/index-BWSRKVZn.js +23 -0
- package/dist/web/assets/index-b6tIZImC.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-tSD4Fpi3.js +1 -0
- package/dist/web/assets/{input-Dk49gO8E.js → input-2eDVjcRZ.js} +1 -1
- package/dist/web/assets/{keybindings-store-B-zET-0o.js → keybindings-store-BOG1yviy.js} +1 -1
- package/dist/web/assets/keybindings-store-BvdUoEC7.js +1 -0
- package/dist/web/assets/{markdown-renderer-Bj2B05Km.js → markdown-renderer-Dbam_-04.js} +3 -3
- package/dist/web/assets/packet-RMMSAZCW-DmDLZUrV.js +1 -0
- package/dist/web/assets/{pdf-preview-CCyw5cuH.js → pdf-preview-BmHVGx32.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-w03Pc9ZR.js +1 -0
- package/dist/web/assets/{port-forwarding-tab-Cebb5Eix.js → port-forwarding-tab-Dkq1upWC.js} +1 -1
- package/dist/web/assets/{postgres-viewer-BrOiliEv.js → postgres-viewer-BgBJAJ9q.js} +3 -3
- package/dist/web/assets/pre-compact-button-Dp7Hs49L.js +1 -0
- package/dist/web/assets/pre-compact-section-DnM5fGSR.js +1 -0
- package/dist/web/assets/radar-KQ55EAFF-C9XQvoey.js +1 -0
- package/dist/web/assets/{scroll-area-BEllam7_.js → scroll-area-CdxNNnN-.js} +1 -1
- package/dist/web/assets/{settings-store-BLLR7ed8.js → settings-store-CMAssqyb.js} +2 -2
- package/dist/web/assets/settings-tab-zYWKTq5z.js +1 -0
- package/dist/web/assets/{sql-query-editor-CVAnRFbi.js → sql-query-editor-b7zJ8XPp.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-OEVq_-Po.js → sqlite-viewer-4lLAz1es.js} +1 -1
- package/dist/web/assets/{tab-store-B3M9hjho.js → tab-store-DNBsLdPn.js} +1 -1
- package/dist/web/assets/{terminal-tab-MjmJaQyA.js → terminal-tab-BtnqkN1H.js} +1 -1
- package/dist/web/assets/treemap-KZPCXAKY-lmftxSky.js +1 -0
- package/dist/web/assets/{use-blob-url-e9uTXjv5.js → use-blob-url-QX-XajU8.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-BkZDwoVd.js → use-monaco-theme-D68oX3XU.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-Dx86tuVP.js → vendor-mermaid-sQS4C_iL.js} +2 -2
- package/dist/web/assets/{video-preview-B819qvlp.js → video-preview-CkOKvVLt.js} +1 -1
- package/dist/web/index.html +18 -18
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/cli/commands/autostart.ts +1 -3
- package/src/cli/commands/init.ts +5 -8
- package/src/cli/commands/restart.ts +4 -5
- package/src/index.ts +0 -5
- package/src/providers/claude-agent-sdk.ts +1 -135
- package/src/server/index.ts +9 -13
- package/src/server/routes/chat.ts +18 -0
- package/src/server/routes/git.ts +16 -0
- package/src/services/autostart-generator.ts +1 -6
- package/src/services/config.service.ts +3 -96
- package/src/services/git.service.ts +34 -0
- package/src/services/jsonl-transcript-parser.ts +216 -0
- package/src/services/ppmbot/cli-reference-default.ts +1 -4
- package/src/services/supervisor.ts +5 -6
- package/src/web/components/chat/message-list.tsx +41 -2
- package/src/web/components/chat/pre-compact-button.tsx +50 -0
- package/src/web/components/chat/pre-compact-section.tsx +69 -0
- package/src/web/components/editor/diff-viewer.tsx +21 -5
- package/dist/web/assets/ai-settings-section-QE6nBNgN.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-DvZbltvY.js +0 -1
- package/dist/web/assets/chat-tab-Cf6T3mGO.js +0 -12
- package/dist/web/assets/diff-viewer-CP2jcR5J.js +0 -4
- package/dist/web/assets/gitGraph-HDMCJU4V-BxhdxFgj.js +0 -1
- package/dist/web/assets/index-BTjuH4fn.css +0 -2
- package/dist/web/assets/index-FGlF8IWZ.js +0 -23
- package/dist/web/assets/info-3K5VOQVL-BwAZ2zd8.js +0 -1
- package/dist/web/assets/keybindings-store-DaBV6qhz.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-tx2n5Qry.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-D6S2MqVT.js +0 -1
- package/dist/web/assets/plus-51UQ45rf.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-BviZcL-b.js +0 -1
- package/dist/web/assets/settings-tab-D0XjupJm.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-CM54VdaB.js +0 -1
- /package/dist/web/assets/{api-client-Dvzcc_EO.js → api-client-DIhJ5qVW.js} +0 -0
- /package/dist/web/assets/{csv-parser--2WJNgS7.js → csv-parser-B5QW8pZ6.js} +0 -0
- /package/dist/web/assets/{dist-im4ynINo.js → dist-GtkSekuX.js} +0 -0
- /package/dist/web/assets/{katex-CKoArbIw.js → katex-C3cZrCvP.js} +0 -0
- /package/dist/web/assets/{lib-DQHnkzGy.js → lib-Bu71-TFS.js} +0 -0
- /package/dist/web/assets/{react-GqWghJ-L.js → react-DMIOAtcX.js} +0 -0
- /package/dist/web/assets/{refresh-cw-LlbZDJpO.js → refresh-cw-BjrAbUJe.js} +0 -0
- /package/dist/web/assets/{sql-completion-provider-C3cq9j99.js → sql-completion-provider-CULTsCqR.js} +0 -0
- /package/dist/web/assets/{table-Dq575bPF.js → table-tf7pRkME.js} +0 -0
- /package/dist/web/assets/{text-wrap-Cn6BNQfq.js → text-wrap-BV-R4Vvy.js} +0 -0
- /package/dist/web/assets/{trash-2-CJYoLw7Q.js → trash-2-DjQOpgUV.js} +0 -0
- /package/dist/web/assets/{utils-CTg5uAYR.js → utils-CQux7CsO.js} +0 -0
- /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-
|
|
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};
|
package/dist/web/index.html
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
51
|
-
<link rel="modulepreload" crossorigin href="/assets/react-
|
|
52
|
-
<link rel="modulepreload" crossorigin href="/assets/api-client-
|
|
53
|
-
<link rel="modulepreload" crossorigin href="/assets/settings-store-
|
|
54
|
-
<link rel="modulepreload" crossorigin href="/assets/scroll-area-
|
|
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/
|
|
57
|
-
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-
|
|
58
|
-
<link rel="modulepreload" crossorigin href="/assets/trash-2-
|
|
59
|
-
<link rel="modulepreload" crossorigin href="/assets/api-settings-
|
|
60
|
-
<link rel="modulepreload" crossorigin href="/assets/ai-settings-section-
|
|
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-
|
|
64
|
-
<link rel="modulepreload" crossorigin href="/assets/file-store-
|
|
65
|
-
<link rel="modulepreload" crossorigin href="/assets/keybindings-store-
|
|
66
|
-
<link rel="modulepreload" crossorigin href="/assets/tab-store-
|
|
67
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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
|
@@ -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(
|
|
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
|
|
package/src/cli/commands/init.ts
CHANGED
|
@@ -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
|
-
|
|
28
|
-
} catch {
|
|
29
|
-
|
|
30
|
-
|
|
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: {
|
|
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(
|
|
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
|
|
208
|
-
: ["run", P.serverScript, "__serve__", String(P.port), P.host
|
|
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
|
-
}
|
package/src/server/index.ts
CHANGED
|
@@ -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(
|
|
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,
|
|
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,
|
|
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.
|
|
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.
|
|
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
|
|
536
|
-
const profileArg =
|
|
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
|
|
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(
|
|
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 {
|
package/src/server/routes/git.ts
CHANGED
|
@@ -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> [
|
|
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
|
}
|