@hienlh/ppm 0.13.50 → 0.13.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/http-api.md +1 -1
  4. package/dist/web/assets/ai-settings-section-AuV6Lzz2.js +1 -2
  5. package/dist/web/assets/api-client-DIhJ5qVW.js +1 -2
  6. package/dist/web/assets/api-settings-C3T95dWg.js +1 -2
  7. package/dist/web/assets/arrow-up-Rcw6_KKu.js +1 -2
  8. package/dist/web/assets/{audio-preview-CILFIsuu.js → audio-preview-BQWWkcm0.js} +1 -2
  9. package/dist/web/assets/{chat-tab-DBYwH_Aa.js → chat-tab-B-QMa-uT.js} +5 -6
  10. package/dist/web/assets/chevron-right-DnHIvvcy.js +1 -2
  11. package/dist/web/assets/code-DGBecc50.js +1 -2
  12. package/dist/web/assets/{code-editor-MXnkYRLp.js → code-editor-DChspYxh.js} +3 -4
  13. package/dist/web/assets/{conflict-editor-C6wH5wV6.js → conflict-editor-C1dZ8tsU.js} +2 -3
  14. package/dist/web/assets/createLucideIcon-BjHrJDVb.js +1 -2
  15. package/dist/web/assets/csv-parser-Dly5nqE1.js +1 -2
  16. package/dist/web/assets/csv-preview-B3Dyhgho.js +1 -2
  17. package/dist/web/assets/data-grid-overlay-editor-C1UUm7Ob.js +1 -2
  18. package/dist/web/assets/data-grid-types-D2cHE8hx.js +1 -2
  19. package/dist/web/assets/database-DOWH9-Vv.js +1 -2
  20. package/dist/web/assets/{database-viewer-BjUruZLv.js → database-viewer-2KW73oEG.js} +1 -2
  21. package/dist/web/assets/{diff-viewer-B_nU7bQi.js → diff-viewer-BMla30lw.js} +2 -3
  22. package/dist/web/assets/dist-BoIkGNC8.js +1 -2
  23. package/dist/web/assets/dist-DVk8T0R5.js +1 -2
  24. package/dist/web/assets/esm-DCbn6xno.js +1 -2
  25. package/dist/web/assets/{extension-webview-B56ZfvoD.js → extension-webview-DpaCcCXq.js} +2 -3
  26. package/dist/web/assets/file-exclamation-point-BwzaQ50n.js +1 -2
  27. package/dist/web/assets/file-store-DOxcU_7s.js +1 -2
  28. package/dist/web/assets/{glide-data-grid-D-qQqqp7.js → glide-data-grid-D08bJMrD.js} +2 -3
  29. package/dist/web/assets/globe-B4Ilypbs.js +1 -2
  30. package/dist/web/assets/{image-preview-Dc6AiqYX.js → image-preview-DVQkHkSo.js} +1 -2
  31. package/dist/web/assets/{index-8_rE2Q1-.js → index-U7GK_3ED.js} +3 -4
  32. package/dist/web/assets/input-_LFQwhzd.js +1 -2
  33. package/dist/web/assets/katex-C10ndCVt.js +1 -2
  34. package/dist/web/assets/keybindings-store-B9gpby19.js +1 -0
  35. package/dist/web/assets/lib-C2D8j3K3.js +1 -2
  36. package/dist/web/assets/{markdown-renderer-CNQ8I0Dk.js → markdown-renderer-B4_rx1aO.js} +2 -3
  37. package/dist/web/assets/notification-store-7WlicqzJ.js +1 -0
  38. package/dist/web/assets/number-overlay-editor-CyEqxXcg.js +1 -2
  39. package/dist/web/assets/panel-store-C8wwxBpn.js +1 -2
  40. package/dist/web/assets/{pdf-preview-zs9QdgDp.js → pdf-preview-D16LLBdq.js} +1 -2
  41. package/dist/web/assets/{port-forwarding-tab-sArYx1nt.js → port-forwarding-tab-CoKoquJZ.js} +1 -2
  42. package/dist/web/assets/{postgres-viewer-khk7N7cd.js → postgres-viewer-B45DfArf.js} +2 -3
  43. package/dist/web/assets/react-DMIOAtcX.js +1 -2
  44. package/dist/web/assets/refresh-cw-BjrAbUJe.js +1 -2
  45. package/dist/web/assets/scroll-area-BDi_FNzr.js +1 -2
  46. package/dist/web/assets/search-tM8K5zWU.js +1 -2
  47. package/dist/web/assets/settings-store-8FpQDjEA.js +1 -2
  48. package/dist/web/assets/{settings-tab-CGWhVzQm.js → settings-tab-Dc8TBxJQ.js} +1 -1
  49. package/dist/web/assets/sparkles-CulWHe4c.js +1 -2
  50. package/dist/web/assets/{sql-query-editor-B5Ndypxp.js → sql-query-editor-DMk0nmOO.js} +2 -3
  51. package/dist/web/assets/{sqlite-viewer-BkpONSGa.js → sqlite-viewer-G81XimpL.js} +1 -2
  52. package/dist/web/assets/tab-store-CNas5Ny8.js +1 -2
  53. package/dist/web/assets/table-BzjWcs87.js +1 -2
  54. package/dist/web/assets/{terminal-tab-BgMCsdeN.js → terminal-tab-rslAfxoV.js} +2 -3
  55. package/dist/web/assets/text-wrap-DJz9Bgpa.js +1 -2
  56. package/dist/web/assets/use-blob-url-DB4nNruT.js +1 -2
  57. package/dist/web/assets/use-monaco-theme-DEI-tJAh.js +1 -2
  58. package/dist/web/assets/utils-CQux7CsO.js +1 -2
  59. package/dist/web/assets/vendor-markdown-0Mxgxy0L.js +1 -2
  60. package/dist/web/assets/vendor-mermaid-D2KKkqNs.js +1 -2
  61. package/dist/web/assets/vendor-ui-UXCWAcmi.js +1 -2
  62. package/dist/web/assets/vendor-xterm-D1P36hcr.js +1 -2
  63. package/dist/web/assets/{video-preview-w8ZAy8av.js → video-preview-vjw8RpLK.js} +1 -2
  64. package/dist/web/assets/x-BPReZWnP.js +1 -2
  65. package/dist/web/index.html +1 -1
  66. package/dist/web/sw.js +1 -2
  67. package/package.json +1 -1
  68. package/src/web/components/chat/chat-tab.tsx +6 -4
  69. package/src/web/components/layout/tab-pool.tsx +1 -1
  70. package/src/web/hooks/use-chat.ts +7 -6
  71. package/vite.config.ts +1 -1
  72. package/dist/web/assets/ai-settings-section-AuV6Lzz2.js.map +0 -1
  73. package/dist/web/assets/api-client-DIhJ5qVW.js.map +0 -1
  74. package/dist/web/assets/api-settings-C3T95dWg.js.map +0 -1
  75. package/dist/web/assets/arrow-up-Rcw6_KKu.js.map +0 -1
  76. package/dist/web/assets/audio-preview-CILFIsuu.js.map +0 -1
  77. package/dist/web/assets/chat-tab-DBYwH_Aa.js.map +0 -1
  78. package/dist/web/assets/chevron-right-DnHIvvcy.js.map +0 -1
  79. package/dist/web/assets/code-DGBecc50.js.map +0 -1
  80. package/dist/web/assets/code-editor-MXnkYRLp.js.map +0 -1
  81. package/dist/web/assets/conflict-editor-C6wH5wV6.js.map +0 -1
  82. package/dist/web/assets/createLucideIcon-BjHrJDVb.js.map +0 -1
  83. package/dist/web/assets/csv-parser-Dly5nqE1.js.map +0 -1
  84. package/dist/web/assets/csv-preview-B3Dyhgho.js.map +0 -1
  85. package/dist/web/assets/data-grid-overlay-editor-C1UUm7Ob.js.map +0 -1
  86. package/dist/web/assets/data-grid-types-D2cHE8hx.js.map +0 -1
  87. package/dist/web/assets/database-DOWH9-Vv.js.map +0 -1
  88. package/dist/web/assets/database-viewer-BjUruZLv.js.map +0 -1
  89. package/dist/web/assets/diff-viewer-B_nU7bQi.js.map +0 -1
  90. package/dist/web/assets/dist-BoIkGNC8.js.map +0 -1
  91. package/dist/web/assets/dist-DVk8T0R5.js.map +0 -1
  92. package/dist/web/assets/esm-DCbn6xno.js.map +0 -1
  93. package/dist/web/assets/extension-webview-B56ZfvoD.js.map +0 -1
  94. package/dist/web/assets/file-exclamation-point-BwzaQ50n.js.map +0 -1
  95. package/dist/web/assets/file-store-DOxcU_7s.js.map +0 -1
  96. package/dist/web/assets/glide-data-grid-D-qQqqp7.js.map +0 -1
  97. package/dist/web/assets/globe-B4Ilypbs.js.map +0 -1
  98. package/dist/web/assets/image-preview-Dc6AiqYX.js.map +0 -1
  99. package/dist/web/assets/index-8_rE2Q1-.js.map +0 -1
  100. package/dist/web/assets/input-_LFQwhzd.js.map +0 -1
  101. package/dist/web/assets/katex-C10ndCVt.js.map +0 -1
  102. package/dist/web/assets/keybindings-store-COJD5O6M.js +0 -1
  103. package/dist/web/assets/lib-C2D8j3K3.js.map +0 -1
  104. package/dist/web/assets/markdown-renderer-CNQ8I0Dk.js.map +0 -1
  105. package/dist/web/assets/notification-store-BiZaLXop.js +0 -1
  106. package/dist/web/assets/number-overlay-editor-CyEqxXcg.js.map +0 -1
  107. package/dist/web/assets/panel-store-C8wwxBpn.js.map +0 -1
  108. package/dist/web/assets/pdf-preview-zs9QdgDp.js.map +0 -1
  109. package/dist/web/assets/port-forwarding-tab-sArYx1nt.js.map +0 -1
  110. package/dist/web/assets/postgres-viewer-khk7N7cd.js.map +0 -1
  111. package/dist/web/assets/react-DMIOAtcX.js.map +0 -1
  112. package/dist/web/assets/refresh-cw-BjrAbUJe.js.map +0 -1
  113. package/dist/web/assets/scroll-area-BDi_FNzr.js.map +0 -1
  114. package/dist/web/assets/search-tM8K5zWU.js.map +0 -1
  115. package/dist/web/assets/settings-store-8FpQDjEA.js.map +0 -1
  116. package/dist/web/assets/sparkles-CulWHe4c.js.map +0 -1
  117. package/dist/web/assets/sql-query-editor-B5Ndypxp.js.map +0 -1
  118. package/dist/web/assets/sqlite-viewer-BkpONSGa.js.map +0 -1
  119. package/dist/web/assets/tab-store-CNas5Ny8.js.map +0 -1
  120. package/dist/web/assets/table-BzjWcs87.js.map +0 -1
  121. package/dist/web/assets/terminal-tab-BgMCsdeN.js.map +0 -1
  122. package/dist/web/assets/text-wrap-DJz9Bgpa.js.map +0 -1
  123. package/dist/web/assets/use-blob-url-DB4nNruT.js.map +0 -1
  124. package/dist/web/assets/use-monaco-theme-DEI-tJAh.js.map +0 -1
  125. package/dist/web/assets/utils-CQux7CsO.js.map +0 -1
  126. package/dist/web/assets/vendor-markdown-0Mxgxy0L.js.map +0 -1
  127. package/dist/web/assets/vendor-mermaid-D2KKkqNs.js.map +0 -1
  128. package/dist/web/assets/vendor-ui-UXCWAcmi.js.map +0 -1
  129. package/dist/web/assets/vendor-xterm-D1P36hcr.js.map +0 -1
  130. package/dist/web/assets/video-preview-w8ZAy8av.js.map +0 -1
  131. package/dist/web/assets/x-BPReZWnP.js.map +0 -1
  132. package/dist/web/sw.js.map +0 -1
package/dist/web/sw.js CHANGED
@@ -1,2 +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":"be912fbe9b241984d45d42adc15f1561","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/refresh-cw-BjrAbUJe.js"},{"revision":null,"url":"assets/panel-store-C8wwxBpn.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/input-_LFQwhzd.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-C1UUm7Ob.js"},{"revision":null,"url":"assets/esm-DCbn6xno.js"},{"revision":null,"url":"assets/glide-data-grid-D-qQqqp7.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/treemap-KZPCXAKY-BvDgIWW9.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-BJj3FH_w.js"},{"revision":null,"url":"assets/sparkles-CulWHe4c.js"},{"revision":null,"url":"assets/use-blob-url-DB4nNruT.js"},{"revision":null,"url":"assets/number-overlay-editor-CyEqxXcg.js"},{"revision":null,"url":"assets/search-tM8K5zWU.js"},{"revision":null,"url":"assets/globe-B4Ilypbs.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/database-DOWH9-Vv.js"},{"revision":null,"url":"assets/code-editor-MXnkYRLp.js"},{"revision":null,"url":"assets/image-preview-Dc6AiqYX.js"},{"revision":null,"url":"assets/dist-DVk8T0R5.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/scroll-area-BDi_FNzr.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-fAJMexNi.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/audio-preview-CILFIsuu.js"},{"revision":null,"url":"assets/sqlite-viewer-BkpONSGa.js"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/sql-query-editor-B5Ndypxp.js"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/settings-store-8FpQDjEA.js"},{"revision":null,"url":"assets/file-store-DOxcU_7s.js"},{"revision":null,"url":"assets/vendor-mermaid-D2KKkqNs.js"},{"revision":null,"url":"assets/dist-BoIkGNC8.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/vendor-xterm-D1P36hcr.js"},{"revision":null,"url":"assets/chat-tab-DBYwH_Aa.js"},{"revision":null,"url":"assets/lib-C2D8j3K3.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/ai-settings-section-AuV6Lzz2.js"},{"revision":null,"url":"assets/pdf-preview-zs9QdgDp.js"},{"revision":null,"url":"assets/terminal-tab-BgMCsdeN.js"},{"revision":null,"url":"assets/conflict-editor-C6wH5wV6.js"},{"revision":null,"url":"assets/index-8_rE2Q1-.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/react-DMIOAtcX.js"},{"revision":null,"url":"assets/utils-CQux7CsO.js"},{"revision":null,"url":"assets/csv-parser-Dly5nqE1.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/use-monaco-theme-DEI-tJAh.js"},{"revision":null,"url":"assets/vendor-ui-UXCWAcmi.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/port-forwarding-tab-sArYx1nt.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/radar-KQ55EAFF-DkybKTt9.js"},{"revision":null,"url":"assets/info-3K5VOQVL-D8uyBfC_.js"},{"revision":null,"url":"assets/csv-preview-B3Dyhgho.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/markdown-renderer-CNQ8I0Dk.js"},{"revision":null,"url":"assets/tab-store-CNas5Ny8.js"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/data-grid-types-D2cHE8hx.js"},{"revision":null,"url":"assets/extension-webview-B56ZfvoD.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-ClRAoBAn.js"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/video-preview-w8ZAy8av.js"},{"revision":null,"url":"assets/settings-tab-CGWhVzQm.js"},{"revision":null,"url":"assets/database-viewer-BjUruZLv.js"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-BKfHRBz7.js"},{"revision":null,"url":"assets/notification-store-BiZaLXop.js"},{"revision":null,"url":"assets/x-BPReZWnP.js"},{"revision":null,"url":"assets/chevron-right-DnHIvvcy.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/api-settings-C3T95dWg.js"},{"revision":null,"url":"assets/katex-C10ndCVt.js"},{"revision":null,"url":"assets/diff-viewer-B_nU7bQi.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/postgres-viewer-khk7N7cd.js"},{"revision":null,"url":"assets/index-CKKoR3gY.css"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/keybindings-store-COJD5O6M.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":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","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.svg`,badge:`/icon-192.svg`,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||`/`)}))});
2
- //# sourceMappingURL=sw.js.map
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":"447c29e3e218b9621795fb2ed31379bf","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/refresh-cw-BjrAbUJe.js"},{"revision":null,"url":"assets/panel-store-C8wwxBpn.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/image-preview-DVQkHkSo.js"},{"revision":null,"url":"assets/input-_LFQwhzd.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-C1UUm7Ob.js"},{"revision":null,"url":"assets/esm-DCbn6xno.js"},{"revision":null,"url":"assets/settings-tab-Dc8TBxJQ.js"},{"revision":null,"url":"assets/table-BzjWcs87.js"},{"revision":null,"url":"assets/glide-data-grid-D08bJMrD.js"},{"revision":null,"url":"assets/text-wrap-DJz9Bgpa.js"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/treemap-KZPCXAKY-BvDgIWW9.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-BJj3FH_w.js"},{"revision":null,"url":"assets/sparkles-CulWHe4c.js"},{"revision":null,"url":"assets/sql-query-editor-DMk0nmOO.js"},{"revision":null,"url":"assets/use-blob-url-DB4nNruT.js"},{"revision":null,"url":"assets/number-overlay-editor-CyEqxXcg.js"},{"revision":null,"url":"assets/search-tM8K5zWU.js"},{"revision":null,"url":"assets/globe-B4Ilypbs.js"},{"revision":null,"url":"assets/database-viewer-2KW73oEG.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/conflict-editor-C1dZ8tsU.js"},{"revision":null,"url":"assets/port-forwarding-tab-CoKoquJZ.js"},{"revision":null,"url":"assets/database-DOWH9-Vv.js"},{"revision":null,"url":"assets/audio-preview-BQWWkcm0.js"},{"revision":null,"url":"assets/dist-DVk8T0R5.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/scroll-area-BDi_FNzr.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-fAJMexNi.js"},{"revision":null,"url":"assets/chat-tab-B-QMa-uT.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/settings-store-8FpQDjEA.js"},{"revision":null,"url":"assets/file-store-DOxcU_7s.js"},{"revision":null,"url":"assets/vendor-mermaid-D2KKkqNs.js"},{"revision":null,"url":"assets/dist-BoIkGNC8.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/vendor-xterm-D1P36hcr.js"},{"revision":null,"url":"assets/lib-C2D8j3K3.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/ai-settings-section-AuV6Lzz2.js"},{"revision":null,"url":"assets/diff-viewer-BMla30lw.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/keybindings-store-B9gpby19.js"},{"revision":null,"url":"assets/react-DMIOAtcX.js"},{"revision":null,"url":"assets/notification-store-7WlicqzJ.js"},{"revision":null,"url":"assets/utils-CQux7CsO.js"},{"revision":null,"url":"assets/csv-parser-Dly5nqE1.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/use-monaco-theme-DEI-tJAh.js"},{"revision":null,"url":"assets/vendor-ui-UXCWAcmi.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/markdown-renderer-B4_rx1aO.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/postgres-viewer-B45DfArf.js"},{"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/radar-KQ55EAFF-DkybKTt9.js"},{"revision":null,"url":"assets/info-3K5VOQVL-D8uyBfC_.js"},{"revision":null,"url":"assets/csv-preview-B3Dyhgho.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/tab-store-CNas5Ny8.js"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/data-grid-types-D2cHE8hx.js"},{"revision":null,"url":"assets/index-U7GK_3ED.js"},{"revision":null,"url":"assets/sqlite-viewer-G81XimpL.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-ClRAoBAn.js"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-BKfHRBz7.js"},{"revision":null,"url":"assets/x-BPReZWnP.js"},{"revision":null,"url":"assets/chevron-right-DnHIvvcy.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/api-settings-C3T95dWg.js"},{"revision":null,"url":"assets/katex-C10ndCVt.js"},{"revision":null,"url":"assets/pdf-preview-D16LLBdq.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/code-editor-DChspYxh.js"},{"revision":null,"url":"assets/index-CKKoR3gY.css"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/video-preview-vjw8RpLK.js"},{"revision":null,"url":"assets/terminal-tab-rslAfxoV.js"},{"revision":null,"url":"assets/extension-webview-DpaCcCXq.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":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","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.svg`,badge:`/icon-192.svg`,tag:`ppm-chat-done`,silent:!1,data:{url:self.location.origin}})}))}),self.addEventListener(`notificationclick`,e=>{e.notification.close(),e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{for(let e of t)if(e.url.includes(self.location.origin)&&`focus`in e)return e.focus();return self.clients.openWindow(e.notification.data?.url||`/`)}))});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hienlh/ppm",
3
- "version": "0.13.50",
3
+ "version": "0.13.51",
4
4
  "description": "Personal Project Manager — mobile-first web IDE with AI assistance",
5
5
  "author": "hienlh",
6
6
  "license": "MIT",
@@ -123,14 +123,14 @@ export function ChatTab({ metadata, tabId }: ChatTabProps) {
123
123
  }, [isConnected, sendMessage]);
124
124
 
125
125
  // Auto-clear notification badge when this tab is active and document is visible.
126
- // Handles the case where notification arrived while browser tab was hidden.
126
+ // Checks ALL panels (not just focused) so split-panel scenarios also clear.
127
127
  useEffect(() => {
128
128
  if (!sessionId || !tabId) return;
129
129
  const maybeClear = () => {
130
130
  if (document.hidden) return;
131
- const { panels, focusedPanelId } = usePanelStore.getState();
132
- const panel = panels[focusedPanelId];
133
- if (panel?.activeTabId === tabId) {
131
+ const { panels } = usePanelStore.getState();
132
+ const isActive = Object.values(panels).some((p) => p.activeTabId === tabId);
133
+ if (isActive) {
134
134
  useNotificationStore.getState().clearForSession(sessionId);
135
135
  }
136
136
  };
@@ -176,6 +176,8 @@ export function ChatTab({ metadata, tabId }: ChatTabProps) {
176
176
  setSessionId(session.id);
177
177
  setProviderId(session.providerId);
178
178
  if (tabId) updateTab(tabId, { title: session.title || "Chat" });
179
+ // Immediately clear notification for the selected session
180
+ useNotificationStore.getState().clearForSession(session.id);
179
181
  }, [tabId, updateTab]);
180
182
 
181
183
  /** Fork current session and open new tab with the forked session, resending userMessage */
@@ -227,7 +227,7 @@ function ReparentingTab({ tabId, panelId, type, metadata, isActive, hiddenContai
227
227
  <div
228
228
  ref={wrapperRef}
229
229
  className="absolute inset-0"
230
- style={isActive ? undefined : { visibility: "hidden", pointerEvents: "none" }}
230
+ style={isActive ? undefined : { display: "none" }}
231
231
  data-tab-pool-id={tabId}
232
232
  >
233
233
  <Suspense
@@ -74,14 +74,15 @@ interface UseChatReturn {
74
74
  isConnected: boolean;
75
75
  }
76
76
 
77
- /** Check if the chat tab for this session is the active foreground tab */
77
+ /** Check if the chat tab for this session is the active foreground tab (any panel) */
78
78
  function isSessionTabActive(sid: string): boolean {
79
79
  if (document.hidden) return false;
80
- const { panels, focusedPanelId } = usePanelStore.getState();
81
- const panel = panels[focusedPanelId];
82
- if (!panel) return false;
83
- const activeTab = panel.tabs.find((t) => t.id === panel.activeTabId);
84
- return activeTab?.type === "chat" && activeTab.metadata?.sessionId === sid;
80
+ const { panels } = usePanelStore.getState();
81
+ for (const panel of Object.values(panels)) {
82
+ const activeTab = panel.tabs.find((t) => t.id === panel.activeTabId);
83
+ if (activeTab?.type === "chat" && activeTab.metadata?.sessionId === sid) return true;
84
+ }
85
+ return false;
85
86
  }
86
87
 
87
88
  export function useChat(sessionId: string | null, providerId = "claude", projectName = ""): UseChatReturn {
package/vite.config.ts CHANGED
@@ -45,7 +45,7 @@ export default defineConfig({
45
45
  build: {
46
46
  outDir: "../../dist/web",
47
47
  emptyOutDir: true,
48
- sourcemap: true,
48
+ sourcemap: false,
49
49
  rollupOptions: {
50
50
  output: {
51
51
  manualChunks(id: string) {
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai-settings-section-AuV6Lzz2.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode"],"sources":["../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/bell-off.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/bot.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/bug.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/chevron-down.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/chevron-up.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/lock.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/pencil.js","../../../src/web/components/ui/label.tsx","../../../src/web/components/ui/switch.tsx","../../../src/web/components/ui/select.tsx","../../../src/web/components/chat/provider-selector.tsx","../../../src/web/components/settings/ai-settings-section.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10.268 21a2 2 0 0 0 3.464 0\", key: \"vwvbt9\" }],\n [\n \"path\",\n {\n d: \"M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742\",\n key: \"178tsu\"\n }\n ],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }],\n [\"path\", { d: \"M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\", key: \"1hqiys\" }]\n];\nconst BellOff = createLucideIcon(\"bell-off\", __iconNode);\n\nexport { __iconNode, BellOff as default };\n//# sourceMappingURL=bell-off.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n];\nconst Bot = createLucideIcon(\"bot\", __iconNode);\n\nexport { __iconNode, Bot as default };\n//# sourceMappingURL=bot.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 20v-9\", key: \"1qisl0\" }],\n [\"path\", { d: \"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z\", key: \"uouzyp\" }],\n [\"path\", { d: \"M14.12 3.88 16 2\", key: \"qol33r\" }],\n [\"path\", { d: \"M21 21a4 4 0 0 0-3.81-4\", key: \"1b0z45\" }],\n [\"path\", { d: \"M21 5a4 4 0 0 1-3.55 3.97\", key: \"5cxbf6\" }],\n [\"path\", { d: \"M22 13h-4\", key: \"1jl80f\" }],\n [\"path\", { d: \"M3 21a4 4 0 0 1 3.81-4\", key: \"1fjd4g\" }],\n [\"path\", { d: \"M3 5a4 4 0 0 0 3.55 3.97\", key: \"1d7oge\" }],\n [\"path\", { d: \"M6 13H2\", key: \"82j7cp\" }],\n [\"path\", { d: \"m8 2 1.88 1.88\", key: \"fmnt4t\" }],\n [\"path\", { d: \"M9 7.13V6a3 3 0 1 1 6 0v1.13\", key: \"1vgav8\" }]\n];\nconst Bug = createLucideIcon(\"bug\", __iconNode);\n\nexport { __iconNode, Bug as default };\n//# sourceMappingURL=bug.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]];\nconst ChevronUp = createLucideIcon(\"chevron-up\", __iconNode);\n\nexport { __iconNode, ChevronUp as default };\n//# sourceMappingURL=chevron-up.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n];\nconst Pencil = createLucideIcon(\"pencil\", __iconNode);\n\nexport { __iconNode, Pencil as default };\n//# sourceMappingURL=pencil.js.map\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","import * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\"\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import * as React from \"react\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-2 py-1.5 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span\n data-slot=\"select-item-indicator\"\n className=\"absolute right-2 flex size-3.5 items-center justify-center\"\n >\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","import { useState, useEffect, useRef, useCallback, type KeyboardEvent } from \"react\";\nimport { Check } from \"lucide-react\";\nimport { api, projectUrl } from \"@/lib/api-client\";\n\ninterface ProviderInfo {\n id: string;\n name: string;\n}\n\ninterface ProviderSelectorProps {\n value: string;\n onChange: (providerId: string) => void;\n projectName: string;\n}\n\nconst PROVIDER_ICONS: Record<string, string> = {\n claude: \"C\",\n cursor: \"▶\",\n codex: \"◆\",\n gemini: \"G\",\n};\n\n/**\n * Provider selector chip + popup — matches ModeSelector style.\n * Hidden when only 1 provider available.\n */\nexport function ProviderSelector({ value, onChange, projectName }: ProviderSelectorProps) {\n const [providers, setProviders] = useState<ProviderInfo[]>([]);\n const [open, setOpen] = useState(false);\n const panelRef = useRef<HTMLDivElement>(null);\n const focusedRef = useRef(0);\n\n useEffect(() => {\n if (!projectName) return;\n api.get<ProviderInfo[]>(`${projectUrl(projectName)}/chat/providers`)\n .then(setProviders)\n .catch(() => {});\n }, [projectName]);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (panelRef.current && !panelRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n // Focus current on open\n useEffect(() => {\n if (open) {\n focusedRef.current = Math.max(0, providers.findIndex((p) => p.id === value));\n }\n }, [open, value, providers]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === \"Escape\") { setOpen(false); return; }\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const dir = e.key === \"ArrowDown\" ? 1 : -1;\n focusedRef.current = (focusedRef.current + dir + providers.length) % providers.length;\n const el = panelRef.current?.querySelector(`[data-idx=\"${focusedRef.current}\"]`) as HTMLElement;\n el?.focus();\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n const p = providers[focusedRef.current];\n if (p) { onChange(p.id); setOpen(false); }\n }\n }, [onChange, providers]);\n\n // Hide when only 1 provider\n if (providers.length <= 1) return null;\n\n const current = providers.find((p) => p.id === value);\n const icon = PROVIDER_ICONS[value] || \"?\";\n\n return (\n <div className=\"relative\">\n {/* Chip — same style as ModeChip */}\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] text-text-subtle hover:text-text-primary hover:bg-surface-elevated transition-colors border border-transparent hover:border-border\"\n aria-label={`AI Provider: ${current?.name ?? value}`}\n >\n <span className=\"inline-flex h-3.5 w-3.5 items-center justify-center rounded text-[9px] font-bold bg-surface-elevated shrink-0\">\n {icon}\n </span>\n <span className=\"max-w-[80px] truncate capitalize\">{current?.name ?? value}</span>\n </button>\n\n {/* Popup panel — same style as ModeSelector */}\n {open && (\n <div\n ref={panelRef}\n role=\"listbox\"\n aria-label=\"AI Providers\"\n onKeyDown={handleKeyDown}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n className=\"absolute bottom-full left-0 mb-1 z-50 w-56 rounded-lg border border-border bg-surface shadow-lg\"\n >\n <div className=\"px-3 py-2 border-b border-border\">\n <span className=\"text-xs font-medium text-text-secondary\">Provider</span>\n </div>\n <div className=\"py-1\">\n {providers.map((p, idx) => {\n const pIcon = PROVIDER_ICONS[p.id] || \"?\";\n const isActive = p.id === value;\n return (\n <button\n key={p.id}\n data-idx={idx}\n role=\"option\"\n aria-selected={isActive}\n tabIndex={0}\n onClick={() => { onChange(p.id); setOpen(false); }}\n className={`w-full flex items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-surface-elevated focus:bg-surface-elevated focus:outline-none ${isActive ? \"bg-surface-elevated\" : \"\"}`}\n >\n <span className=\"inline-flex h-5 w-5 items-center justify-center rounded text-[11px] font-bold bg-surface-elevated text-text-subtle shrink-0\">\n {pIcon}\n </span>\n <span className=\"flex-1 text-sm font-medium text-text-primary capitalize\">{p.name}</span>\n {isActive && <Check className=\"size-4 shrink-0 text-primary\" />}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/** Small provider badge for session lists */\nexport function ProviderBadge({ providerId }: { providerId: string }) {\n const icon = PROVIDER_ICONS[providerId] || \"?\";\n return (\n <span\n className=\"inline-flex h-4 w-4 items-center justify-center rounded text-[10px] font-bold bg-surface-elevated text-text-subtle shrink-0\"\n title={providerId}\n >\n {icon}\n </span>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { RefreshCw, Trash2 } from \"lucide-react\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { getAISettings, updateAISettings, type AISettings } from \"@/lib/api-settings\";\nimport { api } from \"@/lib/api-client\";\nimport { ProviderBadge } from \"@/components/chat/provider-selector\";\nimport type { ModelOption } from \"../../../types/chat\";\n\nconst EFFORT_OPTIONS = [\n { value: \"low\", label: \"Low\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"high\", label: \"High\" },\n];\n\nconst PERMISSION_MODE_OPTIONS = [\n { value: \"bypassPermissions\", label: \"Bypass permissions (default)\" },\n { value: \"default\", label: \"Ask before edits\" },\n { value: \"acceptEdits\", label: \"Edit automatically\" },\n { value: \"plan\", label: \"Plan mode\" },\n];\n\nconst PROVIDER_NAMES: Record<string, string> = {\n claude: \"Claude\",\n cursor: \"Cursor\",\n codex: \"Codex\",\n gemini: \"Gemini\",\n};\n\nexport function AISettingsSection({ compact }: { compact?: boolean } = {}) {\n const [settings, setSettings] = useState<AISettings | null>(null);\n const [activeTab, setActiveTab] = useState<string>(\"\");\n const [models, setModels] = useState<ModelOption[]>([]);\n const [modelsLoading, setModelsLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [revision, setRevision] = useState(0);\n\n useEffect(() => {\n getAISettings().then((s) => {\n setSettings(s);\n setActiveTab(s.default_provider ?? \"claude\");\n }).catch((e) => setError(e.message));\n }, []);\n\n // Fetch models when active tab changes — uses global settings endpoint\n useEffect(() => {\n if (!activeTab) return;\n setModelsLoading(true);\n api.get<ModelOption[]>(`/api/settings/ai/providers/${activeTab}/models`)\n .then(setModels)\n .catch(() => setModels([]))\n .finally(() => setModelsLoading(false));\n }, [activeTab]);\n\n const providerTabs = settings\n ? Object.keys(settings.providers)\n .filter((k) => k !== \"mock\")\n .map((id) => ({ id, name: PROVIDER_NAMES[id] ?? id }))\n : [];\n\n const config = settings?.providers[activeTab];\n const isSdkProvider = config?.type === \"agent-sdk\" || (!config?.type && activeTab === \"claude\");\n\n const handleSave = async (field: string, value: unknown) => {\n if (!settings) return;\n setSaving(true);\n setError(null);\n try {\n const updated = await updateAISettings({\n providers: { [activeTab]: { [field]: value } },\n });\n setSettings(updated);\n setRevision((r) => r + 1);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setSaving(false);\n }\n };\n\n const labelSize = compact ? \"text-[11px]\" : \"text-sm\";\n const headingSize = compact ? \"text-xs\" : \"text-sm\";\n const gapSize = compact ? \"space-y-2\" : \"space-y-4\";\n const innerGap = compact ? \"space-y-1.5\" : \"space-y-3\";\n const fieldGap = compact ? \"space-y-1\" : \"space-y-1.5\";\n\n if (!settings) {\n return (\n <div className={innerGap}>\n <h3 className={`${headingSize} font-medium text-text-secondary`}>AI Settings</h3>\n <p className={`${labelSize} text-text-subtle`}>\n {error ? `Error: ${error}` : \"Loading...\"}\n </p>\n </div>\n );\n }\n\n // Model select options: use fetched models, with \"auto\" option for non-SDK providers\n const modelOptions = isSdkProvider\n ? models\n : [{ value: \"__default__\", label: \"Auto (default)\" }, ...models];\n\n return (\n <div className={gapSize}>\n <h3 className={`${headingSize} font-medium text-text-secondary`}>AI Settings</h3>\n\n {/* Provider tabs */}\n {providerTabs.length > 1 && (\n <div className=\"flex gap-0.5 border-b border-border/50 -mx-1 px-1\">\n {providerTabs.map((p) => (\n <button\n key={p.id}\n onClick={() => setActiveTab(p.id)}\n className={`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${\n activeTab === p.id\n ? \"text-primary border-b-2 border-primary font-medium\"\n : \"text-text-subtle hover:text-text-secondary\"\n }`}\n >\n <ProviderBadge providerId={p.id} />\n <span className=\"capitalize\">{p.name}</span>\n </button>\n ))}\n </div>\n )}\n\n <div className={innerGap}>\n {/* Model selector — dynamic, works for all providers */}\n {models.length > 0 && (\n <div className={fieldGap}>\n <Label htmlFor=\"ai-model\" className={compact ? labelSize : undefined}>Model</Label>\n <Select\n value={isSdkProvider ? (config?.model ?? models[0]?.value) : (config?.model || \"__default__\")}\n onValueChange={(v) => handleSave(\"model\", v === \"__default__\" ? undefined : v)}\n disabled={modelsLoading}\n >\n <SelectTrigger id=\"ai-model\" className={`w-full ${compact ? \"h-7 text-[11px]\" : \"\"}`}>\n <SelectValue placeholder={modelsLoading ? \"Loading models...\" : \"Select model\"} />\n </SelectTrigger>\n <SelectContent className=\"max-h-[300px]\">\n {modelOptions.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* SDK-specific fields */}\n {isSdkProvider && (\n <>\n <div className={fieldGap}>\n <Label htmlFor=\"ai-base-url\" className={compact ? labelSize : undefined}>Base URL</Label>\n <Input\n key={`baseurl-${activeTab}-${revision}`}\n id=\"ai-base-url\"\n type=\"url\"\n defaultValue={config?.base_url ?? \"\"}\n placeholder=\"https://api.anthropic.com (default)\"\n className={compact ? \"h-7 text-[11px]\" : undefined}\n onBlur={(e) => {\n const val = e.target.value.trim();\n handleSave(\"base_url\", val || undefined);\n }}\n />\n </div>\n\n <div className={fieldGap}>\n <Label htmlFor=\"ai-api-key\" className={compact ? labelSize : undefined}>API Key / Token</Label>\n <Input\n key={`apikey-${activeTab}-${revision}`}\n id=\"ai-api-key\"\n type=\"password\"\n defaultValue={config?.api_key ?? \"\"}\n placeholder=\"sk-ant-... (optional, overrides accounts)\"\n className={compact ? \"h-7 text-[11px] font-mono\" : \"font-mono\"}\n onBlur={(e) => {\n const val = e.target.value.trim();\n if (val.startsWith(\"••••\")) return;\n handleSave(\"api_key\", val || undefined);\n }}\n />\n <p className={`${compact ? \"text-[9px]\" : \"text-[11px]\"} text-muted-foreground`}>\n Direct API key or OAuth token. Leave empty to use connected accounts.\n </p>\n </div>\n\n <div className={fieldGap}>\n <Label htmlFor=\"ai-effort\" className={compact ? labelSize : undefined}>Effort</Label>\n <Select\n value={config?.effort ?? \"high\"}\n onValueChange={(v) => handleSave(\"effort\", v)}\n >\n <SelectTrigger id=\"ai-effort\" className={`w-full ${compact ? \"h-7 text-[11px]\" : \"\"}`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {EFFORT_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className={fieldGap}>\n <Label htmlFor=\"ai-max-turns\" className={compact ? labelSize : undefined}>Max Turns (1-500)</Label>\n <Input\n key={`turns-${activeTab}-${revision}`}\n id=\"ai-max-turns\"\n type=\"number\"\n min={1}\n max={500}\n defaultValue={config?.max_turns ?? 100}\n className={compact ? \"h-7 text-[11px]\" : undefined}\n onBlur={(e) => {\n const val = parseInt(e.target.value);\n if (!isNaN(val)) handleSave(\"max_turns\", val);\n }}\n />\n </div>\n\n <div className={fieldGap}>\n <Label htmlFor=\"ai-budget\" className={compact ? labelSize : undefined}>Max Budget (USD)</Label>\n <Input\n key={`budget-${activeTab}-${revision}`}\n id=\"ai-budget\"\n type=\"number\"\n step={0.1}\n min={0.01}\n max={50}\n defaultValue={config?.max_budget_usd ?? \"\"}\n placeholder=\"No limit\"\n className={compact ? \"h-7 text-[11px]\" : undefined}\n onBlur={(e) => {\n const val = parseFloat(e.target.value);\n handleSave(\"max_budget_usd\", isNaN(val) ? undefined : val);\n }}\n />\n </div>\n\n <div className={fieldGap}>\n <Label htmlFor=\"ai-thinking\" className={compact ? labelSize : undefined}>Thinking Budget (tokens)</Label>\n <Input\n key={`thinking-${activeTab}-${revision}`}\n id=\"ai-thinking\"\n type=\"number\"\n min={0}\n defaultValue={config?.thinking_budget_tokens ?? \"\"}\n placeholder=\"Disabled\"\n className={compact ? \"h-7 text-[11px]\" : undefined}\n onBlur={(e) => {\n const val = parseInt(e.target.value);\n handleSave(\"thinking_budget_tokens\", isNaN(val) ? undefined : val);\n }}\n />\n </div>\n\n <div className=\"flex items-center justify-between gap-2\">\n <div>\n <Label htmlFor=\"ai-agent-teams\" className={compact ? labelSize : undefined}>Agent Teams</Label>\n <p className={`${compact ? \"text-[9px]\" : \"text-[11px]\"} text-muted-foreground`}>\n Experimental. Enables multi-agent collaboration with shared tasks and messaging. Uses ~7x more tokens.\n </p>\n </div>\n <Switch\n id=\"ai-agent-teams\"\n checked={config?.agent_teams ?? false}\n onCheckedChange={(v) => handleSave(\"agent_teams\", v)}\n />\n </div>\n\n {config?.agent_teams && (\n <TeamListSection compact={compact} />\n )}\n </>\n )}\n\n {/* Common fields: permission mode + system prompt (all providers) */}\n <div className={fieldGap}>\n <Label htmlFor=\"ai-permission-mode\" className={compact ? labelSize : undefined}>Default Permission Mode</Label>\n <Select\n value={config?.permission_mode ?? \"bypassPermissions\"}\n onValueChange={(v) => handleSave(\"permission_mode\", v)}\n >\n <SelectTrigger id=\"ai-permission-mode\" className={`w-full ${compact ? \"h-7 text-[11px]\" : \"\"}`}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PERMISSION_MODE_OPTIONS.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className={fieldGap}>\n <Label htmlFor=\"ai-system-prompt\" className={compact ? labelSize : undefined}>Additional Instructions</Label>\n <textarea\n key={`sysprompt-${activeTab}-${revision}`}\n id=\"ai-system-prompt\"\n rows={compact ? 3 : 4}\n defaultValue={config?.system_prompt ?? \"\"}\n placeholder={`Enter additional instructions for ${activeTab}...`}\n className={`w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${compact ? \"text-[11px]\" : \"text-sm\"}`}\n onBlur={(e) => {\n const val = e.target.value.trim();\n handleSave(\"system_prompt\", val || undefined);\n }}\n />\n </div>\n </div>\n\n {saving && <p className=\"text-xs text-text-subtle\">Saving...</p>}\n {error && <p className=\"text-xs text-red-500\">{error}</p>}\n </div>\n );\n}\n\n/** Team list shown below the Agent Teams toggle in AI Settings */\nfunction TeamListSection({ compact }: { compact?: boolean }) {\n const [teams, setTeams] = useState<any[]>([]);\n const [loading, setLoading] = useState(false);\n const [deleteConfirm, setDeleteConfirm] = useState<string | null>(null);\n\n const fetchTeams = useCallback(async () => {\n setLoading(true);\n try {\n const data = await api.get<any[]>(\"/api/teams\");\n setTeams(data ?? []);\n } catch {}\n setLoading(false);\n }, []);\n\n useEffect(() => { fetchTeams(); }, [fetchTeams]);\n\n const handleDelete = async (name: string) => {\n try {\n await api.del(`/api/teams/${encodeURIComponent(name)}`);\n setTeams((prev) => prev.filter((t) => t.name !== name));\n setDeleteConfirm(null);\n } catch {}\n };\n\n if (teams.length === 0 && !loading) return null;\n\n return (\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label className={compact ? \"text-[11px]\" : undefined}>\n Teams ({teams.length})\n </Label>\n <button onClick={fetchTeams} className=\"text-text-subtle hover:text-foreground p-1\" aria-label=\"Refresh teams\">\n <RefreshCw className={`size-3 ${loading ? \"animate-spin\" : \"\"}`} />\n </button>\n </div>\n {teams.map((team) => (\n <div key={team.name} className=\"flex items-center justify-between p-2 rounded bg-surface-elevated text-xs\">\n <div className=\"min-w-0\">\n <div className=\"font-medium truncate\">{team.name}</div>\n {team.description && <div className=\"text-text-subtle truncate\">{team.description}</div>}\n <div className=\"text-text-subtle\">\n {team.members?.length ?? team.memberCount ?? 0} members\n {team.createdAt ? ` · ${new Date(team.createdAt).toLocaleDateString()}` : \"\"}\n </div>\n </div>\n {deleteConfirm === team.name ? (\n <div className=\"flex gap-1 shrink-0 ml-2\">\n <button\n onClick={() => handleDelete(team.name)}\n className=\"px-2 py-1 bg-red-600 text-white rounded text-[10px]\"\n >\n Delete\n </button>\n <button\n onClick={() => setDeleteConfirm(null)}\n className=\"px-2 py-1 bg-zinc-600 text-white rounded text-[10px]\"\n >\n Cancel\n </button>\n </div>\n ) : (\n <button\n onClick={() => setDeleteConfirm(team.name)}\n className=\"shrink-0 text-text-subtle hover:text-red-500 p-1 ml-2\"\n aria-label={`Delete team ${team.name}`}\n >\n <Trash2 className=\"size-3.5\" />\n </button>\n )}\n </div>\n ))}\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-client-DIhJ5qVW.js","names":[],"sources":["../../../src/web/lib/api-client.ts"],"sourcesContent":["const TOKEN_KEY = \"ppm-auth-token\";\nconst RELOAD_GUARD_KEY = \"ppm-auth-reload-ts\";\n\nclass ApiClient {\n private baseUrl: string;\n\n constructor(baseUrl = \"\") {\n this.baseUrl = baseUrl;\n }\n\n private getToken(): string | null {\n return localStorage.getItem(TOKEN_KEY);\n }\n\n private headers(): HeadersInit {\n const h: HeadersInit = { \"Content-Type\": \"application/json\" };\n const token = this.getToken();\n if (token) h[\"Authorization\"] = `Bearer ${token}`;\n return h;\n }\n\n /** Auto-unwraps {ok, data} envelope. Returns T directly. */\n async get<T>(path: string, options?: { signal?: AbortSignal }): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n headers: this.headers(),\n signal: options?.signal,\n });\n return this.handleResponse<T>(res);\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: this.headers(),\n body: body != null ? JSON.stringify(body) : undefined,\n });\n return this.handleResponse<T>(res);\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PUT\",\n headers: this.headers(),\n body: body != null ? JSON.stringify(body) : undefined,\n });\n return this.handleResponse<T>(res);\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"PATCH\",\n headers: this.headers(),\n body: body != null ? JSON.stringify(body) : undefined,\n });\n return this.handleResponse<T>(res);\n }\n\n async del(path: string, body?: unknown): Promise<void> {\n const res = await fetch(`${this.baseUrl}${path}`, {\n method: \"DELETE\",\n headers: this.headers(),\n body: body != null ? JSON.stringify(body) : undefined,\n });\n await this.handleResponse<void>(res);\n }\n\n private async handleResponse<T>(res: Response): Promise<T> {\n if (res.status === 401) {\n localStorage.removeItem(TOKEN_KEY);\n // Guard against infinite reload loops: skip reload if we already reloaded within 3s\n const lastReload = Number(sessionStorage.getItem(RELOAD_GUARD_KEY) || \"0\");\n if (Date.now() - lastReload > 3000) {\n sessionStorage.setItem(RELOAD_GUARD_KEY, String(Date.now()));\n window.location.reload();\n }\n throw new Error(\"Unauthorized\");\n }\n\n let json: any;\n try {\n json = await res.json();\n } catch {\n throw new Error(res.ok ? \"Empty response from server\" : `Server error (HTTP ${res.status})`);\n }\n\n if (json.ok === false) {\n throw new Error(json.error ?? `HTTP ${res.status}`);\n }\n\n return json.data as T;\n }\n}\n\nexport const api = new ApiClient();\n\n/** Build project-scoped API path prefix */\nexport function projectUrl(projectName: string): string {\n return `/api/project/${encodeURIComponent(projectName)}`;\n}\n\nexport function setAuthToken(token: string) {\n localStorage.setItem(TOKEN_KEY, token);\n}\n\nexport function clearAuthToken() {\n localStorage.removeItem(TOKEN_KEY);\n}\n\nexport function getAuthToken(): string | null {\n return localStorage.getItem(TOKEN_KEY);\n}\n"],"mappings":"+HAAM,EAAY,iBACZ,EAAmB,qBA4FZ,EAAM,IA1FnB,KAAgB,CACd,QAEA,YAAY,EAAU,GAAI,CACxB,KAAK,QAAU,EAGjB,UAAkC,CAChC,OAAO,aAAa,QAAQ,EAAU,CAGxC,SAA+B,CAC7B,IAAM,EAAiB,CAAE,eAAgB,mBAAoB,CACvD,EAAQ,KAAK,UAAU,CAE7B,OADI,IAAO,EAAE,cAAmB,UAAU,KACnC,EAIT,MAAM,IAAO,EAAc,EAAgD,CACzE,IAAM,EAAM,MAAM,MAAM,GAAG,KAAK,UAAU,IAAQ,CAChD,QAAS,KAAK,SAAS,CACvB,OAAQ,GAAS,OAClB,CAAC,CACF,OAAO,KAAK,eAAkB,EAAI,CAGpC,MAAM,KAAQ,EAAc,EAA4B,CACtD,IAAM,EAAM,MAAM,MAAM,GAAG,KAAK,UAAU,IAAQ,CAChD,OAAQ,OACR,QAAS,KAAK,SAAS,CACvB,KAAM,GAAQ,KAA8B,IAAA,GAAvB,KAAK,UAAU,EAAK,CAC1C,CAAC,CACF,OAAO,KAAK,eAAkB,EAAI,CAGpC,MAAM,IAAO,EAAc,EAA4B,CACrD,IAAM,EAAM,MAAM,MAAM,GAAG,KAAK,UAAU,IAAQ,CAChD,OAAQ,MACR,QAAS,KAAK,SAAS,CACvB,KAAM,GAAQ,KAA8B,IAAA,GAAvB,KAAK,UAAU,EAAK,CAC1C,CAAC,CACF,OAAO,KAAK,eAAkB,EAAI,CAGpC,MAAM,MAAS,EAAc,EAA4B,CACvD,IAAM,EAAM,MAAM,MAAM,GAAG,KAAK,UAAU,IAAQ,CAChD,OAAQ,QACR,QAAS,KAAK,SAAS,CACvB,KAAM,GAAQ,KAA8B,IAAA,GAAvB,KAAK,UAAU,EAAK,CAC1C,CAAC,CACF,OAAO,KAAK,eAAkB,EAAI,CAGpC,MAAM,IAAI,EAAc,EAA+B,CACrD,IAAM,EAAM,MAAM,MAAM,GAAG,KAAK,UAAU,IAAQ,CAChD,OAAQ,SACR,QAAS,KAAK,SAAS,CACvB,KAAM,GAAQ,KAA8B,IAAA,GAAvB,KAAK,UAAU,EAAK,CAC1C,CAAC,CACF,MAAM,KAAK,eAAqB,EAAI,CAGtC,MAAc,eAAkB,EAA2B,CACzD,GAAI,EAAI,SAAW,IAAK,CACtB,aAAa,WAAW,EAAU,CAElC,IAAM,EAAa,OAAO,eAAe,QAAQ,EAAiB,EAAI,IAAI,CAK1E,MAJI,KAAK,KAAK,CAAG,EAAa,MAC5B,eAAe,QAAQ,EAAkB,OAAO,KAAK,KAAK,CAAC,CAAC,CAC5D,OAAO,SAAS,QAAQ,EAEhB,MAAM,eAAe,CAGjC,IAAI,EACJ,GAAI,CACF,EAAO,MAAM,EAAI,MAAM,MACjB,CACN,MAAU,MAAM,EAAI,GAAK,6BAA+B,sBAAsB,EAAI,OAAO,GAAG,CAG9F,GAAI,EAAK,KAAO,GACd,MAAU,MAAM,EAAK,OAAS,QAAQ,EAAI,SAAS,CAGrD,OAAO,EAAK,OAOhB,SAAgB,EAAW,EAA6B,CACtD,MAAO,gBAAgB,mBAAmB,EAAY,GAGxD,SAAgB,EAAa,EAAe,CAC1C,aAAa,QAAQ,EAAW,EAAM,CAOxC,SAAgB,GAA8B,CAC5C,OAAO,aAAa,QAAQ,EAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-settings-C3T95dWg.js","names":[],"sources":["../../../src/web/lib/api-settings.ts"],"sourcesContent":["import { api } from \"./api-client\";\n\nexport interface OAuthProfileData {\n account?: {\n uuid?: string;\n full_name?: string;\n display_name?: string;\n email?: string;\n has_claude_max?: boolean;\n has_claude_pro?: boolean;\n created_at?: string;\n };\n organization?: {\n uuid?: string;\n name?: string;\n organization_type?: string;\n billing_type?: string;\n rate_limit_tier?: string;\n has_extra_usage_enabled?: boolean;\n subscription_status?: string;\n subscription_created_at?: string;\n };\n application?: {\n uuid?: string;\n name?: string;\n slug?: string;\n };\n}\n\nexport interface AccountInfo {\n id: string;\n label: string | null;\n email: string | null;\n expiresAt: number | null;\n status: \"active\" | \"cooldown\" | \"disabled\";\n cooldownUntil: number | null;\n priority: number;\n totalRequests: number;\n lastUsedAt: number | null;\n profileData: OAuthProfileData | null;\n createdAt: number;\n hasRefreshToken: boolean;\n}\n\nexport interface VerifyResult {\n valid: boolean;\n email?: string;\n orgName?: string;\n subscriptionType?: string;\n authMethod?: string;\n profileData?: OAuthProfileData;\n}\n\nexport interface AccountSettings {\n strategy: \"round-robin\" | \"fill-first\" | \"lowest-usage\";\n maxRetry: number;\n activeCount: number;\n}\n\nexport function getAccounts(): Promise<AccountInfo[]> {\n return api.get<AccountInfo[]>(\"/api/accounts\");\n}\n\nexport function getActiveAccount(): Promise<AccountInfo | null> {\n return api.get<AccountInfo | null>(\"/api/accounts/active\");\n}\n\nexport function addAccount(params: { apiKey: string; label?: string }): Promise<AccountInfo> {\n return api.post<AccountInfo>(\"/api/accounts\", params);\n}\n\nexport function deleteAccount(id: string): Promise<void> {\n return api.del(`/api/accounts/${id}`);\n}\n\nexport function patchAccount(id: string, updates: { status: string }): Promise<AccountInfo | null> {\n return api.patch<AccountInfo | null>(`/api/accounts/${id}`, updates);\n}\n\nexport function getAccountSettings(): Promise<AccountSettings> {\n return api.get<AccountSettings>(\"/api/accounts/settings\");\n}\n\nexport function updateAccountSettings(s: Partial<Omit<AccountSettings, \"activeCount\">>): Promise<AccountSettings> {\n return api.put<AccountSettings>(\"/api/accounts/settings\", s);\n}\n\nexport interface AccountUsageEntry {\n accountId: string;\n accountLabel: string | null;\n accountStatus: string;\n isOAuth: boolean;\n usage: {\n lastFetchedAt?: string;\n session?: import(\"../../types/chat\").LimitBucket;\n weekly?: import(\"../../types/chat\").LimitBucket;\n weeklyOpus?: import(\"../../types/chat\").LimitBucket;\n weeklySonnet?: import(\"../../types/chat\").LimitBucket;\n };\n}\n\nexport function verifyAccount(id: string): Promise<VerifyResult> {\n return api.post<VerifyResult>(`/api/accounts/${id}/verify`);\n}\n\nexport function getOAuthUrl(): Promise<{ url: string; state: string }> {\n return api.get<{ url: string; state: string }>(\"/api/accounts/oauth/url\");\n}\n\nexport function exchangeOAuthCode(code: string, state: string): Promise<AccountInfo> {\n return api.post<AccountInfo>(\"/api/accounts/oauth/exchange\", { code, state });\n}\n\nexport function getAllAccountUsages(): Promise<AccountUsageEntry[]> {\n return api.get<AccountUsageEntry[]>(\"/api/accounts/usage\");\n}\n\nexport interface UsageSnapshot {\n id: number;\n account_id: string | null;\n five_hour_util: number | null;\n weekly_util: number | null;\n weekly_opus_util: number | null;\n weekly_sonnet_util: number | null;\n recorded_at: string;\n}\n\nexport function getUsageHistory(accountId: string): Promise<UsageSnapshot[]> {\n return api.get<UsageSnapshot[]>(`/api/accounts/${accountId}/usage-history`);\n}\n\nexport function importAccounts(params: { data: string; password: string }): Promise<{ imported: number; refreshed: number }> {\n return api.post<{ imported: number; refreshed: number }>(\"/api/accounts/import\", params);\n}\n\nexport interface TokenTestResult {\n accessToken: { status: string; code?: number; error?: string };\n refreshToken?: { status: string; code?: number; expiresIn?: number; newRefreshToken?: boolean; error?: string };\n}\n\nexport function testAccountToken(id: string, testRefresh = false): Promise<TokenTestResult> {\n return api.post<TokenTestResult>(`/api/accounts/${id}/test-token`, { testRefresh });\n}\n\nexport interface ExportedTokenInfo {\n id: string;\n label: string;\n email: string;\n preExportToken: string | null;\n preExportTokenFull: string | null;\n exportedToken: string | null;\n exportedTokenFull: string | null;\n postExportToken: string | null;\n postExportTokenFull: string | null;\n preExportExpires: number | null;\n exportedExpires: number | null;\n postExportExpires: number | null;\n tokenChanged: boolean;\n}\n\nexport function testExport(accountIds: string[], includeRefreshToken = false): Promise<ExportedTokenInfo[]> {\n return api.post<ExportedTokenInfo[]>(\"/api/accounts/test-export\", { accountIds, includeRefreshToken });\n}\n\nexport function testRawToken(token: string): Promise<{ status: string; code?: number; error?: string }> {\n return api.post<{ status: string; code?: number; error?: string }>(\"/api/accounts/test-raw-token\", { token });\n}\n\nexport interface AIProviderSettings {\n type?: string;\n api_key_env?: string;\n api_key?: string;\n base_url?: string;\n model?: string;\n effort?: string;\n max_turns?: number;\n max_budget_usd?: number;\n thinking_budget_tokens?: number;\n permission_mode?: string;\n system_prompt?: string;\n agent_teams?: boolean;\n}\n\nexport interface AISettings {\n default_provider: string;\n providers: Record<string, AIProviderSettings>;\n}\n\nexport function updateDeviceName(device_name: string): Promise<{ device_name: string }> {\n return api.put<{ device_name: string }>(\"/api/settings/device-name\", { device_name });\n}\n\nexport function getAISettings(): Promise<AISettings> {\n return api.get<AISettings>(\"/api/settings/ai\");\n}\n\nexport function updateAISettings(settings: Partial<AISettings>): Promise<AISettings> {\n return api.put<AISettings>(\"/api/settings/ai\", settings);\n}\n\n// ── Proxy ────────────────────────────────────────────────────────────\n\nexport interface ProxySettings {\n enabled: boolean;\n authKey: string | null;\n requestCount: number;\n localEndpoint: string;\n localOpenAiEndpoint: string;\n tunnelUrl: string | null;\n proxyEndpoint: string | null;\n openAiEndpoint: string | null;\n}\n\nexport function getProxySettings(): Promise<ProxySettings> {\n return api.get<ProxySettings>(\"/api/settings/proxy\");\n}\n\nexport function updateProxySettings(params: { enabled?: boolean; authKey?: string; generateKey?: boolean }): Promise<ProxySettings> {\n return api.put<ProxySettings>(\"/api/settings/proxy\", params);\n}\n"],"mappings":"8dA2DA,SAAgB,GAAsC,CACpD,OAAO,EAAI,IAAmB,gBAAgB,CAGhD,SAAgB,GAAgD,CAC9D,OAAO,EAAI,IAAwB,uBAAuB,CAG5D,SAAgB,EAAW,EAAkE,CAC3F,OAAO,EAAI,KAAkB,gBAAiB,EAAO,CAGvD,SAAgB,EAAc,EAA2B,CACvD,OAAO,EAAI,IAAI,iBAAiB,IAAK,CAGvC,SAAgB,EAAa,EAAY,EAA0D,CACjG,OAAO,EAAI,MAA0B,iBAAiB,IAAM,EAAQ,CAGtE,SAAgB,GAA+C,CAC7D,OAAO,EAAI,IAAqB,yBAAyB,CAG3D,SAAgB,EAAsB,EAA4E,CAChH,OAAO,EAAI,IAAqB,yBAA0B,EAAE,CAqB9D,SAAgB,GAAuD,CACrE,OAAO,EAAI,IAAoC,0BAA0B,CAG3E,SAAgB,EAAkB,EAAc,EAAqC,CACnF,OAAO,EAAI,KAAkB,+BAAgC,CAAE,OAAM,QAAO,CAAC,CAG/E,SAAgB,GAAoD,CAClE,OAAO,EAAI,IAAyB,sBAAsB,CAa5D,SAAgB,EAAgB,EAA6C,CAC3E,OAAO,EAAI,IAAqB,iBAAiB,EAAU,gBAAgB,CAG7E,SAAgB,EAAe,EAA8F,CAC3H,OAAO,EAAI,KAA8C,uBAAwB,EAAO,CAwD1F,SAAgB,EAAiB,EAAuD,CACtF,OAAO,EAAI,IAA6B,4BAA6B,CAAE,cAAa,CAAC,CAGvF,SAAgB,GAAqC,CACnD,OAAO,EAAI,IAAgB,mBAAmB,CAGhD,SAAgB,EAAiB,EAAoD,CACnF,OAAO,EAAI,IAAgB,mBAAoB,EAAS,CAgB1D,SAAgB,GAA2C,CACzD,OAAO,EAAI,IAAmB,sBAAsB,CAGtD,SAAgB,EAAoB,EAAgG,CAClI,OAAO,EAAI,IAAmB,sBAAuB,EAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"arrow-up-Rcw6_KKu.js","names":[],"sources":["../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/arrow-up.js"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n];\nconst ArrowUp = createLucideIcon(\"arrow-up\", __iconNode);\n\nexport { __iconNode, ArrowUp as default };\n//# sourceMappingURL=arrow-up.js.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAU,EAAiB,WAJd,CACjB,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,SAAU,CAAC,CAC/C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,SAAU,CAAC,CAC3C,CACuD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio-preview-CILFIsuu.js","names":[],"sources":["../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/music.js","../../../src/web/components/editor/audio-preview.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M9 18V5l12-2v13\", key: \"1jmyc2\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"circle\", { cx: \"18\", cy: \"16\", r: \"3\", key: \"1hluhg\" }]\n];\nconst Music = createLucideIcon(\"music\", __iconNode);\n\nexport { __iconNode, Music as default };\n//# sourceMappingURL=music.js.map\n","import { Loader2, FileWarning, Music } from \"lucide-react\";\nimport { useBlobUrl } from \"./use-blob-url\";\nimport { basename } from \"@/lib/utils\";\n\nexport function AudioPreview({ filePath, projectName }: { filePath: string; projectName: string }) {\n const { blobUrl, error } = useBlobUrl(filePath, projectName);\n\n if (error) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-3 text-text-secondary\">\n <FileWarning className=\"size-10 text-text-subtle\" />\n <p className=\"text-sm\">Failed to load audio.</p>\n </div>\n );\n }\n if (!blobUrl) {\n return <div className=\"flex items-center justify-center h-full\"><Loader2 className=\"size-5 animate-spin text-text-subtle\" /></div>;\n }\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 p-4 bg-surface\">\n <Music className=\"size-16 text-text-subtle\" />\n <p className=\"text-sm text-text-secondary truncate max-w-xs\">{basename(filePath)}</p>\n <audio src={blobUrl} controls className=\"w-full max-w-md\" />\n </div>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"yTAcA,IAAM,EAAQ,EAAiB,QALZ,CACjB,CAAC,OAAQ,CAAE,EAAG,kBAAmB,IAAK,SAAU,CAAC,CACjD,CAAC,SAAU,CAAE,GAAI,IAAK,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,CAAC,CACxD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,SAAU,CAAC,CAC1D,CACkD,OCVnD,SAAgB,EAAa,CAAE,WAAU,eAA0D,CACjG,GAAM,CAAE,UAAS,SAAU,EAAW,EAAU,EAAY,CAa5D,OAXI,GACF,EAAA,EAAA,MACG,MAAD,CAAK,UAAU,sFAAf,EAAA,EAAA,EAAA,KACG,EAAD,CAAa,UAAU,2BAA6B,CAAA,EAAA,EAAA,EAAA,KACnD,IAAD,CAAG,UAAU,mBAAU,wBAAyB,CAAA,CAC5C,GAGL,GAGL,EAAA,EAAA,MACG,MAAD,CAAK,UAAU,iFAAf,WACG,EAAD,CAAO,UAAU,2BAA6B,CAAA,WAC7C,IAAD,CAAG,UAAU,yDAAiD,EAAS,EAAS,CAAK,CAAA,WACpF,QAAD,CAAO,IAAK,EAAS,SAAA,GAAS,UAAU,kBAAoB,CAAA,CACxD,IAPN,EAAA,EAAA,KAAQ,MAAD,CAAK,UAAU,6DAA2C,EAAD,CAAS,UAAU,uCAAyC,CAAA,CAAM,CAAA"}