@hienlh/ppm 0.13.12 → 0.13.13
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/.opencode/.env.example +98 -0
- package/.opencode/skills/ads-management/scripts/.env.example +13 -0
- package/.opencode/skills/ai-multimodal/.env.example +230 -0
- package/.opencode/skills/cip-design/.env.example +6 -0
- package/.opencode/skills/devops/.env.example +76 -0
- package/.opencode/skills/docs-seeker/.env.example +15 -0
- package/.opencode/skills/elevenlabs/.env.example +3 -0
- package/.opencode/skills/marketing-dashboard/.env.example +15 -0
- package/.opencode/skills/marketing-dashboard/app/.env.example +2 -0
- package/.opencode/skills/marketing-dashboard/server/.env.example +2 -0
- package/.opencode/skills/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/.opencode/skills/mcp-management/scripts/dist/cli.js +160 -0
- package/.opencode/skills/mcp-management/scripts/dist/mcp-client.js +183 -0
- package/.opencode/skills/payment-integration/scripts/.env.example +20 -0
- package/.opencode/skills/sequential-thinking/.env.example +8 -0
- package/CHANGELOG.md +5 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +30 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{ai-settings-section-ysK_Eixc.js → ai-settings-section-DR5BueEL.js} +1 -1
- package/dist/web/assets/{api-settings-D0_eiIYv.js → api-settings-DowGyuVy.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-7JKY4P1L.js +1 -0
- package/dist/web/assets/{audio-preview-BjoIjXlf.js → audio-preview-YOG6Biao.js} +1 -1
- package/dist/web/assets/chat-tab-DbdDJuLu.js +12 -0
- package/dist/web/assets/code-editor-C4nuAsy6.js +8 -0
- package/dist/web/assets/{conflict-editor-WxMZDucw.js → conflict-editor-DnGfriL5.js} +1 -1
- package/dist/web/assets/{csv-preview-7TsYBQI6.js → csv-preview-Bo-N3GHl.js} +1 -1
- package/dist/web/assets/{data-grid-overlay-editor-BjjuE4-G.js → data-grid-overlay-editor-DqcDQ9st.js} +1 -1
- package/dist/web/assets/{database-viewer-BRW8CMzC.js → database-viewer-AodppoTs.js} +1 -1
- package/dist/web/assets/diff-viewer-DykLUwna.js +4 -0
- package/dist/web/assets/{esm-zjerHxpO.js → esm-Dvc8oJly.js} +1 -1
- package/dist/web/assets/{extension-webview-DgfgR787.js → extension-webview-Bck7QuaB.js} +1 -1
- package/dist/web/assets/{file-store-BrbCNyLm.js → file-store-4BpOJthN.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-Daf9rhiF.js +1 -0
- package/dist/web/assets/{glide-data-grid-DIvkBUKj.js → glide-data-grid-BVt0mwcA.js} +7 -7
- package/dist/web/assets/{image-preview-BlBVP277.js → image-preview-DaSmrIvY.js} +1 -1
- package/dist/web/assets/index-CSK33ACc.css +2 -0
- package/dist/web/assets/index-gZKF1YKy.js +27 -0
- package/dist/web/assets/info-3K5VOQVL-gn0pjNiT.js +1 -0
- package/dist/web/assets/{input-ozrR2DAV.js → input-4ll___Gh.js} +1 -1
- package/dist/web/assets/keybindings-store-DBKLTPrk.js +1 -0
- package/dist/web/assets/{markdown-renderer-CJMJ5Qq0.js → markdown-renderer-B1me_hz2.js} +3 -3
- package/dist/web/assets/{number-overlay-editor-BoRxunFN.js → number-overlay-editor-XTjjEXtk.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-Csaeizjc.js +1 -0
- package/dist/web/assets/{pdf-preview-D0JDPYYs.js → pdf-preview-Dci7TIL1.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-DatkjxTH.js +1 -0
- package/dist/web/assets/port-forwarding-tab-BeM40G-J.js +1 -0
- package/dist/web/assets/{postgres-viewer-DkVKzTKJ.js → postgres-viewer-CGVBOwA9.js} +3 -3
- package/dist/web/assets/radar-KQ55EAFF-BnGB20hR.js +1 -0
- package/dist/web/assets/{scroll-area-7H-Q_k8c.js → scroll-area-iv39O3VN.js} +1 -1
- package/dist/web/assets/search-tM8K5zWU.js +1 -0
- package/dist/web/assets/{settings-store-Dvk8Lvwm.js → settings-store-D2MtC9tm.js} +2 -2
- package/dist/web/assets/settings-tab-CYS8VfNl.js +1 -0
- package/dist/web/assets/{sql-query-editor-BVn40O0T.js → sql-query-editor-DstPySPF.js} +1 -1
- package/dist/web/assets/sqlite-viewer-SUGEk_G1.js +1 -0
- package/dist/web/assets/{tab-store-0rGchMXr.js → tab-store-Dow2Ztto.js} +1 -1
- package/dist/web/assets/terminal-tab-CJvjF79J.js +1 -0
- package/dist/web/assets/treemap-KZPCXAKY-CgEYv38e.js +1 -0
- package/dist/web/assets/{use-blob-url-e9uTXjv5.js → use-blob-url-DGY5qKiT.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-SyJzNaNN.js → use-monaco-theme-CugUkORI.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-DsfY6y4f.js → vendor-mermaid-CPtQ2zua.js} +3 -3
- package/dist/web/assets/{video-preview-BEuZs1dG.js → video-preview-gJSKmPQr.js} +1 -1
- package/dist/web/index.html +16 -15
- package/dist/web/sw.js +1 -1
- package/docs/system-architecture.md +1 -0
- package/package.json +1 -1
- package/src/cli/commands/cloud.ts +53 -0
- package/src/cli/commands/db-cmd.ts +56 -0
- package/src/index.ts +0 -0
- package/src/providers/claude-agent-sdk.ts +12 -15
- package/src/services/cloud.service.ts +55 -0
- package/src/services/sqlite.service.ts +9 -0
- package/src/web/app.tsx +7 -0
- package/src/web/components/chat/chat-welcome.tsx +7 -140
- package/src/web/components/chat/session-list-panel.tsx +188 -0
- package/src/web/components/editor/diff-viewer.tsx +25 -26
- package/src/web/components/layout/editor-panel.tsx +10 -158
- package/bun.lock +0 -2135
- package/bunfig.toml +0 -2
- package/dist/web/assets/architecture-PBZL5I3N-DVlAZGlv.js +0 -1
- package/dist/web/assets/chat-tab-Cq8xYO7K.js +0 -12
- package/dist/web/assets/code-editor-DZ1e_sz0.js +0 -8
- package/dist/web/assets/diff-viewer-BOTb0dkG.js +0 -4
- package/dist/web/assets/gitGraph-HDMCJU4V-b3n-Tgk6.js +0 -1
- package/dist/web/assets/index-COOnLKGB.css +0 -2
- package/dist/web/assets/index-zP-OjEml.js +0 -27
- package/dist/web/assets/info-3K5VOQVL-fJy9dGkV.js +0 -1
- package/dist/web/assets/keybindings-store-Djjc6tPj.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-DMi06dVb.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-BECm43s6.js +0 -1
- package/dist/web/assets/port-forwarding-tab-DfaV6GPS.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-BwqCptkx.js +0 -1
- package/dist/web/assets/settings-tab-BFbe6ybw.js +0 -1
- package/dist/web/assets/sqlite-viewer-8oWf4JCB.js +0 -1
- package/dist/web/assets/terminal-tab-D_C7amDZ.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-Da7U3Olf.js +0 -1
- /package/dist/web/assets/{api-client-Dvzcc_EO.js → api-client-DIhJ5qVW.js} +0 -0
- /package/dist/web/assets/{data-grid-types-BTQHYBUh.js → data-grid-types-DqqspyVw.js} +0 -0
- /package/dist/web/assets/{dist-0kPgRaVx.js → dist-D1SZxtVS.js} +0 -0
- /package/dist/web/assets/{dist-DGSkE2Ml.js → dist-_jZs3YZC.js} +0 -0
- /package/dist/web/assets/{file-exclamation-point-Baz81y5z.js → file-exclamation-point-BwzaQ50n.js} +0 -0
- /package/dist/web/assets/{katex-BuytEdO1.js → katex-DzXRfQ_m.js} +0 -0
- /package/dist/web/assets/{lib-DQHnkzGy.js → lib-Dub8DlCJ.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/{sparkles-fWUT5Vzq.js → sparkles-CulWHe4c.js} +0 -0
- /package/dist/web/assets/{table-tf7pRkME.js → table-BzjWcs87.js} +0 -0
- /package/dist/web/assets/{text-wrap-BV-R4Vvy.js → text-wrap-DJz9Bgpa.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-Dyfw49hJ.js} +0 -0
- /package/dist/web/assets/{x-CG-_0yIW.js → x-BPReZWnP.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-
|
|
1
|
+
import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-BwzaQ50n.js";import"./api-client-DIhJ5qVW.js";import{B as n}from"./index-gZKF1YKy.js";import{t as r}from"./use-blob-url-DGY5qKiT.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,28 +39,29 @@
|
|
|
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-gZKF1YKy.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-CPtQ2zua.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
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
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-
|
|
49
|
+
<link rel="modulepreload" crossorigin href="/assets/x-BPReZWnP.js">
|
|
50
|
+
<link rel="modulepreload" crossorigin href="/assets/input-4ll___Gh.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-D2MtC9tm.js">
|
|
54
|
+
<link rel="modulepreload" crossorigin href="/assets/scroll-area-iv39O3VN.js">
|
|
55
55
|
<link rel="modulepreload" crossorigin href="/assets/dist-CaKCIxem.js">
|
|
56
|
-
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-
|
|
57
|
-
<link rel="modulepreload" crossorigin href="/assets/api-settings-
|
|
58
|
-
<link rel="modulepreload" crossorigin href="/assets/ai-settings-section-
|
|
56
|
+
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-BjrAbUJe.js">
|
|
57
|
+
<link rel="modulepreload" crossorigin href="/assets/api-settings-DowGyuVy.js">
|
|
58
|
+
<link rel="modulepreload" crossorigin href="/assets/ai-settings-section-DR5BueEL.js">
|
|
59
59
|
<link rel="modulepreload" crossorigin href="/assets/database-DOWH9-Vv.js">
|
|
60
60
|
<link rel="modulepreload" crossorigin href="/assets/chevron-right-DnHIvvcy.js">
|
|
61
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
62
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
63
|
-
<link rel="
|
|
61
|
+
<link rel="modulepreload" crossorigin href="/assets/search-tM8K5zWU.js">
|
|
62
|
+
<link rel="modulepreload" crossorigin href="/assets/file-store-4BpOJthN.js">
|
|
63
|
+
<link rel="modulepreload" crossorigin href="/assets/tab-store-Dow2Ztto.js">
|
|
64
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CSK33ACc.css">
|
|
64
65
|
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
|
65
66
|
<body class="bg-[#0f1419] text-[#e5e7eb] font-sans antialiased">
|
|
66
67
|
<div id="portal" style="position: fixed; left: 0; top: 0; z-index: 9999;" /></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":"4c6743a279cfd1eb8f2d8173bb57cad6","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.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":null,"url":"assets/x-CG-_0yIW.js"},{"revision":null,"url":"assets/video-preview-BEuZs1dG.js"},{"revision":null,"url":"assets/vendor-xterm-CU2c3f0A.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/vendor-ui-B-89Uj8i.js"},{"revision":null,"url":"assets/vendor-mermaid-DsfY6y4f.js"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/utils-CTg5uAYR.js"},{"revision":null,"url":"assets/use-monaco-theme-SyJzNaNN.js"},{"revision":null,"url":"assets/use-blob-url-e9uTXjv5.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-Da7U3Olf.js"},{"revision":null,"url":"assets/text-wrap-BV-R4Vvy.js"},{"revision":null,"url":"assets/terminal-tab-D_C7amDZ.js"},{"revision":null,"url":"assets/table-tf7pRkME.js"},{"revision":null,"url":"assets/tab-store-0rGchMXr.js"},{"revision":null,"url":"assets/sqlite-viewer-8oWf4JCB.js"},{"revision":null,"url":"assets/sql-query-editor-BVn40O0T.js"},{"revision":null,"url":"assets/sparkles-fWUT5Vzq.js"},{"revision":null,"url":"assets/settings-tab-BFbe6ybw.js"},{"revision":null,"url":"assets/settings-store-Dvk8Lvwm.js"},{"revision":null,"url":"assets/scroll-area-7H-Q_k8c.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/refresh-cw-LlbZDJpO.js"},{"revision":null,"url":"assets/react-GqWghJ-L.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-BwqCptkx.js"},{"revision":null,"url":"assets/postgres-viewer-DkVKzTKJ.js"},{"revision":null,"url":"assets/port-forwarding-tab-DfaV6GPS.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-BECm43s6.js"},{"revision":null,"url":"assets/pdf-preview-D0JDPYYs.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-DMi06dVb.js"},{"revision":null,"url":"assets/number-overlay-editor-BoRxunFN.js"},{"revision":null,"url":"assets/markdown-renderer-CJMJ5Qq0.js"},{"revision":null,"url":"assets/lib-DQHnkzGy.js"},{"revision":null,"url":"assets/keybindings-store-Djjc6tPj.js"},{"revision":null,"url":"assets/katex-BuytEdO1.js"},{"revision":null,"url":"assets/input-ozrR2DAV.js"},{"revision":null,"url":"assets/info-3K5VOQVL-fJy9dGkV.js"},{"revision":null,"url":"assets/index-zP-OjEml.js"},{"revision":null,"url":"assets/index-COOnLKGB.css"},{"revision":null,"url":"assets/image-preview-BlBVP277.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/glide-data-grid-DIvkBUKj.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/github-dark-dimmed.min-BrpRStFV.css"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-b3n-Tgk6.js"},{"revision":null,"url":"assets/file-store-BrbCNyLm.js"},{"revision":null,"url":"assets/file-exclamation-point-Baz81y5z.js"},{"revision":null,"url":"assets/extension-webview-DgfgR787.js"},{"revision":null,"url":"assets/esm-zjerHxpO.js"},{"revision":null,"url":"assets/dist-DGSkE2Ml.js"},{"revision":null,"url":"assets/dist-CaKCIxem.js"},{"revision":null,"url":"assets/dist-0kPgRaVx.js"},{"revision":null,"url":"assets/diff-viewer-BOTb0dkG.js"},{"revision":null,"url":"assets/database-viewer-BRW8CMzC.js"},{"revision":null,"url":"assets/database-DOWH9-Vv.js"},{"revision":null,"url":"assets/data-grid-types-BTQHYBUh.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-BjjuE4-G.js"},{"revision":null,"url":"assets/csv-preview-7TsYBQI6.js"},{"revision":null,"url":"assets/csv-parser-Dly5nqE1.js"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/conflict-editor-WxMZDucw.js"},{"revision":null,"url":"assets/code-editor-DZ1e_sz0.js"},{"revision":null,"url":"assets/code-DGBecc50.js"},{"revision":null,"url":"assets/chevron-right-DnHIvvcy.js"},{"revision":null,"url":"assets/chat-tab-Cq8xYO7K.js"},{"revision":null,"url":"assets/audio-preview-BjoIjXlf.js"},{"revision":null,"url":"assets/arrow-up-Rcw6_KKu.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-DVlAZGlv.js"},{"revision":null,"url":"assets/api-settings-D0_eiIYv.js"},{"revision":null,"url":"assets/api-client-Dvzcc_EO.js"},{"revision":null,"url":"assets/ai-settings-section-ysK_Eixc.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"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":"352cf07b856f3d16ea2f0ed94538c7fc","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/refresh-cw-BjrAbUJe.js"},{"revision":null,"url":"assets/dist-D1SZxtVS.js"},{"revision":null,"url":"assets/csv-preview-Bo-N3GHl.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/use-monaco-theme-CugUkORI.js"},{"revision":null,"url":"assets/diff-viewer-DykLUwna.js"},{"revision":null,"url":"assets/terminal-tab-CJvjF79J.js"},{"revision":null,"url":"assets/tab-store-Dow2Ztto.js"},{"revision":null,"url":"assets/data-grid-types-DqqspyVw.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-DatkjxTH.js"},{"revision":null,"url":"assets/input-4ll___Gh.js"},{"revision":null,"url":"assets/table-BzjWcs87.js"},{"revision":null,"url":"assets/text-wrap-DJz9Bgpa.js"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/sparkles-CulWHe4c.js"},{"revision":null,"url":"assets/markdown-renderer-B1me_hz2.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-7JKY4P1L.js"},{"revision":null,"url":"assets/search-tM8K5zWU.js"},{"revision":null,"url":"assets/index-gZKF1YKy.js"},{"revision":null,"url":"assets/conflict-editor-DnGfriL5.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/info-3K5VOQVL-gn0pjNiT.js"},{"revision":null,"url":"assets/database-DOWH9-Vv.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-CgEYv38e.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/number-overlay-editor-XTjjEXtk.js"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/radar-KQ55EAFF-BnGB20hR.js"},{"revision":null,"url":"assets/use-blob-url-DGY5qKiT.js"},{"revision":null,"url":"assets/glide-data-grid-BVt0mwcA.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/esm-Dvc8oJly.js"},{"revision":null,"url":"assets/file-store-4BpOJthN.js"},{"revision":null,"url":"assets/extension-webview-Bck7QuaB.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/postgres-viewer-CGVBOwA9.js"},{"revision":null,"url":"assets/react-DMIOAtcX.js"},{"revision":null,"url":"assets/port-forwarding-tab-BeM40G-J.js"},{"revision":null,"url":"assets/image-preview-DaSmrIvY.js"},{"revision":null,"url":"assets/utils-CQux7CsO.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-DqcDQ9st.js"},{"revision":null,"url":"assets/csv-parser-Dly5nqE1.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/dist-_jZs3YZC.js"},{"revision":null,"url":"assets/keybindings-store-DBKLTPrk.js"},{"revision":null,"url":"assets/code-editor-C4nuAsy6.js"},{"revision":null,"url":"assets/code-DGBecc50.js"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/github-dark-dimmed.min-BrpRStFV.css"},{"revision":null,"url":"assets/ai-settings-section-DR5BueEL.js"},{"revision":null,"url":"assets/audio-preview-YOG6Biao.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-Csaeizjc.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/arrow-up-Rcw6_KKu.js"},{"revision":null,"url":"assets/file-exclamation-point-BwzaQ50n.js"},{"revision":null,"url":"assets/api-client-DIhJ5qVW.js"},{"revision":null,"url":"assets/video-preview-gJSKmPQr.js"},{"revision":null,"url":"assets/vendor-xterm-Dyfw49hJ.js"},{"revision":null,"url":"assets/api-settings-DowGyuVy.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/vendor-mermaid-CPtQ2zua.js"},{"revision":null,"url":"assets/index-CSK33ACc.css"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/pdf-preview-Dci7TIL1.js"},{"revision":null,"url":"assets/chat-tab-DbdDJuLu.js"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/sqlite-viewer-SUGEk_G1.js"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/dist-CaKCIxem.js"},{"revision":null,"url":"assets/x-BPReZWnP.js"},{"revision":null,"url":"assets/scroll-area-iv39O3VN.js"},{"revision":null,"url":"assets/settings-store-D2MtC9tm.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-Daf9rhiF.js"},{"revision":null,"url":"assets/chevron-right-DnHIvvcy.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/database-viewer-AodppoTs.js"},{"revision":null,"url":"assets/lib-Dub8DlCJ.js"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/vendor-ui-B-89Uj8i.js"},{"revision":null,"url":"assets/sql-query-editor-DstPySPF.js"},{"revision":null,"url":"assets/settings-tab-CYS8VfNl.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/katex-DzXRfQ_m.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"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||`/`)}))});
|
|
@@ -1336,6 +1336,7 @@ ppm db connections # List all connections
|
|
|
1336
1336
|
ppm db connect # Add new connection (interactive)
|
|
1337
1337
|
ppm db remove <name> # Delete connection
|
|
1338
1338
|
ppm db query <name> <sql> # Execute query (respects readonly)
|
|
1339
|
+
ppm db run <name> <file> # Execute SQL file (multi-statement, transactions)
|
|
1339
1340
|
ppm db tables <name> # List tables
|
|
1340
1341
|
ppm db schema <name> <table> # Show table schema
|
|
1341
1342
|
ppm db data <name> <table> # Show table data (paginated)
|
package/package.json
CHANGED
|
@@ -200,4 +200,57 @@ export function registerCloudCommands(program: Command): void {
|
|
|
200
200
|
process.exit(1);
|
|
201
201
|
}
|
|
202
202
|
});
|
|
203
|
+
|
|
204
|
+
// ── alias subcommand group ────────────────────────────────────────────
|
|
205
|
+
const alias = cmd.command("alias").description("Manage machine alias (vanity URL slug)");
|
|
206
|
+
|
|
207
|
+
alias
|
|
208
|
+
.command("set <slug>")
|
|
209
|
+
.description("Set alias for this machine (e.g. ppm cloud alias set macbook)")
|
|
210
|
+
.action(async (slug: string) => {
|
|
211
|
+
try {
|
|
212
|
+
const { setAlias, getCloudDevice } = await import("../../services/cloud.service.ts");
|
|
213
|
+
const device = getCloudDevice();
|
|
214
|
+
if (!device) { console.error("Not linked. Run: ppm cloud link"); process.exit(1); }
|
|
215
|
+
const result = await setAlias(slug);
|
|
216
|
+
console.log(`Alias set: ${device.cloud_url}/${result.slug}`);
|
|
217
|
+
} catch (err: unknown) {
|
|
218
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
alias
|
|
224
|
+
.command("get")
|
|
225
|
+
.description("Show current alias for this machine")
|
|
226
|
+
.action(async () => {
|
|
227
|
+
try {
|
|
228
|
+
const { getAlias, getCloudDevice } = await import("../../services/cloud.service.ts");
|
|
229
|
+
const device = getCloudDevice();
|
|
230
|
+
if (!device) { console.error("Not linked. Run: ppm cloud link"); process.exit(1); }
|
|
231
|
+
const { slug } = await getAlias();
|
|
232
|
+
if (slug) {
|
|
233
|
+
console.log(`Current alias: ${device.cloud_url}/${slug}`);
|
|
234
|
+
} else {
|
|
235
|
+
console.log("No alias set. Run: ppm cloud alias set <slug>");
|
|
236
|
+
}
|
|
237
|
+
} catch (err: unknown) {
|
|
238
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
alias
|
|
244
|
+
.command("remove")
|
|
245
|
+
.description("Remove alias for this machine")
|
|
246
|
+
.action(async () => {
|
|
247
|
+
try {
|
|
248
|
+
const { removeAlias } = await import("../../services/cloud.service.ts");
|
|
249
|
+
await removeAlias();
|
|
250
|
+
console.log("Alias removed.");
|
|
251
|
+
} catch (err: unknown) {
|
|
252
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
203
256
|
}
|
|
@@ -363,4 +363,60 @@ export function registerDbCommands(program: Command): void {
|
|
|
363
363
|
process.exit(1);
|
|
364
364
|
}
|
|
365
365
|
});
|
|
366
|
+
|
|
367
|
+
// ── ppm db run ──────────────────────────────────────────────────────
|
|
368
|
+
db.command("run <name> <file>")
|
|
369
|
+
.description("Execute a SQL file against a saved connection")
|
|
370
|
+
.action(async (nameOrId: string, filePath: string) => {
|
|
371
|
+
try {
|
|
372
|
+
const { resolveConnection } = await import("../../services/db.service.ts");
|
|
373
|
+
const conn = resolveConnection(nameOrId);
|
|
374
|
+
if (!conn) {
|
|
375
|
+
console.error(`${C.red}Connection not found:${C.reset} ${nameOrId}`);
|
|
376
|
+
process.exit(1);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const { resolve } = await import("node:path");
|
|
380
|
+
const absFile = resolve(filePath);
|
|
381
|
+
const file = Bun.file(absFile);
|
|
382
|
+
if (!(await file.exists())) {
|
|
383
|
+
console.error(`${C.red}File not found:${C.reset} ${absFile}`);
|
|
384
|
+
process.exit(1);
|
|
385
|
+
}
|
|
386
|
+
const sql = await file.text();
|
|
387
|
+
if (!sql.trim()) {
|
|
388
|
+
console.error(`${C.yellow}File is empty:${C.reset} ${absFile}`);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Enforce readonly
|
|
393
|
+
if (conn.readonly && !isReadOnlyQuery(sql)) {
|
|
394
|
+
console.error(`${C.red}Error:${C.reset} Connection "${conn.name}" is readonly — file contains write statements.`);
|
|
395
|
+
console.error(` To allow writes, toggle the readonly switch in the PPM web UI.`);
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const cfg = parseConfig(conn);
|
|
400
|
+
console.log(`${C.cyan}Running${C.reset} ${absFile} ${C.dim}on${C.reset} ${conn.name} (${conn.type})...\n`);
|
|
401
|
+
|
|
402
|
+
if (conn.type === "postgres") {
|
|
403
|
+
const { postgresService } = await import("../../services/postgres.service.ts");
|
|
404
|
+
const result = await postgresService.executeQuery(cfg.connectionString!, sql);
|
|
405
|
+
await postgresService.closeAll();
|
|
406
|
+
if (result.changeType === "select") {
|
|
407
|
+
formatRows(result.columns, result.rows);
|
|
408
|
+
} else {
|
|
409
|
+
console.log(`${C.green}OK${C.reset} — ${result.rowsAffected} row(s) affected (${result.executionTimeMs}ms)`);
|
|
410
|
+
}
|
|
411
|
+
} else {
|
|
412
|
+
const { sqliteService } = await import("../../services/sqlite.service.ts");
|
|
413
|
+
const result = sqliteService.executeScript(cfg.path!, cfg.path!, sql);
|
|
414
|
+
sqliteService.closeAll();
|
|
415
|
+
console.log(`${C.green}OK${C.reset} — script executed (${result.executionTimeMs}ms)`);
|
|
416
|
+
}
|
|
417
|
+
} catch (err) {
|
|
418
|
+
console.error(`${C.red}Error:${C.reset}`, (err as Error).message);
|
|
419
|
+
process.exit(1);
|
|
420
|
+
}
|
|
421
|
+
});
|
|
366
422
|
}
|
package/src/index.ts
CHANGED
|
File without changes
|
|
@@ -988,9 +988,10 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
988
988
|
const retryEnv = this.buildQueryEnv(meta.projectPath, account);
|
|
989
989
|
closeCurrentStream();
|
|
990
990
|
const { generator: earlyAuthGen, controller: earlyAuthCtrl } = createMessageChannel();
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
991
|
+
// Always re-push firstMsg — SDK needs a user message from the generator
|
|
992
|
+
// even with resume (resume loads JSONL history, generator provides current turn)
|
|
993
|
+
earlyAuthCtrl.push(firstMsg);
|
|
994
|
+
const retryOpts = { ...queryOptions, sessionId: undefined, resume: sessionId, env: retryEnv };
|
|
994
995
|
const rq = query({
|
|
995
996
|
prompt: earlyAuthGen,
|
|
996
997
|
options: { ...retryOpts, ...(permissionHooks && { hooks: permissionHooks }), canUseTool } as any,
|
|
@@ -1144,9 +1145,8 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1144
1145
|
const retryEnv = this.buildQueryEnv(meta.projectPath, account);
|
|
1145
1146
|
closeCurrentStream();
|
|
1146
1147
|
const { generator: authRetryGen, controller: authRetryCtrl } = createMessageChannel();
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
const retryOpts = { ...queryOptions, sessionId: undefined, resume: hasHistory ? sessionId : undefined, env: retryEnv };
|
|
1148
|
+
authRetryCtrl.push(firstMsg);
|
|
1149
|
+
const retryOpts = { ...queryOptions, sessionId: undefined, resume: sessionId, env: retryEnv };
|
|
1150
1150
|
const rq = query({
|
|
1151
1151
|
prompt: authRetryGen,
|
|
1152
1152
|
options: { ...retryOpts, ...(permissionHooks && { hooks: permissionHooks }), canUseTool } as any,
|
|
@@ -1184,9 +1184,8 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1184
1184
|
closeCurrentStream();
|
|
1185
1185
|
const rlRetryEnv = this.buildQueryEnv(meta.projectPath, account);
|
|
1186
1186
|
const { generator: rlRetryGen, controller: rlRetryCtrl } = createMessageChannel();
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
const retryOpts = { ...queryOptions, sessionId: undefined, resume: rlHasHistory ? sessionId : undefined, env: rlRetryEnv };
|
|
1187
|
+
rlRetryCtrl.push(firstMsg);
|
|
1188
|
+
const retryOpts = { ...queryOptions, sessionId: undefined, resume: sessionId, env: rlRetryEnv };
|
|
1190
1189
|
const rq = query({
|
|
1191
1190
|
prompt: rlRetryGen,
|
|
1192
1191
|
options: { ...retryOpts, ...(permissionHooks && { hooks: permissionHooks }), canUseTool } as any,
|
|
@@ -1280,9 +1279,8 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1280
1279
|
closeCurrentStream();
|
|
1281
1280
|
const rlRetryEnv = this.buildQueryEnv(meta.projectPath, account);
|
|
1282
1281
|
const { generator: rlRetryGen, controller: rlRetryCtrl } = createMessageChannel();
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
const retryOpts = { ...queryOptions, sessionId: undefined, resume: rlHasHistory2 ? sessionId : undefined, env: rlRetryEnv };
|
|
1282
|
+
rlRetryCtrl.push(firstMsg);
|
|
1283
|
+
const retryOpts = { ...queryOptions, sessionId: undefined, resume: sessionId, env: rlRetryEnv };
|
|
1286
1284
|
const rq = query({
|
|
1287
1285
|
prompt: rlRetryGen,
|
|
1288
1286
|
options: { ...retryOpts, ...(permissionHooks && { hooks: permissionHooks }), canUseTool } as any,
|
|
@@ -1309,9 +1307,8 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1309
1307
|
closeCurrentStream();
|
|
1310
1308
|
const retryEnv = this.buildQueryEnv(meta.projectPath, account);
|
|
1311
1309
|
const { generator: authRetryGen2, controller: authRetryCtrl2 } = createMessageChannel();
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
const retryOpts = { ...queryOptions, sessionId: undefined, resume: authHasHistory2 ? sessionId : undefined, env: retryEnv };
|
|
1310
|
+
authRetryCtrl2.push(firstMsg);
|
|
1311
|
+
const retryOpts = { ...queryOptions, sessionId: undefined, resume: sessionId, env: retryEnv };
|
|
1315
1312
|
const rq = query({
|
|
1316
1313
|
prompt: authRetryGen2,
|
|
1317
1314
|
options: { ...retryOpts, ...(permissionHooks && { hooks: permissionHooks }), canUseTool } as any,
|
|
@@ -426,6 +426,61 @@ export function stopHeartbeat(): void {
|
|
|
426
426
|
}
|
|
427
427
|
}
|
|
428
428
|
|
|
429
|
+
// ─── Alias Management ───────────────────────────────────────────────────
|
|
430
|
+
|
|
431
|
+
/** Set or update device alias slug. Uses secret_key auth (no JWT needed). */
|
|
432
|
+
export async function setAlias(slug: string): Promise<{ slug: string }> {
|
|
433
|
+
const device = getCloudDevice();
|
|
434
|
+
if (!device) throw new Error("Not linked to PPM Cloud. Run: ppm cloud link");
|
|
435
|
+
|
|
436
|
+
const res = await fetch(`${device.cloud_url}/api/devices/${device.device_id}/slug`, {
|
|
437
|
+
method: "PATCH",
|
|
438
|
+
headers: { "Content-Type": "application/json" },
|
|
439
|
+
body: JSON.stringify({ slug, secret_key: device.secret_key }),
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
const data = await res.json() as { slug?: string; error?: string };
|
|
443
|
+
if (!res.ok) throw new Error(data.error ?? `HTTP ${res.status}`);
|
|
444
|
+
return { slug: data.slug! };
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/** Remove device alias slug. Uses secret_key auth (no JWT needed). */
|
|
448
|
+
export async function removeAlias(): Promise<void> {
|
|
449
|
+
const device = getCloudDevice();
|
|
450
|
+
if (!device) throw new Error("Not linked to PPM Cloud. Run: ppm cloud link");
|
|
451
|
+
|
|
452
|
+
const res = await fetch(`${device.cloud_url}/api/devices/${device.device_id}/slug`, {
|
|
453
|
+
method: "PATCH",
|
|
454
|
+
headers: { "Content-Type": "application/json" },
|
|
455
|
+
body: JSON.stringify({ slug: null, secret_key: device.secret_key }),
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
if (!res.ok) {
|
|
459
|
+
const data = await res.json() as { error?: string };
|
|
460
|
+
throw new Error(data.error ?? `HTTP ${res.status}`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/** Get current device alias slug. Uses JWT auth. */
|
|
465
|
+
export async function getAlias(): Promise<{ slug: string | null }> {
|
|
466
|
+
const device = getCloudDevice();
|
|
467
|
+
if (!device) throw new Error("Not linked to PPM Cloud. Run: ppm cloud link");
|
|
468
|
+
|
|
469
|
+
const auth = getCloudAuth();
|
|
470
|
+
if (!auth) throw new Error("Not logged in. Run: ppm cloud login");
|
|
471
|
+
|
|
472
|
+
const res = await fetch(`${device.cloud_url}/api/devices/${device.device_id}/slug`, {
|
|
473
|
+
headers: { Authorization: `Bearer ${auth.access_token}` },
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
if (!res.ok) {
|
|
477
|
+
if (res.status === 401) throw new Error("Session expired. Run: ppm cloud login");
|
|
478
|
+
throw new Error(`HTTP ${res.status}`);
|
|
479
|
+
}
|
|
480
|
+
const data = await res.json() as { slug?: string | null };
|
|
481
|
+
return { slug: data.slug ?? null };
|
|
482
|
+
}
|
|
483
|
+
|
|
429
484
|
// ─── Helpers ────────────────────────────────────────────────────────────
|
|
430
485
|
|
|
431
486
|
function ensurePpmDir(): void {
|
|
@@ -140,6 +140,15 @@ class SqliteService {
|
|
|
140
140
|
return { columns: [], rows: [], rowsAffected: result.changes, changeType: "modify", executionTimeMs };
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
/** Execute multi-statement SQL script (no result rows returned) */
|
|
144
|
+
executeScript(projectPath: string, dbPath: string, sql: string): { executionTimeMs: number } {
|
|
145
|
+
const abs = this.resolvePath(projectPath, dbPath);
|
|
146
|
+
const db = this.open(abs);
|
|
147
|
+
const start = performance.now();
|
|
148
|
+
db.exec(sql);
|
|
149
|
+
return { executionTimeMs: Math.round(performance.now() - start) };
|
|
150
|
+
}
|
|
151
|
+
|
|
143
152
|
/** Update a single cell value */
|
|
144
153
|
updateCell(
|
|
145
154
|
projectPath: string, dbPath: string, table: string,
|
package/src/web/app.tsx
CHANGED
|
@@ -246,6 +246,13 @@ export function App() {
|
|
|
246
246
|
{/* Upgrade banner — shown when new version available */}
|
|
247
247
|
<UpgradeBanner onVisibilityChange={setUpgradeBannerVisible} />
|
|
248
248
|
|
|
249
|
+
{/* Beta ribbon — top-left on desktop, top-right on mobile */}
|
|
250
|
+
<div className="fixed z-50 overflow-hidden pointer-events-none max-md:right-0 max-md:top-0 md:left-0 md:top-0 w-10 h-10">
|
|
251
|
+
<div className="absolute flex items-center justify-center max-md:rotate-45 max-md:right-[-18px] max-md:top-[4px] md:-rotate-45 md:left-[-18px] md:top-[4px] w-[60px] bg-amber-500 text-white text-[6px] font-bold leading-none py-[2.5px] shadow-sm">
|
|
252
|
+
BETA
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
249
256
|
{/* Mobile device name badge — floating top-left */}
|
|
250
257
|
{deviceName && (
|
|
251
258
|
<div className={cn("md:hidden fixed left-0 z-50 px-2 py-0.5 bg-primary/80 text-primary-foreground text-[10px] font-medium rounded-br transition-[top]", upgradeBannerVisible ? "top-7" : "top-0")}>
|